OS:XP SP3
编译器: DEV C++ 4.9.9.2
工具:
OD (ollydbg)
大家可以去先查询一下 组合语言(32位元)方面的知识,然後至少要了解 stack区常用的指令 PUSH 跟 POP,与EIP寄存器 不用了解全部章节。
#include <stdio.h>
#include <stdlib.h>
void func(void);
//全域变数
int g1=0;
int g2=1;
int main()
{
//区域变数
int a=2;
int b=3;
func();
system("pause");
return 0;
}
void func(void)
{
//区域变数
int x=7;
int y=8;
}
关於组合语言的知识一偏文肯定讲不完。所以这次给大家简单的方式说明。
stack 区域是一个公共空间,任何函数都可以使用,但是每个函数都有自己的空间,所以使用前,要先规定自己的基底,这个基底的标记就是 寄存器(EBP)。
函数的基底 EBP 规划好後 可以开始往上占领其他空间了。
而这个工作需要交给寄存器 (ESP)
你可以先在 main 函数 里面随便找个地方 按F2设中断 然後F9执行 接下来一直F7走过每一条指令透过观察发现,esp 一直在变动。 ebp 则不会。
1.Ctrl + F2 重新载入
2.找到 main 函数 调用 func函数(call)那行按下F2
3.找到 func 函数 LEAVE 那行按下F2
4.按下F9 跑到 main函数的中断 观察 stack 区
可以看到 EBP 到 ESP 的空间 就是目前函数正在使用的空间
5.在按下F9就会跑到 func函数的中断 观察 stack 区
leave = mov esp,ebp ### pop ebp
retn = pop eip
这两条指令又称为 Function Epilogue 也就是函数的结尾,目的是在释放自己的领土,然後归还给 main 函数
push ebp # 储存 main数的 ebp到堆叠
mov ebp,esp # 规划自己的基底
call 推入下一行(004012CD)到堆叠
push ebp # 储存 main数的 ebp到堆叠
mov ebp,esp # 规划自己的基底
leave = mov esp,ebp (释放自己的领土回到基底) ### pop ebp (归还 main的ebp)
retn = pop eip (回到004012CD)
如果有任何问题欢迎指教,谢谢。
<<: 透过 Composer 安装、更新、移除 PHP 套件或框架(PHP, Composer套件管理)
Hello 大家, 今天介绍一个官方的捷径, 这个捷径是针对图片资讯中的“位置”来查找照片拍摄的地方...
影像中的杂讯真的让人看了很不顺眼!好想把上面那些小白点、小黑点拿掉! 这时候滤波器就派上用场了~~~...
目前Android Studio预设的布局是ConstraintLayout 它的效能比起其他布局还...
前言 背景是一个如此重要的东西,你能想像萤幕的话棉全都是白底或黑底吗!!当然不行啊!! backgr...
如标题,这篇想教大家如何修改phpMyAdmin的帐号密码 因为phpMyAdmin的预设是不用输入...