内存补丁

  1. 前言
  2. 正文
  3. 最后

前言

shark恒第十八课,内存补丁。在开始之前,先说一下何为内存补丁
内存补丁:内存补丁在程序运行之前候修改指定的指令任何在运行程序从而实现破解,程序的主体无任何变动。
162957-15334577973962.jpg

正文

拿到程序首先进行常规查壳(PEID走起)
VB写的,无壳
izYxAA.png

运行程序看看能不能发现什么关键字
iztC1f.png
点击继续试用,找到关键字字 “(未注册)”
iztijS.png
载入OD进行关键字搜索,然后看见了“(已注册)”
iztkng.md.png
点进已注册看看
发现很多跳转
iztE7j.png
往上面翻翻,看看有什么收获。然后发现了一个大跳je,跳过了已注册
iztt41.png
那么把他NOP掉就是已注册了,但是我们这课学的是内存补丁。自然不是更改程序住体
打开内存补丁制作工具,然后进行补丁制作
打开,选择其他,选择制作内存补丁

长度:没两个数字算一个长度,这里有12个数字,所以12除于2
指令:指令就是地址右边的那个框框
修改后:NOP后有6个90

91fd1075.png
生成之后执行补丁,效果如下:
izNuad.md.png

izNQPI.png

最后

从开始到现在学了那么多知识后做一次总结:

1.首先判断软件有没有加壳,用peid看,如果加了壳就找对应的脱壳工具,进行脱壳。
2.然后运行软件,观察软件的运行。获取关键字。如:密码错误的那个
3.把软件拖入od进行搜索关键字,双击关键字的那行。然后跳到CPU区,进行断点。f6运行程序看程序是不是跳到哪里。如果跳转成立的线是红色的,不成立则为灰色,跳转标识符
,然后进行noop填聪(就是什么也没有),然后软件就破解了。
自己可以考虑用C写个简单的登陆程序,进行破解。完毕
注意:搜索用智能搜索,搜索关键字要模糊化,不要全部打上。搜索跳转到CPU区之后先看软件的运行流程,分析软件,下断点,按f6运行程序进行调试。然后进行下一步。
破解完后如果要进行保存,点击复制到可执行文件,选择,保存文件。给他取个名字

破解要用反向思维来想。比如他跳转不成功进入到报错。那他跳转成功是否是正确的呢?
注意:当修改CPU区的代码的时候按空格,修改必须保证修改的代码为16进制

当你脱壳之后,因为现在壳都有压缩功能。所有脱壳之后文件会变大,如果文件变大了。如果PE有检测文件大小功能,如果文件大小不等于
有壳时候的大小就会退出PE。判断是否有自效验就是,脱壳后PE打不开。
将PE拖入到OD设置API断点->常用断点->文件大小断点。F9运行,发现程序被断下来了,在右下角的窗口可以看见判断函数,点击反汇编数据窗口跟踪,然后如果发现。cmp 十六进制(文件大小),然后用Noop填充即可

一般有关键跳上面就有关键call,z载入OD的程序可以观察一下有什么注册成功之类的关键字。上面就有关键跳和关键call,找主要跳转。如果关键跳跳过了正确程序的话,可以从关键call中进行更改使关键call达到正确的程序,关键call和关键跳中有笔记,test可以仔细观察一下

先用API断点函数下一个ReadFile读文件的函数,如果有壳则用401000跳到字符区。然后搜索关键字,双击关键字跳到反汇编窗口F2下断点,将读文件的断点禁止,运行软件跳到断点
之后往上看判断,是否有真码

ini类型重启验证(重启验证之后没有任何关键字提示),我们就用不了ReadFile类型断点任何在搜索关键字来搜索真码,但是我们可以用BP下个GetPrivateProfileStringA断点,专门用于对付ini重启验证。
知识点记录:
程序领空:OD左上角文件名如果文件是程序名就是程序领空
系统领空:OD左上角文件名如果不是程序名的话就是系统领空
如果遇见系统领空的话就按Alt+F9(或者在调试按执行到用户代码)跳出系统领空,然后单步寻找真码

因为PE头部被修改,将PE载入到OD之后直接运行程序。右键->查找->模块user32。到了模块user32之后进行查找->二进制字符串->搜索:F3 A5 8B C8 83 E1 03 F3 A4 E8,双击跳转。然后在合适的步骤下断点,等程序断下来之后
Alt+F9跳出系统领空,找真码即可。

首先判断是不是VB写的,如果是VB写的话有几个特征
有一个push,jmp &MSVBxxx,往上拉还能发现vb的函数

F9运行程序,然后到弹出框框的那里回到OD按F12暂停OD。之后到OD菜单栏上方按K找到 user32.MessageBoxExA 当然不只是这个。还有其他的,然后右键显示调用。之后对跳到的地方下断,F8运行下去跳出系统领空
然后我们往上面翻可以看见段首和段尾, F8往下单步,看看有什么神奇的东西(如果没有什么,那么出call), 出call之后我们发现了弹框的call还有弹出这个框框的关键跳 对jnz下断修改Z标志位,将jnz改为jmp

删除VMP虚拟机检测:
1\. 首先下断点到LocalAlloc
2\. 中断下来后,在数据窗口CTRL+G输入ESP, 然后从这个地址开始搜索 当前模块加载基地址 如这里的 011C0000
    不过这里为了保险,防止搜索到多个结果,应该搜索 模块默认加载基地址 \+ 模块当前加载基地址 组合起来的8个字节
1.搜索LocalAlloc
2.下断,然后运行程序,寄存器窗口选中esp右键数据窗口跟随
3.按菜单栏上的e,查看基址
4.搜索地址
5.在数据窗口中修改
[https://867810770.github.io/2018/09/25/VMP3-12过虚拟机检测/#more](https://867810770.github.io/2018/09/25/VMP3-12%E8%BF%87%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A3%80%E6%B5%8B/#more)

我们可以学到:如果找不到关键跳的情况下,对段首下断点进行单步调试说不定能找到惊喜。一般真码验证在关键跳上方可以找到

脱壳谨记:
1.遇到壳的时候要先查壳,如果PEID查不出什么语言写的用DELE查
2.然后查到什么语言后先去查OEP是怎么样的,不要OEP过了都不知道
3.BC++壳脱完后要手动寻找IAT地址,不要认为是自效验

通过按钮获取关键位:
当你发现一个PE上有很多按钮的时候而你要破解的地方也是要使用按钮的话,你可以用DarkDe分析PE的按钮的位置然后,在OD定位。一个一个下断,在定位按钮,看看那个是你要弄的按钮,分析下面的代码
因为你会跳到按钮那,也就是说按钮下面的代码是处理判断的
[https://422926799.github.io/2018/10/20/%E4%BD%BF%E7%94%A8DarkDe%E9%80%9A%E8%BF%87%E6%8C%89%E9%92%AE%E4%BA%8B%E4%BB%B6%E5%AF%BB%E6%89%BE%E5%85%B3%E9%94%AE%E4%BB%A3%E7%A0%81%E9%83%A8%E5%88%86/](https://422926799.github.io/2018/10/20/%E4%BD%BF%E7%94%A8DarkDe%E9%80%9A%E8%BF%87%E6%8C%89%E9%92%AE%E4%BA%8B%E4%BB%B6%E5%AF%BB%E6%89%BE%E5%85%B3%E9%94%AE%E4%BB%A3%E7%A0%81%E9%83%A8%E5%88%86/)

程序飞了,就对那个飞了的call下段,然后重新运行,然后F7进入程序
遇见循环,在循环的下一行,选中那个位置。然后F4(F4是运行到指定位置)

内存补丁:本文

转载请声明:转自422926799.github.io


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:内存补丁

本文作者:九世

发布时间:2018-11-17, 16:37:58

最后更新:2019-04-19, 20:36:16

原始链接:http://422926799.github.io/posts/7cf8a828.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录