Чтение из code и data

Тема в разделе "WASM.ZEN", создана пользователем DeeoniS, 5 фев 2005.

  1. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    извините пожалуйста может ламерский вопрос, но всетаки оч интересно... Почему когда читаешь данные из секции кода они считываются в правильном порядке, а когда из данных наоборот.

    Например если мы записали по адресу принадлежащему секции кода 12345678h, то в памяти будет 78563412h... и это естественно, и когда мы делаем call или читаем в регистр, то получаем 12345678h. А если адрес принадлежит секции данных, то при чтении 78563412h... Объясните в чем фишка
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    DeeoniS

    Объясните подробнее как вы проводили этот эксперимент, т.е. как записывался и читался DWORD в/из секцию кода и данных соответственно.
     
  3. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    вот кусок кода





    .data

    _proc dd 0h

    ;.......



    .code

    ;это записываем

    call getdata

    ;edi указывает на _proc

    stosd



    ;это читаем

    mov eax,dword ptr _proc

    ;или так

    call _proc
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    DeeoniS

    Ну, вот, набираю в Olly:
    Код (Text):
    1. MOV EAX,12345678
    2. LEA EDI,DWORD PTR DS:[40D000]
    3. STOS DWORD PTR ES:[EDI]
    4. XOR EAX,EAX
    5. MOV EAX,DWORD PTR DS:[40D000]
    6. ; тут EAX == 12345678
    7. LEA EDI,DWORD PTR CS:[40C101]
    8. STOS DWORD PTR ES:[EDI]
    9. XOR EAX,EAX
    10. MOV EAX,DWORD PTR CS:[40C101]
    11. ; опять EAX == 12345678


    Никакой разницы!
     
  5. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    вот тогда программа с исходниками, она просто ищет адреса API, находит ExitProcess и вызывает его

    парольна архив 12345

    [​IMG] _1351586475__proga.rar
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    DeeoniS

    В вашем коде часто встречаются инструкции с операндами вроде
    Код (Text):
    1. mov dword ptr [ebp+offset ker],eax


    Но ebp всегда равен нулю, так зачем его вообще использовать?



    Теперь по существу:
    Код (Text):
    1. @@Offsetz               label   byte


    Вам не кажется что логичнее было бы написать так:
    Код (Text):
    1. @@Offsetz               label   dword
     
  7. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    это программа лишь тестовая и использование ebp были обоснованы. Если использовать @@Offsetz label dword эфект остается темже.

    И всетаки мне непонятна природа этого "явления"
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    DeeoniS

    Где именно проявляется баг?
    Код (Text):
    1. ; GetAPIs
    2. push esi
    3. push edi
    4. call GetAPI
    5. pop edi
    6. pop esi
    7. stosd ; Тут?


    В этом месте по адресу _FindFirstFileA запишется двойное слово, которое возвращает GetAPI. Кстати, а это ничего что значение ECX изменяется в GetAPI?



    А где это записывается в секции кода?
     
  9. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    баг проявляется в основном модуле программы



    push 0h

    call _ExitProcess



    если _ExitProcess (и др) определено в .data, то вызов происходит по адресу 20746573, а если в .code то вызов правилен 73657420(точка входа в ExitProcess).



    сами ф-ии из gapi.asm 100% рабочии. ECX должен изменяться.

    Забыл одну вещь сказать, при перекомпиляции надо поставить атрибут секции кода чтоб писать можно было, по умолчанию ведь нельзя...



    2Quantum>А где это записывается в секции кода?

    этого вопроса не понял
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    DeeoniS



    Я могу найти только одно правдоподобное

    об"яснение : ты путаешь две "записи" :

    call adress

    и ее вид в виде последовательности

    байт, как данных.

    В этой последовательности адрес действительно

    вывернут "наизнанку" - это наследие 86-го

    при переходе от 8 к 16 битам, а потом уже и 32.
     
  11. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    запусти прогу в архиве и ты увидишь что когда делается call адреса из переменной _ExitProcess выкидывает ошибку что память не может быть "read"...
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Чудес в природе не бывает. Чтение и запись в память всегда выполняются одинаково независимо от того как обозвать секцию. Так что, если прога выдает ошибку, значит и есть ошибка в алгоритме - надо искать где, но лень ...



    PS: А вообще-то похоже все элементарно. Заглянув в Олю видим, что что wsprintf затирает все твои адреса и в итоге на момент call _ExitProcess на месте адреса лежит строка. В Win9х, так вообще получаем недопустимую операцию.
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Отладчиком надо пользоваться.

    73 65 74 20 - это совсем не адрес,

    а текст твоего сообщения :

    set is 79430000h..FindFirst

    "set " - 73-s 65-e 74-t 20- :)

    Поправь :

    buffer dd (длина/4)?

    Ты буфером все затер.
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Пока PS дописывал, valterg все разъяснил



    Вот только интересно, действительно мусор из текста совпал с зеркальной записью адреса, или это просто невнимательность (в 9х ес-но ничего общего, т.к. кернеловские адреса начинаются с BFF...)
     
  15. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    и точно буфер все затер... а я что-то на адрес особо внимания не обратил. Ну теперь точно зато такую ошибку не сделаю. Спасибо