C语言逆向基础

C语言反汇编后的代码学习

C语言的基本数据类型:

1
2
3
4
5
6
char	1byte
short 2byte
int 4byte
long 4byte
float 4byte
double 8byte

汇编堆栈图:

从图中我们可以看出

1
2
3
4
[EBP-4n]局部变量
[EBP+4]返回值
[EBP+8]参数
......

利用vs进行反汇编

首先编写好C语言代码,然后设置断点,F5编译,最后调试->窗口->反汇编(寄存器)查看我们想要的东西

返回值反汇编分析

char类型的返回值


反汇编之后我们发现,返回值保存在了al寄存器中

short类型的返回值


反汇编之后我们发现,返回值保存在了ax寄存器中

int类型的返回值


反汇编之后我们发现,返回值保存在了ax寄存器中

数组反汇编分析



特点:等宽连续

结构体反汇编分析



特点:不一定等宽但一定连续

if语句反汇编分析



其实if的反汇编就是jcc判断跳转到哪里的内存地址

do..while语句反汇编分析


for语句反汇编分析


这里可以调试看的更加的清楚,首先跳转到for循环内部,然后将x的值传给eax再传给[ebp-8]也就是参数,第一次会直接跳到和y相比较,比较大小如果比y小则会跳转到printf那里,然后会[add esp,8] 这里的意思是删除栈顶的两个参数x,y,然后跳入到for循环内部,这个时候第二次进入x+1,也就是i++,后面一直循环这个操作,直到x>y为止。

switch语句反汇编分析

case<=3



当我们的case情况较少的时候,发现反汇编的代码和我们if..else的反汇编代码一样,都是通过jcc比较跳转地址

##case>3##
这里的情况复杂一些


反汇编的时候我们看见,首先将我们传入的参数复制给了eax,然后将eax的值给了[ebp-0C4h],最后给了ecx,然后ecx-1,最后又传回给了[ebp-0C4h],然后这里我们与3进行比较,若比3大,则会跳转到0DA436Ah(直接跳出判断语句,因为这里switch的最大值为4,若减了1还比4大,则就会进入default),若这个条件不成立,则会将值赋给edx,跳转到[edx*4+0DA4380h]。

这里反汇编里面搞了这么多的骚操作,原因是为了减少判断的次数直接判断出进入哪一个case,害。

当然,这里的sub并不是每次都是1,这里和你case中的数是相关的。

而switch的反汇编是非常复杂的,是编译器来进行了操作,编译器非常的聪明,这里就不一一分析了。

写的非常粗糙,害。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:C语言逆向基础

本文作者:sher10ck

发布时间:2020-03-03, 20:45:58

最后更新:2020-03-04, 21:09:07

原始链接:http://sherlocz.github.io/2020/03/03/C语言逆向基础/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录