吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2952|回复: 14
收起左侧

[求助] 求解为何封包加密算法位异或的值每次都不一样

[复制链接]
lyf091 发表于 2020-3-3 21:51
各位大神好,小弟最近在研究某网游封包的加密算法,根据前期的学习和试验已经成功进入到加密的关键CALL,现在卡在了加密算法的位异或值上,具体的过程如下:

00ABD1D4        53        push ebx
00ABD1D5        56        push esi
00ABD1D6        57        push edi
00ABD1D7        55        push ebp
00ABD1D8        8BFA        mov edi,edx
00ABD1DA        8BE8        mov ebp,eax
00ABD1DC        8B07        mov eax,dword ptr ds:[edi]
00ABD1DE        E8 457F94FF        call loginp.00405128
00ABD1E3        8BF0        mov esi,eax
00ABD1E5        85F6        test esi,esi
00ABD1E7        7E 3D        jle Xloginp.00ABD226
00ABD1E9        BB 01000000        mov ebx,0x1
00ABD1EE        8BC7        mov eax,edi
00ABD1F0        E8 838194FF        call loginp.00405378
00ABD1F5        4B        dec ebx
00ABD1F6        85C0        test eax,eax
00ABD1F8        74 05        je Xloginp.00ABD1FF
00ABD1FA        3B58 FC        cmp ebx,dword ptr ds:[eax-0x4]
00ABD1FD        72 05        jb Xloginp.00ABD204
00ABD1FF        E8 A46D94FF        call loginp.00403FA8
00ABD204        43        inc ebx
00ABD205        8B17        mov edx,dword ptr ds:[edi]
00ABD207        4B        dec ebx
00ABD208        85D2        test edx,edx
00ABD20A        74 05        je Xloginp.00ABD211
00ABD20C        3B5A FC        cmp ebx,dword ptr ds:[edx-0x4]
00ABD20F        72 05        jb Xloginp.00ABD216
00ABD211        E8 926D94FF        call loginp.00403FA8
00ABD216        43        inc ebx
00ABD217        8A541A FF        mov dl,byte ptr ds:[edx+ebx-0x1]
00ABD21B        3255 06        xor dl,byte ptr ss:[ebp+0x6]
00ABD21E        885418 FF        mov byte ptr ds:[eax+ebx-0x1],dl
00ABD222        43        inc ebx
00ABD223        4E        dec esi
00ABD224  ^        75 C8        jnz Xloginp.00ABD1EE

红色部分即为加密过程,求各位高手指点一下思路,XOR位异或的值每次都不一样(实际上每次重新打开游戏用WPE截喊话的封包也不一样),那么这个是否就代表了这个位异或的方法是动态的?
是需要找到[edx+ebx-0x1]、[ebp+0x6]、[eax+ebx-0x1]的这三个的算法过程吗?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lyf091 发表于 2020-3-4 23:02
本帖最后由 lyf091 于 2020-3-4 23:05 编辑
我的爱是你 发表于 2020-3-4 21:20
我是指在函数头
00ABD1D4        53        push ebx     
00ABD1D5        56        push esi

大神,按照您的指点我确认了:ebp的值在加密CALL里面没有改变,那就是在函数头就直接由eax赋值了。

我从加密CALL里边跳出来向上找(从最后一行倒着找):

00ABD4D0  /$  55            push    ebp
00ABD4D1  |.  8BEC          mov     ebp, esp
00ABD4D3  |.  83C4 F8       add     esp, -0x8
00ABD4D6  |.  53            push    ebx
00ABD4D7  |.  56            push    esi
00ABD4D8  |.  57            push    edi
00ABD4D9  |.  33D2          xor     edx, edx
00ABD4DB  |.  8955 FC       mov     dword ptr [ebp-0x4], edx
00ABD4DE  |.  8BD8          mov     ebx, eax
00ABD4E0  |.  33C0          xor     eax, eax
00ABD4E2  |.  55            push    ebp
00ABD4E3  |.  68 0ADAAB00   push    00ABDA0A
00ABD4E8  |.  64:FF30       push    dword ptr fs:[eax]
00ABD4EB  |.  64:8920       mov     dword ptr fs:[eax], esp
00ABD4EE  |.  8B83 54020000 mov     eax, dword ptr [ebx+0x254]
00ABD4F4  |.  8B10          mov     edx, dword ptr [eax]
00ABD4F6  |.  FF52 14       call    dword ptr [edx+0x14]
00ABD4F9  |.  85C0          test    eax, eax
00ABD4FB  |.  0F8E BF000000 jle     00ABD5C0                  ;  这个地方以上下断点的话没有进行任何操作也会直接暂停,证明这个地方以上和封包是无关的

00ABD501  |.  8D4D FC       lea     ecx, dword ptr [ebp-0x4]
00ABD504  |.  33D2          xor     edx, edx
00ABD506      8B83 54020000 mov     eax, dword ptr [ebx+0x254]
00ABD50C  |.  8B30          mov     esi, dword ptr [eax]
00ABD50E      FF56 0C       call    dword ptr [esi+0xC]
00ABD511  |.  33D2          xor     edx, edx
00ABD513  |.  8B83 54020000 mov     eax, dword ptr [ebx+0x254]
00ABD519  |.  8B08          mov     ecx, dword ptr [eax]
00ABD51B  |.  FF51 48       call    dword ptr [ecx+0x48]
00ABD51E  |.  8D55 FC       lea     edx, dword ptr [ebp-0x4]
00ABD521  |.  8BC3          mov     eax, ebx
00ABD523  |.  E8 A4FBFFFF   call    00ABD0CC                         ;  EAX改变=00000000
00ABD528  |.  8D55 FC       lea     edx, dword ptr [ebp-0x4]         ;  EDX改变=0018FE14(不变)
00ABD52B  |.  8BC3          mov     eax, ebx                         ;  eax改变=ebx
00ABD52D  |.  E8 A2FCFFFF   call    00ABD1D4                         ;  加密CALL

发现在进入加密CALL之前eax的值是由ebx赋予的。我分析是不是蓝色的这条CALL给ebx赋值,于是F7进去看,发现ebx从头到尾都没变化,那证明不是这个CALL给ebx赋值。

棕色部分(分割线)以上就没有办法下断点调试了,会直接停下来。

那请问大神,我的思路对了吗?先找ebx就知道了eax的值了,但是这个ebx要怎么找?

我的爱是你 发表于 2020-3-5 17:41
本帖最后由 我的爱是你 于 2020-3-5 17:54 编辑
lyf091 发表于 2020-3-5 12:04
挺大的,是一个20年前的网游了,客户端有1.73G,叫做金庸群侠传OL

网址是:jyfree.online-game.com.cn ...

2.jpg 喊话发包内容与0x2E异或   如上方2F 异或 2E  解码为 1    其中0 以2E进行填充 。 如 2F 2E 2E  解为 100     2D 2E 2E 为 300  。
至于lz说的发包不一样,确实有时不一样
31 81    DC                        C1     C1          98 AD E0 C5  20 DA          E0 C5           4F A2            E0 C5    4E    A2 E0 C5                                           F7 F7 F7 F7
31 81    D8                         C1    C0           98 AD E0 C5  F3 A1          E0 C5           20 DA           E0 C5    4E    A2 E0 C5 4F A2 E0 C5                        F6 F6 F6 F6
31 81     DC                         C1    C1           98 AD E0 C5  20 DA         E0 C5           4F A2           E0 C5     4E    A2 E0 C5                                            F1 F1 F1 F1
31 81     DC                         C1    C1           98 AD E0 C5  20 DA          E0 C5          4F A2            E0 C5    4E    A2 E0 C5                                            F0 F0 F0 F0
31 81     DB                         C1    C0           98 AD E0 C5  F3 A1           E0 C5          20 DA            E0 C5    4F   A2 E0 C5 4E A2 E0 C5                        F2 F2 F2 F2 F2
31 81    DF                          C1    C1           98 AD E0 C5  20 DA          E0 C5          4F A2            E0 C5    4E    A2 E0 C5                                           FD FD FD FD FD
包每多两个??十六进制会加3     C我也不清楚?                                                          ?                             发包?这里中间多了一段数据                       C5结束为喊话内容
水平有限没法全部解出,我只是新手不是大手子。只算出了数字异或,字母 与 汉字 就没跟了。

yinsugege 发表于 2020-3-3 22:16
 楼主| lyf091 发表于 2020-3-4 00:24
补充一下,明文封包是在这个地方:
00ABD1DC        8B07        mov eax,dword ptr ds:[edi]
发送的封包是“111111”
F4 44 0B 04 00 31 31 31 31 31 31
我的爱是你 发表于 2020-3-4 11:34
mov dl,byte ptr ds:[edx+ebx-0x1]
这个就是取出值放在 dl 里
xor dl,byte ptr ss:[ebp+0x6]        //总之这个 ebp+0x6 这块指向什么值 ,把异或后的值与这个值异或 不就还原了么。
将   [ebp+0x6]  值  与 dl  的值异或操作 把值放到 dl 里
mov byte ptr ds:[eax+ebx-0x1],dl
把 异或完的值 从dl 里取出  放到eax+ebx-0x1 这个位置里。
 楼主| lyf091 发表于 2020-3-4 12:23
我的爱是你 发表于 2020-3-4 11:34
mov dl,byte ptr ds:[edx+ebx-0x1]
这个就是取出值放在 dl 里
xor dl,byte ptr ss:[ebp+0x6]        // ...

感谢解答,问题就是在于[ebp+0x6]这个值每次都不一样,这可如何是好呢?
我理解的话0x6是一个固定的值,那就应该向上找ebp对吧?
我的爱是你 发表于 2020-3-4 12:42
lyf091 发表于 2020-3-4 12:23
感谢解答,问题就是在于[ebp+0x6]这个值每次都不一样,这可如何是好呢?
我理解的话0x6是一个固定的值, ...

00ABD1D4        53        push ebx     
00ABD1D5        56        push esi
00ABD1D6        57        push edi
00ABD1D7        55        push ebp
00ABD1D8        8BFA        mov edi,edx
00ABD1DA        8BE8        mov ebp,eax    //在这里 注意下ebp   一直走到00ABD21B        3255 06        xor dl,byte ptr ss:[ebp+0x6]  看看中间路过call是不是改变了ebp

改变就去进去改变它的 call 找啥改变它的。

没有改变的就去外面找 啥改变eax的  // eax为累加器,其值赋给 ebp 应当去call外面看看是否有判断字符串长度或其他影响。0x6 应当是固定偏移


 楼主| lyf091 发表于 2020-3-4 20:43
我的爱是你 发表于 2020-3-4 12:42
00ABD1D4        53        push ebx     
00ABD1D5        56        push esi
00ABD1D6        57    ...

感谢大神回复,我按照您说的往上找,发现首先在这个地方:
00ABD1EE        8BC7        mov     eax, edi        // eax改变=edi改变=0018FE14(不变)
eax都是不变的,都是等于0018FE14
接着往下走,到了这个CALL
00ABD1F0        E8 838194FF        call    00405378        // eax改变=edx改变=每次会变
发现eax就改变了,变成和edx一样,于是我F7进这个CALL去看
这一句执行过后edx就改变
0040532C        8B10          mov     edx, dword ptr [eax]
我比较不解的是:这一句的意思不就是把eax传入edx吗?eax都是固定的0018FE14,为什么每次这个edx不相同呢?麻烦您了~
我的爱是你 发表于 2020-3-4 21:20
本帖最后由 我的爱是你 于 2020-3-4 21:29 编辑

我是指在函数头
00ABD1D4        53        push ebx     

00ABD1D5        56        push esi

00ABD1D6        57        push edi

00ABD1D7        55        push ebp

00ABD1D8        8BFA        mov edi,edx


00ABD1DA        8BE8        mov ebp,eax    //这里下断点   留意ebp值向下执行



执           遇到call使用 F8 直接路过call看其ebp  值是否会改变以提升效率,被改变则再F7进call分析。



00ABD21B        3255 06        xor dl,byte ptr ss:[ebp+0x6]     //一直到 异或操作 这个位置  ,看看其间 ebp 值是否被改变,被改变就看看被啥改变
没有被改变  从加密call 出去看看call 上方有没对 eax 改变的。
【ebp+0x6】    你找 ebp  ,找eax干嘛 ,00ABD1DA        8BE8        mov ebp,eax      这eax 是在函数头给的ebp 值!如果从00ABD1DA      到  00ABD21B 一直ebp没被改变说明eax 在给ebp值前被改变了;那么就去call 外面找给eax 赋值的!
可能我表达的不清楚,不过你记得在这加密call ebp的值从push头到异或尾一直不动  0x6 也不动 ,就去加密call  外面上方找 eax 就行。   
 楼主| lyf091 发表于 2020-3-4 22:02
我的爱是你 发表于 2020-3-4 21:20
我是指在函数头
00ABD1D4        53        push ebx     
00ABD1D5        56        push esi

太感谢您了,解答得十分详细,我再按照您的方法试试!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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