typedef struct tagBtCode
{
DWORD dwTemp[2];
DWORD ContinueJumpAddr;
BYTE nop_code[0x4];
BYTE JumpCode[0xc];
}BtCode,*lpBtCode;
inline DWORD GetParamAddr(LPVOID lpParam)
{
_asm mov eax,lpParam;
}
DWORD func(void)
{
BtCode *code=NULL;
BYTE *lpAddr=NULL;
memset(code->nop_code,0x90,sizeof(code->nop_code));
memset(code->JumpCode,0x90,sizeof(code->JumpCode));
lpAddr=(BYTE*)::VirtualAlloc (0,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE );
if(lpAddr==NULL)return 0;
code=(BtCode*)lpAddr;
code->ContinueJumpAddr=xxxxx;//存放返的地址
lpAddr=code->JumpCode ;
*(WORD*)lpAddr=0x016a;//push 1
*(WORD*)(lpAddr+2)=0x25ff;
*(DWORD*)(lpAddr+4)=::GetParamAddr (&code->ContinueJumpAddr);//Jmp dword ptr ds:[&code->ContinueJumpAddr];
_asm{
push lpAddr;
pop eax;
}
}
函数的返回值:0xf150010
反汇编中看到:
0f15000f 6A01 push 01 ;
0f150011 FF250800150F jmp dword ptr [f150008]
发现 push 1这一句的地址和上面这个函数的返回值少1
谁帮解释一下是怎么回事?
[培训]科锐逆向工程师培训第53期2025年7月8日开班!