铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 7347|回复: 14

[苍龙逐日原版] 关于对苍龙逐曰v1.2原始加密版本的加密方式的分析以及破解

[复制链接]
发表于 2006-9-7 21:04 | 显示全部楼层

关于对苍龙逐曰v1.2原始加密版本的加密方式的分析以及破解

鉴于我们敬爱的小小猪已经公开了苍龙逐曰v1.2的解密补丁,所以我决定公开我对其原始加密过的苍龙逐曰v1.2的加密方式的一些分

析结果^_^

下述结论通过对dradon.exe的跟踪和反汇编得来(对不住了啊,传说中的坏蛋^_^)

7个文件被分割,它们是 r1.grp , r2.grp ,r3.grp , s1.grp , s2.grp , s3.grp ,z.dat.
这7个文件的前500bytes被切下来保存到log.grp中,顺序为r1.grp , r2.grp ,r3.grp , s1.grp , s2.grp , s3.grp ,z.dat(z.exe)
其余部分保存在 rg1.gpr , rg2.grp , rg3.grp , sg1,grp ,sg2.grp , sg3.grp , zd.dat

对应关系为

log.grp offset[0,499]       +    rg2.grp   =   r1.grp

log.grp offset[500,999]     +    rg3.grp   =   r2.grp

log.grp offset[1000,1499]   +    rg1.grp   =   r3.grp

log.grp offset[1500,1999]   +    sg2.grp   =   s1.grp

log.grp offset[2000,2499]   +    sg3.grp   =   s2.grp

log.grp offset[2500,2999]   +    sg1.grp   =   s3.grp

log.grp offset[3000,3499]   +    zd.dat    =   z.dat(z.exe)


4个文件被改名:它们是

kdef.idx  <--->  zd2.dat

kdef.grp  <--->  zd3.dat

talk.idx  <--->  zd4.dat

talk.grp  <--->  zd5.dat



dragon.exe在每次启动的时候,还原上述7+4个文件,然后创建play.bat进程,游戏得以正常进入...退出时,逆向操作...游戏运行中

可能(没有仔细跟踪)会检测游戏是否被切出到windows桌面,若是,逆向操作...
根据上述结论,我们可以解释:

1.为什么游戏不能直接由play.bat启动?因为游戏的启动文件z.dat(z.exe)的前500bytes被搞走了...
2.为什么游戏不能修改?因为r*.grp,s*.grp不完整。地址不对。
3.为什么把v1.1的r*.grp s*.grp,z.dat覆盖到v1.2的目录中游戏仍然不可运行?因为 talk.* kdef.*被改名了。
4.如果把v1.1的r*.grp s*.grp,z.dat,talk.* kdef.* 全部拷入v1.2的目录中会怎么样?对不起,我没有试,不清楚。


再谈谈dardon.exe,这个东东最大的弱点是它在启动play.bat之前,一定要将游戏恢复成解密状态,也就是说,当你正在玩v1.2时,

游戏是完全解密的。这样的话就毫无安全性可言。因为想把这几个解密后的文件拷出来的方法太多了,不是单纯的靠检测游戏是否被

切出来就能避免的了的,比如,通过共享的网络把它拷出来...


根据上述结论,我们可以写出一个还原程序完成dragon.exe启动play.bat前做的事:一次运行,终生不用再受dradon.exe的摆布(我

顺便修正了片头动画的路径,删掉了解密后不再需要的文件,同时保留当前的存档,恢复在dos/dosbox下的运行)^_^

源码如下:





#include <stdio.h>

#define COMBO_FILE_COUNT 7
#define RENAME_FILE_COUNT 4
#define CLEAN_FILE_COUNT 17
#define COMBO_FILE_HEAD_LENGTH 500
#define COMBO_READ_BUFFER_LENGTH 4096

#define SHOWTIT_LENGTH 18
#define PLAY_LENGTH 45


int main()
{
        const char *szComboDstFileName[COMBO_FILE_COUNT] =

{"r1.grp","r2.grp","r3.grp","s1.grp","s2.grp","s3.grp","z.exe"};
        const char *szComboSrcFileBodyName[COMBO_FILE_COUNT] =

{"rg2.grp","rg3.grp","rg1.grp","sg2.grp","sg3.grp","sg1.grp","zd.dat"};
        const char *szComboSrcFileHeadName = "log.grp";
        const char *szRenameDstFileName[RENAME_FILE_COUNT] = {"kdef.idx","kdef.grp","talk.idx","talk.grp"};
        const char *szRenameSrcFileName[RENAME_FILE_COUNT] = {"zd2.dat","zd3.dat","zd4.dat","zd5.dat"};
        const char *szCleanFileList[CLEAN_FILE_COUNT]=

{"rg1.grp","rg2.grp","rg3.grp","sg1.grp","sg2.grp","sg3.grp","zd.dat","zd2.dat","zd3.dat","zd4.dat","zd5.dat","log.g

rp","logo.txt","logo.gif","dragon.exe","z.com","logo.scr"};

        const char szShowtitContent[SHOWTIT_LENGTH] = "@flivwav tit2 tit";
        const char szPlayContent[PLAY_LENGTH] = "@echo off\r\ncall showtit.bat\r\nz.exe\r\necho on ";
        const char *szShowtitFileName = "Showtit.bat";
        const char *szPlayFileName = "play.bat";

        const char *szMSGProcessFile = "An error occured when processing the file:";
        const char *szMSGSuccess = "Crack successful!\n\nPlease run play.bat to play the game!";
        const char *szMSGFail = "Crack failed!";

        unsigned char ucReadBuffer[COMBO_READ_BUFFER_LENGTH];
        int iReadLength;
        unsigned int i;
        unsigned char ucSuccessFlag = 1;

        FILE *pfComboFileHead;
        FILE *pfComboFileBody;
        FILE *pfComboFileDst;
        FILE *pfShowtitAndPlay;

        /*generate all seperated files  */

        pfComboFileHead = fopen(szComboSrcFileHeadName,"rb");

        if(pfComboFileHead != NULL)
        {
                for(i = 0 ; i < COMBO_FILE_COUNT ; i++)
                {
                   pfComboFileBody = fopen(szComboSrcFileBodyName[i],"rb");
                   pfComboFileDst = fopen(szComboDstFileName[i],"wb");

                   if(pfComboFileBody != NULL && pfComboFileDst != NULL)
                   {

                                        iReadLength = fread(ucReadBuffer,1,COMBO_FILE_HEAD_LENGTH,pfComboFileHead);

                    if(iReadLength == COMBO_FILE_HEAD_LENGTH)
                    {
                        fwrite(ucReadBuffer,COMBO_FILE_HEAD_LENGTH,1,pfComboFileDst);
                    }
                    else
                    {
                        printf("\n%s%s\n",szMSGProcessFile,szComboSrcFileHeadName);
                        ucSuccessFlag = 0;
                       break;
                    }

                                do
                                {
                                        iReadLength = fread

(ucReadBuffer,1,COMBO_READ_BUFFER_LENGTH,pfComboFileBody);

                    fwrite(ucReadBuffer,iReadLength,1,pfComboFileDst);

                                }while(!feof(pfComboFileBody));

                fclose(pfComboFileBody);
                fclose(pfComboFileDst);
                   }
                   else
                   {
                                if(pfComboFileBody == NULL)
                                {
                                        printf("\n%s%s\n",szMSGProcessFile,szComboSrcFileBodyName[i]);
                                }
                                else
                                {
                                        printf("\n%s%s\n",szMSGProcessFile,szComboDstFileName[i]);
                                }

                                ucSuccessFlag = 0;
                   }
                }

                 fclose(pfComboFileHead);
        }
        else
        {
                printf("\n%s%s\n",szMSGProcessFile,szComboSrcFileHeadName);
                ucSuccessFlag = 0;
        }

    if(ucSuccessFlag == 1)
    {

        /*rename the target file*/

        for(i = 0 ; i < RENAME_FILE_COUNT ; i++)
        {
            if(rename(szRenameSrcFileName[i],szRenameDstFileName[i]) != 0)
            {
                printf("\n%s%s\n",szMSGProcessFile,szRenameSrcFileName[i]);
                ucSuccessFlag = 0;
            }
        }
    }

        if(ucSuccessFlag == 1)
        {


        /*Modify showtit.bat and play.bat , corrcet the wrong path of title cartoon and earse the logo*/

        pfShowtitAndPlay = fopen(szShowtitFileName,"wb");

        if(pfShowtitAndPlay != NULL)
        {
            fwrite(szShowtitContent,SHOWTIT_LENGTH - 1,1,pfShowtitAndPlay);
            fclose(pfShowtitAndPlay);
        }

        pfShowtitAndPlay = fopen(szPlayFileName,"wb");

        if(pfShowtitAndPlay != NULL)
        {
            fwrite(szPlayContent,PLAY_LENGTH - 1,1,pfShowtitAndPlay);
            fclose(pfShowtitAndPlay);
        }

        /*Delete all useless file*/

        for(i = 0 ; i < CLEAN_FILE_COUNT ; i++)
        {
            remove(szCleanFileList[i]);
        }

        printf("\n%s\n",szMSGSuccess);
        }
        else
        {
            printf("\n%s\n",szMSGFail);
        }

        return 0;
}




疑问:
通过对小小猪发布的官方解密补丁的比对,我发现有两个文件dragon.exe并没有操纵,但是加密版和解密版不同,它们是:

alldef.grp, allsin.grp
Comparing files ALLDEF.GRP and ..\ALLDEF.GRP  前面的是加密版本,后面的是解密版本  
0007033C: 01 00
0007033E: 5A 00
00070340: 3B 00
00070341: 04 00
00070346: 62 00
00070347: 1C 00
00070348: 62 00
00070349: 1C 00
0007034A: 62 00
0007034B: 1C 00
0007034E: 28 00
00070350: 25 00
00070352: 01 00
00070354: 5B 00
0007035C: 96 00
0007035D: 18 00
0007035E: 96 00
0007035F: 18 00
00070360: 96 00
00070361: 18 00
00070364: 2A 00
00070366: 25 00


Comparing files ALLSIN.GRP and ..\ALLSIN.GRP 前面是加密版本,后面的是解密版本
004E72D0: 5A FF
004E72D1: 00 FF
004E72D4: 5B FF
004E72D5: 00 FF



原因不外乎下面3个:

1.偶的功底不够,落下了这两个。
2.小小猪在发布补丁的时候又升级了。
3.小小猪在发布补丁的时候发错了.....


恳请达人指点一二...........



收工............
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 21:07 | 显示全部楼层
……虽然有点马后炮的嫌疑,但是还是值得赞赏的工作量~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 21:27 | 显示全部楼层
加密的和解密的都佩服
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 21:28 | 显示全部楼层
强悍~
我和xchy9907 兄说自己想法的时候 他说我思路错了 他给我他说合并修改了一些文件 我后来分析了一下只,初步的知道了改动了哪几个文件 可我对反编译不在行 呵呵
但是没想倒你居然连破解方法都能弄出来 佩服佩服
看来 论坛里面达人不少啊
强悍

[ Last edited by lu9523 on 2006-9-7 at 21:31 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 21:32 | 显示全部楼层
加密只是为了防止盗版,防止出现作者不希望的玩法。当然加密只是为了防止一般玩家,对楼主这样的解密高手是没有办法的。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 21:56 | 显示全部楼层
强烈建议斑竹大人直接给楼主加分加到一定的等级,以便他更好第为我们这些普通攻击服务~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 22:07 | 显示全部楼层
Originally posted by 武骧金星 at 2006-9-7 21:56:
强烈建议斑竹大人直接给楼主加分加到一定的等级,以便他更好第为我们这些普通攻击服务~


。。。。。。。。
我无语
我终于体会到做正版游戏的公司的苦衷了
如此下去,。。。
大家等着玩绝*苍龙2吧
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 22:48 | 显示全部楼层
嘿嘿~~看到南宫的话都笑出来了~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-7 23:00 | 显示全部楼层
Originally posted by 南宫梦 at 2006-9-7 10:07 PM:


。。。。。。。。
我无语
我终于体会到做正版游戏的公司的苦衷了
如此下去,。。。
大家等着玩绝*苍龙2吧


嗯=.=....
老师...
可能迟些会出现
[重出江湖版]也不定=.=..

说回正题..
我这个修改游戏白痴看后也不懂>.<
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-8 00:10 | 显示全部楼层
Originally posted by 南宫梦 at 2006-9-7 10:07 PM:


。。。。。。。。
我无语
我终于体会到做正版游戏的公司的苦衷了
如此下去,。。。
大家等着玩绝*苍龙2吧

我看出个华山论剑版好了,每段剧情都加密,就等高手拆
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-8 03:21 | 显示全部楼层
用UE直接把某个字段直接改了就可以把DRAGON变成‘还原补丁’了,还省了不少事。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-8 03:27 | 显示全部楼层
Originally posted by 77979 at 2006-9-8 12:10 AM:

我看出个华山论剑版好了,每段剧情都加密,就等高手拆



呵呵,其实MOD+该MOD的修改器(只修改属性、武功、物品之类的)一起发布,就很少有人去破解了。不过就是麻烦点和谁会做这个修改器的问题了~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-8 08:09 | 显示全部楼层
有修改器是迫不得以啊........不在万分险恶的情况下一般不用....用了游戏乐趣大大降低
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-8 17:21 | 显示全部楼层
高手是值得加赏的。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2006-9-8 17:37 | 显示全部楼层
加、解密的都是人才~!

至于我只关心游戏的好坏,加不加密无所谓,能玩就行。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-23 20:36

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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