350 likes | 505 Views
黑客反向工程 Hacker Reverse Engineering. 概 述. ■ 身份鉴定 ■ 保护方式分类 ■ 保护强度. 身份鉴定的保护方式分类. ■ 基于知识的保护 样例 : 密码 , 序列号。 意外情况 : □合法物主对保护秘密失去兴趣而泄密。 □ 不能阻止非法拷贝 , 但非法拷贝不易得到技术支持。 适用: 大型公司由于市场大实力强 , 因此能应对 一定程度的经济损失 () 。 不适用:小公司市场有限 ( 专门程序 ), 对侵权无能为 力。只能借助“施压”和“雄辩”维权。. 保护方式分类.
E N D
概 述 ■身份鉴定 ■保护方式分类 ■保护强度 chenkm@ustc.edu.cn 0551-3602824
身份鉴定的保护方式分类 ■基于知识的保护 样例: 密码, 序列号。 意外情况: □合法物主对保护秘密失去兴趣而泄密。 □不能阻止非法拷贝,但非法拷贝不易得到技术支持。 适用: 大型公司由于市场大实力强, 因此能应对 一定程度的经济损失()。 不适用:小公司市场有限(专门程序),对侵权无能为 力。只能借助“施压”和“雄辩”维权。 chenkm@ustc.edu.cn 0551-3602824
保护方式分类 ■基于财产占有关系的保护 特点: 钥匙软盘 (软盘用钉子随机损坏,不能复制)。 (光盘用激光破坏)。 限制启动和拷贝次数或者期限。 适用范围: 小型公司或者个人. chenkm@ustc.edu.cn 0551-3602824
各种保护方式的共有缺陷 ■缺陷:所有这些机制均限制了用户合法权利。 ■谁都不愿意安装次数受限制。 ■加锁盘在某些体系结构上不能使用。 ■绕开驱动程序而直接访问设备的保护机制在某些情况下不能正常运行(兼容性)。 ■遗忘-失窃-坏簇-光盘划坏-电子钥匙“耗尽“等。 chenkm@ustc.edu.cn 0551-3602824
主要保护类型 保护类型 基于知识 基于占有关系 静止钥匙 相关钥匙对 加锁软盘 密码 注册码 加锁光盘 序列号 加锁计算机 电子钥匙 程序启动次数 扰动屏? chenkm@ustc.edu.cn 0551-3602824
保护强度 ■不能阻止逆向工程 如果保护是基于代码不会被破译或者修改这样的假设, 那么非常无力。因为现代的逆向工程十分强大,例如能自动识别库函数, 局部变量, 堆栈变量, 数据类型,分支和循环等,并且还能产生与高级语言类似的代码。 ■理想情况: 泄露保护算法应该不至于影响保护强度。虽然通过经常性的测试校验,确实可以检测和阻止对程序的修改, 但计算校验和并将它与特定值进行比较的代码却是可以找到并加以删除的。 chenkm@ustc.edu.cn 0551-3602824
黑客动机 ■常识: 如果突破保护机制的开销比进行程序合法拷贝 所需要的费用还要高时, 就不会有人破解!!! 果真如此吗? 黑客的动机: 智力较量(谁更聪明,安全者还是黑客?) 竞赛(哪个黑客能够攻破更多的程序?) 好奇(是什么驱使保护机制发挥作用?) 提高自己的技能(通过破译提高安全能力?) 消磨时间(娱乐,若从钱考虑则不可思议) 用户意愿: 愿意选择不加保护的产品. chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 最简单的鉴定算法: 密码存放位置: 程序中/ 配置文件/注册表 密码保护措施: 无 if (strcmp(password entered, reference password)) { /* 密码不正确 */ } else { /* 密码正确 */ } chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 List1_p7.cpp---\n 必须要的可以省略一段截掉用户输入的回车符的步骤 #include <stdio.h> #include <string.h> #define PASSWORD_SIZE 100 #define PASSWORD "myGOODpassword\n" int main() { int count=0; // 记录签定失败次数的计数器 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 //用于存放用户输入的密码符的缓冲区 char buff[PASSWORD_SIZE]; // 以下鉴定操作的主循环 for(; ;) // 提示用户输入密码并读取它 printf("Enter password: "); fgets(&buff[0], PASSWORD_SIZE, stdin); //针对参数值匹配输入的密码 if (strcmp(&buff[0], PASSWORD)) chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 // "申斥"密码不匹配 printf("Wrong password\n"); else //“申斥”密码匹配,退出鉴定循环 break; // 失败计数值加1并且在密码试输三次后终止程序的运行 if (++count>3) return -1; } //程序执行到这里,意味着用户输入的密码是正确的 printf("Password OK\n"); } /*match main*/ chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 编译后的程序执行 □猜测密码---凭运气,难度大 □分析程序的组成 代码 …… 数据(密码字符串) chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 ■ data: 数据段 rdata: 只读数据, 字符串文字和常量. 如本程序中的 "myGOODpassword\n“。 bss: 未初始化数据, 比如函数和静态变量。 idata: 包括导入库和导入地址名称表。 edata:包含了应用程序或DLL的导出数据。 ■ text(code): 代码段。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 ■c中,内存数据分为如下几个区 1.栈--- 由编译器自动分配释放[bp+xx], [bp-xx]。 2.堆--- 一般由程序员分配释放new(), delete() 函数。 3.全局区(静态区)共享存储区。 初始化的全局变量和静态变量在一块区域(data)。 未初始化全局和静态变量放在相邻区域(bss)。 4.另外还有一个专门放常量的地方(rdata)。 ■ C++中,内存分成5个区,分别为: 1.栈,里面的变量通常是局部变量、函数参数等。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 2.堆,由new分配的内存块,由delete回收。 3.自由存储区,由malloc等分配的内存块,和堆相似, 由free回收。 4.全局/静态存储区,全局和静态变量均被分配到同一块内存中,由该语言编译器自行确定(与C语言有差别)。 5.常量存储区,存放常量,不允许修改。 静态变量/全局变量:全局/静态存储区。 常量存放在常量区。 程序放在代码区。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 查看二进制文件. 根据: 编译器将初始变量放在如下数据段中. data rdata 自定义段 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 改写动机:隐藏密码字符串,增加一点分析难度。 int count = 0 // 从现在开始, 所有初始化变量都放置在.kpnc中. #pragma data_seg(“kpnc”) char passwd[]=PASSWORD; #pragma data_seg() // 现在所有初始变量又将放到默认段rdata中了. char buff[PASSWORD_SIZE]=“ “; chenkm@ustc.edu.cn 0551-3602824
黑客反向工程热身 改写后的源代码清单---list1_p9.cpp idag list1_p9.exe 目标代码中出现了如下段落: text rdata data idata kpnc 只有在kpnc 段中才能看到密码字符串信息. "myGOODpassword\n“ chenkm@ustc.edu.cn 0551-3602824
黑客反向工程-熟练使用反汇编器 ■修改二进制代码的工具:hiew ■反汇编工具: ida ■大家推荐工具:softice, …… ■汇编: 将汇编程序转换为机器语言程序。 ■反汇编: 将机器语言程序转换为汇编指令。 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程---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 chenkm@ustc.edu.cn 0551-3602824
使用密码串进行比较的程序块 .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 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程---C规范的知识 ■ strcmp传递两个参数 : push offset s_Mygoodpasswor;参考密码 lea ecx, [ebp+var_68]; 用户输入密码区 push ecx call strcmp ■ C 规范:从右到左的顺序将参数压入堆栈。 ■恢复的结果为: strcmp(var_68, "myGOODpassword\n") chenkm@ustc.edu.cn 0551-3602824
黑客反向工程--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。 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 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程--外科手术(改程序) 解决方法: 使用直接编辑二进制工具 hiew32等. Hiew32 list1_p7g.exe 目标: 寻找 JZ 机器代码 定位 1068h偏移, 将 74 改为 75 chenkm@ustc.edu.cn 0551-3602824
黑客反向工程预备知识 ■反汇编---二进制到汇编代码(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
黑客反向工程概述 1 概述 2 热身 3 熟练使用反汇编器 4 外科手术---修改程序 5 熟练使用调试器