您的位置:首页 > 编程语言 > C语言/C++

追逐自己的梦想----------辅助制作第十课:分析动作数组以及攻击捡物品等功能call的封装

2015-01-12 12:55 453 查看
首先通过CE找到我们需要的数据地址 利用CE反复改变鼠标指针来获取到的技能列表的地址

09BE7430

->value

当鼠标指向第一个技能的时候

22b54bc0

当鼠标指向第2个技能的时候

22b54e08

当鼠标指向第3个技能的时候

22b55050

通过在CE中搜索上面的地址可以发现以下三个保存了上面的技能数据的地址

0x031e91e0

0x0e4ceb58

0x22f90720

打开OD利用dd 0x031e91e0 分别查看上面三个数据

可以发现   只有第三个包含了纯净的数据 也就是只包含了技能数组

其他的两个地址都包含了很多的其他的数据

所以这节课中我们要用到的地址就是0x22f90720

下一个内存访问的断点

00786D09    8975 F4         MOV DWORD PTR SS:[EBP-0xC],ESI

00786D0C    3B75 0C         CMP ESI,DWORD PTR SS:[EBP+0xC]

00786D0F    0F8D 7A020000   JGE Client.00786F8F

00786D15    8D14F6          LEA EDX,DWORD PTR DS:[ESI+ESI*8]

00786D18    8D9CB7 10040000 LEA EBX,DWORD PTR DS:[EDI+ESI*4+0x410]

00786D1F    8D8497 EC050000 LEA EAX,DWORD PTR DS:[EDI+EDX*4+0x5EC]

00786D26    895D F0         MOV DWORD PTR SS:[EBP-0x10],EBX

00786D29    8945 EC         MOV DWORD PTR SS:[EBP-0x14],EAX

00786D2C    8D6424 00       LEA ESP,DWORD PTR SS:[ESP]

00786D30    8B03            MOV EAX,DWORD PTR DS:[EBX]

00786D32    85C0            TEST EAX,EAX

00786D34    0F84 CF000000   JE Client.00786E09

00786D3A    8B4D EC         MOV ECX,DWORD PTR SS:[EBP-0x14]

00786D3D    8039 00         CMP BYTE PTR DS:[ECX],0x0

EDI 22F90310

得到公式

dd 22F90310+0x410+4*i

然后在ce中查找22F90310的基址   得到  31c0eb0

然后通过在OD中查找常量 可以发现这个就是基址  

所有公式变成

dd [[0x31c0eb0]+0x410+4*i]+5c

dd [[0x31c0eb0]+0x410+4*0]+4c

+08 分类编号  玩家31   怪物2e   动作56

+0c 总的对象数组下标

+4c 动作分类ID    8000001

+5c 名字

然后在OD中分析攻击call

通过下访问了这个地址的断点 得到下面的两个数据

007A9BDF - 80 B8 30020000 00 - cmp byte ptr [eax+00000230],00

007A9BE6 - 75 6D - jne Client.exe+3A9C55

007A9BE8 - 8B 8C 9F 10040000  - mov ecx,[edi+ebx*4+00000410] <<

007A9BEF - 85 C9  - test ecx,ecx

007A9BF1 - 74 62 - je Client.exe+3A9C55

EAX=09BE7208

EBX=00000002

ECX=22B55050

EDX=000000D7

ESI=000000B7

EDI=22F90310

ESP=0018A480

EBP=0018CCC4

EIP=007A9BEF

007AA4A8 - 83 BF 08160000 35 - cmp dword ptr [edi+00001608],35

007AA4AF - 75 1F - jne Client.exe+3AA4D0

007AA4B1 - 8B 84 9F 10040000  - mov eax,[edi+ebx*4+00000410] <<

007AA4B8 - 85 C0  - test eax,eax

007AA4BA - 74 14 - je Client.exe+3AA4D0

EAX=22B55050

EBX=00000002

ECX=18D01E62

EDX=22F90310

ESI=000000B7

EDI=22F90310

ESP=0018A480

EBP=0018CCC4

EIP=007AA4B8

然后在OD中下断点 然后F8跟踪就得到以下的数据

007AA485    803D 49FF1B03 0>CMP BYTE PTR DS:[0x31BFF49],0x1

007AA48C    0F84 8A000000   JE Client.007AA51C

007AA492    8B87 08160000   MOV EAX,DWORD PTR DS:[EDI+0x1608]

007AA498    8B8F D01B0000   MOV ECX,DWORD PTR DS:[EDI+0x1BD0]

007AA49E    53              PUSH EBX                                 ; 0

007AA49F    50              PUSH EAX                                 ; 35

007AA4A0    51              PUSH ECX                                 ; 5

007AA4A1    8BCF            MOV ECX,EDI                              ; 22F90310

007AA4A3    E8 08EAFEFF     CALL Client.00798EB0

007AA4A8    83BF 08160000 3>CMP DWORD PTR DS:[EDI+0x1608],0x35

007AA4AF    75 1F           JNZ SHORT Client.007AA4D0

007AA4B1    8B849F 10040000 MOV EAX,DWORD PTR DS:[EDI+EBX*4+0x410]

007AA4B8    85C0            TEST EAX,EAX

007AA4BA    74 14           JE SHORT Client.007AA4D0

007AA4BC    8B50 4C         MOV EDX,DWORD PTR DS:[EAX+0x4C]

007AA4BF    A1 C088F500     MOV EAX,DWORD PTR DS:[0xF588C0]

007AA4C4    8B88 7C020000   MOV ECX,DWORD PTR DS:[EAX+0x27C]

007AA4CA    52              PUSH EDX

007AA4CB    E8 20A3EDFF     CALL Client.006847F0

007AA4D0    83BF 08160000 3>CMP DWORD PTR DS:[EDI+0x1608],0x36

007AA4D7    75 20           JNZ SHORT Client.007AA4F9

007AA4D9    8B849F 10040000 MOV EAX,DWORD PTR DS:[EDI+EBX*4+0x410]

可能就是她的call

用代码注入器测试

mov ebx ,1 //动作下标

mov edi ,31c0eb0

mov edi,[edi]

MOV EAX,DWORD PTR DS:[EDI+EBX*4+0x410]

 MOV EDX,DWORD PTR DS:[EAX+0x4C]

MOV EAX,DWORD PTR DS:[0xF588C0]

MOV ECX,DWORD PTR DS:[EAX+0x27C]

PUSH EDX

CALL 006847F0

最后我们得到的就是以上的一段汇编代码,分析就到此结束了

下面要做的就是封装数据了

typedef struct ACTION{
char* szpname; //动作名字
DWORD id;//动作id
//int sub; //动作下标
}_ACTION;

class ActionList :public BaseData{
public:
ActionList();
~ActionList();

BOOL UseActionByName(char* szpName); //通过名字使用动作
void PrintAll_Action();

private:
/*接口定义*/
int GetActionIndexByName(char* szpname); //通过名字获取动作下标
int UseActionByIndex(int index); //通过下标使用动作
DWORD GetCateOffset(); //获取分类编号偏移 玩家为31 怪物为2e 技能为56
DWORD GetArraySubOffet();//获取总的数组下标偏移
DWORD GetActionIdOffset();//获取动作分类ID偏移
DWORD GetActionNameOffset();//获取动作名字偏移
int GetMaxActionNum();//获取最大动作个数

ACTION actionList[12];//动作列表
const int MaxActionNum = 12;//最大动作个数
DWORD CateOffset = 0x08; //分类编号偏移 玩家为31 怪物为2e 技能为56
DWORD AllArraySubOffset = 0x0c; //总的数组下标偏移
DWORD ActionIdOffset = 0x4c; //动作分类ID偏移
DWORD ActionNameOffset = 0x5c; //动作名字偏移
};


具体代码看源码:

辅助制作第十课:分析动作数组源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC c++ 辅助
相关文章推荐