逆向基础:32位软件逆向技术

    在编写win32应用程序时、都必须在源码里实现一个WinMain函数。但windows程序的执行并不是从WinMain函数开始的,首先被执行的是启动函数的相关代码,这段代码是由编译器生成的。

启动源代码:crtsrcwincmdln.c中

调用WinMain的示例

程序启动代码的汇编代码

函数的识别
编译器都使用call和ret指令来调用函数及返回调用位置。
call指令与跳转指令功能类似。不同的是,call指令保存返回信息,即将其之后的指令地址压入栈的顶部,当遇到ret指令时返回这个地址。

函数的参数

函数传递参数有3种方式,分别是栈方式、寄存器方式及通过全局变量进行隐含参数传递的方式

栈方式:注意栈平衡、按照什么顺序把参数压入栈br>

 

 

 有时,编译器优化,会直接通过esp对参数进行寻址。

 

 按寄存器传参数:

 

函数的返回值
    函数被调用执行后,将向调用者返回1个或多个执行结果,称为函数返回值。返回值最常见的形式是return操作符,还有通过参数按传引用方式返回值、通过全局变量返同值等。

用return操作符

函数的返回值放在eax寄存器中返回,如果处理结果的大小超过eax寄存器的容量,其高32位就会放到edx寄存器中。

局部变量

 

 

 

 没有sub esp,4  分配局部变量;而是push ecx,再用[ebp-4]访问局部变量,效果一样,都让esp-4

 全局变量:

全局变量一般在.data区块的一个固定地址

数组:

 

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树数据库组成31408 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年10月20日
下一篇 2021年10月20日

相关推荐