2013-05-09 170 views
0

我想掛鉤一個x86可執行的函數。這就是函數原型與六角射線插件反編譯爲IDA:掛鉤一個_userpurge函數C++

int __userpurge sub_43CE70<eax>(int a1<eax>, int a2, char a3, int a4, int a5, int a6) 

所以函數是EAX的接受作爲第一個參數,並返回到相同的寄存器。

我嘗試了以下功能的包裝:

int the_wrapper(int a2, unsigned a3, int a4, int a5, int a6) 
{ 
    int a1; 
    _asm 
    { 
     mov [a1], eax 
    }; 
    char bString[50]; 
    sprintf(bString,"a1: %u, a2: %u, a3: %d, a4: %d, a5: %d, a6: %d",a1,a2,a3,a4,a5,a6); 
    logs(bString); 
    int rtn; 
    _asm{ 
     push a6 
     push a5 
     push a4 
     push a3 
     push a2 
     mov eax, [a1] 
     call the_function 
     mov [rtn], eax 
    }; 
    return rtn; 
} 

由於某種原因,它不工作,每次墜毀的函數被調用。

回答

0

您需要聲明您的包裝與您試圖包裝的功能相同calling convention

根據約定(最常見的是cdeclstdcall,但它也取決於包裝代碼的編譯器),它是清理堆棧的調用者或被調用者。如果你不使用正確的約定,你很容易堆棧損壞和崩潰。