吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 65547|回复: 365

[原创逆向图文] 补丁打不上的原因?你需要进来看!

  [复制链接]
Shy 发表于 2016-8-14 12:32 | 显示全部楼层 |阅读模式

本教程由热情洋溢的木木不哭赞助播出(“哎呀我摔倒了要漂亮姐姐亲亲才能起来”)

以下观点纯属个人赞同,或许不专业性,但是通俗易懂,不喜点x

补丁的分类
1.Exe型内存补丁
2.Dll型内存补丁

一般大家接触的就这两种,其他的不列举,像什么驱动读写就我个人而言我认为不够全面,x64位系统很多驱动加载不了,或者加载起来就蓝屏,,这个不提,主讲以上两种

Exe型内存补丁:通过API函数WriteProcessMemory,将指定数据写入到指定内存地址
优势:兼容性高,不易出错,使用要求低
劣势:对时机要求高,且必须要有写入权限

Dll型内存补丁:原理同上述Exe型内存补丁
优势:稳定,对时机要求较低
劣势:不能独立运行,需在目标进程中运行

程序的运行过程:将硬盘中的Exe数据映射到内存中,并分配一块内存区域,这个过程可比作是从桌子上拿起某样东西到手上

API:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节

以上内容了解就好,只是说个原理,不懂的话也可以跳过,不影响下面我要说的内容
我们先来写一个简单的程序,,从而简单分析你的补丁为何打不进去
1.jpg
首先这是一个简单的Exe程序,内容是当这个按钮被按下的以后,程序会判断这个按钮是否可以可视,如果可视的话就 弹一个Success的信息框

那么假设我们要逆向这个程序,理论上有两种思路可选
1.在判断是否可视的地方,强制判断为真
2.强制将按钮可视

那么到此处,我们再延伸一些概念:壳
壳,有两个作用,一是保护程序,二是压缩程序,这里不提压缩,只讲保护
保护程序,事实上就是将程序放入一个保险箱,那么当程序在硬盘当中,其实就是这个程序放在保险箱里面,密不透风不可修改
当程序运行的时候,保险箱要打开门,将里面的东西取出来放到内存,所以当你打开门看到程序的时候那个点叫做OEP

然后我们回到刚刚那个程序,当这个按钮不被点击的时候这段代码是没有被执行的,所以在没有被执行之前,你对他任何的修改,当代码被执行时,都会按照你改的流程走
但是,如果我们改变一下这个源码,将他放到这个地方
2.jpg
这样的话,这个程序在这个窗口创建完毕的时候,就会进行判断,那么当你看到窗体的时候,事实上这段代码已经执行完毕,并且只会执行这一次的时候,你的补丁修改就无效了
也就是说当你在OD运行起来,这个程序窗口已经出来,这段代码也已经执行完毕,并且这个判断只执行这一次的时候,你再对他进行内存补丁,也就没有意义了
所以,我们用内存补丁一个非常非常非常重要的一点就是:时机

最后我们将内存补丁打不上,分为以下几种原因:
1.在程序内存中,无权限修改内存

2.时机,时机,时机,重要的事情说三遍

3.动态内存地址

以上三种是最主要的原因,出现问题最多的就是第二个,时机,所以我们重点讲下时机,其他的稍微提一些解决办法

解决无权限修改内存:

每个人都有属于自己的小秘密,程序亦是如此,那么系统分配给程序的内存,有公开的也就是可读可写,有私密的不可读不可写
所以我们有两个解决办法:
1.让程序认为自己的秘密可以被分享
2.拿到钥匙打开程序私密的地方

首先第一点的解决办法:
我们先来看程序的区段
3.jpg
在这里,一般程序的重点代码都放在了Text段
所以他的标志一般为可读可执行,但是其他段就不一定了,有可能只读不可写不可执行,所以我们需要修改
需要的工具:Load PE
4.jpg
直接将文件拖进来,如果你拖进来不显示这个框,而是提示重建PE头,那么请这样设置
5.jpg
首先点击选项,其次点打开PE编辑器,最后点确定就可以了

当我们拖进来以后,我们依图操作,首先点击区段
6.jpg

其次点击编辑区段,此时应知道你需要修改的内存地址所在的区段
7.jpg

然后给我们点这个标志的小按钮
8.jpg

最后我们勾选好可写入可执行,然后一路点确定保存就可以了
9.jpg

然后我们该怎么找内存地址在哪个区段呢?比如说00401000到底在哪个段呢?
我们把软件拖进OD,然后点M
a.jpg
找到你的程序名所在的区段,比如我的程序名是test.exe,那么我们就找test
我们这样看,如果你的内存地址≥00401000,但是<0047F000,那么就是在Text段
如果是≥0047F000但是<00493000,那么就是在rdata段,以此类推

比如我们要修改的00401000,这个地址≥00401000,但是<0047F000,所以他是在Text段,我们要修改的区段就是这个

这样我们就完成了让程序认为此秘密可以被分享,,但是请注意:VMP此类加密壳不可修改区段的可读可写性,否则会报错导致程序运行失败

接着第二点解决办法的操作方法:
在OD里面,我们可以用此办法
同样点M,找到内存地址所在区段
b.jpg
但是这样的话只适合单次修改,如果程序被重新载入又要重新设置一次,而且不能被保存,那么我们的补丁应该怎么写呢?
这时候如果你们不懂API,我们就借助超级模块,个人非常非常不推荐精易这个bug模块,修改不了,,至少5.33是有bug的,前几天就是因为这个我耽误了半个多小时,,
c.jpg
超级模块的话,我个人找到一个微风的模块,反正8.0已经开源了,大家自己去编译一下也可以,,或者用成品8.0也行
这里用法的话就照上面填,把地址改成你需要修改的地址,因为OD里面的地址是16进制的,而E语言是10进制的,所以直接将16进制转换到10进制
属性的话填64,这个好像是可读可写可执行,具体大家可以自己去查阅,反正改64就对了,然后这里的长度我看了一下
他说默认如果为空参数的话,是32位长度,但是我看源码好像填的是5,所以这里的长度,大概最好改一下,改成比你修改的数据的长度大1就可以了
d.jpg
大家可以看一下源码
e.jpg
这里填的是5,但是他的说明填的是32位长度,我也不知道是我错了还是这里填错了,反正大家填大一点也无所谓,,,除非你跟我一样有强迫症,,
他这里的长度其实是字节,如果是长度填5那就是5个字节,这里如何确定你的数据的长度呢?这里给大家写个源码,确定一下(没有啥技术含量)
f.jpg
大家如果不画信息框就用上面那句代码,
调试输出 (到整数 (取文本长度 (删全部空 (“这里填你的补丁数据”)) ÷ 2))
如:
调试输出 (到整数 (取文本长度 (删全部空 (“30 31 32 33”)) ÷ 2))
然后会自动得出你的长度,这样的话你就照着填或者填大一个字节,比如上句代码得出来的结果是4,那么你就填5即可
------------------------
接着我们来说原因3,动态地址的补丁方法,其实说实在的这个动态地址的补丁就两种解决办法
1.将动态地址变为静态地址
2.使用内存搜索特征码确定特征码所在的地址,再进行补丁

事实上解决办法1算比较简单,等会我做个例子大家就明白了,但是解决办法2,非常需要考验时机,就是我文章开头说的时机,这个特别难把握,大家视情况解决吧

解决办法1:
2.jpg
我这个小例子很简单,源码就是判断编辑框1.内容是否等于123,相等弹出Success信息框,否则无任何动作
那么这里大家看到我下断的地方,以及寄存器EAX
这里是将EAX的值赋值给EBP-4,但是这个EBP的值我们知道是非固定的,是经过运算的,所以我们一般不去修改这个值
一般修改的是EAX的值,把1234改成123对不对?而这个1234所在的0386A410这个内存地址,不属于4大区段中的任何一个段,所以他属于程序自己申请的一块内存
这块内存可以随时释放随时申请,所以当这块内存被别的程序使用时,系统会分配另一块内存给程序使用,所以导致这个内存地址是不变的,大概就是这么一个意思

对,没错,我说的就是补码,补码其实不一定可以在程序区段中存放,也可以自己申请一块内存补码,,这样的话就达到了我们固定动态地址的目的,补码大家很熟悉我就不说了

解决办法2
说真的这个方法不怎么样,但是在某些时候却是最好用的,,像我写的这个例子的话,如果你想用内存搜索1234并替换成123,就比较难了,时机不好把握,所以这里只是稍微提一下
3.jpg

写法的话就这样写,,但是这样大范围内存搜索的话,程序很容易死,所以这里只是提这种方法,并不是特别推荐
------------------------
接下来,我重点要说的时机,终于来了,在讲时机之前,大家必须要了解,我强烈要求去学习的API Hook技术

游客,如果您要查看本帖隐藏内容请回复


评分

参与人数 121威望 +1 HB +185 THX +64 收起 理由
lwolves + 1 + 1
longge188 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
24567 + 1
Jawon + 1
sjtkxy + 1 + 1
DDK4282 + 2 + 1 牛!
虚心学习 + 1
一路走来不容易 + 1
WolfKing + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
消逝的过去 + 1
冷亦飞 + 1
禽大师 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
琉璃格大 + 1
jaunic + 2
PDWORD + 1
kll545012 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
EMT + 1
小可 + 1 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
jianxuu + 1
CraftDeadMRC + 1
曦照 + 1
leo999 + 1 + 1
年少 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
boot + 2
風清. + 1
成丰羽 + 1
csawxt + 1
本子狸 + 1
dowdndx + 1 [快捷评语]--2021年,我们爱0爱1
a810680485 + 1
xiaodiao99 + 1
hnymsh + 1
beijita520 + 1
豆0o0豆 + 1
6378895 + 1
mengzhisuoliu1 + 1
mengzhisuoliu + 1
Tian_52HB + 1
goldmvp + 1 [快捷评语]--吃水不忘打井人,给个评分懂感恩!
谈心123 + 1 [快捷评语]--积极评分,从我做起。感谢分享!
莣孒嬡沵芣蓜 + 6 + 1 [通知]学破解论坛即将在近期更名为吾爱汇编论坛WWW.52HB.COM
liugu0hai + 1 [快捷评语]--吃水不忘打井人,给个评分懂感恩!
上帝的恩赐 + 1
lies + 1
星辰物语呀 + 1 + 1 [快捷评语]--你将受到所有人的崇拜!
zy52111 + 1
方长 + 1 [快捷评语] - 评分=感恩!简单却充满爱!感谢您的作品!
若然 + 2 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
人生有酒多忘欢 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
微若清风 发表于 2016-8-14 14:27 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
donglouse 发表于 2016-8-14 15:09 | 显示全部楼层

分析的有道理。虽然我还是懵懂。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
蓝色贝雷帽 发表于 2016-8-14 20:29 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
boom 发表于 2016-8-14 22:34 来自手机端 | 显示全部楼层

谢谢楼主分享教程 谢谢
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
xiaocao 发表于 2016-8-14 23:22 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
公爵4ever 发表于 2016-8-15 02:39 | 显示全部楼层

原来如此,学习了!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
ok8953 发表于 2016-8-15 07:20 | 显示全部楼层

牛人啊
希望弄个视频版的出来
专门系统讲解补丁的教程太少了
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
六年小乞丐 发表于 2016-8-15 08:34 | 显示全部楼层

继续看下一步
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
LYQingYe 发表于 2016-8-15 08:42 | 显示全部楼层

新人学习下
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表