标签:name 读取 sof iss 方法 sub 调试 div val
这里能够简单的改动随意函数的返回地址。能够做到自己定义EIP的指向,就可以运行当前进程空间的随意指令,这里仅仅是让大家更清楚栈帧结构,没有涉及跨进程的inline HOOK 等,后面会陆续讲下读取随意进程内存。改动随意进程函数运行流程等方法。
废话不多说了,直接上菜:
#include <stdio.h>
#include <windows.h>
/*
打印 main函数的返回地址的值(用途,你懂得!)
所需知识:函数栈帧结构
C调用约定,自右向左压栈
push argv
push argc
call main ; jmp main
main:
push ebp
mov ebp, esp
sub esp, 0x4 ; 0x4 == sum (sizeof(type) * count)
栈中:
argv
argc ; new ebp + 8
eip ; main ret 地址 == new ebp + 4
ebp ; old ebp value, new ebp postation
i ; i 局部变量 == new ebp - 4
*/
int main(int argc, char* argv[])
{
int i = 0; // ebp - 4
__asm {
mov eax, [ebp + 4]
mov i, eax
}
printf("%08x\n",i);
printf("%p\n", *(DWORD*)(((DWORD)&argc) - 4));
printf("%p\n", *(DWORD*)(((DWORD)&i) + 8));
return 0;
}
还有以下的调试图。一目了然:
三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)
标签:name 读取 sof iss 方法 sub 调试 div val
原文地址:http://www.cnblogs.com/wzzkaifa/p/6883868.html