всетакие я тупой. расскажите про call

Тема в разделе "WASM.BEGINNERS", создана пользователем La_plaza, 26 сен 2008.

  1. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    как вообще она прыгает ?
    в общем-то саму суть работы. Нет, я конечно пойму алгоритм работы, но непонима. как она прыгает ?
    только не отправляйте читать интелловский ман

    Код (Text):
    1. format pe gui
    2. include  'K:\1\fasmw16726\INCLUDE\win32ax.inc'
    3.  
    4. start:
    5. xor eax,eax
    6. call __2
    7. mov eax,10
    8. __2:
    9. xor ecx,ecx
    10. push NULL
    11. call [ExitProcess]
    12. .end start
    в результате:

    Код (Text):
    1. 00401000 >/$ 31C0           XOR EAX,EAX
    2. 00401002  |. E8 [b]05000000[/b]           CALL test.0040100C
    3. 00401007  |. B8 0A000000           MOV EAX,0A
    4. 0040100C  |$ 31C9                     XOR ECX,ECX
    5. 0040100E  |. 6A 00                     PUSH 0                                   ; /ExitCode = 0
    6. 00401010  \. FF15 3E204000  CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; \ExitProcess
    интересует то, что выделено
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    La_plaza
    E8 05000000 тут байты задом наперед, т.е. надо читать 00000005.
    Тогда получается 00401007 (это адрес инструкции следующей за call'ом) + 00000005 = 0040100C
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Чтоб посмотреть как компилится строчка кода проще юзать этот инклуд:
    http://www.wasm.ru/forum/viewtopic.php?pid=267555#p267555
     
  4. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    ясно, оно в коде просто расчитывает прыжки по размерам инструкций ? т.е вперед просчитывает и точно так же назад ? А если я допустим хочу переписать в коде прыжок на код находящийся в расширенной секции или в сделанной секции ? как тогда просчитывать прыжки ?
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    mov dword[0x00401002+1], hook-(0x00401002+5)
    hook:
    ...
     
  6. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    а обычным текстом ? всмысле обьясни не кодом
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    есть код
    Код (Text):
    1. aaa:jmp xxx
    2. aaa+5: ...
    надо поменять xxx на hook. Пишем в dword по адресу [aaa+1] разницу между адресом hook и адресом инструкции следующей за jmp xxx
    mov dword[aaa+1], hook-(aaa+5)
     
  8. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    мля:)
    давай так:

    адресс пяти байт: 401388
    адресс куда нужно прыгнуть: 401888
    кстати нужно еще выполнить сохраненные пять байт в секции .CODE и выпрыгнуть на .CODE_адресс пяти байт: 401388+пять собственно

    теперь обьясняй:)
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    установка перехвата
    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


    Если непонятно просто забей на это дело пока не осилиш асм %)