中图科学技术大计算机科学与资术系 University of Science and Technology of China DEPARTME利TDFB口PUr三是马B1巨NCE AND T三CN口L口回 破解和混合编程实例 Hacker Reverse Engineering
破解和混合编程实例 Hacker Reverse Engineering
自定义保护机制,养尝武破解 ■创建一个最简单的保护机制并破解它: ■选一个实例,在此基础上学习十六进制编辑器,API窥 测器与反汇编器(IDA Pro) ■破解一个实际的例子 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 2
■ 创建一个最简单的保护机制并破解它; ■ 选一个实例, 在此基础上学习十六进制编辑器, API窥 测器 与 反汇编器(IDA Pro) ■ 破解一个实际的例子 2 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 自定义保护机制,并尝试破解
自定义保护机制,养尝试破解 最简单的密码保护算法: 密码存放位置: 程序中/配置文件/注册表 密码保护措施: 无 if (strcmp(password entered,reference password)) { /休密码不正确*/ } { /休密码正确*/ } chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 3
最简单的密码保护算法: 密码存放位置: 程序中/ 配置文件/注册表 密码保护措施: 无 if (strcmp(password entered, reference password)) { /* 密码不正确 */ } else { /* 密码正确 */ } 3 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 自定义保护机制,并尝试破解
黑客反向工程热身 Protect_password #define legal_psw "my.good.password" int main() { char user_psw[666]: cout user_psw; if (strcmp(legal_psw,user_psw)) cout<<"wrong password\n"; /升"标记"密码不匹配 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824
Protect_password #define legal_psw "my.good.password" int main() { char user_psw[666]; cout > user_psw; if (strcmp(legal_psw, user_psw)) cout<<“wrong password\n”; // “标记"密码不匹配 4 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 黑客反向工程热身
黑客反向工程热身 else cout<<"password ok\nhello ,legal user|In"; /"标记”密码匹配//"中斥"密码不匹配 return O; } chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 5
黑客反向工程热身 else cout<< “password ok\nhello ,legal user|\n “; //“标记”密码匹配 return 0; } 2022/11/8 chenkm@ustc.edu.cn 0551- 3602824 5 // "申斥"密码不匹配
自动过滤上述程序二进制内容猪果 00007d11:LCMapStringW 00007d1f: kernel32.dll 0000805c:crackme 00h 0000806a:enter passwd: 0000807d:my.good.password 0000808f:wrong password 0000809c:password ok 000080af:hello,legal user! 000080c2:.2 Avios@@ 000080de:?Avistream@@ chenkm@ustc.edu.cn 0551- 2022/11/8 3602824
2022/11/8 chenkm@ustc.edu.cn 0551- 3602824 6 自动过滤上述程序二进制内容结果 00007d11: LCMapStringW 00007d1f: kernel32.dll 0000805c: crackme 00h 0000806a: enter passwd: 0000807d: my.good.password 0000808f: wrong password 0000809c: password ok 000080af: hello, legal user! 000080c2: .?Avios@@ 000080de: .?Avistream@@ …………
结果分析 现在来看所得到的清单,特别要注意位于地址807Dh处的ay,gpod.passw0rd字符串。它 可能是密码吗?你在寻找的字符串经常位于最靠近“Enter pas9word”文本的地方,住下的-个位 置(80afh),可以看到另外一个候选串 ,你可以至少检查它们之中的一个。 将第-个候选密码▣馈给所要破解的程序 crackme.C5F11EA6h.exe Enter passwd:my.ood.password password ok hello,legal user! 对这种方法,保护机制的反应是完全无条件地投降。 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824
结果分析 2022/11/8 chenkm@ustc.edu.cn 0551- 3602824 7
黑客反向工程热身 编译后的程序执行 ☐猜测密码--凭运气,难度大 □分析程序的组成 代码 数据(密码字待串) chenkm@ustc.edu.cn 0551- 2022/11/8 3602824
黑客反向工程热身 编译后的程序执行 □猜测密码---凭运气,难度大 □分析程序的组成 代码 …… 数据(密码字符串) 2022/11/8 chenkm@ustc.edu.cn 0551- 3602824 8
黑客反向工程热身 ■data: 数据段 rdata:只读数据,字特串文字和常量.如本程序中的 "myGOODpassword\n"。 bss:未初始化数据,比如函数和静态变量。 idata:包括导入库和导入地址名称表。 edata:包会了应用程序或DLL的导出数据。 ■text(code):代码段。 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824
黑客反向工程热身 ■ data: 数据段 rdata: 只读数据, 字符串文字和常量. 如本程序中的 "myGOODpassword\n“。 bss: 未初始化数据, 比如函数和静态变量。 idata: 包括导入库和导入地址名称表。 edata:包含了应用程序或DLL的导出数据。 ■ text(code): 代码段。 9 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824
黑客反向工程热身 ■c中,内存数据分为如下几个区 1.栈-由编译器自动分配释放[bp+XX],[bp-XX]。 2.堆-一般由程序员分配释放new(),delete()函数。 3.全局区(静态区)共享存储区。 初始化的全局变量和静态变量在一块区域(data)。 未初始化全局和静态变量放在相邻区域(bSS)。 4.另外还有一个专门放常量的地方(rdata)。 ■C++中,内存分成5个区,分别为: 1.栈,里面的变量通常是局部变量、函数参数等。 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824 10
黑客反向工程热身 ■c中,内存数据分为如下几个区 1.栈--- 由编译器自动分配释放[bp+xx], [bp-xx]。 2.堆--- 一般由程序员分配释放new(), delete() 函数。 3.全局区(静态区)共享存储区。 初始化的全局变量和静态变量在一块区域(data)。 未初始化全局和静态变量放在相邻区域(bss)。 4.另外还有一个专门放常量的地方(rdata)。 ■ C++中,内存分成5个区,分别为: 1.栈,里面的变量通常是局部变量、函数参数等。 10 chenkm@ustc.edu.cn 0551- 2022/11/8 3602824