есть проблема. необходимо переписать функцию в DLL-ке, так, чтобы передавала управление другой ф-ции в другой DLL-ке, возвращала бы то значение, которое возвращает функция. Путем проб и ошибок пришел к следующему варианту (листинг IDA) Код (Text): .text:BFB78D5A public ImageList_DrawIndirect .text:BFB78D5A ImageList_DrawIndirect proc near ; CODE XREF: ImageList_DrawEx+55vp .text:BFB78D5A ; ImageList_Draw+4Evp ... .text:BFB78D5A .text:BFB78D5A arg_0 = dword ptr 8 .text:BFB78D5A arg_8 = dword ptr 10h .text:BFB78D5A arg_10 = dword ptr 18h .text:BFB78D5A arg_14 = dword ptr 1Ch .text:BFB78D5A arg_18 = dword ptr 20h .text:BFB78D5A arg_1C = dword ptr 24h .text:BFB78D5A arg_20 = dword ptr 28h .text:BFB78D5A arg_24 = dword ptr 2Ch .text:BFB78D5A arg_28 = dword ptr 30h .text:BFB78D5A arg_34 = dword ptr 3Ch .text:BFB78D5A .text:BFB78D5A push ebp .text:BFB78D5B mov ebp, esp .text:BFB78D5D sub esp, 40h .text:BFB78D60 nop .text:BFB78D61 push esi .text:BFB78D62 mov esi, [ebp+arg_0] .text:BFB78D65 nop .text:BFB78D66 push dword ptr [esi+4] .text:BFB78D69 push offset aLibName .text:BFB78D6E call ds:LoadLibraryA .text:BFB78D74 push offset aImagelist_draw ; "IMAGELIST_DRAWINDIRECTHACK" .text:BFB78D79 push eax .text:BFB78D7A call ds:GetProcAddress .text:BFB78D80 mov [esi], eax .text:BFB78D82 test eax, eax .text:BFB78D84 mov eax, 0 .text:BFB78D89 jz loc_BFB7935E .... .text:BFB78D94 push [ebp+arg_34] .text:BFB78D97 push [ebp+arg_28] .text:BFB78D9A push [ebp+arg_24] .text:BFB78D9D push [ebp+arg_20] .text:BFB78DA0 push [ebp+arg_1C] .text:BFB78DA3 push [ebp+arg_18] .text:BFB78DA6 push [ebp+arg_14] .text:BFB78DA9 push [ebp+arg_10] .text:BFB78DAC push dword ptr [ebp+14h] .text:BFB78DAF push [ebp+arg_8] .text:BFB78DB2 push dword ptr [ebp+0Ch] .text:BFB78DB5 push [ebp+arg_0] .text:BFB78DB8 nop .text:BFB78DB9 call dword ptr [esi] .text:BFB78DBB jmp loc_BFB7935C .... .text:BFB7935C loc_BFB7935C: ; CODE XREF: ImageList_DrawIndirect+61^j .text:BFB7935C xor eax, eax .text:BFB7935E .text:BFB7935E loc_BFB7935E: ; CODE XREF: ImageList_DrawIndirect+2F^j .text:BFB7935E pop eax .text:BFB7935F pop esi .text:BFB79360 cwde .text:BFB79361 leave .text:BFB79362 retn 4 так вот, данный вариант работает, функция принимает и возвращает все нормально, но в некоторых случаях все рушится с ошибкой в kernel32... если удалить dll-ку вообще, ошибки не происходит. Если dll-ку сделать "пустой", ошибка есть - значит ошибка в этом коде. У кого-нибудь есть предположения? А то я в асме не очень...
хотя стоп... понял, создать dll-ку, которая будет функции передавать настоящей? это не катит к сожалению, слишком тяжело переписать все функции, не имея исходников библиотеки.
Я же сказал "forwarding" а не "враппер". Читаешь доку по формату таблицы экспорта, и в подопытной dll правишь имя функции в таблице экспорта так чтобы она форвардилась на другую dll и другую функцию. В случае одной функции это можно и ручками за пару минут в hex-редакторе вколотить. И будут все модули использующии эту либу получать вместо оригинальной функции липовую из другой длл.
Хм... К сожалению, не прокатило. Поменял указатель в таблице экспорта, ничего не поменялось. Подозреваю, что проблема в том, что библиотека слита с парной 16-битной или у меня чересчур кривые руки..
Только это LibName.FuncName должно быть в пределах таблицы экспорта (rva + размер) иначе это будет считаться именем функции И кстати это будет работать только под NT.
Не, в документации писали что работает и в Windows 9x. К тому же адрес я переписал, а функция продолжает работать-значит она берет адрес этой функции где-либо еще. Ну так мог бы кто-нибудь написать функцию подобную вышенаписанной?
Хм. Вот то, что все-таки получилось и работает: push offset DllName call LoadLibraryA ;KERNEL32.dll push offset ProcName push eax call GetProcAddress ;KERNEL32.dll jmp eax Это стоило 3-х дней гемора - а так просто!!!