申请会员ID:xjing
1、申 请 I D:xjing2、个人邮箱:416556398@qq.com
3、原创技术文章:http://bbs.pediy.com/showthread.php?t=196483
最近在研究一个网游,里面用儿叉树的结构,至于怎么找到这颗二叉树的,网上教程这么多,我就不说了,重点讲下这颗二叉树。
http://bbs.pediy.com/attachment.php?attachmentid=95156&thumb=1&d=1420944549
其中1是左子树执行的流程,2是右子树执行的流程。
其实这个图是个排序二叉树,这里儿叉树跟edi(经分析,这个edi是某怪物ID)做比较,类似二分搜索这样的。
自己画了个图,方便自己理解。
http://bbs.pediy.com/attachment.php?attachmentid=95157&thumb=1&d=1420944967
引用:
void CGameDlg::TLBianLi(ULONG CurAddr){
//bl=[根+0x15] bl为0时进入遍历
ULONG RightAddr,LeftAddr,tempAddr;
float X,Y;
BYTE root_15;
char GuaiWustr="null";
_asm
{
push eax
mov eax,CurAddr
add eax,0x15
mov eax,
mov root_15,al
pop eax
}
if(root_15==0){
//当前结点
//[[[+0x1EC]+0x4]+0x34]是怪物名 eax =CurAddr
//[[[[+0x70]+0x1EC]+0x4]+000024A0]血
ReadProcessMemory(hp,(LPVOID)((DWORD)CurAddr+0x10),&tempAddr,4,NULL);
//+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;
//是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,
mov LeftAddr,eax
pop eax
}
TLBianLi(LeftAddr);
//右树mov 根,[根+0x8]
_asm
{
push eax
mov eax,CurAddr
add eax,0x8
mov eax,
mov RightAddr,eax
pop eax
}
TLBianLi(RightAddr);
}
}
http://bbs.pediy.com/attachment.php?attachmentid=95158&thumb=1&d=1420945354
现在再来说游戏如果用了lua我们怎么调用怎么找到关键的lua
还是那样,要先找到游戏中的某lua调用的地方,网上教程这么多我就不说怎么找了,说说怎么实现相关的luaHook吧。
=============lua_call=============
007251E1|.8B0D 884F3401 mov ecx,dword ptr ds: ;lua
007251E7|.8B11 mov edx,dword ptr ds:
007251E9|.FF52 3C call dword ptr ds:
007251EC|.8B00 mov eax,dword ptr ds:
007251EE|.53 push ebx
007251EF|.50 push eax
007251F0|.FF15 5CE38400 call dword ptr ds: ;luaplus.lua_dostring
007251F6|.8B45 E4 mov eax,
007251F9|.83C4 08 add esp,0x8
=====================================
hook的方法就是inline hook那样了,其实也没什么好说的,会了inline hook,其实是很简单的
代码:
void __declspec(naked) Mylua(){//执行自己的代码_asm{pushadmov lua_str,ebx//保存lua的字符串 其中ebx保存了lua的字符串}//lua_Mycode();_asm popad//跳回原来的地方_asm{mov ecx,dword ptr ds:jmp HookLuaBackAddr //这个地址是HookLuaAddr+6 0x007251E7}}//保存原来的数据BYTE oldGameCode={0x8B,0x0D,0x88,0x4F,0x34,0x01};void lua_hook(){//保存原来的数据//修改代码 E9 (DWORD)&Mylua-HookLuaAddr -55个字节 jmp MyluaULONG jmpAddr =(ULONG)Mylua-HookLuaAddr -0x5;_asm{push eaxpush ebxmov eax,HookLuaAddrmov byte ptr ds:,0xE9mov ebx,jmpAddrmov dword ptr ds:,ebxpop ebxpop eax}//AfxMessageBox(L"hook");}voidlua_unHook(){//恢复所在位置的代码_asm{push eaxpush ebxpush ecxmov eax,HookLuaAddrlea ebx,oldGameCodemov ecx,mov word ptr ds:,cxmov ecx,mov dword ptr ds:,ecx//mov HookLuaAddr,oldGameCodepop ecxpop ebxpop eax}}
希望申请到吧 看雪帖子 虽然没有精 但是还是很用心去写的。 本人现专心研究安卓逆向,在window下没时间研究,所以帖子也就只有一个了,但技术还是可以有的。
虽然没有获得精华,但看出来是用心写的,代码可以用代码框会好看一些,请在看雪论坛给hmilywen发短消息确认下是本人。 {:1_906:}天龙八部,还是07年玩的,好怀念 看雪kx币不够 不能悄悄话发送悄悄话要100kx。。。。。 这图应该能证明是本人
页:
[1]