Mov DWord Ptr Ds:[xxx] - пожырает следующую за собой инструкцию.

Тема в разделе "WASM.ASSEMBLER", создана пользователем tagegor, 7 авг 2009.

  1. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    И снова здравствуйте, едва решив свою прошлую проблему, вылезла еще одна о_0
    Запускаю дебаггер, вижу:
    Код (Text):
    1. 005D908E > $ 68 3D905D00    PUSH GameServ.005D903D                                 ; /FileName = "research.dll"
    2. 005D9093   . FF15 F4BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>]           ; \LoadLibraryA
    3. 005D9099   . 68 5B905D00    PUSH GameServ.005D905B                                 ; /ProcNameOrOrdinal = "LeInit"
    4. 005D909E   . 50             PUSH EAX                                               ; |hModule
    5. 005D909F   . FF15 F0BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>]         ; \GetProcAddress
    6. 005D90A5   . FFD0           CALL EAX
    7. 005D90A7   .^E9 54FFFFFF    JMP GameServ.005D9000
    Начинаю выполнять пошагово, код преобразуется в:
    Код (Text):
    1. 005D908E > $ 68 3D905D00    PUSH GameServ.005D903D                                 ; /FileName = "research.dll"
    2. 005D9093   . FF15 F4BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>]           ; \LoadLibraryA
    3. 005D9099   . 68 5B905D00    PUSH GameServ.005D905B                                 ; /ProcNameOrOrdinal = "LeInit"
    4. 005D909E   . 50             PUSH EAX                                               ; |hModule
    5. 005D909F   . FF15 F0BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>]         ; \GetProcAddress
    6. 005D90A5   . 8000 E9        ADD BYTE PTR DS:[EAX],0E9
    7. 005D90A8   ? 00FF           ADD BH,BH
    8. 005D90AA   ? FFFF           ???                                                    ;  Unknown command
    Функция LeInit подменяет оффсет:
    Код (Text):
    1. LeInit Proc
    2.  Local OldProtect:DWord
    3.  Invoke VirtualProtect, 00401000H, 006B2FFFH, 40H, OldProtect
    4.  Mov DWord Ptr Ds:[401F91H],NewNPC
    5.  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
    6.  Ret
    7. LeInit EndP
    Дак вот, почему она изменяет последующие процедуры, и как от этого избавиться? о_0
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    005D90A5
    Mov DWord Ptr Ds:[401F91H],NewNPC
    Очень интересно. И как же это случилось.
    А вы уверены, что после инициализации LeInit это
    Код (Text):
    1. LeInit Proc
    2.  Local OldProtect:DWord
    3.  Invoke VirtualProtect, 00401000H, 006B2FFFH, 40H, OldProtect
    4.  Mov DWord Ptr Ds:[401F91H],NewNPC
    5.  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
    6.  Ret
    7. LeInit EndP
    и сообщение выскакивает?
     
  3. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Сообщение выскакивает
    Процедура по адресу 401F91H, принмает нужный вид :)
    Только одна "байда" что кушает процедуры после себя :dntknw:
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а ты попробуй исполнять ее с заходом в функцию. Когда ты делаешь прыжок через функцию, отладчик ставит инт3 на адрес возврата. Если функция меняет этот адрес, то будет конфликт с инт3.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Нужно передавать не значение OldProtect, а указатель - addr OldProtect
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Hardware breakpoints.
     
  7. slonik

    slonik New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    4
    вы ведь сами писали о ChangeThisCall в предыдущей теме своей, а тут зачем то делаете Mov DWord Ptr. изменяются последующие процедуры из того что создаваемая в результате использовании Mov DWord Ptr Ds: инструкция не совпадает по размеру байт с оригинальной из-за чего и происходит изменение нижеследующих байт а следовательно и "процедур". используйте свой же ChangeThisCall вместо Mov. например так Invoke ChangeThisCall, 401F91H, Offset NewNPC.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    slonik
    У него изменение "нижеследующих" происходит совсем в другом месте и причину я уже указал в #5 - в VirtualProtect передается не адрес переменной OldProtect, а ее значение, которое "по стечению обстоятельств" как раз и равно адресу инструкции call eax = адресу возврата из GetProcAddress. Вот по этому адресу сама VirtualProtect и записывает значение OldProtect, затирая call eax и часть jmp