個hook function run左4000 iterations,然後crash?

本帖最後由 luckiejacky 於 2016-8-26 11:07 編輯

我已save左所有register before entry
restore when exit
應該可以同平時一樣禁行?
我用minhook

應該中間D functions改左個stack frame?


https://github.com/TsudaKageyu/minhook
  1. char __fastcall hooked_game_thunk(void* a1, void* a2)
  2. {       
  3.         try {
  4.                 __asm {
  5.                         pushad
  6.                 }

  7.                 DWORD mess = ((struct game_message*)a2)->Message_Base;
  8.                 stringstream oss;
  9.                 oss << mess << endl;
  10.                 logfile2->shared_print(0, oss.str());                 

  11.                 __asm {
  12.                         popad
  13.                 }

  14.                 return original_game_thunk(a1, a2);
  15.         }
  16.         catch (std::exception e)
  17.         {
  18.                 MessageBox(0, e.what(), e.what(), 0);
  19.                 return 0;
  20.         }
  21. }
複製代碼

有冇CHING知為何會throw exception, 如果無任何instruction
在subroutine start 去到tramp(a1,a2)
個program唔會crash,但一加一個MessageBox就會crash
  1. char __fastcall hooked_game_thunk(void* a1, void* a2)
  2. {        
  3. 5C56C9D0  push        ebp  
  4. 5C56C9D1  mov         ebp,esp  
  5. 5C56C9D3  sub         esp,0D8h  
  6. 5C56C9D9  push        ebx  
  7. 5C56C9DA  push        esi  
  8. 5C56C9DB  push        edi  
  9. 5C56C9DC  push        ecx  
  10. 5C56C9DD  lea         edi,[ebp-0D8h]  
  11. 5C56C9E3  mov         ecx,36h  
  12. 5C56C9E8  mov         eax,0CCCCCCCCh  
  13. 5C56C9ED  rep stos    dword ptr es:[edi]  
  14. 5C56C9EF  pop         ecx  
  15. 5C56C9F0  mov         dword ptr [a2],edx  
  16. 5C56C9F3  mov         dword ptr [a1],ecx      
  17.          

  18.         //Assembly
  19.         __asm
  20.         {
  21.                 push 0
  22. 5C56C9F6  push        0  
  23.                 push eax
  24. 5C56C9F8  push        eax  
  25.                 push eax
  26. 5C56C9F9  push        eax  
  27.                 push 0
  28. 5C56C9FA  push        0  
  29.                 call MessageBox
  30. 5C56C9FC  call        dword ptr [__imp__MessageBoxA@16 (5C58636Ch)]  
  31.                  
  32.         }

  33.          
  34.        
  35.         return tramp(a1, a2);
  36. 5C56CA02  mov         esi,esp  
  37. 5C56CA04  mov         edx,dword ptr [a2]  
  38. 5C56CA07  mov         ecx,dword ptr [a1]  
  39. 5C56CA0A  call        dword ptr [tramp (5C585174h)]  
  40. 5C56CA10  cmp         esi,esp  
  41. 5C56CA12  call        __RTC_CheckEsp (5C56159Bh)  
  42. }
複製代碼

TOP

Okay, this works
  1. __asm
  2.         {
  3.                
  4.                 pushad

  5.                 push 0
  6.                 push eax
  7.                 push eax
  8.                 push 0
  9.                 // stdcall, callee cleans up
  10.                 call MessageBox
  11.                  
  12.                 popad
  13.         }
  14.        
  15.          
  16.         // pass on stack, so wrong, must be passed on registers
  17.         return tramp();
複製代碼

TOP