破解和混合编程实例 Hacker Reverse Engineering 2018/11/12 破解和混合编程实例 Hacker Reverse Engineering chenkm@ustc.edu.cn
自定义保护机制,并尝试破解 ■ 创建一个最简单的保护机制并破解它; 2018/11/12 自定义保护机制,并尝试破解 ■ 创建一个最简单的保护机制并破解它; ■ 选一个实例, 在此基础上学习十六进制编辑器, API窥测器 与 反汇编器(IDA Pro) ■ 破解一个实际的例子 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
自定义保护机制,并尝试破解 最简单的密码保护算法: 密码存放位置: 程序中/ 配置文件/注册表 密码保护措施: 无 2018/11/12 自定义保护机制,并尝试破解 最简单的密码保护算法: 密码存放位置: 程序中/ 配置文件/注册表 密码保护措施: 无 if (strcmp(password entered, reference password)) { /* 密码不正确 */ } else /* 密码正确 */ 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
#define legal_psw "my.good.password" int main() { char user_psw[666]; 2018/11/12 黑客反向工程热身 Protect_password #define legal_psw "my.good.password" int main() { char user_psw[666]; cout << “crackme 00h\n enter password: “; cin >> user_psw; if (strcmp(legal_psw, user_psw)) cout<<“wrong password\n”; // “标记"密码不匹配 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程热身 else cout<< “password ok\nhello ,legal user|\n “; //“标记”密码匹配 return 0; } // "申斥"密码不匹配 // "申斥"密码不匹配 // "申斥"密码不匹配 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
自动过滤上述程序二进制内容结果 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@@ ………… 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 6
结果分析 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 编译后的程序执行 □猜测密码---凭运气,难度大 □分析程序的组成 代码 …… 数据(密码字符串) 编译后的程序执行 □猜测密码---凭运气,难度大 □分析程序的组成 代码 …… 数据(密码字符串) 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 ■ data: 数据段 rdata: 只读数据, 字符串文字和常量. 如本程序中的 "myGOODpassword\n“。 2018/11/12 黑客反向工程热身 ■ data: 数据段 rdata: 只读数据, 字符串文字和常量. 如本程序中的 "myGOODpassword\n“。 bss: 未初始化数据, 比如函数和静态变量。 idata: 包括导入库和导入地址名称表。 edata:包含了应用程序或DLL的导出数据。 ■ text(code): 代码段。 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程热身 ■c中,内存数据分为如下几个区 ■ C++中,内存分成5个区,分别为: 1.栈--- 由编译器自动分配释放[bp+xx], [bp-xx]。 2.堆--- 一般由程序员分配释放new(), delete() 函数。 3.全局区(静态区)共享存储区。 初始化的全局变量和静态变量在一块区域(data)。 未初始化全局和静态变量放在相邻区域(bss)。 4.另外还有一个专门放常量的地方(rdata)。 ■ C++中,内存分成5个区,分别为: 1.栈,里面的变量通常是局部变量、函数参数等。 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 2.堆,由new分配的内存块,由delete回收。 3.自由存储区,由malloc等分配的内存块,和堆相似, 3.自由存储区,由malloc等分配的内存块,和堆相似, 由free回收。 4.全局/静态存储区,全局和静态变量均被分配到同一块内存中,由该语言编译器自行确定(与C语言有差别)。 5.常量存储区,存放常量,不允许修改。 静态变量/全局变量:全局/静态存储区。 常量存放在常量区。 程序放在代码区。 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 查看二进制文件. 根据: 编译器将初始变量放在如下数据段中. data rdata 自定义段 根据: 编译器将初始变量放在如下数据段中. data rdata 自定义段 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 改写动机:隐藏密码字符串,增加一点分析难度。 int count = 0 2018/11/12 黑客反向工程热身 改写动机:隐藏密码字符串,增加一点分析难度。 int count = 0 // 从现在开始, 所有初始化变量都放置在.kpnc中. #pragma data_seg(“kpnc”) char passwd[]=PASSWORD; #pragma data_seg() // 现在所有初始变量又将放到默认段rdata中了. char buff[PASSWORD_SIZE]=“ “; 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程热身 改写后的源代码清单---list1_p9.cpp idag list1_p9.exe 目标代码中出现了如下段落: text 2018/11/12 黑客反向工程热身 改写后的源代码清单---list1_p9.cpp idag list1_p9.exe 目标代码中出现了如下段落: text rdata data idata kpnc 只有在kpnc 段中才能看到密码字符串信息. "myGOODpassword\n“ 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程-熟练使用反汇编器 ■修改二进制代码的工具:hiew(动机) ■反汇编工具: ida ■大家推荐工具:softice, …… 2018/11/12 黑客反向工程-熟练使用反汇编器 ■修改二进制代码的工具:hiew(动机) ■反汇编工具: ida ■大家推荐工具:softice, …… ■汇编: 将汇编程序转换为机器语言程序。 ■反汇编: 将机器语言程序转换为汇编指令。 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程---Ida ---list1_7.exe 2018/11/12 黑客反向工程---Ida ---list1_7.exe 分析过程: .rdata:00420000 00 00 00 00 24 79 F0 46 00 00 00 00 02 00 00 00 ....$y餏....... rdata:00420010 35 00 00 00 00 00 00 00 00 60 02 00 50 61 73 73 5........`.Pass rdata:00420020 77 6F 72 64 20 4F 4B 0A 00 00 00 00 57 72 6F 6E word OK....Wron rdata:00420030 67 20 70 61 73 73 77 6F 72 64 0A 00 00 00 00 00 g password..... rdata:00420040 6D 79 47 4F 4F 44 70 61 73 73 77 6F 72 64 0A 00 myGOODpassword. rdata:00420050 00 00 00 00 45 6E 74 65 72 20 70 61 73 73 77 6F ....Enter passwo rdata:00420060 72 64 3A 20 20 20 00 00 00 00 00 00 73 74 72 20 rd: ......str rdata:00420070 21 3D 20 4E 55 4C 4C 00 66 67 65 74 73 2E 63 00 != NULL.fgets.c 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
使用密码串进行比较的程序块 .text:0040104D .text:00401052 add esp, 0Ch .text:00401055 push offset s_Mygoodpasswor (00420040h)"myGOODpassword\n" .text:0040105A lea ecx, [ebp+var_68] .text:0040105D push ecx .text:0040105E call strcmp .text:0040105E .text:00401063 add esp, 8 .text:00401066 test eax, eax .text:00401068 jz short loc_401079 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程---C规范的知识 ■ strcmp传递两个参数 : push offset s_Mygoodpasswor ;参考密码 2018/11/12 黑客反向工程---C规范的知识 ■ strcmp传递两个参数 : push offset s_Mygoodpasswor ;参考密码 lea ecx, [ebp+var_68]; 用户输入密码区 push ecx call strcmp ■ C 规范:从右到左的顺序将参数压入堆栈。 ■恢复的结果为: strcmp(var_68, "myGOODpassword\n") 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程--C规范的知识 ■ 1 从堆栈中删除参数不由函数自身完成,而是由调用程序完成,这样能创建数目可变的参数。 调用程序 被调用程序 调用程序 被调用程序 call strcmp ret 8 add esp, +08 ■ 2 常用清除堆栈指令 add esp, XXX 32位: n_args = XXX/4 16位:n_args = XXX/2 pop reg sub esp, -XXX ■ 3 由call后的add esp, 8 指令知该函数个数为2。 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程---分析修改的程序 text:00401063 add esp, 8 .text:00401066 test eax, eax .text:00401068 jz short loc_401079 .text:0040106A push offset_WrongPassword ;"Wrong password\n" .text:0040106F call printf 检查函数返回值是否等于零,若为0,表示密码正确,进行相应提示;否则转错误处理程序。 修改: JNZ--》JZ, test eax,eaxxor eax,eax等 JZ: 74--》JNZ: 75 XOR: 31 2018/11/12 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程--外科手术(改程序) 解决方法: 使用直接编辑二进制工具 hiew32等. Hiew32 list1_p7g.exe 2018/11/12 黑客反向工程--外科手术(改程序) 解决方法: 使用直接编辑二进制工具 hiew32等. Hiew32 list1_p7g.exe 目标: 寻找 JZ 机器代码 定位 1068h偏移, 将 74 改为 75 2018/11/12 chenkm@ustc.edu.cn 0551-3602824 chenkm@ustc.edu.cn
黑客反向工程预备知识 ■反汇编---二进制到汇编代码(X86) 二进制 汇编代码 90 NOP 89D8 MOV AX,BX 74 JZ 39C8 CMP AX, BX ■反编译---汇编到高级语言(C或C++) MOV AX,[1000], ADD AX, 10, MOV [1000],AX var1000=var1000+10 ■类/模型/概念识别---从高级语言到类/模式/概念。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 ■如何创建与绕过保护环节 若能了解创建保护机制的知识更好。 ■黑客底层分析技术---调试器与反汇编器使用技能 熟练使用调试器 熟练使用反汇编器 二进制编辑工具 ■识别与重建源代码关键结构---从二进制或汇编中识别出函数、局部与全局变量、控制结构、对象、运算符等。降低程序分析的工作量。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 根据喜好选用一些工具软件 ■ 调试器---Softice ■ 反汇编器---IDA ■ 十六进制编辑器---Hiew ■ 开发包---SDK 与 DDK ■ 操作系统---Windows XP ■ 编译器---VC6.0 (C++) chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 调试器介绍: ■ Softice: 黑客们使用的主要武器。3.26版本是一个经受了时间考验的版本,它具有很好的稳定性。 ■ OllyDby:不及Softice 。 ■ TRW:国产的较好的工具。 ■ VC6自带的调试器---常用方法介绍。 ■ Debug :最古老的,最基本的---使用方法。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 反汇编器介绍 ■ IDA------常用功能介绍 ■ W32DASM ■ SR(Source) ■ Hex2ASM chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 十六进制编辑器: ■ Hiew---常用功能介绍 ■ FlexHex ■ Hedit ■ WinHex ■ Editor chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 ■ SDK WinAPI 函数 用于PE 文件DUMPBIN 实用工具文档资料 ■ DDK 有助于弄清楚驱动程序如何开发、工作,以及如何被攻击。包含一个非常有价值的文件NTDDK.h。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 ■常用汇编语言(机器)指令 ■寄存器的用途 ■堆栈---常用概念介绍 ■中断调用 ■处理器文档资料: www.Intel.com www.amd.com chenkm@ustc.edu.cn 0551-3602824
课程说明(2) 2.教材和参考文献 黑客反向工程(第二版),卡巴斯基, 各种相关文献或学术文章 3. 考试或考查 一次正式课堂汇报(ppt+报告不超过30分钟,70%) 平时发言或报告或点名 30% http://staff.ustc.edu.cn/~chenkm 30