C语言逆向基础
C语言反汇编后的代码学习
C语言的基本数据类型:1
2
3
4
5
6char 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" 转载请保留原文链接及作者。