例如调用函数funtest();
下图是反汇编窗口单步以后代码跳转到0x00411181。
(这是debug模式下的一个跳转表地址)
当前地址:00411181
当前代码硬编码:E9 FA 05 00 00
汇编代码:jmp
跳转的函数地址:funtest (0411780h)
在硬编码E9 FA 05 00 00中,
E9是jmp指令, 00 00 05 FA是跳转地址和当前代码地址的偏移
// 代码实现:取函数地址
unsigned char *pCode = NULL;
pCode = (unsigned char*)funtest;// 当前代码地址
printf("%当前代码地址:%08X\r\n", pCode);
int offset = *(int*)(pCode + 1);// 取数据 00 00 6B 6D(取偏移),因为当前位置的数据是E9也就是jmp指令所以+1
printf("%偏移:%08X\r\n", offset);
pCode = pCode + offset + 5;// 加5是跳转表硬编码的长度。(当前代码长度)
printf("%目标地址:%08X\r\n", pCode);
代码运行截图:
总结:目标地址 = 当前代码地址 + 偏移 + 当前代码长度