飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7524|回复: 10

[原创] 另类破解DJ Java Decompiler ver. 3.11.11.95 获取源文件代码浅析

[复制链接]

该用户从未签到

发表于 2009-8-21 20:27:52 | 显示全部楼层 |阅读模式
DJ Java Decompiler ver. 3.11.11.95 获取源文件代码浅析
这款软件的注册方法非常有意思。我一开始只是以为他的验证方式像一个壳子一样套在程序外面的。谁知其实他是一个loader一样的程序。非常有特色的加密方式。

先运行源程序开始试用后这样简易修改可以简单实现无限期试用:
7.png

6.png

但这个不是我们的重点。我们运行一下这样修改的程序看看。的确没有限制。可以运行。但我们注意一下任务管理器。

8.png

OD载入DJ.DAT看看:
9.png

却是一堆乱码,这说明我们在运行dj.exe之后程序对他的内存写入了代码。
我们记一下dj.dat的OEP。6a8590。

然后我们再运行程序,用OD挂接一下DJ.BAT
10.png

停在系统领空后,跟随到我们的OEP:
11.png

哇,代码写入完了也~
那就全选这段写入好的代码,二进制复制,然后粘贴到原本的dj.bat.
这时你最好有一个Advanced Olly插件来忽略补丁大于1000的提示,否则按确定按到吐血。

12.png

然后用插件dump一下。
哈哈~发现没,程序可以运行~
呵呵,这个就是另类破解这款软件的全过程了~拉出来跟大家分享一下啊,也是响应一下Nisy老大~

13.png

[ 本帖最后由 wuhanqi 于 2009-8-21 20:37 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2009-8-21 20:39:47 | 显示全部楼层
呵呵 省了我写这篇文章了 o(∩_∩)o...哈哈

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

该用户从未签到

 楼主| 发表于 2009-8-21 20:46:30 | 显示全部楼层
...keyfile解码我到现在都没找到在哪里/:002
代码段的解码是先解码到内存再调用writeprocessmemory写入的...
我好烦分析啊...算法我实在是不喜欢玩.../:QQ2
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2009-8-21 21:52:26 | 显示全部楼层
    看到了  学习 但是有点不太明白 其实就是个破解的思路没有打开 这个也是影响新手们的 总是跟大牛们的后面走 拿着那个几个断点调试来调试去 就是不明白为什么 破解了 也不知道是怎么破解的 呵呵
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 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:[EBP+EDX*4]
    004A1DBB  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1DD1  |. |90            |NOP
    004A1DD2  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1DD6  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1DDA  |. |881C24        |MOV BYTE PTR SS:[ESP],BL
    004A1DDD  |. |03D0          |ADD EDX,EAX
    004A1DDF  |. |81E2 FF000000 |AND EDX,0FF
    004A1DE5  |. |41            |INC ECX
    004A1DE6  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1DEA  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1E00  |. |90            |NOP
    004A1E01  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1E05  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1E09  |. |885C24 01     |MOV BYTE PTR SS:[ESP+1],BL
    004A1E0D  |. |03D0          |ADD EDX,EAX
    004A1E0F  |. |81E2 FF000000 |AND EDX,0FF
    004A1E15  |. |41            |INC ECX
    004A1E16  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1E1A  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1E30  |. |90            |NOP
    004A1E31  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1E35  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1E39  |. |885C24 02     |MOV BYTE PTR SS:[ESP+2],BL
    004A1E3D  |. |03D0          |ADD EDX,EAX
    004A1E3F  |. |81E2 FF000000 |AND EDX,0FF
    004A1E45  |. |41            |INC ECX
    004A1E46  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1E4A  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1E60  |. |90            |NOP
    004A1E61  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1E65  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1E69  |. |885C24 03     |MOV BYTE PTR SS:[ESP+3],BL
    004A1E6D  |. |03D0          |ADD EDX,EAX
    004A1E6F  |. |81E2 FF000000 |AND EDX,0FF
    004A1E75  |. |41            |INC ECX
    004A1E76  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1E7A  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1E90  |. |90            |NOP
    004A1E91  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1E95  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1E99  |. |885C24 04     |MOV BYTE PTR SS:[ESP+4],BL
    004A1E9D  |. |03D0          |ADD EDX,EAX
    004A1E9F  |. |81E2 FF000000 |AND EDX,0FF
    004A1EA5  |. |41            |INC ECX
    004A1EA6  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1EAA  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1EC0  |. |90            |NOP
    004A1EC1  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1EC5  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1EC9  |. |885C24 05     |MOV BYTE PTR SS:[ESP+5],BL
    004A1ECD  |. |03D0          |ADD EDX,EAX
    004A1ECF  |. |81E2 FF000000 |AND EDX,0FF
    004A1ED5  |. |41            |INC ECX
    004A1ED6  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1EDA  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1EF0  |. |90            |NOP
    004A1EF1  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1EF5  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    004A1EF9  |. |885C24 06     |MOV BYTE PTR SS:[ESP+6],BL
    004A1EFD  |. |03D0          |ADD EDX,EAX
    004A1EFF  |. |81E2 FF000000 |AND EDX,0FF
    004A1F05  |. |41            |INC ECX
    004A1F06  |. |8B5C95 00     |MOV EBX,DWORD PTR SS:[EBP+EDX*4]
    004A1F0A  |. |895C8D FC     |MOV DWORD PTR SS:[EBP+ECX*4-4],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:[EBP+EDX*4],EAX
    004A1F20  |. |90            |NOP
    004A1F21  |. |8B5C9D 00     |MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    004A1F25  |. |83C7 08       |ADD EDI,8
    004A1F28  |. |885C24 07     |MOV BYTE PTR SS:[ESP+7],BL
    004A1F2C  |. |8B0424        |MOV EAX,DWORD PTR SS:[ESP]
    004A1F2F  |. |8B5E F8       |MOV EBX,DWORD PTR DS:[ESI-8]
    004A1F32  |. |33C3          |XOR EAX,EBX
    004A1F34  |. |8B5E FC       |MOV EBX,DWORD PTR DS:[ESI-4]
    004A1F37  |. |8947 F8       |MOV DWORD PTR DS:[EDI-8],EAX
    004A1F3A  |. |8B4424 04     |MOV EAX,DWORD PTR SS:[ESP+4]
    004A1F3E  |. |33C3          |XOR EAX,EBX
    004A1F40  |. |8B5C24 08     |MOV EBX,DWORD PTR SS:[ESP+8]
    004A1F44  |. |8947 FC       |MOV DWORD PTR DS:[EDI-4],EAX
    004A1F47  |. |8B448D 00     |MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    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:[EBP+EDX*4]
    MOV DWORD PTR SS:[EBP+ECX*4-4],EBX
    ADD EBX,EAX
    AND ECX,0FF
    AND EBX,0FF
    MOV DWORD PTR SS:[EBP+EDX*4],EAX
    NOP
    MOV EBX,DWORD PTR SS:[EBP+EBX*4]
    MOV EAX,DWORD PTR SS:[EBP+ECX*4]
    MOV BYTE PTR SS:[ESP],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:[EBP+EDX*4]     //ebx == dword [01EA17D0+edx*4]
    MOV DWORD PTR SS:[EBP+ECX*4-4],EBX   //再把ebx放入 [01EA17D0+ecx*4-4]
    ADD EBX,EAX                          //ebx=ebx+eax
    AND ECX,0FF                          //ecx只保留cl里的数值
    AND EBX,0FF                          //ebx只保留Bl里的数值
    MOV DWORD PTR SS:[EBP+EDX*4],EAX     //eax的数值放入[01EA17D0+edx*4]
    NOP
    MOV EBX,DWORD PTR SS:[EBP+EBX*4]     //把[01EA17D0+ebx*4]放入ebx
    MOV EAX,DWORD PTR SS:[EBP+ECX*4]     //把[01EA17D0+ecx*4]放入eax
    MOV BYTE PTR SS:[ESP],BL             //接下来就是把BL的数值放入关键堆栈地址. AL里的数值参与接下去的运算.

    他就是这样运算.等到esp+7也赋值完毕后.表B的功能就算到此为止了.循环一次能计算出八个字节.
    并且顺手把要存放解码后代码的地址加了8位.004A1F25  |.  83C7 08       |ADD EDI,8
    还记得我们的表A么?接下来该他出场了.
    记得我们这个循环第一句命令么?ADD ESI,8.此时的ESI为02AB0028.

    我们来看剩下的代码:
    MOV EAX,DWORD PTR SS:[ESP]          //表B计算出的前四位到eax
    MOV EBX,DWORD PTR DS:[ESI-8]        //ESI-8的数值到ebx.结合之前的命令可理解为表A的数据以8个字节为一组,现在取每一组的前四个字节.
    XOR EAX,EBX                         //eax=eax与ebx异或.此时算解码完四个字节.
    MOV EBX,DWORD PTR DS:[ESI-4]        //表A每一组数据后四个字节到ebx.
    MOV DWORD PTR DS:[EDI-8],EAX        //把解码后的字节放入内存  
    MOV EAX,DWORD PTR SS:[ESP+4]        //取表B计算出的后四个字节到eax
    XOR EAX,EBX                         //eax=eax与ebx异或.算是把后四个字节也解码了,一次大循环能解码八个字节.
    MOV EBX,DWORD PTR SS:[ESP+8]        //NOT IMPORTANT
    MOV DWORD PTR DS:[EDI-4],EAX        //把解码后的四个字节放到内存里
    MOV EAX,DWORD PTR SS:[EBP+ECX*4]    //恢复eax的值,继续下面的运算
    CMP ESI,EBX                         //比较一下是否运算完
    JLE 004A1DAB                        //运算完就不跳.

    [ 本帖最后由 wuhanqi 于 2009-8-22 02:06 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2009-8-22 01:53:17 | 显示全部楼层
    表B不大,附上吧...表A实在是太大了..自己去看吧..

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

    表B.txt

    4.69 KB, 下载次数: 3, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-5-16 14:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-8-22 07:17:06 | 显示全部楼层
    小柒在这里出现了,支持哇
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-8-22 08:03:25 | 显示全部楼层
    太高深了,简单的我看不懂,不过还是学习一下,支持一下先.
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2009-8-22 11:27:54 | 显示全部楼层
    原帖由 tianxj 于 2009-8-22 07:17 发表
    小柒在这里出现了,支持哇


    嘿嘿,来这里响应一下Nisy老大,老T,你算法好,看看我有没有分析错。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 2023 天

    [LV.Master]伴坛终老

    发表于 2009-8-23 19:40:06 | 显示全部楼层
    多谢楼主分享
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表