铁血丹心

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

[通用] 金前事件及对话的加解密

[复制链接]
 楼主| 发表于 2022-11-29 18:42 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
以前我看几个流行的金庸群侠传前传MOD工具,都不能显示除大礼包以外版本的事件和对话,或者是显示的乱码,原来是加密了。


像这种执行频率极高的操作,不太可能用很复杂的加密,我就想反汇编跟踪下。

使用1.22版本,随便在一个文件处理函数上下断点就断下来了,我们先看事件的加解密。

前面圧入了:KG3,就是[0x1E72912]这里3个字节:

004AA01A     8B45 F8                 moveax,dword ptr ss:[ebp-0x8]
004AA01D     66:8B0458             movax,word ptr ds:[eax+ebx*2]         ;b(i*2)
004AA021      66:8B15 1229E701 mov dx,word ptr ds:[0x1E72912]         ;这里是3
004AA028      E8 9FA3FDFF         call <kys_prom.加解密函数>
004AA02D     8B55 F8                movedx,dword ptr ss:[ebp-0x8]
004AA030      66:89045A            movword ptr ds:[edx+ebx*2],ax
004AA034      8B45 F8                moveax,dword ptr ss:[ebp-0x8]
004AA037      66:313C58             xorword ptr ds:[eax+ebx*2],di           ;b(i*2)再和di(KG)进行xor
004AA03B     43                         incebx
004AA03C     4E                         dec esi
004AA03D     ^ 75 DB                jnzshort kys_prom.004AA01A


那个函数里操作很简单,每两个字节为一组,左移13(16-3)位,右移3位(这个3是KG3中第三字节),再or一下,最后和di(KG)异或

整个加解密算法就是:

设字节数组为b,每两个字节为1组
int x =b(i) << (16 - 3);
   x &= 0xFF;
int y =b(i) >> 3;
b(i) = x| y
b(i) ^= 0x4B43(KG)


对话的加解密:
0049585E       A1 ECF34A00              moveax,dword ptr ds:[0x4AF3EC]     ; 3
00495863       66:8338 00                    cmp word ptr ds:[eax],0x0
00495867       7E 30                             jleshort kys_prom.00495899
00495869       8B15 ECF34A00           movedx,dword ptr ds:[0x4AF3EC]     ;kys_prom.01E72912
0049586F       66:8B12                        mov dx,word ptr ds:[edx]
00495872       8B85 68FFFFFF           mov eax,dword ptr ss:[ebp-0x98]
00495878       8A0418                         mov al,byte ptrds:[eax+ebx]
0049587B       E8 6CEBFEFF             call <kys_prom.加解密函数>
00495880       8B95 68FFFFFF           mov edx,dword ptr ss:[ebp-0x98]
00495886       88041A                         movbyte ptr ds:[edx+ebx],al
00495889       A1 5CF54A00              mov eax,dword ptr ds:[0x4AF55C]       ;KG3
0049588E       8A00                            mov al,byte ptrds:[eax]                          ; al = 4B(K)
00495890       8B95 68FFFFFF           mov edx,dword ptr ss:[ebp-0x98]
00495896       30041A                         xorbyte ptr ds:[edx+ebx],al                    ;b(i) ^= 4B
00495899       8B85 68FFFFFF           mov eax,dword ptr ss:[ebp-0x98]
0049589F       803418 FF                    xor byte ptrds:[eax+ebx],0xFF               ; Xor 0xFF
004958A3      8B85 68FFFFFF           mov eax,dword ptr ss:[ebp-0x98]
004958A9      803C18 FF                   cmpbyte ptr ds:[eax+ebx],0xFF              ; ifb(i)==0xFF { b(i) = 0; }
004958AD      75 0A                           jnzshort kys_prom.004958B9
004958AF      8B85 68FFFFFF           mov eax,dword ptr ss:[ebp-0x98]
004958B5       C6041800                    mov byte ptrds:[eax+ebx],0x0
004958B9       43                                 incebx
004958BA      4E                                 decesi
004958BB      ^ 75 A1                         jnzshort kys_prom.0049585E
       函数内:
       <kys_prom.加解密函数>  53             pushebx
       004843ED      0FB7CA                       movzx ecx,dx
       004843F0       51                                 push ecx
       004843F1       B908000000               mov ecx,0x8
       004843F6       5B                                pop ebx                                             ;ebx= 3
       004843F7       2BCB                           sub ecx,ebx                                       ; 8 - 3
       004843F9       8BD8                           mov ebx,eax
       004843FB      D2E3                            shl bl,cl                                             ;b(i) <= 8 - 3, 设为x
       004843FD      8BCA                           mov ecx,edx
       004843FF       25FF000000               and eax,0xFF
       00484404       D3E8                            shr eax,cl                                           ;b(i) >>= 3,设为y
       00484406       0AC3                            oral,bl                                               ;b(i) = x | y
       00484408       5B                                 pop ebx
       int x = b(i) << (8 - 3);
       int y = b(i) >> 3;
       b(i) = x | y;
算法:
       int x = b(i) << (8 - 3);
       int y = b(i) >> 3;
       b(i) = x | y;
       b(i) ^= 4B;
       b(i) ^= FF;
       if (b(i)==0xFF)
              b(i) = 0;


已经验证,可以正确解出加密的事件和对话。


不过我没有尝试,这个算法是否可逆,只测试了解密这个方向。


对话事件类型是68,其事件内容很多还不明了。不过对话本身带有格式控制:
^1    这个表示心理活动,用黑底橙黄字表示
^2    这个表示人物,用黑底红色字体
^3    这个表示物品,用黑底蓝色字体
^4    这个表示地点,用黑底绿色字体
$$    这个表示主角的姓



比如游戏中的第一个对话:
在下姓$$,乃是^2胡一刀^^胡大侠之友,特来拜访苗大侠?
如果主角名字是“金先生”,那么就是“在下姓金”
胡一刀是红色黑底显示
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2022-11-30 21:59 | 显示全部楼层
在懂汇编的眼里是不是不存在加密
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2022-12-1 10:59 | 显示全部楼层
当然是存在的,理论上虽然一切加密都可以破解,但是实际上,有很多加密都是起作用的,或者在相当长的时间起作用。是否能破,得看加密的强度和跟踪的人的水平,得看破解的价值,如果破解付出的代价太大,收获很小,一般就会放弃,经常还要看运气。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2022-12-1 13:23 | 显示全部楼层
这游戏貌似开源了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2022-12-1 13:47 | 显示全部楼层
我不故道哎,这论坛我也是不久前才发现,那里能弄到源码?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2022-12-1 13:51 | 显示全部楼层
https://github.com/scarsty/kys-more
里面有一些工具,以及前传和水浒的源码
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2022-12-1 13:51 | 显示全部楼层
发贴时没仔细核对,这里有2个错误:事件解密的算法里:x &= 0xFF,正确的是:x &= 0xFFFF,另外KG是0x4B47,不是0x4B43
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2022-12-1 14:00 | 显示全部楼层
bt 发表于 2022-12-1 13:51
https://github.com/scarsty/kys-more
里面有一些工具,以及前传和水浒的源码

太感谢了!下下来看看。


还有,不知道有黄顺坤的SFE的源码吗?我已经有upedit的源码,不过我个人对delphi不熟悉,短时间还不能弄明白,而SFE看上去是VB写的,VB更加熟悉一些。

功能上,upedit可能是目前最强大的,但是,我发现SFE对场景、事件等很多细节上,处理更加准确一些。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2022-12-1 14:05 | 显示全部楼层
sfe没有开源,我可以去问问他
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2022-12-1 14:11 | 显示全部楼层
好的,非常感谢,刚才粗粗看了下,里面非常多宝贵的资料,够我学习研究很长一段时间了。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2022-12-1 16:10 | 显示全部楼层
yakov 发表于 2022-12-1 14:00
太感谢了!下下来看看。

已经开源:

https://tiexuedanxin.net/forum.php?mod=viewthread&tid=1068077

盲目分析配环境太复杂了,随便看看代码就行了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2022-12-1 16:29 | 显示全部楼层
感谢KA大佬!今天能得到多个金庸群侠传传奇人物的指点,感觉有点幸福来得太突然的感觉。

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

本版积分规则

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

GMT+8, 2024-4-25 16:25

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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