追逐自己的梦想----------辅助制作第十课:分析动作数组以及攻击捡物品等功能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; //动作名字偏移
};
具体代码看源码:
辅助制作第十课:分析动作数组源码下载
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; //动作名字偏移
};
具体代码看源码:
辅助制作第十课:分析动作数组源码下载
相关文章推荐
- 追逐自己的梦想----------辅助制作第五课:分析并测试物品使用CALL
- 追逐自己的梦想----------辅助制作第六课:背包数组分析和根据物品名称来使用物品
- 追逐自己的梦想----------辅助制作第三十四课:向仓库存入N个物品对象函数封装实现
- 追逐自己的梦想----------辅助制作第十二课:选怪功能封装
- 追逐自己的梦想----------辅助制作第三十课:NPC对话更正以及封装查找NPC对象函数
- 追逐自己的梦想----------辅助制作第三十一课:向仓库存入N个物品对象分析
- 追逐自己的梦想----------辅助制作第九课:分析怪物列表及怪物属性的封装等
- 追逐自己的梦想----------辅助制作第三十二课:向仓库存入N个物品对象分析缓冲区解密
- 追逐自己的梦想----------辅助制作第二十五课:存仓库call分析
- 追逐自己的梦想----------辅助制作第三十八课:物品出售的分析和实现
- 追逐自己的梦想----------辅助制作第二十一课:分析技能自动修炼call
- 追逐自己的梦想----------辅助制作第三十五课:从仓库取出N个物品分析与实现
- 追逐自己的梦想----------辅助制作第十一课:选怪功能分析
- 追逐自己的梦想----------辅助制作第二十九课:分析打开NPC后功能打开
- 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
- 追逐自己的梦想----------辅助制作第二十八课:打开系统NPC CALL分析
- 追逐自己的梦想----------辅助制作第三十六课:物品购买分析
- 追逐自己的梦想----------辅助制作第三十七课:物品购买实现
- 追逐自己的梦想----------辅助制作第二十七课:身上装备更换的分析与实现
- 追逐自己的梦想----------辅助制作第七课:封装调试函数OutputDebugString(),使其可调试任意参数个数