滴水逆向笔记系列-c语言总结1-7.堆栈图-8.c语言反汇编-9.数据类型

第七课 堆栈图

1.函数

函数的入口
image.png
汇编中的函数
image.png
函数有入口出口,但不一定有返回值和参数

2、堆栈

windows堆栈:
image.png
什么是堆栈平衡:
image.png

第八课 c语言

分析这段代码的反编译

image.png
image.png
image.pngimage.png
有时候跟反汇编不一定要进函数看,有时候从上下文就能大概猜出函数的作用
image.png
image.png

第九课 c语言2

1、什么是裸函数

可以看到plus1()函数是可以正常运行且就算是空函数也会有开栈等操作
image.pngimage.pngimage.png
下图可以看到裸函数plus里面是一堆int 3(断点)
image.png
这时候如果我们自己在裸函数里面写上ret,程序就能正常运行
image.png
image.png

总结:

普通函数编译器会自动帮我们操作一些堆栈,但是裸函数什么都没有,全需要我们自己写

2、调用约定

前言

这是正常调用函数的四句汇编,可以看到正常都是两个参数从右到左入栈,调用约定就是约定这些东西
image.png

常见的三个调用约定:

image.png
__cdecl():一般c++默认的调用约定;从右至左入栈,采用外平栈
image.png
__stdcall():一般windows api默认的调用约定;从右至左入栈,采用内平栈
image.pngimage.png
__fastcall():从右至左入栈,剩下前两个使用edx和ecx;如果只有两个参数,都是使用mov,则不用平衡堆栈,但是还是使用的内平栈
image.png

总结:

1、fastcall运行较快
2、看堆栈平衡的代码(ret 8)去 判断函数有几个参数不一定准确,可能调用约定不一样,或者fastcall他有两个参数是mov,和堆栈没关系

3、函数入口点

真正的函数起始的地方是mainCRTStartup()
image.png
不可被替换,他帮我们做了很多初始化操作
image.png

4、数据类型

整数类型

image.png
整数类型分有符号和无符号
image.pngimage.png

总结:

1、其实内存中有无符号存储到内存里面都是一样的
2、在运算中需要注意
3、有符号数在计算时汇编指令就会使用有符号的比较指令,无符号的就会使用无符号的指令,一切都是写程序的人决定的,

浮点类型

image.png
image.png
0到23位存放科学计数法后小数位,23到31位存放指数-1
image.png
image.png

作业

image.png

2、image.png
3、image.png

posted @ 2024-03-14 13:15  小新07  阅读(67)  评论(0编辑  收藏  举报