吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2934|回复: 3
收起左侧

[会员申请] 申请会员ID:xjing

[复制链接]
吾爱游客  发表于 2015-7-31 16:34
1、申 请 I D:xjing
2、个人邮箱:416556398@qq.com

3、原创技术文章:http://bbs.pediy.com/showthread.php?t=196483

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

其中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  }  }
希望申请到吧 看雪帖子 虽然没有精 但是还是很用心去写的。 本人现专心研究安卓逆向,在window下没时间研究,所以帖子也就只有一个了,但技术还是可以有的。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2015-7-31 17:04
虽然没有获得精华,但看出来是用心写的,代码可以用代码框会好看一些,请在看雪论坛给hmilywen发短消息确认下是本人。
qtfreet00 发表于 2015-7-31 17:18
吾爱游客  发表于 2015-8-1 19:53
看雪kx币不够 不能悄悄话  发送悄悄话  要100kx。。。。。 这图应该能证明是本人 无标题.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表