本帖最后由 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断了下来
图中可以看到,程序中断,堆栈也出现了数据包结构。
第一步完成了,下面进行第2步
包是否加密(当然,现在几乎没有不加密的游戏)
我们来从新断一下游戏,看看数数据包里的内容
很显然是加密的包
那么先不管他是不是加密的包,我们的目标是找到明文包,那么直接干第三步
根据包来回溯到功能区域,也就是call
因为游戏断的很频繁,所以我们操做要快
在操作之前,我们先来看看游戏自己法的数据包有没有什么特点,看看能不能过滤掉
这样对我们操作上面来说有很大的帮助
经过我等待了1分多种,我发现了一个问题,就是游戏自己法的包的DateSize的长度一直等于66
朝上看寄存器的esi和edi的值都保持在66
那么我们就可以在ws_32.send的头部下一个条件断点
按下SHIFT+F2然后我们输入esi!=0x66
非常不错,过滤掉了心跳包,那么现在只有我们动作的时候,才会断下了。
我们来打坐看看
可以到到数据包的内容便了,长度也变了
然后正常我们有固定的思维,也就是网上常用到的方法
我们来总结一下
1,直接CTRI+F9,返回,然后看到有类似连续push的地方要注意
2,数据窗口对缓存区下硬件断点,然后回溯
3,找堆栈,一直向下找
好,那我直接CTRL+F9来看看
大概回溯了6此吧,最后回溯到这,然后在回溯就到了系统领空
然后中间没有任何有价值的东西,我看了在我回溯到第3此的时候,还是会有加密包的内容偶尔出现
所以这个方法不行
那么就在数据区写入硬件断点来试试
在这地方下入硬件写入断点,bit
到了这里
然后我在在堆栈窗口里发现了一点东西,我们一直向下啦,遇到不是回到系统领域的就反汇编跟着看一下
我的办法就是在堆栈所有返回程序领空的地方的头部都下个断,
然后吧那些不停断下的断点先停用,然后继续打坐
当我看到上图堆栈到反汇编的窗口时候,似乎有了点眉目,我们超上面下断点,下一次断点就打一次坐,如果一直没有断下,或者直接断,那么就还得继续朝下找
很幸运,我到这儿的时候打坐断下了
这点断下可就不得了了,直接到达明文封包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的加密方式来研究一下,先看图
下断,然后进入游戏打坐,停了下来
分析后,最后包是放在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加密地址就行了,发送没问题,也能实现相应功能,到这
|