как вообще она прыгает ? в общем-то саму суть работы. Нет, я конечно пойму алгоритм работы, но непонима. как она прыгает ? только не отправляйте читать интелловский ман Код (Text): format pe gui include 'K:\1\fasmw16726\INCLUDE\win32ax.inc' start: xor eax,eax call __2 mov eax,10 __2: xor ecx,ecx push NULL call [ExitProcess] .end start в результате: Код (Text): 00401000 >/$ 31C0 XOR EAX,EAX 00401002 |. E8 [b]05000000[/b] CALL test.0040100C 00401007 |. B8 0A000000 MOV EAX,0A 0040100C |$ 31C9 XOR ECX,ECX 0040100E |. 6A 00 PUSH 0 ; /ExitCode = 0 00401010 \. FF15 3E204000 CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; \ExitProcess интересует то, что выделено
La_plaza E8 05000000 тут байты задом наперед, т.е. надо читать 00000005. Тогда получается 00401007 (это адрес инструкции следующей за call'ом) + 00000005 = 0040100C
Чтоб посмотреть как компилится строчка кода проще юзать этот инклуд: http://www.wasm.ru/forum/viewtopic.php?pid=267555#p267555
ясно, оно в коде просто расчитывает прыжки по размерам инструкций ? т.е вперед просчитывает и точно так же назад ? А если я допустим хочу переписать в коде прыжок на код находящийся в расширенной секции или в сделанной секции ? как тогда просчитывать прыжки ?
есть код Код (Text): aaa:jmp xxx aaa+5: ... надо поменять xxx на hook. Пишем в dword по адресу [aaa+1] разницу между адресом hook и адресом инструкции следующей за jmp xxx mov dword[aaa+1], hook-(aaa+5)
мля давай так: адресс пяти байт: 401388 адресс куда нужно прыгнуть: 401888 кстати нужно еще выполнить сохраненные пять байт в секции .CODE и выпрыгнуть на .CODE_адресс пяти байт: 401388+пять собственно теперь обьясняй
установка перехвата mov ebx, 0x401388 mov eax, [ebx+1] lea eax, [eax+ebx+5] mov [OriginalAddr],eax mov dword[ebx+1], hook-(0x401388+5) ;org 401888 hook: ... ;код перехвата jmp [OriginalAddr] OriginalAddr dd ? Или если известен оригинальный адрес, то mov dword[0x401388+1], hook-(0x401388+5) ;org 401888 hook: ... ;код перехвата jmp OriginalAddr Если непонятно просто забей на это дело пока не осилиш асм %)