-
-
[讨论]vmp程序的破解。。
-
发表于:
2012-1-15 13:39
11756
-
某程序是通过网络验证的,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 探索篇!