第八课 c语言
分析这段代码的反编译
分析:
有时候跟反汇编不一定要进函数看,有时候从上下文就能大概猜出函数的作用
第九课 c语言2
1、什么是裸函数
可以看到plus1()函数是可以正常运行且就算是空函数也会有开栈等操作
下图可以看到裸函数plus里面是一堆int 3(断点)
这时候如果我们自己在裸函数里面写上ret,程序就能正常运行
总结:
普通函数编译器会自动帮我们操作一些堆栈,但是裸函数什么都没有,全需要我们自己写
2、调用约定
前言
这是正常调用函数的四句汇编,可以看到正常都是两个参数从右到左入栈,调用约定就是约定这些东西
常见的三个调用约定:
__cdecl():一般c++默认的调用约定;从右至左入栈,采用外平栈
__stdcall():一般windows api默认的调用约定;从右至左入栈,采用内平栈
__fastcall():从右至左入栈,剩下前两个使用edx和ecx;如果只有两个参数,都是使用mov,则不用平衡堆栈,但是还是使用的内平栈
总结:
1、fastcall运行较快
2、看堆栈平衡的代码(ret 8)去 判断函数有几个参数不一定准确,可能调用约定不一样,或者fastcall他有两个参数是mov,和堆栈没关系
3、函数入口点
真正的函数起始的地方是mainCRTStartup()
不可被替换,他帮我们做了很多初始化操作
4、数据类型
整数类型
整数类型分有符号和无符号
总结:
1、其实内存中有无符号存储到内存里面都是一样的
2、在运算中需要注意
3、有符号数在计算时汇编指令就会使用有符号的比较指令,无符号的就会使用无符号的指令,一切都是写程序的人决定的,
浮点类型
0到23位存放科学计数法后小数位,23到31位存放指数-1
作业
2、
3、
第十课 c语言3
1.编码
ASCII
标准的ASCII编码只需要七位,第八位在拓展ASCII编码使用
GB2312
2.局部变量和全局变量
下面代码输出结果为1111(x=11改变了全局的x)
第十一课 c语言4
1.内存图
2.逆向参数个数
3.简单逆向if代码
4.if...else...反汇编判断
- 跳转执行一部分代码,不跳转则执行另外一部分代码
- 第一个jxx命令跳转的地址前面有一个jmp,则可以判断是if...else...语句
练习示例
5.if..else if....else if..反编译判断
- 当每个jxx命令跳转指令要跳转的地址前面都有jmp命令
- 这些jmp指令跳转的地址都是一样的
- 如果某个分支没有条件判断,则为else部分
6、循环反汇编
for循环
while循环
do...while循环
作业
1、ebp+8,ebp+c
2、ebp-4
3、[004225c4]
4、如果[ebp+8]大于[ebp+c],则跳转到00401064,否则[ebp+c]与[ebp-4]相加,把结果放入全局变量[004225c4]
5、
1、分析参数
[ebp+8]a、[ebp+c]b
2、分析局部变量
[ebp-4]x、[ebp-8]y
3、分析全局变量
[004225c4]c
4、功能分析
x=c,y=2,若a>=b则y++,若a>=b则c=x+y,则否则c=y,
5、返回值分析
全局变量被修改
6、还原成c
int c;
int function(int x,int y)
{
int x = c;
int y = 2;
if(a>=b)
{
y++;
}
if(a>=b)
{
c = x+y;
}
else
{
c = y;
}
}
1、分析参数
[ebp+8]x、[ebp+c]y、[ebp+10]i
2、分析局部变量
[ebp-4]a、[ebp-8]b、[ebp-c]c
3、分析全局变量
无
4、功能分析
a=0,b=1,c=2,若x<=y,a=b-1且跳到00401123,否则(若y>=i则a=c+1且跳转00401123,否则(若x>i则a=b+c且跳转00401123,否则))最后00401123地址是return a+1
5、返回值分析
6、还原成c
int function(int x , int y , int i)
{
int a = 0;
int b = 1;
int c = 2;
if(x<=y)
{
a=b-1;
}
else if(y>=i)
{
a = c + 1;
}
else if(x>i)
{
a = b + c;
}
else
{
a = b + c - 1;
}
return a + 1;
}