另类破解DJ Java Decompiler ver. 3.11.11.95 获取源文件代码浅析
DJ Java Decompiler ver. 3.11.11.95 获取源文件代码浅析这款软件的注册方法非常有意思。我一开始只是以为他的验证方式像一个壳子一样套在程序外面的。谁知其实他是一个loader一样的程序。非常有特色的加密方式。
先运行源程序开始试用后这样简易修改可以简单实现无限期试用:
但这个不是我们的重点。我们运行一下这样修改的程序看看。的确没有限制。可以运行。但我们注意一下任务管理器。
OD载入DJ.DAT看看:
却是一堆乱码,这说明我们在运行dj.exe之后程序对他的内存写入了代码。
我们记一下dj.dat的OEP。6a8590。
然后我们再运行程序,用OD挂接一下DJ.BAT
停在系统领空后,跟随到我们的OEP:
哇,代码写入完了也~
那就全选这段写入好的代码,二进制复制,然后粘贴到原本的dj.bat.
这时你最好有一个Advanced Olly插件来忽略补丁大于1000的提示,否则按确定按到吐血。
然后用插件dump一下。
哈哈~发现没,程序可以运行~
呵呵,这个就是另类破解这款软件的全过程了~拉出来跟大家分享一下啊,也是响应一下Nisy老大~
[ 本帖最后由 wuhanqi 于 2009-8-21 20:37 编辑 ] 呵呵 省了我写这篇文章了 o(∩_∩)o...哈哈
PS: 还有一些核心的东西你没写出来 比如说keyfile的解码 代码段的解码等等 还有帖子中数据的定位等等 太多了 有待继续完善哈 不要去注重数量 要重质量 ...keyfile解码我到现在都没找到在哪里/:002
代码段的解码是先解码到内存再调用writeprocessmemory写入的...
我好烦分析啊...算法我实在是不喜欢玩.../:QQ2 看到了学习 但是有点不太明白 其实就是个破解的思路没有打开 这个也是影响新手们的 总是跟大牛们的后面走 拿着那个几个断点调试来调试去 就是不明白为什么 破解了 也不知道是怎么破解的 呵呵 004A1DA5|. /0F8C A8010000 JL 004A1F53
004A1DAB|> |83C6 08 /ADD ESI,8
004A1DAE|. |03D0 |ADD EDX,EAX
004A1DB0|. |81E2 FF000000 |AND EDX,0FF
004A1DB6|. |41 |INC ECX
004A1DB7|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1DBB|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1DBF|. |03D8 |ADD EBX,EAX
004A1DC1|. |81E1 FF000000 |AND ECX,0FF
004A1DC7|. |81E3 FF000000 |AND EBX,0FF
004A1DCD|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1DD1|. |90 |NOP
004A1DD2|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1DD6|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1DDA|. |881C24 |MOV BYTE PTR SS:,BL
004A1DDD|. |03D0 |ADD EDX,EAX
004A1DDF|. |81E2 FF000000 |AND EDX,0FF
004A1DE5|. |41 |INC ECX
004A1DE6|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1DEA|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1DEE|. |03D8 |ADD EBX,EAX
004A1DF0|. |81E1 FF000000 |AND ECX,0FF
004A1DF6|. |81E3 FF000000 |AND EBX,0FF
004A1DFC|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1E00|. |90 |NOP
004A1E01|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1E05|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1E09|. |885C24 01 |MOV BYTE PTR SS:,BL
004A1E0D|. |03D0 |ADD EDX,EAX
004A1E0F|. |81E2 FF000000 |AND EDX,0FF
004A1E15|. |41 |INC ECX
004A1E16|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1E1A|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1E1E|. |03D8 |ADD EBX,EAX
004A1E20|. |81E1 FF000000 |AND ECX,0FF
004A1E26|. |81E3 FF000000 |AND EBX,0FF
004A1E2C|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1E30|. |90 |NOP
004A1E31|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1E35|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1E39|. |885C24 02 |MOV BYTE PTR SS:,BL
004A1E3D|. |03D0 |ADD EDX,EAX
004A1E3F|. |81E2 FF000000 |AND EDX,0FF
004A1E45|. |41 |INC ECX
004A1E46|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1E4A|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1E4E|. |03D8 |ADD EBX,EAX
004A1E50|. |81E1 FF000000 |AND ECX,0FF
004A1E56|. |81E3 FF000000 |AND EBX,0FF
004A1E5C|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1E60|. |90 |NOP
004A1E61|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1E65|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1E69|. |885C24 03 |MOV BYTE PTR SS:,BL
004A1E6D|. |03D0 |ADD EDX,EAX
004A1E6F|. |81E2 FF000000 |AND EDX,0FF
004A1E75|. |41 |INC ECX
004A1E76|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1E7A|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1E7E|. |03D8 |ADD EBX,EAX
004A1E80|. |81E1 FF000000 |AND ECX,0FF
004A1E86|. |81E3 FF000000 |AND EBX,0FF
004A1E8C|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1E90|. |90 |NOP
004A1E91|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1E95|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1E99|. |885C24 04 |MOV BYTE PTR SS:,BL
004A1E9D|. |03D0 |ADD EDX,EAX
004A1E9F|. |81E2 FF000000 |AND EDX,0FF
004A1EA5|. |41 |INC ECX
004A1EA6|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1EAA|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1EAE|. |03D8 |ADD EBX,EAX
004A1EB0|. |81E1 FF000000 |AND ECX,0FF
004A1EB6|. |81E3 FF000000 |AND EBX,0FF
004A1EBC|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1EC0|. |90 |NOP
004A1EC1|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1EC5|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1EC9|. |885C24 05 |MOV BYTE PTR SS:,BL
004A1ECD|. |03D0 |ADD EDX,EAX
004A1ECF|. |81E2 FF000000 |AND EDX,0FF
004A1ED5|. |41 |INC ECX
004A1ED6|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1EDA|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1EDE|. |03D8 |ADD EBX,EAX
004A1EE0|. |81E1 FF000000 |AND ECX,0FF
004A1EE6|. |81E3 FF000000 |AND EBX,0FF
004A1EEC|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1EF0|. |90 |NOP
004A1EF1|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1EF5|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1EF9|. |885C24 06 |MOV BYTE PTR SS:,BL
004A1EFD|. |03D0 |ADD EDX,EAX
004A1EFF|. |81E2 FF000000 |AND EDX,0FF
004A1F05|. |41 |INC ECX
004A1F06|. |8B5C95 00 |MOV EBX,DWORD PTR SS:
004A1F0A|. |895C8D FC |MOV DWORD PTR SS:,EBX
004A1F0E|. |03D8 |ADD EBX,EAX
004A1F10|. |81E1 FF000000 |AND ECX,0FF
004A1F16|. |81E3 FF000000 |AND EBX,0FF
004A1F1C|. |894495 00 |MOV DWORD PTR SS:,EAX
004A1F20|. |90 |NOP
004A1F21|. |8B5C9D 00 |MOV EBX,DWORD PTR SS:
004A1F25|. |83C7 08 |ADD EDI,8
004A1F28|. |885C24 07 |MOV BYTE PTR SS:,BL
004A1F2C|. |8B0424 |MOV EAX,DWORD PTR SS:
004A1F2F|. |8B5E F8 |MOV EBX,DWORD PTR DS:
004A1F32|. |33C3 |XOR EAX,EBX
004A1F34|. |8B5E FC |MOV EBX,DWORD PTR DS:
004A1F37|. |8947 F8 |MOV DWORD PTR DS:,EAX
004A1F3A|. |8B4424 04 |MOV EAX,DWORD PTR SS:
004A1F3E|. |33C3 |XOR EAX,EBX
004A1F40|. |8B5C24 08 |MOV EBX,DWORD PTR SS:
004A1F44|. |8947 FC |MOV DWORD PTR DS:,EAX
004A1F47|. |8B448D 00 |MOV EAX,DWORD PTR SS:
004A1F4B|. |3BF3 |CMP ESI,EBX
004A1F4D|.^|0F8E 58FEFFFF \JLE 004A1DAB
这里就是关键解码部分的算法了。
用到了两个表。其中有一个非常巨大,复制下来将近12.5MB。
我就不复制了,有兴趣的朋友自己看看吧~
我做点简单的分析。
要先说明的是,这里不只中断一次,你选择的时机要正确,是要在我们的loader一样的主程序运行了创建了dj.bat这个进程后再断下的才是关键。bp CreateProcessA
当我们F8走到004A1DAB|> |83C6 08 /ADD ESI,8 的时候,我们需要注意我们的寄存器:
EAX 00000006 //这是最初的值
ECX 00000001 //这里作为计数器不断递增1.下面的运算会用到他
EDX 00000000 //这里与eax不停的做相加的运算得到关键的数值.
EBX 02C57818 //这里-2就是是那张非常巨大的表的结束
ESP 026FFAA0 //这个ESP地址作为关键的堆栈地址而存在
EBP 01EA17D0 //这里则是第二张表的起始地址,我们姑且称这个表为表B
ESI 029B0020 //而这里则是那个巨大的表开始的地方.可以想象一下有多大了吧~我们姑且称这个表为表A
EDI 02C60020 //程序申请的存放解码后的数据的内存地址.这里也可以找到所有的源程序代码,不过应该需要重定位吧.俺也不太清楚= =.
EIP 004A1DAB DJ1.004A1DAB
或许有朋友看了上面这么一堆注释会头晕.没关系我们来结合代码分析一下,我们的目的就是简单知道他的运算过程.
可能在你的机器里这些寄存器的地址可能会不同.无所谓,都是壳临时申请的内存地址罢了.
我们仔细观察一下代码,有没有发现代码很大一部分都是这样一个形式的重复?
ADD EDX,EAX
AND EDX,0FF
INC ECX
MOV EBX,DWORD PTR SS:
MOV DWORD PTR SS:,EBX
ADD EBX,EAX
AND ECX,0FF
AND EBX,0FF
MOV DWORD PTR SS:,EAX
NOP
MOV EBX,DWORD PTR SS:
MOV EAX,DWORD PTR SS:
MOV BYTE PTR SS:,BL
唯一改变的只有最后一句,esp不停的在加1,一直加到7就不加了.
我们先来基础的一句句分析代码吧.
ADD EDX,EAX //edx=edx+eax
AND EDX,0FF //edx=edx+0ffh 其实作用就是只保留edx里的DL的数值
INC ECX //edx递增1
MOV EBX,DWORD PTR SS: //ebx == dword
MOV DWORD PTR SS:,EBX //再把ebx放入
ADD EBX,EAX //ebx=ebx+eax
AND ECX,0FF //ecx只保留cl里的数值
AND EBX,0FF //ebx只保留Bl里的数值
MOV DWORD PTR SS:,EAX //eax的数值放入
NOP
MOV EBX,DWORD PTR SS: //把放入ebx
MOV EAX,DWORD PTR SS: //把放入eax
MOV BYTE PTR SS:,BL //接下来就是把BL的数值放入关键堆栈地址. AL里的数值参与接下去的运算.
他就是这样运算.等到esp+7也赋值完毕后.表B的功能就算到此为止了.循环一次能计算出八个字节.
并且顺手把要存放解码后代码的地址加了8位.004A1F25|.83C7 08 |ADD EDI,8
还记得我们的表A么?接下来该他出场了.
记得我们这个循环第一句命令么?ADD ESI,8.此时的ESI为02AB0028.
我们来看剩下的代码:
MOV EAX,DWORD PTR SS: //表B计算出的前四位到eax
MOV EBX,DWORD PTR DS: //ESI-8的数值到ebx.结合之前的命令可理解为表A的数据以8个字节为一组,现在取每一组的前四个字节.
XOR EAX,EBX //eax=eax与ebx异或.此时算解码完四个字节.
MOV EBX,DWORD PTR DS: //表A每一组数据后四个字节到ebx.
MOV DWORD PTR DS:,EAX //把解码后的字节放入内存
MOV EAX,DWORD PTR SS: //取表B计算出的后四个字节到eax
XOR EAX,EBX //eax=eax与ebx异或.算是把后四个字节也解码了,一次大循环能解码八个字节.
MOV EBX,DWORD PTR SS: //NOT IMPORTANT
MOV DWORD PTR DS:,EAX //把解码后的四个字节放到内存里
MOV EAX,DWORD PTR SS: //恢复eax的值,继续下面的运算
CMP ESI,EBX //比较一下是否运算完
JLE 004A1DAB //运算完就不跳.
[ 本帖最后由 wuhanqi 于 2009-8-22 02:06 编辑 ] 表B不大,附上吧...表A实在是太大了..自己去看吧..
[ 本帖最后由 wuhanqi 于 2009-8-22 01:54 编辑 ] 小柒在这里出现了,支持哇 太高深了,简单的我看不懂,不过还是学习一下,支持一下先. 原帖由 tianxj 于 2009-8-22 07:17 发表 https://www.chinapyg.com/images/common/back.gif
小柒在这里出现了,支持哇
嘿嘿,来这里响应一下Nisy老大,老T,你算法好,看看我有没有分析错。 多谢楼主分享
页:
[1]
2