Сплайсинг вычисление адреса

Тема в разделе "WASM.WIN32", создана пользователем XshStasX, 23 янв 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    нужно сделать jmp c адреса 0x00840007 на 0x7d4d14e7 считаю так:

    Код (Text):
    1. LONG_PTR ADDR(LONG_PTR a,LONG_PTR b){
    2.     return  (a-b-5);
    3. };
    на выходе получаю: 0x8336eb1b
    В итоге такой код:
    Код (Text):
    1. 00840007  E9 1B EB 36 83   jmp         83BAEB27
    И он почему то прыгает на 0x83BAEB27 а не, 0x7d4d14e7?

    для адресов: 0x1002be1a 0x7d4d14e0
    результат: 0x92b5a935
    код:
    Код (Text):
    1. 7D4D14E0 E9 35 A9 B5 92   jmp         1002BE1Ah
    то есть то что нужно...

    ......
    пока не написал сообщение на форуме, так ошибки и не видел....
    нужно местами сменить было параметры...
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Потому что 0x840007 + 0x8336EB1B + 5 = 0x83BAEB27
    Потому что 0x92B5A935 + 0x7D4D14E0 + 5 = 0x11002BE1A
    Всё логично.

    Смотрите что из чего вычитаете и с какого на какой адрес прыгаете.
     
  3. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    #define JMP_SIZE 5

    void CreateJMP(DWORD at, DWORD to)
    {
    DWORD dwOldProtect;

    VirtualProtect((LPVOID)at, JMP_SIZE, PAGE_EXECUTE_READWRITE, &dwOldProtect);
    *(BYTE*)(at) = 0xE9;
    *(DWORD*)(at+1) = to - (at + JMP_SIZE);
    VirtualProtect((LPVOID)at, JMP_SIZE, dwOldProtect, &dwOldProtect);
    }

    //...
    CreateJMP(0x00840007, 0x7d4d14e7);
    //...