前言
今天继续画堆栈图,今天的比上一节画的又多了一点东西,调用的函数里面有局部变量的(不知道局部变量的,等学完C语言再回头看这篇文章吧)。
说明:这节课相关的源码和exe执行程序已经放网盘,地址放在文末。
有粉丝问本id是怎么找到函数的入口的那个地址的,这个真不好讲,要讲好这个还要讲windows的调用机制,也就是操作系统怎么把我们的程序运行起来的。不过即使不了解这些,在OD上也有一些技巧找到main函数的入口。找XXX.exit,找到后,往前找call,这样很容易找到main的call函数。当然,如果想学,有时间可以按F7,进入每一个call函数去看看。
具体步骤
1、把下载的yiDaChengXuYuan_stack3.exe拖到OD中打开。按Ctrl + G,在弹出的对话框中输入“401098”,在定位到的行按F2设置断点,然后点击上方蓝色的小三角按钮,让程序运行到刚设置的断点处。
2、根据OD中的内容绘制调用函数前的堆栈情况。
绘制的堆栈图。(为节省空间,栈顶、底之间的空间就用一个格表示)。
3、下面二个指令:PUSH 3,PUSH 1,入栈。(都画过两次了,就不再说那么详细了。)
按F8运行这两条指令后的结果。
4、下一条是call指令,这条指令执行后会把call的下一条指令压入栈中,
按F7运行的结果。
5、下一条指令是,JMP指令,直接按F8运行。
6、下一条指令是:PUSH EBP,该指令把当前的栈底压入栈中。
按F8运行的结果如下。
7、下一条指令是:MOV EBP,ESP,修改栈底。
按F8运行的结果。
8、下一条指令是:SUB ESP,48,提升栈顶,这里的48是十六进制的,因为画图时是4个地址为一个格,所以要画18个格。(注意了,这里提升的空间是0x48,以前画的都是0x40,为什么多了8?)
按F8运行结果和画的一样。
9、下面三条指令:PUSH EBX,PUSH ESI,PUSH EDI,保存现场,把可能会修改的寄存器的值压入栈中。
按F8运行这三条指令。
10、下面的指令:LEA EDI,DWORD PTR SS:[EBP-48],MOV ECX,12,MOV EAX,CCCCCCCC,REP STOS DWORD PTR ES:[EDI],这几条指令就是填充提升的栈空间
按F8运行这4条指令。
11、下一条指令:MOV DWORD PTR SS:[EBP-4],1,这条指令向栈中压入1,可以看到它是用栈底加上偏移量来确定数据压入的位置的。用这种方式的,很可能就是函数的局部变量。
按F8运行,可以看到在填满了CCCCCCCC的栈空间的底,数字1被写入栈中。
12、下一条指令:MOV DWORD PTR SS:[EBP-8],4,这条指令是把4压入栈中,和上一条指令相似。
按F8运行,可以看到数字4被放到1的上面。
13、下面的指令:(1)MOV EAX,DWORD PTR SS:[EBP-4],
(2)ADD EAX,DWORD PTR SS:[EBP+8],
(3)ADD EAX,DWORD PTR SS:[EBP+C],
(4)MOV DWORD PTR SS:[EBP-4],EAX,
(5)MOV ECX,DWORD PTR SS:[EBP-4],
(6)SUB ECX,DWORD PTR SS:[EBP-8],
(7)MOV DWORD PTR SS:[EBP-8],ECX,
(8)MOV EAX,DWORD PTR SS:[EBP-8],
这就是函数的功能部分。为了方便下面的解释,我们把EBP-4的地址对应的值称为局部变量A,把EBP-8的地址所对应的值称为局部变量B,把EBP + 8的称为参数C,把EBP + C的称为参数D。
下面一句一句分析:
(1)把局部变量A放到EAX中
(2)把局部变量A和参数C相加的结果放到EAX中
(3)把(2)中的结果和参数D相加的值放到EAX中
(4)把(3)中的结果放到局部变量A中
(5)把局部变量A放到ECX中
(6)把局部变量A减局部变量B的值,保存到ECX中
(7)把(6)计算的结果保存到局部变量B中
(8)把局部变量B保存到EAX中
可以有点绕:其实就是计算:A+C+D-B。最后结果是1
14、下面三条指令:POP EDI,POP ESI,POP EBX,还原现场。
按F8运行.
15、下一条指令:MOV ESP,EBP,降低栈顶。
按 F8运行
16、下一条指令:POP EBP,还原原来的栈底。
按F8运行。
17、下一条指令:TETN,这条指令会把栈顶的内容弹出到EIP中,让程序返回到调用call的下一条指令处。
按F8运行。
18、下一条指令:ADD ESP,8,只是为了调用前后栈结构相同,即栈平衡。
按F8运行。
本id的错,不应该把函数的功能写得那么复杂,搞得自己都不好写,算是熬夜了。
本节资料:
链接:https://pan.baidu.com/s/1sQDCIP_qaxNB4sWtuMHrZw
提取码:tcl3
写于2020.7.2 0:57