吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10607|回复: 25
收起左侧

[游戏安全] 2.16更新网游逆向分析之从0开始找明文call和明文call的加密分析

[复制链接]
tyl1988 发表于 2020-2-15 22:16
本帖最后由 tyl1988 于 2020-2-16 19:00 编辑

2020年2月15日之寻找明文call



因疫情原因在家什么事也干不了,突然想起来以前初中玩的一款网友,现在只有私服了,拿来练练手……
直接进入正题


在找明文call之前,我们要先思考的几步:
1,找到游戏是怎么发包
2,包是否加密(当然,现在几乎没有不加密的游戏)
3,根据包来回溯到功能区域,也就是call


先来第1步
找到游戏是怎么发包的

老套路,先来看看windows游戏发包的几个常用函数,老生常谈的主要有
1.send
2.WSASend
3.sendto

4.ws2_32.send



在这里我每个都试了一下,然后只有ws2_32.send断了下来
1PNG.PNG


图中可以看到,程序中断,堆栈也出现了数据包结构。
第一步完成了,下面进行第2步

包是否加密(当然,现在几乎没有不加密的游戏)

我们来从新断一下游戏,看看数数据包里的内容
2.PNG


很显然是加密的包
那么先不管他是不是加密的包,我们的目标是找到明文包,那么直接干第三步

根据包来回溯到功能区域,也就是call

因为游戏断的很频繁,所以我们操做要快
在操作之前,我们先来看看游戏自己法的数据包有没有什么特点,看看能不能过滤掉
这样对我们操作上面来说有很大的帮助
3.PNG
经过我等待了1分多种,我发现了一个问题,就是游戏自己法的包的DateSize的长度一直等于66
朝上看寄存器的esi和edi的值都保持在66
那么我们就可以在ws_32.send的头部下一个条件断点
按下SHIFT+F2然后我们输入esi!=0x66
4.PNG

非常不错,过滤掉了心跳包,那么现在只有我们动作的时候,才会断下了。
我们来打坐看看
5.PNG


可以到到数据包的内容便了,长度也变了
然后正常我们有固定的思维,也就是网上常用到的方法
我们来总结一下
1,直接CTRI+F9,返回,然后看到有类似连续push的地方要注意
2,数据窗口对缓存区下硬件断点,然后回溯
3,找堆栈,一直向下找

好,那我直接CTRL+F9来看看
6.PNG


大概回溯了6此吧,最后回溯到这,然后在回溯就到了系统领空
然后中间没有任何有价值的东西,我看了在我回溯到第3此的时候,还是会有加密包的内容偶尔出现
所以这个方法不行
那么就在数据区写入硬件断点来试试
7.png
在这地方下入硬件写入断点,bit
到了这里
8.png

然后我在在堆栈窗口里发现了一点东西,我们一直向下啦,遇到不是回到系统领域的就反汇编跟着看一下

13.png



我的办法就是在堆栈所有返回程序领空的地方的头部都下个断,
然后吧那些不停断下的断点先停用,然后继续打坐
当我看到上图堆栈到反汇编的窗口时候,似乎有了点眉目,我们超上面下断点,下一次断点就打一次坐,如果一直没有断下,或者直接断,那么就还得继续朝下找
很幸运,我到这儿的时候打坐断下了
14.png



这点断下可就不得了了,直接到达明文封包call了,

004D6775  |> \8B45 FC              mov eax,[local.1]                     
004D6778  |.  66:8B00                mov ax,word ptr ds:[eax]
004D677B  |.  83C0 8F                add eax,-0x71
004D677E  |.  66:83E8 03            sub ax,0x3
004D6782  |.  73 22                     jnb short ylclient.004D67A6
004D6784  |.  C645 F9 13           mov byte ptr ss:[ebp-0x7],0x13          写入代号,比如0x13是姿势,我大概这么理解
004D6788  |.  8B45 FC                mov eax,[local.1]                                 这里是吧姿势的形态的代表数值取出来,根据我观察,7100是站起来7200是坐下
004D678B  |.  66:8B00                 mov ax,word ptr ds:[eax]                   放入ax
004D678E  |.  66:8945 FA             mov word ptr ss:[ebp-0x6],ax            在放入0x13的后面
004D6792  |.  8D4D F9               lea ecx,dword ptr ss:[ebp-0x7]             包的数据存放在ecx里
004D6795  |.  A1 AC744F00         mov eax,dword ptr ds:[0x4F74AC]     这个是啥基质不知道,后来发现只要是组包最后都有他,暂时理解为组包基质吧
004D679A  |.  8B00                       mov eax,dword ptr ds:[eax]            
004D679C  |.  BA 03000000          mov edx,0x3                                       这个意思是要区ecx里的3个字节作为包,也就是说这个明文包就3个字节
004D67A1  |.  E8 0A970100           call ylclient.004EFEB0                        这个不应该理解为发包call,应该理解为加密数据包call





好了,既然这个明文包找出来了,而且经过测试,这个游戏全部用这一个 基质发送数据包,而且固定的形态就是这样的:
mov ecx,防数据的数据包地址
mov eax,dword ptr ds:[0x4F74AC]   
mov eax,dword ptr ds:[eax]   

mov edx,要取数据包的字节

call 加密发包



大概就是这样,值要在数据包地址里写入数据,然后写读取的字节数,就可以做到游戏里的99%的功能





然后数据包加密也在这个call里面

今天就不继续研究了,要睡觉了
过几天我在吧加密研究出来~






2020年2月16日更新关于明文call的加密分析


今天还是无聊的一天,所以继续把昨天的明文call的加密方式来研究一下,先看图
x1.png




下断,然后进入游戏打坐,停了下来
分析后,最后包是放在ecx里的(经过测试所有的call都是数据包放ecx eax放入一个固定值 edx为功能数据的长度)

数据窗口看下包的3个数值是13 72 00

然后分析了 13 是姿势的代表,72 是坐下
那么就进入call来看看数据的走向
这里我就不贴图了,因为贴图太多,累人,我就直接上数据的分析

004EFEB0 /$  53            push ebx                                              发包call
004EFEB1 |.  56            push esi
004EFEB2 |.  57            push edi
004EFEB3 |.  81C4 04F0FFFF add esp,-0xFFC
004EFEB9 |.  50            push eax
004EFEBA |.  83C4 F4       add esp,-0xC
004EFEBD |.  8BF1          mov esi,ecx
004EFEBF |.  8BFA          mov edi,edx
004EFEC1 |.  8BD8          mov ebx,eax
004EFEC3 |.  C60424 00     mov byte ptr ss:[esp],0x0                                 
保证esp是0
004EFEC7 |.  33C0          xor eax,eax
004EFEC9 |.  8A06          mov al,byte ptr ds:[esi]                              
提取封包第一个字节放入al
004EFECB |.  83F8 24       cmp eax,0x24                                          
004EFECE |.  75 25         jnz short ylclient.004EFEF5                                 
跳转成功
004EFEF5 |>  85C0          test eax,eax
004EFEF7 |.  7C 2E         jl short ylclient.004EFF27
004EFEF9 |.  3D FF000000   cmp eax,0xFF                                          
在比较
004EFEFE |.  7F 27         jg short ylclient.004EFF27
004EFF00 |.  8B1485 901B56>mov edx,dwordptr ds:[eax*4+0x561B90]                 
数据包第一个值计算
004EFF07 |.  83C2 19       add edx,0x19                                          
+19
004EFF0A |.  8B0D 9C774F00 mov ecx,dword ptrds:[0x4F779C]                       
提取这里的值放ecx 和后边的[ebp+0x350]对应
004EFF10 |.  3B11          cmp edx,dword ptr ds:[ecx]
004EFF12 |.  0F8F B5000000 jgylclient.004EFFCD
004EFF18 |.  8B15 9C774F00 mov edx,dwordptr ds:[0x4F779C]                       

004EFF1E |.  8B12          mov edx,dword ptr ds:[edx]
004EFF20 |.  891485 901B56>mov dword ptrds:[eax*4+0x561B90],edx                 
edx的值放入这里
004EFF27 |>  83F8 0B       cmp eax,0xB
004EFF2A |.  75 4F         jnz short ylclient.004EFF7B                              
跳了

004EFF7B |>  C60424 01     mov byte ptr ss:[esp],0x1                             
数字1放在这个堆栈的值
这里esp是第一地址:放入01应该是确定这个包存在
004EFF7F |.  66:897C24 08  mov word ptr ss:[esp+0x8],di                          
功能数据有多少个字节放在第8个字节
Di的意思是组包的字节一共有3个
Esp的值就是:01 00 00 0000 00 00 00 03 00
004EFF84 |.  8D5424 0A     lea edx,dword ptr ss:[esp+0xA]                        
把esp+a地址放入edx也就还是13 72 00
004EFF88 |.  8BC6          mov eax,esi
004EFF8A |.  8BCF          mov ecx,edi
004EFF8C |.  E8 C72DF1FF   call ylclient.00402D58

00402D58 /$  56            push esi
00402D59 |.  57            push edi
00402D5A |.  89C6          mov esi,eax
00402D5C |.  89D7          mov edi,edx
00402D5E |.  89C8          mov eax,ecx
00402D60 |.  39F7          cmp edi,esi
00402D62 |.  77 13         ja short ylclient.00402D77
00402D64 |.  74 2F         je short ylclient.00402D95
00402D66 |.  C1F9 02       sar ecx,0x2                                          
这里右移动两位,理解为除4
00402D69 |.  78 2A         js short ylclient.00402D95
00402D6B |.  F3:A5         rep movs dword ptr es:[edi],dword ptrds:[esi]               
这里3/4就为0了所以这里没有执行
00402D6D  |. 89C1          mov ecx,eax
00402D6F |.  83E1 03       and ecx,0x3                                               
必须取3字节
00402D72 |.  F3:A4         rep movs byte ptr es:[edi],byte ptrds:[esi]         
取esi的ecx个字节放入edi,这里每次放入ecx个
这个时候的esp+0a里的3个字节就为13 72 00
那么esp的值就是:01 00 00 0000 00 00 00 03 00 13 72 00
00402D74 |.  5F            pop edi                                               
00402D75 |.  5E            pop esi                                             
00402D76 |.  C3            retn


004EFF91 |.  8B83 58030000 mov eax,dwordptr ds:[ebx+0x358]
004EFF97 |.  85C0          test eax,eax
004EFF99 |.  74 32         je short ylclient.004EFFCD
004EFF9B |.  6A 00         push 0x0                                             
一个入栈操作
004EFF9D |.  8D5424 0C     lea edx,dword ptr ss:[esp+0xC]                       
数据包+c开始
Esp+c的值就是:03 00 13 7200
004EFFA1 |.  52            push edx                                       
入栈上面计算的地址
004EFFA2 |.  83C7 02       add edi,0x2                                      
上面加入功能包数据数量在包前2个字节,所以要加2
004EFFA5 |.  57            push edi                                         
在把包长入栈,这里edi是是现在包的长度
004EFFA6 |.  33C9          xor ecx,ecx
004EFFA8 |.  8B93 50030000 mov edx,dwordptr ds:[ebx+0x350]                  
[ebx+0x350]的值在后面有用
004EFFAE |.  E8 C12AF8FF   call ylclient.00472A74

00472A74 /$  55            push ebp                                      
00472A75 |.  8BEC          mov ebp,esp
00472A77 |.  50            push eax
00472A78 |.  B8 04000000   mov eax,0x4
00472A7D |>  81C4 04F0FFFF /addesp,-0xFFC
00472A83 |.  50            |push eax
00472A84 |.  48            |dec eax
这里连续4次esp-ffc获得一个新地址
姑且就叫esp-4xffc把
00472A85 |.^ 75 F6         \jnz shortylclient.00472A7D
00472A87 |.  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]      
这里取的值暂时不要管他
00472A8A |.  83C4 DC       add esp,-0x24
继续esp-4xffc-0x24
就给他命名为esp2把
00472A8D |.  53            push ebx
00472A8E |.  56            push esi
00472A8F |.  57            push edi
00472A90 |.  33DB          xor ebx,ebx
00472A92 |.  899D F0BFFFFF mov dword ptrss:[ebp+0xFFFFBFF0],ebx
00472A98 |.  8BD8          mov ebx,eax
00472A9A |.  8B75 08       mov esi,dword ptr ss:[ebp+0x8]                        
这个值要注意下
Call外部入栈的5,就是esp+8里面的03 00 13 72 00 的五个字节
00472A9D |.  33C0          xor eax,eax
00472A9F |.  55            push ebp
00472AA0 |.  68 E92B4700   push ylclient.00472BE9
00472AA5 |.  64:FF30       push dword ptr fs:[eax]
00472AA8 |.  64:8920       mov dword ptr fs:[eax],esp
00472AAB |.  C645 FF 00    mov byte ptr ss:[ebp-0x1],0x0
00472AAF |.  85F6          test esi,esi
00472AB1 |.  0F8C 19010000 jlylclient.00472BD0
00472AB7 |.  81FE 00200000 cmp esi,0x2000
00472ABD |.  0F8F 0D010000 jgylclient.00472BD0
00472AC3 |.  8BC6          mov eax,esi
00472AC5 |.  66:83C0 08    add ax,0x8
包长+8
00472AC9 |.  66:8985 F7DFF>mov word ptrss:[ebp-0x2009],ax
包加长,写入这里
00472AD0 |.  8995 F9DFFFFF mov dword ptrss:[ebp-0x2007],edx
这个edx值来自于call外面,细心的你应该看到我上面的[ebp+0x350]
00472AD6 |.  888D FDDFFFFF mov byte ptrss:[ebp-0x2003],cl
这个时候会有个地址也就是ebp-2009 里的值为: 0D 00 10 00 00 00 00 00
00472ADC |.  8A45 10       mov al,byte ptr ss:[ebp+0x10]
在把5取出来,为了下面把功能数据取出来也就是03 00 13 72 00
00472ADF |.  8885 FEDFFFFF mov byte ptrss:[ebp-0x2002],al
00472AE5 |.  85F6          test esi,esi
00472AE7 |.  7E 10         jle short ylclient.00472AF9
00472AE9 |.  8D95 FFDFFFFF lea edx,dwordptr ss:[ebp-0x2001]
00472AEF  |.  8B450C       mov eax,dword ptr ss:[ebp+0xC]
00472AF2 |.  8BCE          mov ecx,esi
00472AF4 |.  E8 5F02F9FF   call ylclient.00402D58
这个call就是为了取出03 00 1372 00 放入ebp-2009里面


00402D58 /$  56            push esi
00402D59 |.  57            push edi
00402D5A |.  89C6          mov esi,eax
00402D5C |.  89D7          mov edi,edx
00402D5E |.  89C8          mov eax,ecx
00402D60 |.  39F7          cmp edi,esi
00402D62 |.  77 13         ja short ylclient.00402D77
00402D64 |.  74 2F         je short ylclient.00402D95
00402D66 |.  C1F9 02       sar ecx,0x2                                          
这时候ecx为5,所以右移后为1
00402D69 |.  78 2A         js short ylclient.00402D95
00402D6B |.  F3:A5         rep movs dword ptr es:[edi],dword ptrds:[esi]        
移动ecx的4字节
00402D6D |.  89C1          mov ecx,eax
00402D6F |.  83E1 03       and ecx,0x3
00402D72 |.  F3:A4         rep movs byte ptr es:[edi],byte ptrds:[esi]         
取esi的ecx个字节放入edi,这里每次放入ecx个
00402D74 |.  5F            pop edi
00402D75 |.  5E            pop esi
00402D76 |.  C3            retn

组合后Ebp-2009的值就是0D00 10 00 00 00 00 00 03 00 13 72 00

00472AF9 |>  33F6          xor esi,esi
00472AFB |.  807B 0C 01    cmp byte ptr ds:[ebx+0xC],0x1
00472AFF |.  75 51         jnz short ylclient.00472B52
00472B01 |.  C685 F7BFFFFF>mov byte ptrss:[ebp+0xFFFFBFF7],0x28
这个[ebp+0xFFFFBFF7]姑且叫esp3把,写入固定值28
00472B08 |.  0FB78D F7DFFF>movzx ecx,wordptr ss:[ebp-0x2009]
00472B0F |.  8D95 F8BFFFFF lea edx,dwordptr ss:[ebp+0xFFFFBFF8]
00472B15 |.  8D85 F7DFFFFF lea eax,dwordptr ss:[ebp-0x2009]
00472B1B |.  E8 E4FAFFFF   call ylclient.00472604                                


封包加密过程

00472604 /$  53            push ebx
00472605 |.  56            push esi
00472606 |.  57            push edi
00472607 |.  55            push ebp
00472608 |.  83C4 F8       add esp,-0x8
0047260B |.  8BF2          mov esi,edx
0047260D |.  890424        mov dword ptr ss:[esp],eax                           
把数据包地址放入esp里
00472610 |.  8B0424        mov eax,dword ptr ss:[esp]                           
00472613 |.  03C1          add eax,ecx                                    
确保数据包没有多余数据,所以把包后在加2里全为00
00472615 |.  C600 00       mov byte ptr ds:[eax],0x0
00472618 |.  8BD0          mov edx,eax
0047261A |.  42            inc edx                                               
包在+1
0047261B |.  C602 00       mov byte ptr ds:[edx],0x0
0047261E |.  83C0 02       add eax,0x2                                          
+2
00472621 |.  C600 00       mov byte ptr ds:[eax],0x0
00472624 |.  8BC1          mov eax,ecx                                          
最后得到的包的长度,下面是计算出要循环的次数
00472626 |.  BB 03000000   movebx,0x3
0047262B |.  99            cdq                                                    ;
扩展eax做除法
0047262C |.  F7FB          idiv ebx
0047262E |.  894424 04     mov dword ptr ss:[esp+0x4],eax
循环次数放入栈
00472632 |.  8BC1          mov eax,ecx
00472634 |.  B9 03000000   mov ecx,0x3
00472639 |.  99            cdq
0047263A |.  F7F9          idiv ecx
0047263C |.  85D2          test edx,edx
0047263E |.  74 04         je short ylclient.00472644
00472640 |.  FF4424 04     inc dword ptr ss:[esp+0x4]                           
esp+04里的值加1
00472644 |>  8B6C24 04     mov ebp,dword ptr ss:[esp+0x4]
00472648 |.  4D            dec ebp                                            
-1
00472649 |.  85ED          test ebp,ebp                 
0047264B |.  7C 5A         jl short ylclient.004726A7
0047264D |.  45            inc ebp                                                   
又+1
0047264E |.  33DB          xor ebx,ebx                                      
下面是个循环加密,每次拿4个字节从第一个开始加密
00472650 |>  8BFB          /mov edi,ebx
00472652 |.  C1E7 02       |shl edi,0x2
左移动2位
00472655 |.  03FE          |add edi,esi
00472657 |.  8BD7          |mov edx,edi
00472659 |.  8D045B        |lea eax,dword ptr ds:[ebx+ebx*2]                     
这个是控制esp地址的 每次加上:[ebx+ebx*2]来确保取出数据的位置
0047265C |.  030424        |add eax,dword ptr ss:[esp]                            ;
0047265F |.  E8 48FFFFFF   |call ylclient.004725AC

004725AC /$  53            push ebx
004725AD |.  83C4 F8       add esp,-0x8
004725B0 |.  8BDA          mov ebx,edx
004725B2 |.  8BD4          mov edx,esp
004725B4 |.  B9 03000000   mov ecx,0x3
004725B9 |.  E8 9A07F9FF   call ylclient.00402D58
这个还是每次拿出来数据包的3个字节
004725BE |.  33C0          xor eax,eax
004725C0 |.  8A0424        mov al,byte ptr ss:[esp]                              
计算改变数据包的内容方便加密
004725C3 |.  C1E8 02       shr eax,0x2
004725C6 |.  8803          mov byte ptr ds:[ebx],al                              
取出三个值计算后得到4个值
004725C8 |.  43            inc ebx
004725C9 |.  8A0424        mov al,byte ptr ss:[esp]
004725CC |.  24 03         and al,0x3
004725CE |.  C1E0 04       shl eax,0x4
004725D1 |.  33D2          xor edx,edx
004725D3 |.  8A5424 01     mov dl,byte ptr ss:[esp+0x1]
004725D7 |.  C1EA 04       shr edx,0x4
004725DA |.  0AC2          or al,dl
004725DC |.  8803          mov byte ptr ds:[ebx],al
004725DE |.  43            inc ebx
004725DF |.  8A4424 01     mov al,byte ptr ss:[esp+0x1]
004725E3 |.  24 0F         and al,0xF
004725E5 |.  C1E0 02       shl eax,0x2
004725E8 |.  33D2          xor edx,edx
004725EA |.  8A5424 02     mov dl,byte ptr ss:[esp+0x2]
004725EE |.  C1EA 06       shr edx,0x6
004725F1 |.  0AC2          or al,dl
004725F3 |.  8803          mov byte ptr ds:[ebx],al
004725F5 |.  43            inc ebx
004725F6 |.  8A4424 02     mov al,byte ptr ss:[esp+0x2]
004725FA |.  24 3F         and al,0x3F
004725FC |.  8803          mov byte ptr ds:[ebx],al
004725FE |.  59            pop ecx                                             
004725FF |.  5A            pop edx                                            
00472600 |.  5B            pop ebx                                             
00472601 \.  C3            retn


00472664  |. 8BC7          |mov eax,edi                                          
加密很简单,就是算出数字,然后提取加密基质+数字的代码
00472666 |.  33D2          |xor edx,edx
00472668 |.  8A10          |mov dl,byte ptr ds:[eax]
0047266A |.  8A92 F8AD5500 |mov dl,byte ptrds:[edx+0x55ADF8]                    
0x55adf8是加密基质?
00472670 |.  8810          |mov byte ptr ds:[eax],dl
00472672 |.  8BC7          |mov eax,edi
00472674 |.  40            |inc eax
00472675 |.  33D2          |xor edx,edx
00472677 |.  8A10          |mov dl,byte ptr ds:[eax]
00472679 |.  8A92 F8AD5500 |mov dl,byte ptrds:[edx+0x55ADF8]
0047267F |.  8810          |mov byte ptr ds:[eax],dl
00472681 |.  8BC7          |mov eax,edi
00472683 |.  83C0 02       |add eax,0x2
00472686 |.  33D2          |xor edx,edx
00472688 |.  8A10          |mov dl,byte ptr ds:[eax]
0047268A |.  8A92 F8AD5500 |mov dl,byte ptrds:[edx+0x55ADF8]
00472690 |.  8810          |mov byte ptr ds:[eax],dl
00472692 |.  8BC7          |mov eax,edi
00472694 |.  83C0 03       |add eax,0x3
00472697 |.  33D2          |xor edx,edx
00472699 |.  8A10          |mov dl,byte ptr ds:[eax]
0047269B |.  8A92 F8AD5500 |mov dl,byte ptrds:[edx+0x55ADF8]
004726A1 |.  8810          |mov byte ptr ds:[eax],dl
004726A3 |.  43            |inc ebx
004726A4 |.  4D            |dec ebp
004726A5 |.^ 75 A9         \jnz shortylclient.00472650
004726A7 |>  8B4424 04     mov eax,dword ptr ss:[esp+0x4]
004726AB |.  C1E0 02       shl eax,0x2
004726AE |.  8BD0          mov edx,eax
004726B0 |.  03D6          add edx,esi
004726B2 |.  C602 00       mov byte ptr ds:[edx],0x0                           
包结束标记
004726B5 |.  59            pop ecx                                            
004726B6  |. 5A            pop edx                                             
004726B7 |.  5D            pop ebp                                             
004726B8 |.  5F            pop edi                                            
004726B9 |.  5E            pop esi                                            
004726BA |.  5B            pop ebx                                          
004726BB \.  C3            retn
加密完成

00472B20 |.  8BF0          mov esi,eax
00472B22 |.  0FB7FE        movzx edi,si
00472B25 |.  C6843D F8BFFF>mov byte ptrss:[ebp+edi+0xFFFFBFF8],0x29
数据包后面加29代表结束
00472B2D |.  C6843D F9BFFF>mov byte ptrss:[ebp+edi+0xFFFFBFF9],0x0
补个0
00472B35 |.  8BCF          mov ecx,edi
00472B37 |.  83C1 02       add ecx,0x2
00472B3A |.  8D95 F7BFFFFF lea edx,dwordptr ss:[ebp+0xFFFFBFF7]               
数据包拿出来放入edx
00472B40 |.  8B43 10       mov eax,dword ptr ds:[ebx+0x10]
00472B43 |.  E8 7034FFFF   call ylclient.00465FB8
这个call就是要完成向线程过度的call了,这里就不分析了
最后就返回到图片的发包call的后面继续执行了





既然加密call分析出来了,那么我们来看看怎么把这个加密call整理出来



那么 首先要有个地址 我们就叫 esp把

功能数据包是  13 72 00

那么这个包的长度就是3 在组合就是
03 00 13 72 00

组合过后,就变成了5长度,然后有个硬性的数字就是组合过后的包长+08 那么数据是怎么写入esp的呢?来看看
00472AC5 |.  66:83C0 08    add ax,0x8
包长+8
00472AC9 |.  66:8985 F7DFF>mov word ptrss:[ebp-0x2009],ax
包加长,写入这里
00472AD0 |.  8995 F9DFFFFF mov dword ptrss:[ebp-0x2007],edx
这个edx值来自于call外面,细心的你应该看到我上面的[ebp+0x350]
00472AD6 |.  888D FDDFFFFF mov byte ptrss:[ebp-0x2003],cl
这个时候会有个地址也就是ebp-2009 里的值为: 0D 00 10 00 00 00 00 00
00472ADC |.  8A45 10       mov al,byte ptr ss:[ebp+0x10]
在把5取出来,为了下面把功能数据取出来也就是03 00 13 72 00
00472ADF |.  8885 FEDFFFFF mov byte ptrss:[ebp-0x2002],al
00472AE5 |.  85F6          test esi,esi
00472AE7 |.  7E 10         jle short ylclient.00472AF9
00472AE9 |.  8D95 FFDFFFFF lea edx,dwordptr ss:[ebp-0x2001]
00472AEF  |.  8B450C       mov eax,dword ptr ss:[ebp+0xC]
00472AF2 |.  8BCE          mov ecx,esi
00472AF4 |.  E8 5F02F9FF   call ylclient.00402D58
这个call就是为了取出03 00 1372 00 放入ebp-2009里面




那么从上面这个可以看出来 首先写入包长是个字节0d  00
继续写入ebp的数值,这里的ebp来源于[
[4F779C]+0]+350],

然后写入4字节,暂时把这个数值定 01 01 01 01那么



esp:0d 00 01 01 01 01

然后又在esp+7的位置写入00 这个时候在esp+6的这个位置没有数值,是用00代替那么
esp: 0d 00 01 01 01 01 00 00


最后又取出功能数据的5个字节,成的包就是
esp:
0d 00 01 01 01 01 00 00 03 00 13 72 00




再来个地址放入加密过的数据包 esp2
从上面的代码分析能看出来,加密包是28开头 29 00结尾 中间才是加密数据
然后就是每三个明文数据加密得到4个加密数据,也就是 0d/3=4余1 就是循环4次,然后在4x4=16也就是加密后成了16个字节,
至于怎么加密可以看上面的数据转换过程,至于后来从加密基质提取数值那些就没必要了

加密后的esp2应该是
esp2: 28 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 29 00



起始分析这个加密过程是没有意义的,除非你要做脱机外挂
一般组好数据包直接call加密地址就行了,发送没问题,也能实现相应功能,到这





8.png
9.png
10.png
11.png
12.png

免费评分

参与人数 6威望 +1 吾爱币 +11 热心值 +6 收起 理由
Peerin + 1 + 1 谢谢@Thanks!
Swift_ + 1 这绝对是大佬啊
刘千寻 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qaz003 + 1 + 1 谢谢分享,想起当年的外挂海了。。
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Lopht + 1 + 1 绝不是新人,老人回流,鉴定完毕。

查看全部评分

本帖被以下淘专辑推荐:

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

xiaohui888 发表于 2020-2-16 00:54
大佬演示的是这个CALL在循环体里面的对吧!!
 楼主| tyl1988 发表于 2020-2-16 19:12
yaoaixgyx 发表于 2020-2-16 10:01
太多了我都没有看清楚, 我自己试试的时候  不行哦 找不到

重要的不是方法,是思路,比如线程发包,那么肯定在主程序里又个地方得把主程序里的包给线程才可以,或者说线程从主程序的某一个地方获取,那么这个时候就可以追踪加密包的来源了。
而且没个游戏都是不同的,思路很重要
头像被屏蔽
我是一颗小虎牙 发表于 2020-2-15 22:56
g11021044 发表于 2020-2-15 23:05
你虽然ID都是新的,你的技术是老的,我却是小白
Hmily 发表于 2020-2-15 23:11
最后有几个图怎么没插进去?第一次注册?
copper187 发表于 2020-2-16 00:08
支持大佬!
从农菜菜籽 发表于 2020-2-16 01:41
大佬,小白来看看大佬的操作..
GS_小东 发表于 2020-2-16 02:38
好久都没见过bp send这个方法了
VanYun 发表于 2020-2-16 03:33
膜拜(>ω<)
 楼主| tyl1988 发表于 2020-2-16 07:28
Hmily 发表于 2020-2-15 23:11
最后有几个图怎么没插进去?第一次注册?

最后几个图我也不知道为啥…那是本来想从鼠标事件下手的…但是图传到相册之后发我没加入到文章…发表了确都出来了…我编辑也看不到这几个图…发表就有…郁闷

点评

别用相册,直接传论坛图片。  详情 回复 发表于 2020-2-16 10:37
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-1 07:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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