首页
社区
课程
招聘
关于某网游的二叉树分析和luaHook实现
发表于: 2015-1-11 11:12 17727

关于某网游的二叉树分析和luaHook实现

2015-1-11 11:12
17727
最近在研究一个网游,里面用儿叉树的结构,至于怎么找到这颗二叉树的,网上教程这么多,我就不说了,重点讲下这颗二叉树。

其中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
	//跳回原来的地方
	_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
	}
	
}

技术含量不高 小菜一枚 高手不要喷,绝对原创,还有这只是对游戏的研究,没有意思要破坏游戏。给个致谢就好了。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
→_→果断不懂
2015-1-11 11:25
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
前排支持,写出来就是最好的
2015-1-11 11:42
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很古老的东西了,
2015-1-11 13:58
0
雪    币: 27
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
原来这就是二叉树的代码呀。见识了。十分感谢。
2015-1-11 16:46
0
雪    币: 27
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可不可以把二叉树的特征写出来呀?
2015-1-11 16:48
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
更应该是排序二叉树 左树枝的值比根小,右树枝比根大  上面那个图是排序二叉树的查找
2015-1-11 19:16
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
向楼主学习了。。。
2015-1-12 13:58
0
雪    币: 192
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
乔峰 段誉 虚竹 行行
2015-1-12 14:00
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你好请问 你这个 "lua_str" 变量的 完整定义能贴出来吗?  我用了你的代码出错,我不知道 是不是定义有问题.
错误:                LUA:SelectServer/SelectServer.lua
Access violation

@:         D:\XTLBB\Bin\MSVCR71.dll
Operate:   Read
Address:   0xCCCCCCCC
LastError: 0x00000000
2015-6-3 19:09
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
想不到还有人翻这贴,程序是mfc写的, lua_str是string类就是了,lua_str保存的是lua语句而已
如果你直接是C的话 那就
string lua_str;
print(“%s”,lua_str);
就行了
2015-6-5 08:42
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2017-4-11 20:41
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
用易怎么写HOOK  lua
2017-4-11 20:44
0
雪    币: 48
活跃值: (1104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看看,  顺带学习
2017-8-15 22:45
0
游客
登录 | 注册 方可回帖
返回