黑客反向工程 Hacker Reverse Engineering

35
黑黑黑黑黑黑 黑黑黑黑黑黑 Hacker Reverse Engineering Hacker Reverse Engineering

description

黑客反向工程 Hacker Reverse Engineering. 概 述. ■ 身份鉴定 ■ 保护方式分类 ■ 保护强度. 身份鉴定的保护方式分类. ■ 基于知识的保护 样例 : 密码 , 序列号。 意外情况 : □合法物主对保护秘密失去兴趣而泄密。 □ 不能阻止非法拷贝 , 但非法拷贝不易得到技术支持。  适用: 大型公司由于市场大实力强 , 因此能应对一定程度的经济损失 () 。  不适用:小公司市场有限 ( 专门程序 ), 对侵权无能为力。只能借助“施压”和“雄辩”维权。. 保护方式分类. - PowerPoint PPT Presentation

Transcript of 黑客反向工程 Hacker Reverse Engineering

Page 1: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程黑客反向工程

Hacker Reverse EngineeringHacker Reverse Engineering

黑客反向工程黑客反向工程

Hacker Reverse EngineeringHacker Reverse Engineering

Page 2: 黑客反向工程  Hacker Reverse Engineering

概 述

■ 身份鉴定

■ 保护方式分类

■ 保护强度

[email protected] 0551-360282423/4/20

Page 3: 黑客反向工程  Hacker Reverse Engineering

身份鉴定的保护方式分类■ 基于知识的保护 样例 : 密码 , 序列号。

意外情况 : □ 合法物主对保护秘密失去兴趣而泄密。□ 不能阻止非法拷贝 , 但非法拷贝不易得到技术支

持。 适用: 大型公司由于市场大实力强 , 因此能应对

一定程度的经济损失 () 。 不适用:小公司市场有限 ( 专门程序 ), 对侵权无能为

力。只能借助“施压”和“雄辩”维权。

[email protected] 0551-360282423/4/20

Page 4: 黑客反向工程  Hacker Reverse Engineering

保护方式分类■ 基于财产占有关系的保护特点 :

钥匙软盘 ( 软盘用钉子随机损坏,不能复制 ) 。

( 光盘用激光破坏 ) 。限制启动和拷贝次数或者期限。

适用范围 : 小型公司或者个人 .

[email protected] 0551-360282423/4/20

Page 5: 黑客反向工程  Hacker Reverse Engineering

各种保护方式的共有缺陷■ 缺陷:所有这些机制均限制了用户合法权利。

■ 谁都不愿意安装次数受限制。■ 加锁盘在某些体系结构上不能使用。■ 绕开驱动程序而直接访问设备的保护机制在某些情况下不能正常运行(兼容性)。■ 遗忘 - 失窃 - 坏簇 - 光盘划坏 - 电子钥匙“耗尽“等。

[email protected] 0551-360282423/4/20

Page 6: 黑客反向工程  Hacker Reverse Engineering

保护类型

基于知识 基于占有关系

静止钥匙 相关钥匙对

密码 注册码

序列号

程序启动次数 扰动屏?

加锁软盘

加锁光盘

加锁计算机

电子钥匙

主要保护类型

[email protected] 0551-360282423/4/20

Page 7: 黑客反向工程  Hacker Reverse Engineering

保护强度■ 不能阻止逆向工程 如果保护是基于代码不会被破译或者修改这样的假设 , 那么非常无力。因为现代的逆向工程十分强大,例如能自动识别库函数 , 局部变量 , 堆栈变量 , 数据类型 , 分支和循环等,并且还能产生与高级语言类似的代码。

■ 理想情况 : 泄露保护算法应该不至于影响保护强度。虽然通过经常性的测试校验,确实可以检测和阻止对程序的修改, 但计算校验和并将它与特定值进行比较的代码却是可以找到并加以删除的。

[email protected] 0551-360282423/4/20

Page 8: 黑客反向工程  Hacker Reverse Engineering

黑客动机■常识: 如果突破保护机制的开销比进行程序合法拷

贝 所需要的费用还要高时, 就不会有人破解 !!! 果真如此吗?黑客的动机 :

智力较量 ( 谁更聪明 , 安全者还是黑客 ?) 竞赛 (哪个黑客能够攻破更多的程序 ?) 好奇 ( 是什么驱使保护机制发挥作用 ?) 提高自己的技能 (通过破译提高安全能力 ?) 消磨时间 (娱乐 ,若从钱考虑则不可思议 )用户意愿 : 愿意选择不加保护的产品 .

[email protected] 0551-360282423/4/20

Page 9: 黑客反向工程  Hacker Reverse Engineering

最简单的鉴定算法 : 密码存放位置 : 程序中 / 配置文件 /注册表密码保护措施: 无 if (strcmp(password entered, reference password)) { /* 密码不正确 */ } else { /* 密码正确 */ }

[email protected] 0551-360282423/4/20

黑客反向工程热身黑客反向工程热身黑客反向工程热身黑客反向工程热身

Page 10: 黑客反向工程  Hacker Reverse Engineering

List1_p7.cpp---\n 必须要的可以省略一段截掉用户输入的回车符的步骤

#include <stdio.h> #include <string.h>#define PASSWORD_SIZE 100#define PASSWORD "myGOODpassword\

n"int main() {

int count=0; // 记录签定失败次数的计数器

[email protected] 0551-360282423/4/20

黑客反向工程热身黑客反向工程热身黑客反向工程热身黑客反向工程热身

Page 11: 黑客反向工程  Hacker Reverse Engineering

// 用于存放用户输入的密码符的缓冲区char buff[PASSWORD_SIZE];

// 以下鉴定操作的主循环for(; ;)// 提示用户输入密码并读取它 printf("Enter password: ");

fgets(&buff[0], PASSWORD_SIZE, stdin);

//针对参数值匹配输入的密码if (strcmp(&buff[0], PASSWORD))

23/4/20 [email protected] 0551-3602824 11

黑客反向工程热身黑客反向工程热身黑客反向工程热身黑客反向工程热身

Page 12: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身// "申斥 "密码不匹配

printf("Wrong password\n");else

//“申斥”密码匹配,退出鉴定循环 break;// 失败计数值加 1 并且在密码试输三次后终止程序的运

行 if (++count>3) return -1; }// 程序执行到这里,意味着用户输入的密码是正确的

printf("Password OK\n"); } /*match main*/

23/4/20 [email protected] 0551-3602824 12

Page 13: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身编译后的程序执行 □猜测密码 ---凭运气 ,难度大 □ 分析程序的组成

代码……

数据 ( 密码字符串 )

23/4/20 [email protected] 0551-3602824 13

Page 14: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身

■ data: 数据段 rdata: 只读数据 , 字符串文字和常量 . 如本程序中

的 "myGOODpassword\n“ 。 bss: 未初始化数据 , 比如函数和静态变量。 idata: 包括导入库和导入地址名称表。 edata:包含了应用程序或 DLL 的导出数据。 ■ text(code): 代码段。

[email protected] 0551-360282423/4/20

Page 15: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身■c中 , 内存数据分为如下几个区 1. 栈 --- 由编译器自动分配释放 [bp+xx], [bp-xx] 。 2. 堆 --- 一般由程序员分配释放 new(), delete() 函数。 3.全局区(静态区)共享存储区。

初始化的全局变量和静态变量在一块区域 (data) 。 未初始化全局和静态变量放在相邻区域( bss )。

4.另外还有一个专门放常量的地方 (rdata) 。

■ C++ 中 , 内存分成5 个区,分别为: 1.栈,里面的变量通常是局部变量、函数参数等。

[email protected] 0551-360282423/4/20

Page 16: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身2.堆,由 new 分配的内存块,由 delete回收。 3.自由存储区,由 malloc 等分配的内存块,和堆相似, 由 free回收。4.全局 /静态存储区,全局和静态变量均被分配到同一块内存中,由该语言编译器自行确定 ( 与 C 语言有差别 ) 。

5.常量存储区,存放常量,不允许修改。 静态变量 /全局变量 : 全局 /静态存储区。 常量存放在常量区。

程序放在代码区。

[email protected] 0551-360282423/4/20

Page 17: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身

查看二进制文件 .

根据 : 编译器将初始变量放在如下数据段中 . data rdata 自定义段

[email protected] 0551-360282423/4/20

Page 18: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身改写动机:隐藏密码字符串,增加一点分析难度。

int count = 0  // 从现在开始 , 所有初始化变量都放置

在 .kpnc 中 .#pragma data_seg(“kpnc”) char passwd[]=PASSWORD;#pragma data_seg()  // 现在所有初始变量又将放到默认段 rdata中了 .

char buff[PASSWORD_SIZE]=“ “;

[email protected] 0551-360282423/4/20

Page 19: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程热身改写后的源代码清单 ---list1_p9.cpp

idag list1_p9.exe目标代码中出现了如下段落 :textrdatadataidatakpnc只有在 kpnc 段中才能看到密码字符串信息. "myGOODpassword\n“

[email protected] 0551-360282423/4/20

Page 20: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程 -熟练使用反汇编器

■ 修改二进制代码的工具: hiew

■ 反汇编工具: ida

■ 大家推荐工具: softice, …… ■汇编 : 将汇编程序转换为机器语言程序。■ 反汇编 : 将机器语言程序转换为汇编指令。

[email protected] 0551-360282423/4/20

Page 21: 黑客反向工程  Hacker Reverse Engineering

分析过程 :.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........`.Passrdata:00420020 77 6F 72 64 20 4F 4B 0A 00 00 00 00 57 72 6F 6E

word OK....Wronrdata: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 passwordata:00420060 72 64 3A 20 20 20 00 00 00 00 00 00 73 74 72 20

rd: ......strrdata:00420070 21 3D 20 4E 55 4C 4C 00 66 67 65 74 73 2E 63 00

!= NULL.fgets.c

黑客反向工程 ---Ida ---list1_7.exe

[email protected] 0551-360282423/4/20

Page 22: 黑客反向工程  Hacker Reverse Engineering

使用密码串进行比较的程序块.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

[email protected] 0551-360282423/4/20

Page 23: 黑客反向工程  Hacker Reverse Engineering

■ strcmp传递两个参数 :push offset s_Mygoodpasswor ;参考

密码lea ecx, [ebp+var_68]; 用户输入密码

区 push ecx

call strcmp

■ C 规范:从右到左的顺序将参数压入堆栈。■恢复的结果为: strcmp(var_68, "myGOODpassword\n")

黑客反向工程 ---C规范的知识

[email protected] 0551-360282423/4/20

Page 24: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程 --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 。

[email protected] 0551-360282423/4/20

Page 25: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程 --- 分析修改的程序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

[email protected] 0551-360282423/4/20

Page 26: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程 -- 外科手术 ( 改程序 )

解决方法: 使用直接编辑二进制工具 hiew32 等 .

Hiew32 list1_p7g.exe

目标: 寻找 JZ 机器代码

定位 1068h偏移 , 将 74 改为   75

[email protected] 0551-360282423/4/20

Page 27: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识■■ 反汇编反汇编 ------二进制到汇编代码二进制到汇编代码 (X86)(X86)

二进制 汇编代码二进制 汇编代码

90 90 NOP NOP

89D889D8 MOV AX,BX MOV AX,BX

74 74 JZ JZ

39C8 39C8 CMP AX, BX CMP AX, BX

■■ 反编译反编译 ------汇编到高级语言汇编到高级语言 (C(C 或或 C++)C++)

MOV AX,[1000], ADD AX, 10, MOV [1000],AXMOV AX,[1000], ADD AX, 10, MOV [1000],AX

var1000=var1000+10 var1000=var1000+10

■■ 类类 // 模型模型 //概念识别概念识别 ------从高级语言到类从高级语言到类 // 模式模式 //概念。概念。

[email protected] 0551-3602824

Page 28: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识 ■■ 如何创建与绕过保护环节如何创建与绕过保护环节 若能了解创建保护机制的知识更好。若能了解创建保护机制的知识更好。■■ 黑客底层分析技术黑客底层分析技术 ------调试器与反汇编器使用技能调试器与反汇编器使用技能 熟练使用调试器熟练使用调试器 熟练使用反汇编器熟练使用反汇编器 二进制编辑工具二进制编辑工具■■ 识别与重建源代码关键结构识别与重建源代码关键结构 ------从二进制或汇编中识别从二进制或汇编中识别出函数、局部与全局变量、控制结构、对象、运算符等。出函数、局部与全局变量、控制结构、对象、运算符等。降低程序分析的工作量。降低程序分析的工作量。

[email protected] 0551-3602824

Page 29: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识根据喜好选用一些工具软件根据喜好选用一些工具软件

■ ■ 调试器调试器 ---Softice---Softice

■■ 反汇编器反汇编器 ---IDA---IDA

■■ 十六进制编辑器十六进制编辑器 ---Hiew---Hiew

■■ 开发包开发包 ---SDK ---SDK 与 与 DDKDDK

■■ 操作系统操作系统 ---Windows XP---Windows XP

■■ 编译器编译器 ---VC6.0---VC6.0 (C++)(C++)

[email protected] 0551-3602824

Page 30: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识调试器介绍:调试器介绍:

■ ■ Softice: Softice: 黑客们使用的主要武器。黑客们使用的主要武器。 3.263.26版本是一个版本是一个经受了时间考验的版本,它具有很好的稳定性。经受了时间考验的版本,它具有很好的稳定性。■ ■ OllyDbyOllyDby ::不及不及 SofticeSoftice 。。■ ■ TRWTRW ::国产的较好的工具。国产的较好的工具。■ ■ VC6VC6 自带的调试器自带的调试器 ------ 常用方法介绍。常用方法介绍。■ ■ Debug :Debug :最古老的,最基本的最古老的,最基本的 ------ 使用方法。使用方法。

[email protected] 0551-3602824

Page 31: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识反汇编器介绍反汇编器介绍

■ ■ IDA------IDA------ 常用功能介绍常用功能介绍■ ■ W32DASMW32DASM

■ ■ SR(Source)SR(Source)

■ ■ Hex2ASMHex2ASM

[email protected] 0551-3602824

Page 32: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识十六进制编辑器:十六进制编辑器:

■ ■ Hiew---Hiew--- 常用功能介绍常用功能介绍■ ■ FlexHexFlexHex

■ ■ HeditHedit

■ ■ WinHexWinHex

■ ■ EditorEditor

[email protected] 0551-3602824

Page 33: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识

■ ■ SDKSDK

WinAPI WinAPI 函数函数 用于用于 PEPE 文件文件 DUMPBINDUMPBIN 实用工具文档资料实用工具文档资料

■ ■ DDKDDK

有助于弄清楚驱动程序如何开发、工作,以及如何有助于弄清楚驱动程序如何开发、工作,以及如何被攻击。包含一个非常有价值的文件被攻击。包含一个非常有价值的文件 NTDDK.hNTDDK.h 。。

[email protected] 0551-3602824

Page 34: 黑客反向工程  Hacker Reverse Engineering

黑客反向工程预备知识

■■ 常用汇编语言常用汇编语言 (( 机器机器 )) 指令指令■■寄存器的用途寄存器的用途■■ 堆栈堆栈 ------ 常用概念介绍常用概念介绍■■中断调用中断调用■■处理器文档资料处理器文档资料 ::

www.www.IntelIntel.com.com  

www.amd.comwww.amd.com

[email protected] 0551-3602824

Page 35: 黑客反向工程  Hacker Reverse Engineering

1 1 概述概述 2 2 热身热身 3 3 熟练使用反汇编器熟练使用反汇编器 4 4 外科手术外科手术 ------ 修改程序修改程序 5 5 熟练使用调试器熟练使用调试器

黑客反向工程概述黑客反向工程概述黑客反向工程概述黑客反向工程概述