运行后:

本机机器码"195F9059606EEB4723128A216ED1426B”,在内存中搜索该字符串,可以得到3个地方,我这里以最后搜索到的地方为切入点,

为什么? 找到的3个地方都下内存断点判断,刚好最后找到的那个注册码最早生成而已,以哪个作为切入点都是一样的。

快速判断:
软件重新RUN,不断d 00EECF68,等该内存段分配完毕后,在该地址下内存断点,第一次断在:

  1. 00EF7BB3    8915 84CFEE00   mov     dword ptr [EECF84], edx
  2. 00EF7BB9    E9 D2360000     jmp     00EFB290

复制代码

是写0的操作,估计是初始化。
第二次断点:

  1. 00F05A92    8802            mov     byte ptr [edx], al
  2. 00F05A94    C3              retn

复制代码

发现此时[00EECF68]内存段正在写入数据。断点设在00F05A94处,等机器码全部写完后PATCH之,

取消断点,RUN,第一次时生成.KEY文件,再重复上次过程则跳过注册框正常运行。

在做INLINE HOOK程序时,发现几个问题:
1,机器码放置的位置是变化的,比如说这次是[00EECF68],那下次有可能是[00EFCF68]。再跟踪几次,发现还好,虽然地址在变化,但在该内存段的OFFSET值是固定的。V2.1.0DEMO版本的OFFSET值为01CF68:

)

2,机器码所在的区段是固定的,即总是在SIZE = 0008A000 的段中。

  1. Memory map, 条目 51
  2. 地址=00ED0000
  3. 大小=0008A000 (565248.)
  4. 属主=         00ED0000 (自身)
  5. 区段=
  6. 类型=Priv 00021040
  7. 访问=RWE
  8. 初始访问=RWE

复制代码

在此基础上,考虑HOOK VrtualAlloc,
1,根据Alloc的内存SIZE定位到机器码所在的段,从而获得段地址。
2,段地址 + 机器码OFFSET值(比如这里的:00ED0000 + 01CF68)即为机器码的位置。
3,看能否找到某个API,在刚机器码刚生成时HOOK住,然后直接PATCH 机器码即可。

以上1,2点不用测试即可知道能实现,第3点的API在测试多遍后都没能找到合适的API,只好放弃,因为程序有可能在生成机器码后进行运算直接与注册码进行比较或与注册码进行运算后进行解码,也就是说这个过程可能不用调用到API。

那么换个思路,我们从前面的内存写入断点可以定位到生成最终机器码的过程代码:

  1. 00F05A92    8802            mov     byte ptr [edx], al
  2. 00F05A94    C3              retn


经过几次测试,发现改代码的OFFSET值也是固定的,固定值为35A92 :

  1. $+35A92  >  8802            mov     byte ptr [edx], al
  2. $+35A94  >  C3              retn


因此思路可以调整如下:
1,根据Alloc的内存SIZE定位到机器码所在的段,从而获得段地址。
2,段地址 + CODE OFFSET值(比如这里的:00ED0000 + 035A92 )即为生成机器码代码的地址。
3,HOOK 生成机器码的代码:
原来的:

  1. 00F05A85    F7D5            not     ebp
  2. 00F05A87    53              push    ebx
  3. 00F05A88    66:8BD2         mov     dx, dx
  4. 00F05A8B    5B              pop     ebx
  5. 00F05A8C    F7D5            not     ebp
  6. 00F05A8E    66:57           push    di
  7. 00F05A90    66:5F           pop     di
  8. 00F05A92    8802            mov     byte ptr [edx], al


很明显,中间一段代码为无用代码,更改为类似如下代码(其中00F597D1为任选的一段空白代码处):

  1. 00F05A85   /E9 473D0500     jmp     00F597D1
  2. 00F05A8A   |90              nop
  3. 00F05A8B   |90              nop
  4. 00F05A8C   |90              nop
  5. 00F05A8D   |90              nop
  6. 00F05A8E   |90              nop
  7. 00F05A8F   |90              nop
  8. 00F05A90   |90              nop
  9. 00F05A91   |90              nop


再来做00F597D1处的PATCH代码:

  1. 00F597D1    81FA 87CF5801   cmp     edx, 158CF87
  2. 00F597D7    74 05           je      short 00F597DE
  3. 00F597D9  ^ E9 B4C2FAFF     jmp     00F05A92
  4. 00F597DE    83EA 1F         sub     edx, 1F
  5. 00F597E1    C702 30463043   mov     dword ptr [edx], HWID1
  6. 00F597E7    C742 04 3342443>mov     dword ptr [edx+4], HWID2
  7. 00F597EE    C742 08 4231333>mov     dword ptr [edx+8], HWID3
  8. 00F597F5    C742 0C 4241443>mov     dword ptr [edx+C], HWID4
  9. 00F597FC    C742 10 3043313>mov     dword ptr [edx+10], HWID5
  10. 00F59803    C742 14 4343344>mov     dword ptr [edx+14], HWID6
  11. 00F5980A    C742 18 4646303>mov     dword ptr [edx+18], HWID7
  12. 00F59811    C742 1C 4141414>mov     dword ptr [edx+1C], HWID8
  13. 00F59818  ^ E9 75C2FAFF     jmp     00F05A92


把代码写入程序后发现运行时出错,很明显,有类似CRC校验的东西存在。  还好经过测试后发现;
1,机器码只要PATCH一次后即可。
2,校验只校验部分代码,比如刚刚那空白处00F597D1写入的代码即不在校验范围内。
那么,我们只要在PATCH机器码后把原始的CODE写回即可。

如果不符合以上两个条件,那么只能通过多次HOOK API经过多次更改代码来BYPASS了(兵无定势,根据实际情况分析,哪种可行就选哪种了)。

破解VProtect所有版本,PATCH HWID方式过注册相关推荐

  1. Enigma所有版本过注册 高版本通过PATCH HWID方式

    软件打开界面: V2.0以下的貌似只要跳过注册框即可,无需解码.(以下内容摘自本人发自upk的原创,并非抄袭) 以下以V3.7为例子PATCH HWID: 一,查找HWID生成地址: 1, 先在.rs ...

  2. nginx patch补丁方式添加 nginx_upstream_check_module 模块,并测试健康检查

    原创博客地址:陈帅同学-nginx patch补丁方式添加 nginx_upstream_check_module 模块,并测试健康检查 我的测试环境 contos:6.7nginx:1.63 che ...

  3. QQ农场破解思路(版本20091212)

    QQ农场破解思路(版本20091212): 1.获得验证码 重要参数: aid=15000101&0.+16位的随机码 2.web形式登陆qq空间 重要参数: u=QQ号: p=md5(md5 ...

  4. rpm打patch的方式

    如何使用git命令打patch 以下的说明只针对于centos/frdora/kylinos等rpm包管理的操作系统 在我们平时的业务开发和维护中,遇到业务的一些问题的时候,就需要去修改源代码.像我平 ...

  5. 【版本安装】最新版本|还在开发的版本sklearn安装方式

    记录 对于有些还处在开发版本的库,我们是无法通过简单的pip调用的,比如sklearn的所有版本(2022.10.30)如下: 对于scikit-learn 1.2.dev0 与 scikit-lea ...

  6. Idea中Maven报错:Failed to read artifact descriptor for jar包名.jar.jar包版本的解决方式

    Idea中Maven报错:Failed to read artifact descriptor for jar包名.jar.jar包版本的解决方式 故障现象 尝试解决 总结 故障现象 最近这种故障频发 ...

  7. Linux驱动之----Linux2.6方式设备注册

    Linux2.6方式设备注册API 杂项设备注册和经典设备注册方法可参考我前俩篇博客 Linux驱动之----杂项设备注册 Linux驱动之----经典方式注册 在linux2.6里面设备号的申请方式 ...

  8. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标 1)搞清楚构造参数依赖注入的过程及类 2)搞清楚注解方式的属性依赖注入在哪里完成的. 学习思路 1)思考我们手写时是如何做的 2)读 spring 源码对比看它的实现 3) ...

  9. EXECL导入(检查服务器版本.包括NPOI方式导入.可以通过配置文件信息导入EXECL)代码记录下....

    在工作中很多要把EXECL的数据取出来的情况,因此,写一个相对通用的这种功能类很有必要.我因为当时只考虑了引用MS的EXECL类的情况,所以后面加入NPOI时这个类就有点显乱了,因为已经有人在用了,只 ...

最新文章

  1. 喜讯不断,BCH又迎来两个代币发行方案
  2. httplib 和 httplib2区别之 gzip解压
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1091:求阶乘的和
  4. Maven实战——常用Maven插件介绍
  5. php RabbitMQ使用
  6. 牛客题霸 [ 旋转数组的最小数字] C++题解/答案
  7. 阿里高专王夕宁:Istio网关之南北向流量管理
  8. Machine Learning(CF-940F)
  9. 【Flink】checkpoint storage at checkckpoint coordinator No route host from xx to xx:9000
  10. Linux(RedHat)下Weblogic 12C静默安装
  11. Elasticsearch与SpringBoot整合 High-level-client-rest
  12. [转载] pickle:让python对象序列化
  13. 利用pil库处理图像
  14. python机器学习实战_Python机器学习实战案例
  15. github action自动部署构建入门
  16. springboot项目启动后执行方法
  17. c语言乘法除法结合律,C语言运算符的优先级和结合律
  18. 2019秋招银行类——邮储银行总行笔试经验
  19. Linux系统mysql 查看当前使用的配置文件my.cnf的方法
  20. c语言的split字符串分割(函数strtok)

热门文章

  1. 使用Selenium破解滑动验证码的原理及解决思路
  2. RA(RouterAdvertisement) and DHCPv6
  3. ios 九宫格图片的展示实现
  4. gg怎样获得root权限,gg怎么获得root权限
  5. C语言int search类型,C语言的一些高级议题
  6. 吃一堑长一智(sql篇)
  7. lftp安装包 linux_linux-lftp
  8. JAVA锁定mdb文件_ArcGIS中有关MDB文件锁定的说明
  9. 星载SAR及InSAR卫星系统参数
  10. 学习摄影,入了Canon 50D