堆栈图(2)

滴水逆向三期——堆栈图(2)

函数:
计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理,所谓出口,就是指函数的计算结果,也称为返回值,在计算机求得之后,由此口带回给调用它的程序
汇编中的函数:
堆栈图(2)
如果说中间随便选取一段来说是不是函数?不是函数,因为函数有一些自己特有的特征,函数有一个入口和一个出口

函数的入口:
堆栈图(2)
传进去的2 1 是参数
什么叫无参? 比如说这一段程序 函数他有入口也有出口,入口就是允许你可以把参数穿进去,出口就是这段函数需要有个办法把得出的结果给返回去,也可以不返回值

假设一款游戏,比如说打坐,那么分析程序你想找到打坐这个代码在内存中,打坐时候很有可能不需要传参数,很多程序有可能,人家不需要传过来一个外来的参数所以函数来说,不一定要往里面传值或者返回来一个值

参数看起来是PUSH传的,参数给传到了堆栈里面去了,这两个参数的目的是为了给下面的这个程序去使用,把他放在堆栈里面了用什么EBP+8 那些等等去找到,但是传参数不一定要通过堆栈传,那8个通用的寄存器,我们也可以把值放进寄存器,只要能把参数弄进去就是参数了,本质就是我们只要能让他们找到就是传进去了,不要认为只有PUSH才是传参数
堆栈图(2)
EAX只有4个字节,只能存32位的数,那么我们也可以把结果存到某一块内存里面去
函数就是一段固定的代码,这个代码他执行了某些特定的功能,他提供了一个入口,允许我们把外来的值传进来,传进来的值称为参数,这个参数可以通过寄存器传进来也可以通过内存器传进来,没有固定的套路,当这段程序执行完,会得到一个结果,会提供一个出口,这个出口允许我们把计算的结果传过去,上面可以看到我们把值传到了EAX中,那么我们就把计算结果存储到EAX中叫返回值,一个函数可以没有参数和返回值

Windows堆栈:
堆栈图(2)
函数调用前后的堆栈一定要平衡

堆栈图:
堆栈图(2)
EBP栈底:80 ESP栈顶:34
执行完三个PUSH PUSH首先影响的就是内存,把值压入了堆栈
堆栈图(2)
堆栈图(2)
ESP发生了变化,变成了28
观察堆栈:
堆栈图(2)
发现压进去了
CALL时候按F7
F8就是一行一行的执行,F7就是如果这一行你遇到函数了,他可以跳进函数里面,然后再进行单步的执行
CALL这个指令执行了两个事情,将下一行的那个地址压入到堆栈,修改了EIP的值
CALL 00401005
堆栈图(2)
堆栈图(2)
JMP不影响堆栈直接F8过去就好
堆栈图(2)
PUSH EBP
MOV EBP,ESP
SUB ESP,48
这三行就是将EBP放入ESP-4,EBP=ESP,ESP-48
提升栈顶
堆栈图(2)
堆栈图(2)
PUSH EBX
PUSH ESI
PUSH EDI
这三行就是把EBX放进ESP-4 ESI再放进ESP-4 EDI放进ESP-4
压栈 ESP-c
堆栈图(2)
堆栈图(2)
LEA EDI,DWORD PTR SS:[EBP-48]
MOV ECX,12
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]
将EBP-48的地址放进EDI里面,给ECX赋值一个立即数12,给EAX赋值CCCCCCCC,执行12次,每执行一次就覆盖4个字节
堆栈图(2)
MOV DWORD PTR SS:[EBP-4],2
MOV EAX,DWORD PTR SS:[EBP+C]
将2写入EBP-4中 将EBP+C内存编号中的值放进EAX中
堆栈图(2)
PUSH EAX
MOV ECX,DWORD PTR SS:[EBP+8]
PUSH ECX
把EAX放入ESP-4中 将EBP+8的值放进ECX中 再把ECX放进ESP-4
堆栈图(2)
堆栈图(2)
堆栈图(2)
函数里面可以调用函数,嵌套
堆栈图(2)
CMP相当于减法,Z标志位变成了1
堆栈图(2)
不等于1的时候跳转 JNZ