Download presentation
Presentation is loading. Please wait.
1
基本的”防”黑客技术 Basic” ” Hacker Technique
2018/12/5 基本的”防”黑客技术 Basic” ” Hacker Technique
2
课程说明 1.教材和参考文献 (1) 黑客反汇编揭秘(第2版),卡巴斯基, 俄Kris Kaspersky著,谭明金等译
(2) SQL 注入攻击与防御, Justin Clarke等著,黄晓磊等翻译 (3) 各种相关文献或学术文章 (4) 2.考试或考查 一次正式课堂汇报(ppt报告不超过30分钟,80%) 平时发言 20%, 点名缺3次取消汇报资格。
3
上节课介绍的工具 ■ Olldbg: 调试器 ■ IDA: 反汇编器 ■ Winhex: 十六进制编辑器
4
汇编器入门 ■ 低级语言如机器码,汇编语言等是计算机的母语. 优点: 可以直接访问硬件, 容易学习. ■ 不精通汇编语言, 仅掌握高级语言在黑客领域很难做成象样的事情. 比如如何识别大量没有源代码的海量程序中的算法. ■ 访问未公开的操作系统特性. 艘索程序后门, 抑制病毒, 从事逆向工程, 破解秘密算法等.
5
汇编器入门 ■ 例子: 在程序运行过程中不时弹出臭名昭著的错误提示窗口,提示用户在程序中出现了严重的错误,并且含有地址等信息。 若只会高级语言,则无能为力,只能生闷气或骂人。 精通汇编语言就大不一样,可以通过地址修复错误。
6
汇编语言介绍 ■ 单条指令功能有限: 找不到一条可直接用语显示“Hello, World!”字符串的命令。 若要输出该字符串,需要查阅显示卡的硬件资料。 拷贝硬盘数据,需要知道扇区,查阅硬盘驱动器的文档资料等。 端口: 高级语言不能任意访问,在应用程序级别
7
汇编语言介绍 ■ 寄存器概念:解释清楚很难。 微观:很多处理器不能直接处理两个内存单元之间的运算,需要用寄存器。 宏观:机器码要经过解释才能执行。 X86: 寄存器虚拟,MUL,DIV等指令用到特殊组合的积存器,不支持内存到内存的直接操作。 ■地址空间: 处理器可用的一组虚拟内存单元。其中又细分为代码,数据与堆栈等段。 ■ 堆栈:存储数据的方法,像清单与数组的结合,有PUSH,POP指令,处理函数调用,ESP指示栈顶。 ■ EIP:指向下一条要执行的指令地址。
8
汇编语言介绍 ■ 通用寄存器: EAX,EBX,ECX,EDX 4个通用32位 AX, BX, CX, DX: 低16位 AH(AL), BH(BL), CH(CL), DH(DL) 高8位( 低8位) ESI, EDI: 32位 EBP: 处理局部变量(C语言) ■段寄存器,标志寄存器等。
9
汇编语言介绍 ■ 通用寄存器: EAX,EBX,ECX,EDX 4个通用32位 AX, BX, CX, DX: 低16位 AH(AL), BH(BL), CH(CL), DH(DL) 高8位( 低8位) ESI, EDI: 32位 EBP: 处理局部变量(C语言) ■段寄存器,标志寄存器等。
10
基于C 程序示例解释汇编概念 ■ MOV 等价于 “=” c= 0x333 等价于: MOV eax, 333h a=*b 等价于: MOV eax, [ebx] a=b[0x66] MOV eax, [ebx+66h] db 1b, dw 2b, dd 4b
11
数据交换的主要方法
12
条件跳转指令 ■ 汇编条件跳转包含两个操作 1. 使用CMP指令比较两个数并将比较结果的对应标志保存起来(flag). 有小于,等于 和 大于 三个状态标志. 2. jx 条件操作指令系列用于检查指定的条件x, 如果该条件成立就跳转到指定地址. je, jne, 相等或不相等时跳转 jb, ja: 无符号数,小于或大于跳转 jl, jg: 带符号数,小于或大于跳转 jbe: 复合条件,小于等于 jmp: 直接转移
13
条件跳转的主要类型
14
函数调用指令 ■ C 调用: 传递给函数的参量是按照是按从右到左的顺序传递,由完成调用的代码负责从堆栈中清除参量. ■ Pascal调用:传递给函数的参量是按照是按从左到右的顺序传递,由被调用的函数自身完成从堆栈中清除参量. ■Windows API: stdcall 规范: 按C调用传递参数,按Pascal调用从堆栈中清除参数. ■ 函数的返回值: 放入 EAX 寄存器中, 若返回64函数值,则使用 EDX:EAX 寄存器对.
15
调用操作系统的API函数
16
防黑客反向工程预备知识 ■如何创建与绕过保护环节 若能了解创建保护机制的知识更好。 ■黑客底层分析技术---调试器与反汇编器使用技能
熟练使用调试器 熟练使用反汇编器 二进制编辑工具 ■识别与重建源代码关键结构---从二进制或汇编中识别出函数、局部与全局变量、控制结构、对象、运算符等。降低程序分析的工作量。
17
防黑客-软件保护机制 ■黑客的对手是保护机制:设置软件保护机制的主要目的在于防止盗版以及对计算机程序的非授权使用。
2018/12/5 防黑客-软件保护机制 ■黑客的对手是保护机制:设置软件保护机制的主要目的在于防止盗版以及对计算机程序的非授权使用。 手段: 检查使用者身份的真实性是核心。从已经购买了软件的用户或者计算机上存有该软件已授权副本的用户哪里获取一些证据。 2018/12/5
18
两种保护类型 chenkm@ustc.edu.cn 0551-3602824 2018/12/5 2018/12/5
19
防黑客-序列号1 为何知名开发商都使用序列号保护? 答: 开发商试图威胁非授权用户,希望采取法律行动来保护自己的知识产权。
2018/12/5 防黑客-序列号1 为何知名开发商都使用序列号保护? 答: 开发商试图威胁非授权用户,希望采取法律行动来保护自己的知识产权。 设想场景:某公司安静的办公场所突然闯进一伙乔装打扮的代理人……,将公司电脑上的授权编号与许可协议编号比较,……,只要发现一份非法拷贝……后果不堪设想。 2018/12/5
20
防黑客-序列号2 盗版是传播软件的最快和最好的方式之一? 巨头拿小公司和家庭用户无能为力。
2018/12/5 防黑客-序列号2 盗版是传播软件的最快和最好的方式之一? 巨头拿小公司和家庭用户无能为力。 序列号还是有用---非注册用户不能得到技术支持,促使它们去购买合法的软件版本。 序列号不适用于小型程序员团队和个体开发者的软件保护。因其市场容量有限(光谱分析或者核反应建模),软件过于专业化。 2018/12/5
21
防黑客-占有关系1 手段:基于某种特别难于复制或者在理想情况下根本不可能复制的主体占有关系而施加的保护。
2018/12/5 防黑客-占有关系1 手段:基于某种特别难于复制或者在理想情况下根本不可能复制的主体占有关系而施加的保护。 答:第一种是加锁软盘。信息以一种使软盘不可能被复制的方式写在加锁软盘上。 现在使用光盘,有钱人用激光破坏,一般人用钉子或锥子进行。 程序与盘片绑定运行,盗版者放弃。 2018/12/5
22
防黑客-占有关系2 手段:频繁地修改占有的主体而限制程序的启动数目或者使用期限-通常用于安装程序。
2018/12/5 防黑客-占有关系2 手段:频繁地修改占有的主体而限制程序的启动数目或者使用期限-通常用于安装程序。 为了避免让用户感到厌烦,密钥只需在安装程序时使用一次,平常工作时不要。 由于程序的安装次数受到限制,一份拷贝在多台机器上进行非授权安装而给开发商造成的损失会很小。 2018/12/5
23
各种保护方式的共有缺陷 缺陷:所有这些机制均限制了用户合法权利 ■谁都不愿意安装次数受限制。 ■加锁盘在某些体系结构上不能使用。
■绕开驱动程序而直接访问设备的保护机制在某些情况下不能正常运行(兼容性如WindowsNT/2000等)。 ■遗忘-失窃-坏簇-光盘划坏-电子钥匙“耗尽“等。 2018/12/5
24
共有缺陷带来的后果 ■若既不能阻止黑客,又不能给消费者带来利益,则后果严重。
案例:因为使用太不方便用户宁愿光顾最近的盗卖场所购买非法软件。道德、伦理与尊严等方面的说教无用。 可耻:应该感到羞耻的是程序开发人员,为 何要给用户平白增加麻烦。 2018/12/5
25
走进黑客门-注册码 基于注册号的保护方式也在普遍使用。
2018/12/5 走进黑客门-注册码 基于注册号的保护方式也在普遍使用。 答:首次运行之后,程序将自身与计算机捆绑在一起,打开一个“计数器”并不时去阻止程序的某些功能。为了使程序发挥全部的功能,需要花钱从开发人员哪里换取密码输入计算机。该密码一般是从用户计算机的关键参数(用户名)衍生出来的。 2018/12/5
26
保护机制两种类型 ■加密(基于基尔霍夫)保护 和逻辑保护 ■ 加密(基于基尔霍夫)保护:
2018/12/5 保护机制两种类型 ■加密(基于基尔霍夫)保护 和逻辑保护 ■ 加密(基于基尔霍夫)保护: 加密保护机制的强度完全取决于保密密钥的强度,即使加密算法暴露了,也不会极大地简化对它的破解过程,只要密钥长度选择得合适,基尔霍夫保护机制就不可能被破解。 ■逻辑保护 强度取决于保护算法的隐密性,而不是依赖于密钥的隐密性。 完全基于 程序的保护代码是不能被她人分析或者修改的。 2018/12/5
27
黑客与普通用户 ■普通用户:不会使用反汇编器与调试器,输入的注册号如何发挥作用与自己关系不大。只关心怎么输入和对应的输出结果是否正确。
2018/12/5 黑客与普通用户 ■普通用户:不会使用反汇编器与调试器,输入的注册号如何发挥作用与自己关系不大。只关心怎么输入和对应的输出结果是否正确。 ■黑客高手: 很容易破解注册号加密。如果加密水平很高,黑客可以先合法买入一套工作版本运行,然后检查它的转储内容就可以破解。 假设将用户输入密码与内置原始密码比较,则 1) 找到原始密码 2)让保护机制比较输入密码与输入的密码 3)找出密码输入不正确时程序执行的的路径后修正 2018/12/5
28
逻辑机制不堪一击还流行? ■理由 软件销售主要利润来自工业化国家,公民遵纪守法,不大可能去破解软件。而另外一些国家情形刚好想法,喜欢免费。
1) 大多数软件开发人员并不具备保护机制方面的知识,无法想象编译器会将源代码研磨成什么?(畏惧机器码) 2)在应付面向大众的流行软件时,保护机制的可靠性并没有极大的影响。黑客只要能找到哪怕是一份合法注册的软件拷贝,就能得手。 软件销售主要利润来自工业化国家,公民遵纪守法,不大可能去破解软件。而另外一些国家情形刚好想法,喜欢免费。 2018/12/5
29
狠 招 ■虽然任何程序都可破解,但例外: 从Internet 上下载 或者 从CD,DVD购买的演示程序不一定能破解,因为其中的关键片段(狠招:从演示包中将关键片段进行物理删除),那么能破解的人就几乎绝迹了!!! 2018/12/5
30
按密钥类型划分保护机制 ■密钥(序列号),加密盘和注册号,能复制软件不能复制加密盘的黑法:
使保护机制无效:检查加密盘是否存在唯一特征但从来不用到这些特征的保护机制特别合适。 “一对一”复制密钥介质,较复杂,比如将坏扇区数值用作密钥信息来动态解密某些程序路径。 2018/12/5
31
保护机制的强度 3.创建密钥介质仿真器 创建具有原始介质所有特性但基于不同物理原理,如从保护机制的角度编写一个专用软件工具。
4. 基于显式知识保护的主要依靠法律手段, 认为程序被出售的数量直接与保护机制的复杂等级之间存在比例关系的想法不符合实际结果。 2018/12/5
32
黑客的建议 ■常识: 密码与序列号虽然是当前最流行的保护类型,近年来,许多程序开发人员听从了黑客的建议和意见将”Registered(注册)”项从菜单中删除了。现在注册所要的内容发生变化: 密钥文件 某个注册项 一些键码序列 其他内容 关于注册过程成功或者失败的文本消息也被删除,这样定位保护机制就很复杂。 2018/12/5
33
保护机制的新变化 ■变化:使用Internet 来检查程序的合法
简单过程:保护机制周期性地尝试访问网络,在网上有一个专用的服务器存放了所有注册用户的完整信息,如果用户输入的注册编号能在服务器中找到,OK! 否则保护机制会让程序的注册标志无效。甚至于将它从磁盘上删除。 其他方法:擅自地在计算机上安装传输控制协议或者用户数据协议,为开发人员提供某种远程控制程序的能力。 2018/12/5
34
新保护机制的对策 ■变化对策:此种保护机制也容易定位,甚至更加容易删除。
因为对Internet 的访问不可能不引起注意,可由netstat,tcpview 轻而易举识别,定位保护机制代码也不困难,只要追踪与保护机制有关的API 调用足矣。 2018/12/5
35
保护机制的强度 ■ 保护机制基于代码不会被考察或修改的假设问题很大。
现代逆向工程技术:自动识别库函数、局部变量、堆栈变量、数据类型、分支、循环等。已经有过生成与高级语言源代码类似代码的工具。 ■就是现在破解实例已很多! ■理想情况:保护算法被泄露也不致于影响保护的强度。 2018/12/5
36
黑客动机 ■常识: 如果突破保护机制的开销比进行程序合法拷贝所需要的费用还要高时, 就不会有人破解!!! 果真如此吗? 黑客的动机:
■常识: 如果突破保护机制的开销比进行程序合法拷贝所需要的费用还要高时, 就不会有人破解!!! 果真如此吗? 黑客的动机: 智力较量(谁更聪明,安全者还是黑客?) 竞赛(哪个黑客能够攻破更多的程序?) 好奇(是什么驱使保护机制发挥作用?) 提高自己的技能(通过破译提高安全能力?) 消磨时间(娱乐,若从钱考虑则不可思议) 用户意愿: 愿意选择不加保护的产品. 2018/12/5
37
保护机制生存威胁 ■推理: 黑客太强大,保护机制命中注定要为自己的生存而战! 似乎保护机制只能延缓破解,无法阻止破解!
创建安全的保护机制没有希望了? ■推理 按照理论估计,应有安全的保护机制。 问题:为何被黑客破解的程序数量如此众多? 原因: 程序开发人员的 低级错误 和 失误连连。 2018/12/5
38
创建保护机制的知识 不知道如何创建保护机制,但可以破解程序; 反过来,不知道如何破解程序是不可能创建保护机制的。
■保护机制与破解的关系 不知道如何创建保护机制,但可以破解程序; 反过来,不知道如何破解程序是不可能创建保护机制的。 成功破解的案例说明: 不是黑客多高明和神奇,而是保护机制开发人员所开发的软件低质量。部分几分钟就可搞定。 2018/12/5
39
商业化保护机制的缺点 ■强度: 保护方案所能提供的强度与它的流行性成反比。特别是当它可以以通用的方式进行破解时更是如此。
■所以另起炉灶比采用流行的保护机制好。 ■人为问题:人为实现错误,另一些保护机制本身具有入侵性质,如Armadillo 会扰乱系统注册表来破坏系统性能。 2018/12/5
40
定位保护机制的实现错误 ■开发人员常犯的概念性错误,使黑客新手甚至高级用户就可以破解保护程序。
大多数程序对非授权复制进行保护,带有试用时间限制,不允许重建原始算法,或者阻止对磁盘或内存文件进行修改。 ■挫败黑客的措施有:阻止反汇编器、调试器、内存转储器、以及文件和注册表监视器等发挥作用的各种方法。 2018/12/5
41
非授权复制与序列号分发 ■1 与特定机器进行捆绑可以保护程序免遭非授权复制。 建议:与光盘介质捆绑,并且只在安装时使用,程序正常启动时不用。
■2 假定保护机制周期性地尝试访问Internet,向注册站点传递序列号,如果同样的序列号可以由许多IP地址来提供,就有可能以远程方式传递重置注册标志的命令。 2018/12/5
42
试用期及其弱点 比如word, winrar的某些版本 2018/12/5
43
倒计时的精确性问题 ■永远不要依赖系统时间来进行倒计时,因为修改系统时间为较早日子就会使试用版变成无限使用版,但它的缺点是影响了所有本地要使用系统时间的程序。 ■像TrailFreezer工具可截获对GetLocalTime API 函数的调用,然后将假的时间信息反馈给各个程序。 2018/12/5
44
倒计时的精确性问题对策 ■保护机制可以访问Internet来检查国际原子时间。但针对安装了防火墙的用户就无法使用。需用罕见格式来保存程序启动次数和以及保护机制处理的文档数目,并很难用手工方式修改会很有效。 ■如何发现系统时间被修改了? 采用几个相互独立的资源,比如打开的文件日期属性,或者连接到国际原子时间服务,最可靠的是扫描整个磁盘。并比较不同的文件的创建与最后修改日期……。 2018/12/5
45
试用版重装问题 ■保护机制:通过试用期进行保护的程序普遍遇到的问题。使用期满后可以卸载—重装后继续免费使用。
■对策:试用安装时在计算机上留下隐藏跟踪的信息,并且不会被卸载程序轻易删除。一旦发现程序以前曾在某机器上安装过,保护机制阻止启动,并建议用户进行注册。 2018/12/5
46
如何发现并删除隐藏标记(续) ■留底:在安装程序之前,保存完整的系统转储内容。反病毒监视程序允许用户创建文件清单;注册表监视程序能够生成注册表快照。 在安装程序之后,可以创建另外一个转储,用于与第一个转储进行比较,通过查看不同的部分所有秘密暴露无遗。 2018/12/5
47
安装前没有转储的办法 2018/12/5
48
保护机制棋高一着 ■愚蠢方法:扰乱注册表与文件系统,给黑客留下需要清除的许多跟踪信息。
■不露声色:可以将%Windows%文件夹的创建时间修改几分之一秒钟,将自己的“魔法数”填在这个字段中。但管理程序会成功跟踪到这个操作。 增加日志文件的大小会更隐藏。 2018/12/5
49
保护机制棋高一着续1 ■更巧妙方法:创建一个文件,针对整个空闲空间进行seek操作,然后扫描所生成的文件看是否存在特定的内容。
在磁盘上删除文件时,它们的内容仍然会在空闲扇区保留相当长的一段时间。 据此保护机制会很容易地发现是否在磁盘上安装过程序。 2018/12/5
50
保护机制棋高一着续2 ■更巧妙方法:在编译时将试用安装日期采用硬编码的方式植入程序。由于试用版并不是每天都上传给服务器,因此试用期持续时间取决于用户下载程序的时间。允许用户多次下载吗? 可以考虑要求用户在网站注册后再下载,这样用户一般会注册购买,而不会多次注册下载。 2018/12/5
51
保护机制棋高一着续3 ■更巧妙方法:在不包含主程序体的安装程序首次启动时,它收集硬件配置方面的信息,并发送给服务器。服务器将信息与数据库中的比较,然后根据比较结果决定允许或者拒绝对程序的下载。 设计一个到几天之后会自动删除的临时链接的引用,用户乃至黑客如果要尝试破解这个保护机制,会很困难。 2018/12/5
52
使用免费软件的简易方法 ■ 安装虚拟机,在虚拟机机上运行试用版软件,比如VMWare, Microsoft Virtural PC, 每次用户只需要简单地格式化虚拟盘,就能删除由软件留下的所有跟踪信息。 简单易行,放在心上! 2018/12/5
53
弥补保护机制925 ■ 不要让黑客知道保护机制如何工作,它可能是一个密钥文件、密钥的某种组合形式或者是一条命令行参数。
■不要使用WM_GETTEXT或者GetWindowText 来读取序列号或者用户名-注册码对,单易行,放在心上! 2018/12/5 53
54
弥补保护机制续 原因:由用户输入的符号串不能以显式的形式在内存中出现,否则,黑客会针对它设置断点,然后用调试工具揭示整个保护机制的核心内容。
■ 逐个处理直接从主输入数据流中得到的键盘事件(WM_CHAR, WM_KEYUP,WM_KEYDOWN),并立即加密之。 原因:由用户输入的符号串不能以显式的形式在内存中出现,否则,黑客会针对它设置断点,然后用调试工具揭示整个保护机制的核心内容。 2018/12/5 54
55
弥补保护机制续 ■ 使用随机数发生器:若采用,不要使用普通函数,因为交叉引用或者正则搜索将使黑客轻而易举地找出保护机制,不能使用rand函数。 ■不用用明文形式存放保护信息,也不要用指针来调用它们。因为黑客使用交叉引用立刻定位保护机制代码。 ■避免直接调用API函数。 2018/12/5 55
56
弥补保护机制续 2018/12/5 56
57
创建保护机制并尝试破解 最简单的鉴定算法: 密码存放位置: 程序中/ 配置文件/注册表 密码保护措施: 无
2018/12/5 创建保护机制并尝试破解 最简单的鉴定算法: 密码存放位置: 程序中/ 配置文件/注册表 密码保护措施: 无 if (strcmp(password entered, reference password)) { /* 密码不正确 */ } else /* 密码正确 */ 2018/12/5
58
#include <stdio.h> #include <string.h>
2018/12/5 最简单的密码保护 #include <stdio.h> #include <string.h> #define legal_psw “my.good.password” int main() { char user_psw[666]; cout<<“crackme 00h\nenter passwd:” ; cin>>user_psw; 2018/12/5
59
最简单的密码保护续 if (strcmp(legal_psw, user_psw)) count<< “wrong password\n”; Else cout<< “password ok\n hello , legal user!\n”; return 0; } 2018/12/5
60
编译链接执行 文件名: crackme.c5f11ea6h.cpp Crackme.cpp = crackme.exe 编译器 不损坏 文本串 执行过程: 要求用户输入密码串,程序将用户输入的密码与保护密码比较,那么参考密码必须存放在程序中的某个位置,想一想? 使用工具查看程序exe文件的内容 。 2018/12/5 60
61
查看二进制内容 2018/12/5 61
62
查看二进制内容续 2018/12/5
63
结果分析 2018/12/5
64
黑掉程序而非找密码 ■ 选用合适的工具 主要工具: 反汇编器与调试器 反汇编: 将机器码转换成汇编指令的过程。
2018/12/5 黑掉程序而非找密码 ■ 选用合适的工具 主要工具: 反汇编器与调试器 反汇编: 将机器码转换成汇编指令的过程。 反汇编只能处理由 编译器产生的机器码程序。 辅助工具:屏幕监视器,窥测器与解压器 解释器与编译器的异同点 2018/12/5 64 64
65
黑掉程序而非找密码 ■ 选用合适的工具 主要工具: 反汇编器与调试器 反汇编: 将机器码转换成汇编指令的过程。
2018/12/5 黑掉程序而非找密码 ■ 选用合适的工具 主要工具: 反汇编器与调试器 反汇编: 将机器码转换成汇编指令的过程。 反汇编只能处理由 编译器产生的机器码程序。 辅助工具:屏幕监视器,窥测器与解压器 解释器与编译器的异同点 批反汇编器与交互式反汇编器 2018/12/5 65 65
66
黑客反向工程热身 ■ data: 数据段 rdata: 只读数据, 字符串文字和常量. 如本程序中的 "myGOODpassword\n“。
2018/12/5 黑客反向工程热身 ■ data: 数据段 rdata: 只读数据, 字符串文字和常量. 如本程序中的 "myGOODpassword\n“。 bss: 未初始化数据, 比如函数和静态变量。 idata: 包括导入库和导入地址名称表。 edata:包含了应用程序或DLL的导出数据。 ■ text(code): 代码段。 2018/12/5
67
黑客反向工程热身 ■c中,内存数据分为如下几个区 ■ C++中,内存分成5个区,分别为:
1.栈--- 由编译器自动分配释放[bp+xx], [bp-xx]。 2.堆--- 一般由程序员分配释放new(), delete() 函数。 3.全局区(静态区)共享存储区。 初始化的全局变量和静态变量在一块区域(data)。 未初始化全局和静态变量放在相邻区域(bss)。 4.另外还有一个专门放常量的地方(rdata)。 ■ C++中,内存分成5个区,分别为: 1.栈,里面的变量通常是局部变量、函数参数等。 2018/12/5
68
黑客反向工程热身 2.堆,由new分配的内存块,由delete回收。 3.自由存储区,由malloc等分配的内存块,和堆相似,
3.自由存储区,由malloc等分配的内存块,和堆相似, 由free回收。 4.全局/静态存储区,全局和静态变量均被分配到同一块内存中,由该语言编译器自行确定(与C语言有差别)。 5.常量存储区,存放常量,不允许修改。 静态变量/全局变量:全局/静态存储区。 常量存放在常量区。 程序放在代码区。 2018/12/5
69
黑客反向工程热身 查看二进制文件. 根据: 编译器将初始变量放在如下数据段中. data rdata 自定义段
根据: 编译器将初始变量放在如下数据段中. data rdata 自定义段 2018/12/5
70
黑客反向工程热身 改写动机:隐藏密码字符串,增加一点分析难度。 int count = 0
2018/12/5 黑客反向工程热身 改写动机:隐藏密码字符串,增加一点分析难度。 int count = 0 // 从现在开始, 所有初始化变量都放置在.kpnc中. #pragma data_seg(“kpnc”) char passwd[]=PASSWORD; #pragma data_seg() // 现在所有初始变量又将放到默认段rdata中了. char buff[PASSWORD_SIZE]=“ “; 2018/12/5
71
黑客反向工程热身 改写后的源代码清单---list1_p9.cpp idag list1_p9.exe 目标代码中出现了如下段落: text
2018/12/5 黑客反向工程热身 改写后的源代码清单---list1_p9.cpp idag list1_p9.exe 目标代码中出现了如下段落: text rdata data idata kpnc 只有在kpnc 段中才能看到密码字符串信息. "myGOODpassword\n“ 2018/12/5
72
黑客反向工程-熟练使用反汇编器 ■修改二进制代码的工具:hiew(动机) ■反汇编工具: ida ■大家推荐工具:softice, ……
2018/12/5 黑客反向工程-熟练使用反汇编器 ■修改二进制代码的工具:hiew(动机) ■反汇编工具: ida ■大家推荐工具:softice, …… ■汇编: 将汇编程序转换为机器语言程序。 ■反汇编: 将机器语言程序转换为汇编指令。 2018/12/5
73
黑客反向工程---Ida ---list1_7.exe
2018/12/5 黑客反向工程---Ida ---list1_7.exe 分析过程: .rdata: F ....$y餏....... rdata: `.Pass rdata: F F 4B 0A F 6E word OK....Wron rdata: F A g password..... rdata: D F 4F F A myGOODpassword. rdata: E F ....Enter passwo rdata: A rd: str rdata: D 20 4E 55 4C 4C E 63 00 != NULL.fgets.c 2018/12/5
74
使用密码串进行比较的程序块 .text:0040104D .text:00401052 add esp, 0Ch
.text: push offset s_Mygoodpasswor ( h)"myGOODpassword\n" .text: A lea ecx, [ebp+var_68] .text: D push ecx .text: E call strcmp .text: E .text: add esp, 8 .text: test eax, eax .text: jz short loc_401079 2018/12/5
75
黑客反向工程---C规范的知识 ■ strcmp传递两个参数 : push offset s_Mygoodpasswor ;参考密码
2018/12/5 黑客反向工程---C规范的知识 ■ strcmp传递两个参数 : push offset s_Mygoodpasswor ;参考密码 lea ecx, [ebp+var_68]; 用户输入密码区 push ecx call strcmp ■ C 规范:从右到左的顺序将参数压入堆栈。 ■恢复的结果为: strcmp(var_68, "myGOODpassword\n") 2018/12/5
76
黑客反向工程--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/12/5
77
黑客反向工程---分析修改的程序 text:00401063 add esp, 8 .text:00401066 test eax, eax
.text: jz short loc_401079 .text: A push offset_WrongPassword ;"Wrong password\n" .text: F call printf 检查函数返回值是否等于零,若为0,表示密码正确,进行相应提示;否则转错误处理程序。 修改: JNZ--》JZ, test eax,eaxxor eax,eax等 JZ: 74--》JNZ: XOR: 31 2018/12/5
78
黑客反向工程--外科手术(改程序) 解决方法: 使用直接编辑二进制工具 hiew32等. Hiew32 list1_p7g.exe
2018/12/5 黑客反向工程--外科手术(改程序) 解决方法: 使用直接编辑二进制工具 hiew32等. Hiew32 list1_p7g.exe 目标: 寻找 JZ 机器代码 定位 h偏移, 将 74 改为 75 2018/12/5
79
实际的破解范例 ■Winrar 下载版试用40天。 试用期结束 会显示 会显示一个 令人恼火的要求用户注册的屏幕消息,很挑衅。 其它版本的可按同样方式进行破解,唯一的不同在于,保护字节所处的位置的偏移量是不一样的。
80
实际的破解范例 80
81
抑制干扰屏的出现 ■基本方法:每种对话框都是用某个API函数来显示的。捕获显示干扰屏的API函数,就有可能反汇编调用该函数的保护代码,从而分析出让干扰屏得以显示的条件。 ■反编译---汇编到高级语言(C或C++) MOV AX,[1000], ADD AX, 10, MOV [1000],AX var1000=var ■类/模型/概念识别---从高级语言到类/模式/概念。 81
82
抑制干扰屏的出现 82
83
黑客反向工程预备知识 ■如何创建与绕过保护环节 若能了解创建保护机制的知识更好。 ■黑客底层分析技术---调试器与反汇编器使用技能
熟练使用调试器 熟练使用反汇编器 二进制编辑工具 ■识别与重建源代码关键结构---从二进制或汇编中识别出函数、局部与全局变量、控制结构、对象、运算符等。降低程序分析的工作量。
Similar presentations