好久之前写的天龙八部辅助思路分享
2016-04-30 14:32
134 查看
关于某网游的二叉树分析和luaHook实现
最近在研究一个网游,里面用儿叉树的结构,至于怎么找到这颗二叉树的,网上教程这么多,我就不说了,重点讲下这颗二叉树。
![](https://img-blog.csdn.net/20160430143404602)
其中1是左子树执行的流程,2是右子树执行的流程。
其实这个图是个排序二叉树,这里儿叉树跟edi(经分析,这个edi是某怪物ID)做比较,类似二分搜索这样的。
自己画了个图,方便自己理解。
![](https://img-blog.csdn.net/20160430143455181)
void CGameDlg::TLBianLi(ULONG CurAddr){
//bl=[根+0x15] bl为0时进入遍历
ULONG RightAddr,LeftAddr,tempAddr;
float X,Y;
BYTE root_15;
char GuaiWustr[16]="null";
_asm
{
push eax
mov eax,CurAddr
add eax,0x15
mov eax,[eax]
mov root_15,al
pop eax
}
if(root_15==0){
//当前结点
//[[[[eax+0x10]+0x1EC]+0x4]+0x34]是怪物名 eax =CurAddr
//[[[[[9CD654]+0x70]+0x1EC]+0x4]+000024A0]血
ReadProcessMemory(hp,(LPVOID)((DWORD)CurAddr+0x10),&tempAddr,4,NULL);
//[eax+0x10]+48
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x48),&X,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x50),&Y,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x01EC),&tempAddr,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x04),&tempAddr,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x34),&GuaiWustr,10,NULL);
GuaiWustr_CStr=(char*)GuaiWustr;
//[CurAddr+0xc]是GuaiWuID
ReadProcessMemory(hp,(PVOID)((DWORD)CurAddr+0xc),&GuaiWuID,4,NULL);
str.Format(L"%8x %8s %8.2f %8.2f",GuaiWuID,GuaiWustr_CStr,X,Y);
m_listGuaiWu.AddString(str);
//左树mov 根,[根]
_asm
{
push eax
mov eax,CurAddr
mov eax,[eax]
mov LeftAddr,eax
pop eax
}
TLBianLi(LeftAddr);
//右树mov 根,[根+0x8]
_asm
{
push eax
mov eax,CurAddr
add eax,0x8
mov eax,[eax]
mov RightAddr,eax
pop eax
}
TLBianLi(RightAddr);
}
}
![](https://img-blog.csdn.net/20160430143626182)
现在再来说游戏如果用了lua我们怎么调用怎么找到关键的lua
还是那样,要先找到游戏中的某lua调用的地方,网上教程这么多我就不说怎么找了,说说怎么实现相关的luaHook吧。
=============lua_call=============
007251E1 |. 8B0D 884F3401 mov ecx,dword ptr ds:[0x1344F88] ; lua
007251E7 |. 8B11 mov edx,dword ptr ds:[ecx]
007251E9 |. FF52 3C call dword ptr ds:[edx+0x3C]
007251EC |. 8B00 mov eax,dword ptr ds:[eax]
007251EE |. 53 push ebx
007251EF |. 50 push eax
007251F0 |. FF15 5CE38400 call dword ptr ds:[0x84E35C] ; luaplus.lua_dostring
007251F6 |. 8B45 E4 mov eax,[local.7]
007251F9 |. 83C4 08 add esp,0x8
=====================================
hook的方法就是inline hook那样了,其实也没什么好说的,会了inline hook,其实是很简单的void __declspec(naked) Mylua(){
//执行自己的代码
_asm
{
pushad
mov lua_str,ebx//保存lua的字符串 其中ebx保存了lua的字符串
}
//lua_Mycode();
_asm popad
//跳回原来的地方
4000
_asm
{
mov ecx,dword ptr ds:[0x1344F88]
jmp HookLuaBackAddr //这个地址是HookLuaAddr+6 0x007251E7
}
}
//保存原来的数据
BYTE oldGameCode[6]={0x8B,0x0D,0x88,0x4F,0x34,0x01};
void lua_hook(){
//保存原来的数据
//修改代码 E9 (DWORD)&Mylua-HookLuaAddr -5 5个字节 jmp Mylua
ULONG jmpAddr =(ULONG)Mylua-HookLuaAddr -0x5;
_asm
{
push eax
push ebx
mov eax,HookLuaAddr
mov byte ptr ds:[eax],0xE9
mov ebx,jmpAddr
mov dword ptr ds:[eax+1],ebx
pop ebx
pop eax
}
//AfxMessageBox(L"hook");
}
void lua_unHook(){
//恢复所在位置的代码
_asm
{
push eax
push ebx
push ecx
mov eax,HookLuaAddr
lea ebx,oldGameCode
mov ecx,[ebx]
mov word ptr ds:[eax],cx
mov ecx,[ebx+2]
mov dword ptr ds:[eax+2],ecx
//mov HookLuaAddr[0...5],oldGameCode[0...5]
pop ecx
pop ebx
pop eax
}
}
第一次在csdn写博客 试试 大家随便 看看 话说怎么传压缩包
关于某网游的二叉树分析和luaHook实现
最近在研究一个网游,里面用儿叉树的结构,至于怎么找到这颗二叉树的,网上教程这么多,我就不说了,重点讲下这颗二叉树。
其中1是左子树执行的流程,2是右子树执行的流程。
其实这个图是个排序二叉树,这里儿叉树跟edi(经分析,这个edi是某怪物ID)做比较,类似二分搜索这样的。
自己画了个图,方便自己理解。
void CGameDlg::TLBianLi(ULONG CurAddr){
//bl=[根+0x15] bl为0时进入遍历
ULONG RightAddr,LeftAddr,tempAddr;
float X,Y;
BYTE root_15;
char GuaiWustr[16]="null";
_asm
{
push eax
mov eax,CurAddr
add eax,0x15
mov eax,[eax]
mov root_15,al
pop eax
}
if(root_15==0){
//当前结点
//[[[[eax+0x10]+0x1EC]+0x4]+0x34]是怪物名 eax =CurAddr
//[[[[[9CD654]+0x70]+0x1EC]+0x4]+000024A0]血
ReadProcessMemory(hp,(LPVOID)((DWORD)CurAddr+0x10),&tempAddr,4,NULL);
//[eax+0x10]+48
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x48),&X,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x50),&Y,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x01EC),&tempAddr,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x04),&tempAddr,4,NULL);
ReadProcessMemory(hp,(LPVOID)((DWORD)tempAddr+0x34),&GuaiWustr,10,NULL);
GuaiWustr_CStr=(char*)GuaiWustr;
//[CurAddr+0xc]是GuaiWuID
ReadProcessMemory(hp,(PVOID)((DWORD)CurAddr+0xc),&GuaiWuID,4,NULL);
str.Format(L"%8x %8s %8.2f %8.2f",GuaiWuID,GuaiWustr_CStr,X,Y);
m_listGuaiWu.AddString(str);
//左树mov 根,[根]
_asm
{
push eax
mov eax,CurAddr
mov eax,[eax]
mov LeftAddr,eax
pop eax
}
TLBianLi(LeftAddr);
//右树mov 根,[根+0x8]
_asm
{
push eax
mov eax,CurAddr
add eax,0x8
mov eax,[eax]
mov RightAddr,eax
pop eax
}
TLBianLi(RightAddr);
}
}
现在再来说游戏如果用了lua我们怎么调用怎么找到关键的lua
还是那样,要先找到游戏中的某lua调用的地方,网上教程这么多我就不说怎么找了,说说怎么实现相关的luaHook吧。
=============lua_call=============
007251E1 |. 8B0D 884F3401 mov ecx,dword ptr ds:[0x1344F88] ; lua
007251E7 |. 8B11 mov edx,dword ptr ds:[ecx]
007251E9 |. FF52 3C call dword ptr ds:[edx+0x3C]
007251EC |. 8B00 mov eax,dword ptr ds:[eax]
007251EE |. 53 push ebx
007251EF |. 50 push eax
007251F0 |. FF15 5CE38400 call dword ptr ds:[0x84E35C] ; luaplus.lua_dostring
007251F6 |. 8B45 E4 mov eax,[local.7]
007251F9 |. 83C4 08 add esp,0x8
=====================================
hook的方法就是inline hook那样了,其实也没什么好说的,会了inline hook,其实是很简单的void __declspec(naked) Mylua(){
//执行自己的代码
_asm
{
pushad
mov lua_str,ebx//保存lua的字符串 其中ebx保存了lua的字符串
}
//lua_Mycode();
_asm popad
//跳回原来的地方
4000
_asm
{
mov ecx,dword ptr ds:[0x1344F88]
jmp HookLuaBackAddr //这个地址是HookLuaAddr+6 0x007251E7
}
}
//保存原来的数据
BYTE oldGameCode[6]={0x8B,0x0D,0x88,0x4F,0x34,0x01};
void lua_hook(){
//保存原来的数据
//修改代码 E9 (DWORD)&Mylua-HookLuaAddr -5 5个字节 jmp Mylua
ULONG jmpAddr =(ULONG)Mylua-HookLuaAddr -0x5;
_asm
{
push eax
push ebx
mov eax,HookLuaAddr
mov byte ptr ds:[eax],0xE9
mov ebx,jmpAddr
mov dword ptr ds:[eax+1],ebx
pop ebx
pop eax
}
//AfxMessageBox(L"hook");
}
void lua_unHook(){
//恢复所在位置的代码
_asm
{
push eax
push ebx
push ecx
mov eax,HookLuaAddr
lea ebx,oldGameCode
mov ecx,[ebx]
mov word ptr ds:[eax],cx
mov ecx,[ebx+2]
mov dword ptr ds:[eax+2],ecx
//mov HookLuaAddr[0...5],oldGameCode[0...5]
pop ecx
pop ebx
pop eax
}
}
第一次在csdn写博客 试试 大家随便 看看 话说怎么传压缩包
相关文章推荐
- JAVA运算符
- JAVA关键字大全
- 滴滴实习总结
- PHP开发常见的页面跳转技术
- android常用设计模式
- 真的无语了。。。。联想笔记本这设计。。。。
- 《优先级流量调度算法研究》毕业设计工作日志
- 新手学Struts(二)----Struts2工作机制
- PHP导出EXCEL
- Jetty 的工作原理以及与 Tomcat 的比较
- CSS控制鼠标形状
- 《机电传动控制》大作业-机械大楼电梯控制项目(阶段1)
- 设备像素比devicePixelRatio简单介绍
- 三大框架
- 进行以上Java编译的时候,出现unmappable character for encoding GBK。
- sql行转列
- 【VS开发】关于线程安全一些细节体会
- 基于CSerialPort修改类的串口调试助手源代码(支持中文、自动保存等)
- HDU-4493 Tutor (模拟)
- B - The Suspects——HOJ