Как использовать DetourAttach() для указателя на функцию в шестнадцатеричном формате?

Я пытаюсь сделать учебник, используя библиотеку обхода.

В более старой версии библиотеки обхода v1.5 функция DetourFunction использовалась для определения адреса, чтобы DLL знала, где искать функцию.

Например, его можно использовать следующим образом:

         InsertDateTime = (int (__stdcall*)(int))DetourFunction((PBYTE)0x01006F10,       (PBYTE)MyInsertDateTime)

см. http://www.moddb.com/groups/ibepex/tutorials/function-hooking

Однако в более новых версиях функция изменена на

     LONG DetourAttach(
        PVOID * ppPointer,
        PVOID pDetour
     );

где ppPointer — указатель на целевой указатель, к которому будет привязан обход.

Теперь, когда я знаю адрес целевой функции в шестнадцатеричном формате, 0x01006F10, я хочу каким-то образом использовать его в качестве аргумента для ppPointer. Я пытался просто написать:

               InsertDateTime = (int (__stdcall*)(int))DetourAttach((PVOID*)0x01006F10, MyInsertDateTime);

и компилируется нормально, но моя программа работает не так, как я думал. Кажется, что программа никогда не ловит функцию с этого адреса.

Итак, в основном мой вопрос заключается в том, правильно ли я использовал указатель на шестнадцатеричный адрес, и, во-вторых, есть ли у меня какие-то фундаментальные ошибки в том, как я использую DetourAttach()?


person Euklides    schedule 07.06.2013    source источник
comment
Вместо этого я настоятельно рекомендую использовать EasyHook... easyhook.codeplex.com   -  person TCS    schedule 07.06.2013


Ответы (1)


Вы используете DetourAttach неправильно. Правильное использование в вашем случае будет:

int(__stdcall* InsertDateTime)(int) = (int(__stdcall*)(int))(0x01006F10);

LONG errorCode = DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime);
if(!errorCode) {
    //Detour successful
}

Обратите внимание, что при наличии таких технологий, как ASLR; Вы должны использовать что-то вроде GetProcAddress для получения адреса функции во время выполнения, в противном случае вы можете вызвать повреждение или сбой.

person indeterminately sequenced    schedule 07.06.2013
comment
Во-первых, хороший ответ! Итак, первая строка, которую вы пишете, — это указатель на функцию с начальным адресом 0x01006F10. Я пытался сделать это, но все равно ничего не происходит, когда я активирую функцию с этим адресом. Я использую Winject для внедрения DLL в процесс. Теперь процесс, в который я пытаюсь внедрить функцию, — это 32-битный Блокнот. Есть ли шанс, что он будет использовать ASLR, чтобы адрес функции, который я нашел в IDA Pro, не был действительным? - person Euklides; 07.06.2013