功能函数及明文发包综合分析
2011年12月25日
五林功能函数及明文发包综合分析
下面先将近期找到的函数作一个整理,在最后附上寻找方法
-------------------------------------------------- ----------------------------------------
五林死亡回城函数调用及原型
DWORD sendadr=0x005648F0;
_asm
{
pushad
MOV EAX,DWORD PTR DS:[0x8C2F44]
MOV EAX,DWORD PTR DS:[EAX+0x20]
LEA ECX,DWORD PTR DS:[EAX+0xEC]
CALL sendadr
popad
}
cooltools(5534376) 23:00:04
下面为游戏中反汇编原型
004F96B0 . E8 BBC3FAFF CALL elementc.004A5A70
004F96B5 . 8D88 EC000000 LEA ECX,DWORD PTR DS:[EAX+EC]
004F96BB . E8 30B20600 CALL elementc.005648F0
-------------------------------------------------- -----------------------------
死亡后原地复活的调用方法
_asm
{
pushad
mov eax , 0x004A5A70
CALL eax
mov eax, 0x0058AA10
CALL eax
popad
}
-------------------------------------------------- ----------------------------
五林的捡物函数
00472060 |. 8B0D 442F8C00 MOV ECX,DWORD PTR DS:[8C2F44]
00472066 |. 8B97 10010000 MOV EDX,DWORD PTR DS:[EDI+110] ; 物品类别ID
0047206C |. 8B46 20 MOV EAX,DWORD PTR DS:[ESI+20] ; 物品ID
0047206F |. 52 PUSH EDX ; /Arg2
00472070 |. 8B49 20 MOV ECX,DWORD PTR DS:[ECX+20] ; |
00472073 |. 50 PUSH EAX ; |Arg1
00472074 |. 81C1 EC000000 ADD ECX,0EC ; |
0047207A |. E8 41270F00 CALL elementc.005647C0 ; \elementc.005647C0
-------------------------------------------------- --------------------------------------------------- --
发言函数(对于密语无效)
004B5541 |. 57 PUSH EDI ; /Arg2
004B5542 |. 50 PUSH EAX ; |Arg1
004B5543 |. 8BCB MOV ECX,EBX ; |
004B5545 |. E8 36430B00 CALL elementc.00569880 ; \elementc.00569880
参数二是发言内容,参数一是发言形式
ecx是固定地址
-------------------------------------------------- ---------------------------------------------------
五林明文发包函数
地址:005697A0
反汇编调用方法
0058A041 |. 66:C706 0400 MOV WORD PTR DS:[ESI],4
0058A046 |. A1 442F8C00 MOV EAX,DWORD PTR DS:[8C2F44]
0058A04B |. 6A 02 PUSH 2 ; /Arg2 = 00000002
0058A04D |. 56 PUSH ESI ; |Arg1
0058A04E |. 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20] ; |
0058A051 |. E8 4AF7FDFF CALL elementc.005697A0 ; \elementc.005697A0
实际为三个参数,第三个是ecx
上述调用为人物死亡回城复活的调用
发包长度为2,内容为04 00
扔东西的调用c++调用
DWORD sendadr=0x005697A0;
BYTE temp[]={0x0E,0x00 ,0x00 ,0x02 ,0x00};
DWORD sendbuffer;
sendbuffer=(DWORD)temp;
_asm
{
pushad
MOV EDX,DWORD PTR DS:[0x8C2F44]
MOV ECX,DWORD PTR DS:[EDX+0x20]
push 5
push sendbuffer
call sendadr
popad
}
-------------------------------------------------- ------------------------------------------------
下面开讲解如何找到的这些函数,由于不能一一作介绍,我们以捡物函数为准进行介绍
在实际操作前,说一下大致的思路
在bp send 上下断后,按ctrl+f9
再f8
就回到调用的send语句的下面一句了。一般为
call send
f8到这
逐级往回,就可找到调用函数。
当然,在send处下断,有可能是游戏的保挂连接的函数。
最后是在按了动作后,断下来的一般才是。
在分析中,主要使用工具OD,当流程复杂时,可借助于IDA
第一步:开启OD,载入游戏《五林外传》,进入游戏画面,并在地上扔一个东西,随便什么都行(别扔值钱的,小心被别人捡走,最好找个没人的脚落),准备工作做好了。进行第二步。
第二步:在OD的命令行中,敲入bp send ,回到游戏
第三步:用鼠标捡东西,这时程序或停在
71A2428A > 8BFF MOV EDI,EDI
71A2428C 55 PUSH EBP
71A2428D 8BEC MOV EBP,ESP
这是系统函数 send的入口处,直接按ctrl+f9 ,再按f8 ,就回到游戏区域了,一看是发包函数
0056E729 |. 8B0D 44B88C00 MOV ECX,DWORD PTR DS:[8CB844]
0056E72F |. 6A 00 PUSH 0 ; /Flags = 0
0056E731 |. 6A 01 PUSH 1 ; |DataSize = 1
0056E733 |. 68 00268C00 PUSH elementc.008C2600 ; |Data = elementc.008C2600
0056E738 |. 51 PUSH ECX ; |Socket => 100
0056E739 |. E8 D8F01C00 CALL ; \send
0056E73E |. EB 07 JMP SHORT elementc.0056E747
继续按ctrl+f9 ,再按f8 ,到下面,一看没什么用,继续
00567365 |. 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8]
00567369 |. 52 PUSH EDX ; /Arg3
0056736A |. 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8] ; |
0056736E |. 52 PUSH EDX ; |Arg2
0056736F |. 50 PUSH EAX ; |Arg1
00567370 |. E8 4B720000 CALL elementc.0056E5C0 ; \elementc.0056E5C0
继续按ctrl+f9 ,再按f8,经过观察分析,发现这是明文发包函数(当然这个分析过程,是要对多个功能进行分析,发现都调用这个函数得出的)
00589C74 |. 8B15 442F8C00 MOV EDX,DWORD PTR DS:[8C2F44] ; elementc.008C6A38
00589C7A |. 6A 0A PUSH 0A ; /Arg2 = 0000000A
00589C7C |. 56 PUSH ESI ; |Arg1
00589C7D |. 8B4A 20 MOV ECX,DWORD PTR DS:[EDX+20] ; |
00589C80 |. E8 1BFBFDFF CALL elementc.005697A0 ; \elementc.005697A0
继续按ctrl+f9 ,再按f8 ,就到了实际的功能函数了,其它的功能也是如此
00472060 |. 8B0D 442F8C00 MOV ECX,DWORD PTR DS:[8C2F44] ; elementc.008C6A38
00472066 |. 8B97 10010000 MOV EDX,DWORD PTR DS:[EDI+110] ; 物品类别ID
0047206C |. 8B46 20 MOV EAX,DWORD PTR DS:[ESI+20] ; 物品ID 全是从上一过程传进来的,一个是edi 一个是ecx
0047206F |. 52 PUSH EDX ; /Arg2
00472070 |. 8B49 20 MOV ECX,DWORD PTR DS:[ECX+20] ; |
00472073 |. 50 PUSH EAX ; |Arg1
00472074 |. 81C1 EC000000 ADD ECX,0EC ; |
0047207A |. E8 41270F00 CALL elementc.005647C0 ; \elementc.005647C0
总结一下,一般判断是不是功能函数,要看它的参数。通过分析参数,看是否有规律,是否和物品ID,怪物ID等相关。
可以从简单的没有参数的功能入手,比如说回城,死亡回城一类。对游戏了解之后可以找更复杂的功能。
2011年12月25日
五林功能函数及明文发包综合分析
下面先将近期找到的函数作一个整理,在最后附上寻找方法
-------------------------------------------------- ----------------------------------------
五林死亡回城函数调用及原型
DWORD sendadr=0x005648F0;
_asm
{
pushad
MOV EAX,DWORD PTR DS:[0x8C2F44]
MOV EAX,DWORD PTR DS:[EAX+0x20]
LEA ECX,DWORD PTR DS:[EAX+0xEC]
CALL sendadr
popad
}
cooltools(5534376) 23:00:04
下面为游戏中反汇编原型
004F96B0 . E8 BBC3FAFF CALL elementc.004A5A70
004F96B5 . 8D88 EC000000 LEA ECX,DWORD PTR DS:[EAX+EC]
004F96BB . E8 30B20600 CALL elementc.005648F0
-------------------------------------------------- -----------------------------
死亡后原地复活的调用方法
_asm
{
pushad
mov eax , 0x004A5A70
CALL eax
mov eax, 0x0058AA10
CALL eax
popad
}
-------------------------------------------------- ----------------------------
五林的捡物函数
00472060 |. 8B0D 442F8C00 MOV ECX,DWORD PTR DS:[8C2F44]
00472066 |. 8B97 10010000 MOV EDX,DWORD PTR DS:[EDI+110] ; 物品类别ID
0047206C |. 8B46 20 MOV EAX,DWORD PTR DS:[ESI+20] ; 物品ID
0047206F |. 52 PUSH EDX ; /Arg2
00472070 |. 8B49 20 MOV ECX,DWORD PTR DS:[ECX+20] ; |
00472073 |. 50 PUSH EAX ; |Arg1
00472074 |. 81C1 EC000000 ADD ECX,0EC ; |
0047207A |. E8 41270F00 CALL elementc.005647C0 ; \elementc.005647C0
-------------------------------------------------- --------------------------------------------------- --
发言函数(对于密语无效)
004B5541 |. 57 PUSH EDI ; /Arg2
004B5542 |. 50 PUSH EAX ; |Arg1
004B5543 |. 8BCB MOV ECX,EBX ; |
004B5545 |. E8 36430B00 CALL elementc.00569880 ; \elementc.00569880
参数二是发言内容,参数一是发言形式
ecx是固定地址
-------------------------------------------------- ---------------------------------------------------
五林明文发包函数
地址:005697A0
反汇编调用方法
0058A041 |. 66:C706 0400 MOV WORD PTR DS:[ESI],4
0058A046 |. A1 442F8C00 MOV EAX,DWORD PTR DS:[8C2F44]
0058A04B |. 6A 02 PUSH 2 ; /Arg2 = 00000002
0058A04D |. 56 PUSH ESI ; |Arg1
0058A04E |. 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20] ; |
0058A051 |. E8 4AF7FDFF CALL elementc.005697A0 ; \elementc.005697A0
实际为三个参数,第三个是ecx
上述调用为人物死亡回城复活的调用
发包长度为2,内容为04 00
扔东西的调用c++调用
DWORD sendadr=0x005697A0;
BYTE temp[]={0x0E,0x00 ,0x00 ,0x02 ,0x00};
DWORD sendbuffer;
sendbuffer=(DWORD)temp;
_asm
{
pushad
MOV EDX,DWORD PTR DS:[0x8C2F44]
MOV ECX,DWORD PTR DS:[EDX+0x20]
push 5
push sendbuffer
call sendadr
popad
}
-------------------------------------------------- ------------------------------------------------
下面开讲解如何找到的这些函数,由于不能一一作介绍,我们以捡物函数为准进行介绍
在实际操作前,说一下大致的思路
在bp send 上下断后,按ctrl+f9
再f8
就回到调用的send语句的下面一句了。一般为
call send
f8到这
逐级往回,就可找到调用函数。
当然,在send处下断,有可能是游戏的保挂连接的函数。
最后是在按了动作后,断下来的一般才是。
在分析中,主要使用工具OD,当流程复杂时,可借助于IDA
第一步:开启OD,载入游戏《五林外传》,进入游戏画面,并在地上扔一个东西,随便什么都行(别扔值钱的,小心被别人捡走,最好找个没人的脚落),准备工作做好了。进行第二步。
第二步:在OD的命令行中,敲入bp send ,回到游戏
第三步:用鼠标捡东西,这时程序或停在
71A2428A > 8BFF MOV EDI,EDI
71A2428C 55 PUSH EBP
71A2428D 8BEC MOV EBP,ESP
这是系统函数 send的入口处,直接按ctrl+f9 ,再按f8 ,就回到游戏区域了,一看是发包函数
0056E729 |. 8B0D 44B88C00 MOV ECX,DWORD PTR DS:[8CB844]
0056E72F |. 6A 00 PUSH 0 ; /Flags = 0
0056E731 |. 6A 01 PUSH 1 ; |DataSize = 1
0056E733 |. 68 00268C00 PUSH elementc.008C2600 ; |Data = elementc.008C2600
0056E738 |. 51 PUSH ECX ; |Socket => 100
0056E739 |. E8 D8F01C00 CALL ; \send
0056E73E |. EB 07 JMP SHORT elementc.0056E747
继续按ctrl+f9 ,再按f8 ,到下面,一看没什么用,继续
00567365 |. 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8]
00567369 |. 52 PUSH EDX ; /Arg3
0056736A |. 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8] ; |
0056736E |. 52 PUSH EDX ; |Arg2
0056736F |. 50 PUSH EAX ; |Arg1
00567370 |. E8 4B720000 CALL elementc.0056E5C0 ; \elementc.0056E5C0
继续按ctrl+f9 ,再按f8,经过观察分析,发现这是明文发包函数(当然这个分析过程,是要对多个功能进行分析,发现都调用这个函数得出的)
00589C74 |. 8B15 442F8C00 MOV EDX,DWORD PTR DS:[8C2F44] ; elementc.008C6A38
00589C7A |. 6A 0A PUSH 0A ; /Arg2 = 0000000A
00589C7C |. 56 PUSH ESI ; |Arg1
00589C7D |. 8B4A 20 MOV ECX,DWORD PTR DS:[EDX+20] ; |
00589C80 |. E8 1BFBFDFF CALL elementc.005697A0 ; \elementc.005697A0
继续按ctrl+f9 ,再按f8 ,就到了实际的功能函数了,其它的功能也是如此
00472060 |. 8B0D 442F8C00 MOV ECX,DWORD PTR DS:[8C2F44] ; elementc.008C6A38
00472066 |. 8B97 10010000 MOV EDX,DWORD PTR DS:[EDI+110] ; 物品类别ID
0047206C |. 8B46 20 MOV EAX,DWORD PTR DS:[ESI+20] ; 物品ID 全是从上一过程传进来的,一个是edi 一个是ecx
0047206F |. 52 PUSH EDX ; /Arg2
00472070 |. 8B49 20 MOV ECX,DWORD PTR DS:[ECX+20] ; |
00472073 |. 50 PUSH EAX ; |Arg1
00472074 |. 81C1 EC000000 ADD ECX,0EC ; |
0047207A |. E8 41270F00 CALL elementc.005647C0 ; \elementc.005647C0
总结一下,一般判断是不是功能函数,要看它的参数。通过分析参数,看是否有规律,是否和物品ID,怪物ID等相关。
可以从简单的没有参数的功能入手,比如说回城,死亡回城一类。对游戏了解之后可以找更复杂的功能。