2026-07-06
结构体对齐
观察到一个现象:
12345678910111213141516171819202122struct S1 { char a; int b; char c;};struct S2 { //顺序不一样大小也不一样 int a; char b; char c;};int main(int argc,...
阅读全文
2026-06-29
结构体
正向基础我就不整理了,多说一句,其实我之前最喜欢写的就是结构体,不知道为什么觉得用起来特别爽
但是这一部分有个问题,关于课上讲的结构体中变量的存储地址的计算,就是基址+偏移嘛,但是有一个问题就是,课堂中举的那个例子(见下图),Gamer 这个的第一个变量生命写成了 +4,应该是写错了,Gamer 的生命是 +0 才对,和坐标的那个规则一样是从 +0 ...
阅读全文
2026-06-23
二维数组
一维数组与多维数组在反汇编上没有区别
12345678void Fun() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; //int arr[1...
阅读全文
2026-05-31
返回值的传递
char 类型的返回值:用 al 存
short 类型的返回值:用 ax 存
int 类型的返回值:用 eax 存
宽度为 64 位的返回值数据类型要怎么存储?见作业1
参数传递
本机尺寸:如果本机是 32 位的,那么对 32 位的数据支持最好,如果是 64 位的,那么对 64 位的支持最好。编译器也遵守了这个规则:char 类型或者 s...
阅读全文
2026-05-26
被坑了哇,看到爱达人官网那里有一个3块钱的练习代码下载,还以为是刚开始提到的那个有基础的人觉得无聊的话就去逆的那个程序,买了下载了一看只是一个很普通的交换排序,不知道是干啥用的,是说的那个无聊就去逆的吗?不管了反正课也直接拉进度条听完了
do…while语句
语句及对应反汇编示例:
总结:
根据条件跳转指令所跳转到的地址,可以得到循环语句块的起始地址
...
阅读全文
2026-05-22
变量的声明
声明变量就是告诉计算机,我要用一块内存,你给我留着,宽度和存储格式有数据类型决定。
计算机什么时候把这块内存给你,取决于变量的作用范围,如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有所在的程序被调用的时候,才会分配空间。
全局变量如果不赋初始值,默认是0,但局部变量在使用前一定要赋初值
类型转换
MOVSX先符号扩展,...
阅读全文
2026-05-14
IF…ELSE…语句的反汇编判断
第一个 JCC 跳转到的地址前面有一个 jmp(并且 jump 是往下跳的),就可以确定是 if…else… 语句
案例分析 demo:
IF…ELSE IF…ELSE IF…多分支语句的反汇编判断
案例分析 demo:
课后作业
If…else
还原成 C :
123456789101112131415161...
阅读全文
2026-05-11
全局变量、局部变量
内存图:
当然以上的是否可读写都是对于正向开发来讲的,逆向可以随意操作
全局变量:
只要是见到用立即数直接寻址的多半都是全局变量
局部变量:
局部变量不仅可以通过 ebp-? 来找,也可以通过栈顶加什么 esp+? 来找,所以看到这个形式不要惊慌,因为编译器的不同/不同的版本,寻找的方式可能会不同
函数参数的分析
分析一个程序,你肯...
阅读全文
2026-05-06
课后作业
做的是有基础的那部分
有一个字符串是这样的:china中国verygood天朝nice,里面既含有中文又含有英文,请编写一个函数,能截取任意长度的字符串 n(n<=总长度)
123fn(5) = chinafn(6) = china中fn(8) = china中国v
此题涉及到字符存储所占字节大小的问题,英文字符占一字节,课上讲的中文字符...
阅读全文
2026-04-23
C语言是怎么变成汇编的
引言:定义一个函数,什么都不写什么都不做的时候,编译器和链接器就已经自动生成了一个框架
如果不想要它自动生成的这个,就可以使用裸函数
什么是裸函数
12void __declspec(naked) Function(){...}
裸函数调用时与普通函数无异,都是生成一个 call 指令,也就是会先把下一条指令...
阅读全文