逆向汇编反汇编——函数分析

逆向汇编反汇编——函数分析_第1张图片

 逆向汇编反汇编——函数分析_第2张图片

add esp,8就是把esp调整到函数调用之前的状态,用以平衡堆栈 

 逆向汇编反汇编——函数分析_第3张图片

 逆向汇编反汇编——函数分析_第4张图片

 默认采用的是cdcall:外平栈

stdcall:内平栈

什么是堆栈平衡?

》原来的堆栈是什么样的,函数调用之后堆栈还是什么样的(即,esp和ebp的值保持不变),这一个线程当中的所有函数调用都是使用这同一个堆栈。

为什么需要保持堆栈平衡呢?

》因为在Windows当中它的栈默认分配的是1M大小的空间,如果每个函数为局部变量分配的栈空间不回收的话,很快就会用完了。为了重复利用堆栈,所以需要平衡堆栈。

一旦函数调用结束之后,原先函数的栈空间存储的局部变量等内容就变成了垃圾数据了,所以不要使用指针等去勾出来原来函数当中的局部变量的值,因为一旦那块内存当中的数值发生变化,很可能获取到的就是垃圾数据。

指针使用完毕之后一定要置为NULL,new出来的对象一定要delete掉

逆向汇编反汇编——函数分析_第5张图片

为什么fastcall速度快呢?

把参数传到寄存器里面:

逆向汇编反汇编——函数分析_第6张图片

 一般来说通过寄存器来传参,如果参数比较多就一部分使用寄存器一部分使用push压栈来传参

 在C++当中,类的成员函数的调用是通过thiscall来实现的

this指针是放在ecx寄存器进行传递的

Windows下的函数调用方式:

他们的定义都包含在windef.h头文件当中

上面是MAC,下面是Windows

逆向汇编反汇编——函数分析_第7张图片

逆向汇编反汇编——函数分析_第8张图片

不定个数的参数一般是cdcall,因为只有调用方才知道传了几个参数进去

逆向汇编反汇编——函数分析_第9张图片

逆向汇编反汇编——函数分析_第10张图片

逆向汇编反汇编——函数分析_第11张图片

逆向汇编反汇编——函数分析_第12张图片

在release版本当中,局部变量如果比较简单的话,有可能会被直接优化掉,可以使用scanf来避免这种情况出现。所以如果在ida当中,应该主要关注的是它的变量名,比如arg1这种,而不用管它究竟是多少偏移量,在ida当中,局部变量是var,外面传进来的参数是arg

你可能感兴趣的:(逆向学习,汇编,windows,c语言,c++)