首页
社区
课程
招聘
[讨论]vmp程序的破解。。
发表于: 2012-1-15 13:39 11757

[讨论]vmp程序的破解。。

2012-1-15 13:39
11757
某程序是通过网络验证的,B/S模式。读取机器码加密再去连接WEB,得到返回结果密解密判断。
提交格式为
http://www.****.com/checkt?a987bf29d93e92a51c15fe98aee8cc
返回的cc83a712aee

并且每次send和recv的这两个串都是不同的,看了下,没有任何规律,用硬断慢慢都跟了一下,找到VM_retn,写脚本发现,比如发送的串a987bf29d93e92a51c15fe98aee8cc
, 就第一个a和第二个9之间,就调用了近两百个HANDER,所以单步分析就放弃了,关键代码全被VMP了,不是最近的2.02壳,用了网上几种方法都脱不掉。郁闷!!

这软件,我买了一个正版的,比如绑定了机器A,我已经找到他读机器码的地方,现在来到机器B上面,我想通过修改本地B机器码为注册正版的那台A机器的机器码,来饶过验证,发现对面服务器有点复杂,一次性只能连接一台,A机器用了,B机器就不能用,所以只有另一种方法,自己来收这个正确的收包,
现在,比如,断A机器,断SEND和RECV得到
http://www.****.com/checkt?16165654abce4f23e4156
返回的5664ce2abb12
可以通过验证,以后,不管有没有验证的机器,我让SEND都发这个16165654abce4f23e4156
我在RECV最下面的RETN处, 把收包的字符串,都改成5664ce2abb12,就可以过了。。

现在又遇到问题,因为生成16165654abce4f23e4156这个串,是通过VM里,一个一个生成的,并且保存在哪,根本不知道。

我来到注册的机器A,OD载入,断到recv的retn处,用CE搜未知数据0~FFFFFFFF位置,将EAX改0,这样,这程序又会SEND一个新的串出去,再断到recv的retn处,再用CE搜变化的。这样循环操作,找到了变化的数据地址。。并且配合od的memory(ALT+M)知道了变化的数据在哪些段中。。

再写代码,HOOK位RECV的retn处,第一次执行,就把所有刚才变化数据的段的数据全保存下来(这里保存,包括所有改变过的数据段,MAP PRIV,甚至stack堆栈,PUSHAD所有寄存器,EFL位),再把EAX改为0,这样,程序又会生成新的串去验证发包,第二次执行HOOK RECV的RETN时,将之前的所有保存的,全部还原,并且OD自己对比看了,的确还原了,但奇迹出现了,说本机器未注册。。。

NND,这就奇怪了。弄了几天这问题了,我在线等。谁能解释解释为啥。

还有,这程序断rand srand GetTickCount GetSystemTime GetLocalTime,全断不下来,这个随机的串是怎么生成的?我用网卡级的截包工具截过包,确定没从别的服务器之类地方过来KEY。。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 4580
活跃值: (992)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
也许是内联的随机数生成器,用IDA看看
2012-1-15 13:48
0
雪    币: 111
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可能性蛮小,我断随机数函数尾retn位置也断不到。
2012-1-15 14:26
0
雪    币: 111
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
坐等高手解释!
2012-1-15 17:57
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
检查rdtsc和cpuid
2012-1-15 20:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我也碰上了一个和你一样的软件,一直没有搞定,做个本地验证也搞不了,烦恼啊
2012-1-15 23:28
0
雪    币: 111
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有空可以加Q 交流下。~ QQ 800 32823
2012-1-16 01:13
0
雪    币: 111
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢大侠提供的线索,加上平时自己理解的,和刚才baidu了一下。~
个人是这么认为的》~
cpuid应该关系不大吧,因为毕竟在同台电脑上。。
rdtsc是检测线程某段代码内执行周期的。这个也想不通,在机器A上面(正版验证过的电脑),因为自己用OD在在recv的retn断很久后, 再F9让程序跑起来。 一直可以正常跑这程序。。。

forgot大侠能否再给点详细的指导,这问题实在百度不到,到处找人问,群里打听也无人能解。

简单的说,当第一次执行到RECV的RETN处时,将程序完全保存一遍,让recv返回0,就会再去通验证服务器, 第二次recv的retn时, 恢复所有的数据,包括堆栈,寄存器,E***,所有都一模一样了,但第二次就验证不通过。。。很是头大。
2012-1-16 01:19
0
雪    币: 192
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
发哥居然出来回帖了
2012-1-17 10:52
0
雪    币: 111
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
奇怪最大的问题就是想知道为什么第一次正确可以认验的recv的retn时,保存所有内存数据,第二次recv的retn恢复, 确不能认验了。。? 诚心想弄懂这问题,等高手帮解答下,先谢过了。
2012-1-19 03:11
0
雪    币: 100
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
可能有提取你get時,的time
你試試getlocaltime相关的函數,能不能斷下.
如果可以斷下,你就重新抓包.
把抓包時的time保存下來.
然後你cheat時,要把抓包成功時那一刻的time 替換上去.
試試,不知可行.
如果還不行的話,可能就是有硬件方面的效驗了.
ex:bios hard 之类的.
2012-1-24 13:39
0
雪    币: 259
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
会不会是程序检测是否被HOOK,有些壳不仅会检测当前模块的数据完整性,还检测系统模块的代码是否被修改
2012-1-25 13:55
0
雪    币: 1644
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
rdtsc..........
2012-2-8 11:03
0
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
send 断下来的时候 直接修改要发送的数据不行么?
为啥还得要找数据是怎么生成的呢... 没明白
然后在配合本地验证或者直接Hook recv 修改返回值
瞎说希望别误导楼主
2012-2-8 17:48
0
游客
登录 | 注册 方可回帖
返回
//