我正在使用Visual Studio的/Gh和/GH编译器选项来分析一些代码。所使用的两种方法是_penter和_pexit,用于在被分析的代码中进入或退出函数时调用。由于我需要对特定的函数进行分析/调试,我使用一个已经定义好的数组FuncTable,其中包含了我需要添加名称及地址的函数。因此,当进入函数时,pStack[0]基本上包含寄存器内容,其中包含正在执行代码的当前行的地址。同样地,当退出函数时,pStack[0]包含最后一行代码的地址。
问题:当进入函数时(调用_penter),我在pStack[0]中获得函数第一行的地址,因此我可以通过减去常数-5来获得函数的地址,并将其保存到我的列表中以便稍后在_pexit函数中检索。但由于在_pexit中我得到的是函数的最后一行的地址,所以我需要找到函数的大小,以便从pStack[0]中减去该大小以达到函数的起始地址,然后将该地址与保存在我的列表中的地址进行比较。以下是代码复制。
问题:当进入函数时(调用_penter),我在pStack[0]中获得函数第一行的地址,因此我可以通过减去常数-5来获得函数的地址,并将其保存到我的列表中以便稍后在_pexit函数中检索。但由于在_pexit中我得到的是函数的最后一行的地址,所以我需要找到函数的大小,以便从pStack[0]中减去该大小以达到函数的起始地址,然后将该地址与保存在我的列表中的地址进行比较。以下是代码复制。
void _stdcall EnterFunc0(unsigned * pStack)
{
void * pCaller;
pCaller = (void *)(pStack[0] - 5); // pStack[0] is first line, -5 for function address
Signature * funct = FuncTable;
while (funct->function)
{
const BYTE * func = (const BYTE *)funct->function;
if ((func == (const BYTE *)pCaller) || ((*func == 0xE9) && ((func + *(DWORD *)(func + 1) + 5) == (const BYTE *)pCaller)))
{
Stack_Push(funct->name, funct->returnType, true, pCaller);
}
funct++;
}
}
extern "C" __declspec(naked) void __cdecl _penter()
{
_asm
{
pushad // save all general purpose registers
mov eax, esp // current stack pointer
add eax, 32 // stack pointer before pushad
push eax // push pointer to return address as parameter to EnterFunc0
call EnterFunc0
popad // restore general purpose registers
ret // start executing original function
}
}
void _stdcall ExitFunc0(unsigned * pStack)
{
if (startRecording)
{
StackEntry * start = top;
while (start != NULL)
{
//**HERE I NEED TO COMPARE THE ADDRESS OF THE FUNCTION WITH THE ONE ALREADY IN MY STACK**
if ((void *)(pStack[0] - sizeOfTheFunction) == start->Address)
{
OutputDebugString("Function Found\n");
}
start = start->next;
}
}
}
extern "C" __declspec(naked) void __cdecl _pexit()
{
_asm
{
pushad // save all general purpose registers
mov eax, esp // current stack pointer
add eax, 32 // stack pointer before pushad
push eax // push pointer to return address as parameter to EnterFunc0
call ExitFunc0
popad // restore general purpose registers
ret // start executing original function
}
}
extern "C"
并不是合法的C语言,而是另一种语言C++。请使用正确的标签。 - too honest for this site