Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› помогите со сплайсом нестандартного пролога (длина !=5)
Посл.ответ Сообщение

Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 01 июня 2010 08:56 · Поправил: punxer
· Личное сообщение · #1

Code:
  1. bool SpliceBridgeAllProlog(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr,int prolog_size) 
  2.          DWORD Protects=   NULL;
  3.          DWORD JA=                     NULL;
  4.          BYTE* bridge=       NULL;
  5.          if(addr && new_addr) 
  6.          { 
  7.                  //Create Bridge
  8.                  bridge=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUT  E_READWRITE);
  9.                  VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);
  10.                  
  11.                  memcpy(bridge, (LPVOID)addr,  prolog_size);
  12.                  bridge[prolog_size]=0xE9;
  13.                  JA=addr-(DWORD)bridge-prolog_size;
  14.                  memcpy(&bridge[prolog_size+1],&JA,4);
  15.                  
  16.                  true_addr=(DWORD)bridge;
  17.                  
  18.                  //Patch Function
  19.                  BYTE *jmp=(BYTE*)VirtualAlloc(NULL,prolog_size,MEM_COMMIT,PAGE_EXECUTE_READ WRITE);
  20.                  jmp[0]=0xE9;
  21.  
  22.                  JA=(DWORD)new_addr - addr - prolog_size;
  23.                  memcpy(&jmp[1],&JA,4);
  24.                  memset(&jmp[5],0x90,prolog_size-5);
  25.                  if(memcpy((LPVOID)addr,jmp, prolog_size)) 
  26.                  { 
  27.                         VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
  28.                         return true;
  29.                  }
  30.          } 
  31. return false;
  32. }

вот функция что нужно перехватить
Code:
  1.  
  2. .text:00552E40
  3. .text:00552E40 ; =============== S U B R O U T I N E =======================================
  4. .text:00552E40
  5. .text:00552E40
  6. .text:00552E40 ; int __cdecl strOut(HDC, LPCSTR, LPCSTR)
  7. .text:00552E40 strOut          proc near             
  8. .text:00552E40                                        
  9. .text:00552E40
  10. .text:00552E40 var_4           = dword ptr -4
  11. .text:00552E40 arg_0           = dword ptr  4
  12. .text:00552E40 arg_4           = dword ptr  8
  13. .text:00552E40 arg_8           = dword ptr  0Ch
  14. .text:00552E40
  15. .text:00552E40                 push    ecx
  16. .text:00552E41                 push    ebx
  17. .text:00552E42                 push    ebp
  18. .text:00552E43                 push    esi
  19. .text:00552E44                 mov     esi, [esp+10h+arg_0]
  20. .text:00552E48                 mov     eax, [esi]
  21. .text:00552E4A                 mov     edx, [eax+44h]
  22. .text:00552E4D                 push    edi
  23. .text:00552E4E                 lea     ecx, [esp+14h+arg_0] ; Load Effective Address


при передаче длины пролога 5 падает на вызове оригинала в хэндлере при правильной передаче 8 прыжок происходит на 3 инструкции выше хэндлера

это с аргументом 8, первый джамп JMP vkbd.00783469 почему то приводит на 3 инструкции выше хэндлера
Code:
  1. Код:
  2. 00552E40   $-E9 24062300    JMP vkbd.00783469
  3. 00552E45     90             NOP
  4. 00552E46     90             NOP
  5. 00552E47     90             NOP
  6. 00552E48   . 8B06           MOV EAX,DWORD PTR DS:[ESI]
  7. 00552E4A   . 8B50 44        MOV EDX,DWORD PTR DS:[EAX+44]
  8. 00552E4D   . 57             PUSH EDI
  9.  
  10. без перехвата
  11. Код:
  12. 00552E40  /$ 51             PUSH ECX
  13. 00552E41  |. 53             PUSH EBX
  14. 00552E42  |. 55             PUSH EBP
  15. 00552E43  |. 56             PUSH ESI
  16. 00552E44  |. 8B7424 14      MOV ESI,DWORD PTR SS:[ESP+14]
  17. 00552E48  |. 8B06           MOV EAX,DWORD PTR DS:[ESI]
  18. 00552E4A  |. 8B50 44        MOV EDX,DWORD PTR DS:[EAX+44]
  19. 00552E4D  |. 57             PUSH EDI
  20.  
  21.  
  22.  
  23. Хэндлер
  24. 00783469   CC               INT3
  25. 0078346A   CC               INT3
  26. 0078346B   CC               INT3
  27. 0078346C   8BFF             MOV EDI,EDI
  28. 0078346E   55               PUSH EBP
  29. 0078346F   8BEC             MOV EBP,ESP
  30. 00783471   837D 0C 00       CMP DWORD PTR SS:[EBP+C],0
  31. 00783475   74 09            JE SHORT vkbd.00783480
  32. 00783477   FF75 0C          PUSH DWORD PTR SS:[EBP+C]
  33. 0078347A   E8 11E3FFFF      CALL vkbd.00781790
  34. 0078347F   59               POP ECX
  35. 00783480   837D 10 00       CMP DWORD PTR SS:[EBP+10],0
  36. 00783484   74 09            JE SHORT vkbd.0078348F
  37. 00783486   FF75 10          PUSH DWORD PTR SS:[EBP+10]
  38. 00783489   E8 02E3FFFF      CALL vkbd.00781790
  39. 0078348E   59               POP ECX
  40. 0078348F   56               PUSH ESI
  41. 00783490   FF75 10          PUSH DWORD PTR SS:[EBP+10]
  42. 00783493   FF75 0C          PUSH DWORD PTR SS:[EBP+C]
  43. 00783496   FF75 08          PUSH DWORD PTR SS:[EBP+8]
  44. 00783499   FF15 68427800    CALL DWORD PTR DS:[784268]
  45. 0078349F   68 E4167800      PUSH vkbd.007816E4                       ; ASCII "True Function Called"
  46. 007834A4   8BF0             MOV ESI,EAX
  47. 007834A6   E8 E5E2FFFF      CALL vkbd.00781790
  48. 007834AB   83C4 10          ADD ESP,10
  49.  


при аргументе 5 в хэндлери заходит но портит перехватываемую функцию


вот обработчик

Code:
  1. int __cdecl MystrOut(HDC hDC, LPCSTR a2, LPCSTR a3)
  2. {
  3.          int ret;
  4.          if (a2)
  5.                  DebugPrintF(a2);
  6.          if (a3)
  7.                  DebugPrintF(a3);
  8.          ret=pstrOut(hDC,a2,a3);
  9.          DebugPrintF("True Function Called");
  10.          return ret;
  11. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 01 июня 2010 09:05
· Личное сообщение · #2

вот решение. ЗАКРЫВАЙТЕ.

Code:
  1. bool SpliceBridgeAllProlog(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr,int prolog_size) 
  2.          DWORD Protects=   NULL;
  3.          DWORD JA=                     NULL;
  4.          BYTE* bridge=       NULL;
  5.          if(addr && new_addr) 
  6.          { 
  7.                  //Create Bridge
  8.                  bridge=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUT  E_READWRITE);
  9.                  VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);
  10.                  
  11.                  memcpy(bridge, (LPVOID)addr,  prolog_size);
  12.                  bridge[prolog_size]=0xE9;
  13.                  JA=addr-(DWORD)bridge-5;
  14.                  memcpy(&bridge[prolog_size+1],&JA,4);
  15.                  
  16.                  true_addr=(DWORD)bridge;
  17.                  
  18.                  //Patch Function
  19.                  BYTE *jmp=(BYTE*)VirtualAlloc(NULL,prolog_size,MEM_COMMIT,PAGE_EXECUTE_READ WRITE);
  20.                  jmp[0]=0xE9;
  21.  
  22.                  JA=(DWORD)new_addr - addr - 5;
  23.                  memcpy(&jmp[1],&JA,4);
  24.                  memset(&jmp[5],0x90,prolog_size-5);
  25.                  if(memcpy((LPVOID)addr,jmp, prolog_size)) 
  26.                  { 
  27.                         VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
  28.                         return true;
  29.                  }
  30.          } 
  31. return false;
  32. }





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 01 июня 2010 09:22
· Личное сообщение · #3

Автор и сам может закрыть, кнопка Закрыть тему под кнопкой Отправить сообщение.


 eXeL@B —› Программирование —› помогите со сплайсом нестандартного пролога (длина !=5)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати