Как перехватить функции C ++ с помощью asm - PullRequest
3 голосов
/ 28 августа 2011

Я хочу подключить функцию C ++.Но я не хочу использовать батутный механизм обхода мс, вместо этого я хочу полностью его залатать.Я могу получить дескриптор к DLL, где находится функция, и у меня есть правильное смещение (imageBase материал ...).Так как это зацепить?И я не знаю типы данных аргументов (var_4 и arg_0), или они не нужны?В общем, я хочу заменить следующую функцию своей собственной (моя функция почти такая же, изменилась только строка):

sub_39001A40    proc near

    var_4       = dword ptr -4
    arg_0       = dword ptr  4
        push    ecx
        cmp dword_392ADAB4, 0
        jnz short loc_39001A4F
        call    loc_39024840

loc_39001A4F:
        push    esi
        mov esi, [esp+8+arg_0]
        lea eax, [esp+8+var_4]
        push    eax
        push    esi
        call    dword_392ADA98
        mov ecx, [esp+10h+var_4]
        add esp, 8
        add dword_392ADA80, ecx
        adc dword_392ADA84, 0
        add dword_392ADA90, esi
        pop esi
        adc dword_392ADA94, 0
        add dword_392ADA7C, 1
        pop ecx
        retn
sub_39001A40    endp

Плохо, что я могу перехватывать только те функции, имена которых я знаюс обходом мс.Я не могу подключить эти asm-функции к обходным путям, потому что мне нужны типы данных аргументов, передаваемых для создания структур функций!

EDIT ::::

"Что именно с обходными путями, точно?«

Я написал:« Я не хочу использовать батутный механизм обхода мс, вместо него я хочу полностью его залатать ».и "Плохо, что я могу только перехватывать функции, имена которых я знаю с обходом ms. Я не могу перехватить эти функции asm с обходами, потому что мне нужны типы данных аргументов, передаваемых для создания структур функций!"и у меня нет исходного кода файлов C ++.У меня есть только шестнадцатеричный дамп.

«Батут - это технический термин :) Мне просто интересно, почему @lua не может его использовать».

Я пишу: Прочитайте мои предложенияОпять же, если вы все еще не понимаете, почему, мой английский плохой.

"Переопределение только названной функции должно работать, конечно, вам может понадобиться повторно реализовать всю DLL (в зависимости от того,дальнейшее использование для вас). Учитывая ваше понимание ассемблера, вы можете использовать шестнадцатеричный редактор для редактирования (копии) исходной DLL, которую вы хотите подорвать. "

Я хочу подключить функциюпотому что я не хочу редактировать файл.Я не могу перезаписать свою функцию, потому что не знаю типов данных аргументов и названия функции.

@ asveikau: Спасибо за вашу реальную помощь, но я не хочу использовать батутный механизмЯ хочу перезаписать функцию.

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Хорошая уловка - заменить первые несколько инструкций на:

push dword xxxx ; where xxx = new code location
ret

Это похоже на запутанный jmp. Я пишу это так, потому что собранную версию этого очень легко заменить операндом push указателем во время выполнения. Он собирается до:

68 XX XX XX XX c3

Где "XX XX XX XX" - ваш адрес в младшем порядке.

Затем вы можете сделать местоположение кода «вызвать старую версию функции», где первые несколько инструкций - это те, которые вы заменили приведенной выше последовательностью, а затем перейти к следующей действительной инструкции в исходном коде. 1011 *

0 голосов
/ 28 августа 2011

Переопределение только названной функции должно работать, конечно, вам может понадобиться повторно реализовать всю DLL (в зависимости от того, будет ли она вам полезна).Учитывая ваше понимание ассемблера, вы можете использовать шестнадцатеричный редактор для редактирования (копии) исходной DLL, которую вы хотите испортить.

...