вообще используй дизасм движок коих в инете дофига, для определения целого числа инструкций которые заменяешь
Код (Text): 00552E40 $-E9 24062300 JMP vkbd.00783469 00552E45 90 NOP 00552E46 90 NOP 00552E47 90 NOP 00552E48 . 8B06 MOV EAX,DWORD PTR DS:[ESI] 00552E4A . 8B50 44 MOV EDX,DWORD PTR DS:[EAX+44] 00552E4D . 57 PUSH EDI без перехвата Код (Text): 00552E40 /$ 51 PUSH ECX 00552E41 |. 53 PUSH EBX 00552E42 |. 55 PUSH EBP 00552E43 |. 56 PUSH ESI 00552E44 |. 8B7424 14 MOV ESI,DWORD PTR SS:[ESP+14] 00552E48 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] 00552E4A |. 8B50 44 MOV EDX,DWORD PTR DS:[EAX+44] 00552E4D |. 57 PUSH EDI это с аргументом 8, первый джамп JMP vkbd.00783469 почему то приводит на 3 инструкции выше хэндлера Код (Text): 00783469 CC INT3 0078346A CC INT3 0078346B CC INT3 0078346C 8BFF MOV EDI,EDI 0078346E 55 PUSH EBP 0078346F 8BEC MOV EBP,ESP 00783471 837D 0C 00 CMP DWORD PTR SS:[EBP+C],0 00783475 74 09 JE SHORT vkbd.00783480 00783477 FF75 0C PUSH DWORD PTR SS:[EBP+C] 0078347A E8 11E3FFFF CALL vkbd.00781790 0078347F 59 POP ECX 00783480 837D 10 00 CMP DWORD PTR SS:[EBP+10],0 00783484 74 09 JE SHORT vkbd.0078348F 00783486 FF75 10 PUSH DWORD PTR SS:[EBP+10] 00783489 E8 02E3FFFF CALL vkbd.00781790 0078348E 59 POP ECX 0078348F 56 PUSH ESI 00783490 FF75 10 PUSH DWORD PTR SS:[EBP+10] 00783493 FF75 0C PUSH DWORD PTR SS:[EBP+C] 00783496 FF75 08 PUSH DWORD PTR SS:[EBP+8] 00783499 FF15 68427800 CALL DWORD PTR DS:[784268] 0078349F 68 E4167800 PUSH vkbd.007816E4 ; ASCII "True Function Called" 007834A4 8BF0 MOV ESI,EAX 007834A6 E8 E5E2FFFF CALL vkbd.00781790 007834AB 83C4 10 ADD ESP,10 007834AE 8BC6 MOV EAX,ESI 007834B0 5E POP ESI 007834B1 5D POP EBP 007834B2 C3 RETN
Код (Text): int __cdecl MystrOut(HDC hDC, LPCSTR a2, LPCSTR a3) { int ret; if (a2) DebugPrintF(a2); if (a3) DebugPrintF(a3); ret=pstrOut(hDC,a2,a3); DebugPrintF("True Function Called"); return ret; } вот обработчик
а вот переписаная функция Код (Text): bool SpliceBridgeAllProlog(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr,int prolog_size) { DWORD Protects= NULL; DWORD JA= NULL; BYTE* bridge= NULL; if(addr && new_addr) { //Create Bridge bridge=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE); VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects); memcpy(bridge, (LPVOID)addr, prolog_size); bridge[prolog_size]=0xE9; JA=addr-(DWORD)bridge-prolog_size; memcpy(&bridge[prolog_size+1],&JA,4); true_addr=(DWORD)bridge; //Patch Function BYTE *jmp=(BYTE*)VirtualAlloc(NULL,prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE); jmp[0]=0xE9; JA=(DWORD)new_addr - addr - prolog_size; memcpy(&jmp[1],&JA,4); memset(&jmp[5],0x90,prolog_size-5); if(memcpy((LPVOID)addr,jmp, prolog_size)) { VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects); return true; } } return false; }
Ну, Ё - прочитай еще раз #14 и #20: JA=addr-(DWORD)bridge-prolog_size; замени на JA=addr-bridge-5; и JA=(DWORD)new_addr - addr - prolog_size; замени на JA=new_addr - addr - 5;
Команда jmp лежит по адресу addr и тебе надо задать для нее такое смещение, чтобы попасть на адрес new_addr. Сама команда jmp занимает в памяти 5 байт (для нашего случая). Тогда смещение, которое нужно задать в команде jmp(см. #20) ,будет вычисляться так: смещение=new_addr-(addr+5)=new_addr-addr-5 где 5 - длина команды jmp (для нашего случая). Что не понятно?
punxer Взял краб захломил своими патчами, этот форум.. Сплайсинги нафиг никому не нужны, это отсталые способы контроля за кодом. Сейчас не актуально. Просто забудьте про это.
punxer Код (Text): .text:00552E40 .text:00552E40 ; =============== S U B R O U T I N E ======================================= .text:00552E40 .text:00552E40 .text:00552E40 ; int __cdecl strOut(HDC, LPCSTR, LPCSTR) .text:00552E40 strOut proc near .text:00552E40 .text:00552E40 .text:00552E40 var_4 = dword ptr -4 .text:00552E40 arg_0 = dword ptr 4 .text:00552E40 arg_4 = dword ptr 8 .text:00552E40 arg_8 = dword ptr 0Ch .text:00552E40 .text:00552E40 push ecx .text:00552E41 push ebx .text:00552E42 push ebp .text:00552E43 push esi .text:00552E44 mov esi, [esp+10h+arg_0] .text:00552E48 mov eax, [esi] .text:00552E4A mov edx, [eax+44h] .text:00552E4D push edi .text:00552E4E lea ecx, [esp+14h+arg_0] ; Load Effective Address .text:00552E52 push ecx .text:00552E53 push esi .text:00552E54 call edx ; Indirect Call Near Procedure Изменить ссылку на свой стаб в структуре, далее она будет вызвана кодом [.text:00552E54]. Типо сабклассинг.. Если нельзя изменить ссылку на калбэк, то можно использовать технику IDP. Вызываем двиг, передав в него ссыль и обрабатываем останов при доступе к ней. Далее можно дотрассировать до куда нужно.
punxer Большинство есчо видимо не доросло до техник, которые я сдесь описал, очень жаль. Тупо заменить ссылку - что есчо описывать ?