wuhanqi 发表于 2009-8-21 20:27:52

另类破解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 编辑 ]

Nisy 发表于 2009-8-21 20:39:47

呵呵 省了我写这篇文章了 o(∩_∩)o...哈哈

PS: 还有一些核心的东西你没写出来 比如说keyfile的解码 代码段的解码等等 还有帖子中数据的定位等等 太多了 有待继续完善哈 不要去注重数量 要重质量

wuhanqi 发表于 2009-8-21 20:46:30

...keyfile解码我到现在都没找到在哪里/:002
代码段的解码是先解码到内存再调用writeprocessmemory写入的...
我好烦分析啊...算法我实在是不喜欢玩.../:QQ2

MOV 发表于 2009-8-21 21:52:26

看到了学习 但是有点不太明白 其实就是个破解的思路没有打开 这个也是影响新手们的 总是跟大牛们的后面走 拿着那个几个断点调试来调试去 就是不明白为什么 破解了 也不知道是怎么破解的 呵呵

wuhanqi 发表于 2009-8-22 01:51:21

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 编辑 ]

wuhanqi 发表于 2009-8-22 01:53:17

表B不大,附上吧...表A实在是太大了..自己去看吧..

[ 本帖最后由 wuhanqi 于 2009-8-22 01:54 编辑 ]

tianxj 发表于 2009-8-22 07:17:06

小柒在这里出现了,支持哇

duchuan 发表于 2009-8-22 08:03:25

太高深了,简单的我看不懂,不过还是学习一下,支持一下先.

wuhanqi 发表于 2009-8-22 11:27:54

原帖由 tianxj 于 2009-8-22 07:17 发表 https://www.chinapyg.com/images/common/back.gif
小柒在这里出现了,支持哇

嘿嘿,来这里响应一下Nisy老大,老T,你算法好,看看我有没有分析错。

冯玉姣 发表于 2009-8-23 19:40:06

多谢楼主分享
页: [1] 2
查看完整版本: 另类破解DJ Java Decompiler ver. 3.11.11.95 获取源文件代码浅析