// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include <atlstr.h>  #pragma data_seg(".Share")
HWND g_hMainWnd=NULL;//主窗口句柄;
HANDLE  gameHandle=NULL;//游戏进程句柄HINSTANCE hInstDll=NULL;//本dll实例句柄;
DWORD g_dwHookPid=0;//要HOOK的进程的PID
BOOL g_bIsFirstLoad=TRUE;//判断是否是第一次加载本dll
FLOAT destCoordinate[3]={202,43,-374};//目的坐标  别弄错类型  double是八个字节  弄错类型 跑的地点是错误的
FLOAT destDirection[3] = {0,1,0};//方向可以随便写 主要是调用的第三个call 判断方向上有没有障碍物
DWORD ecxBaseAddr = 0x00ce1118;//第一个call的ecx隐性参数的基地址
DWORD ecxAddr = 0;//存放第一个call隐性参数ecx#pragma data_seg()
#pragma comment(linker, "/section:.Share,rws")  BOOL OpenProc()
{g_hMainWnd=::FindWindow(L"QElementClient Window",L"Element Client");  if(!g_hMainWnd){MessageBox(0,L"找不到主窗口句柄 ",0,0);return 0;}GetWindowThreadProcessId(g_hMainWnd,&g_dwHookPid);  //获取进程IDif(!g_dwHookPid){MessageBox(0,L"找不到游戏id ",0,0);return 0;}gameHandle=::OpenProcess(PROCESS_ALL_ACCESS,false,g_dwHookPid);    //打开进程 失败的话 就要调用EnableDebugPrivilege 修改进程权限if(!gameHandle){    //如果进程ID等于0    退出CString str;int err = GetLastError();str.Format(L"找不到游戏句柄 错误原因%d",err);MessageBox(0,str,0,0);PostQuitMessage(0);return 0;}return 1;
}
BOOL EnableDebugPrivilege(){HANDLE hToken;BOOL fOk=FALSE;if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))//获得进程的调试的令牌句柄,就是个类似于结构的对象,负责管理系统进程,安全进程等的权限,第二个参数是获得哪种类型的句柄 第三个是返回地址{TOKEN_PRIVILEGES tp;//AdjustTokenPrivileges必备参数tp.PrivilegeCount=1;//第一个参数是数组成员数量 第二个参数书一个数组 里面每个都是一个结构 结构成员就是 luid(类似于uid 数字和对象之间的映射 通过数字可以找到对象 通过对象可以找到数字)和对应的操作类型LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);//只有调用他才能迅速找到操作类型的对应的luid,第一个参数是操作系统 null代表当前的系统 第二个是操作类型 第三个是返回地址tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//吧数组成员的结构的第二个成员设置为puid对应的操作类型为调试类型AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);//第一个参数是令牌句柄 第二个是ture就会去除现有的的特权 第三个是要调整的tp 第四个是大小 第五个是保存之前的tp  第六个是返回的大小fOk=(GetLastError()==ERROR_SUCCESS);CloseHandle(hToken);}return fOk;
}
BOOL ReadProcess()
{DWORD buf = 0;ReadProcessMemory(gameHandle,(LPVOID)ecxBaseAddr,&buf,4,NULL); //第二个参数不能是&ecxBaseAddrbuf+=0x1c;ReadProcessMemory(gameHandle,(LPVOID)buf,&buf,4,NULL);buf+=0x28;ReadProcessMemory(gameHandle,(LPVOID)buf,&buf,4,NULL);buf+=0x1548;ReadProcessMemory(gameHandle,(LPVOID)buf,&buf,4,NULL);ecxAddr = buf;if(!buf)return 0;return 1;
}VOID ExcuteGameCall()
{__asm{push 0x1;mov ecx,ecxAddr;mov edx,0x00493060;call edx;//返回一个结构eaxmov esi,eax;lea eax,destCoordinate;push eax;push 0x0;mov ecx,esi;mov edx,0x00497FB0;call edx;//吧目的坐标存入eaxlea ecx,destDirection;lea edx,destCoordinate;push ecx;//方向数组push edx;//坐标数组mov ecx,esi;mov edx,0x00498100;call edx;//判断方向是否有障碍物 0或者1 写入eaxmov ecx,ecxAddr;push 0x0;push 0x1;push esi;push 0x1;mov edx,0x00493550;//寻路call edx;}
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{hInstDll=GetModuleHandle(0);//这行不能少  g_bIsFirstLoad = FALSE;  MessageBox(NULL,L"注入成功",L"信息",MB_ICONINFORMATION); BOOL enable = EnableDebugPrivilege();if(!enable){MessageBox(0,L"不能改变权限 ",0,0);return 0;}if(!OpenProc()){MessageBox(NULL,L"打开游戏失败",L"信息",MB_ICONINFORMATION);break;}if(!ReadProcess()){MessageBox(NULL,L"读取游戏失败",L"信息",MB_ICONINFORMATION);break;}ExcuteGameCall();break;}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

武林外传寻路call相关推荐

  1. 【Android】基于A星寻路算法的简单迷宫应用

    简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...

  2. 在A*寻路中使用二叉堆

    在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序:     这一篇文章,是"A* Pathfinding ...

  3. 03、NavMesh--导航网格寻路

    一.概述: NavMesh是3D游戏世界中用于实现动态物体自动寻路的一种技术,他将游戏场景中复杂的结构组织关系简化为带有一定信息的网格, 进而在这些网格的基础上通过一些列的计算来实现自动寻路. 二.简 ...

  4. A*寻路算法的探寻与改良(三)

    A*寻路算法的探寻与改良(三) by:田宇轩                                        第三分:这部分内容基于树.查找算法等对A*算法的执行效率进行了改良,想了解细 ...

  5. 从 NavMesh 网格寻路回归到 Grid 网格寻路。

    上一个项目的寻路方案是客户端和服务器都采用了 NavMesh 作为解决方案,当时的那几篇文章(一,二,三)是很多网友留言和后台发消息询问最多的,看来这个方案有着广泛的需求.但因为是商业项目,我无法贴出 ...

  6. cocos2d-x的A*寻路

    如果你还不熟悉A*寻路,请先看下这篇文章http://blog.csdn.net/dssdss123/article/details/11494065 一.先介绍几个函数和结构: 1.virtual ...

  7. 关于A*寻路算法的认识

    最近要参加学校的APP比赛,我们组做的是一个3D迷宫的小APP,我负责的是迷宫的生成与寻路. 寻路算法选择的是A*寻路算法,具体参考的是下面的这篇博客. 本文主要是谈谈自己对A*算法的理解,具体细节, ...

  8. 开发ing经验关于游戏中寻路

    开发ing经验关于游戏中寻路 任何的游戏几乎都需要寻路吸,最常用的则是A星寻路,这个算法在网络上可以找到很多的版本,然而,今天则是一起探讨寻路算法的问题. 在我们当前的正在开发的项目中,使用的就是A* ...

  9. 武林外传辅助工具详细制作过程[第二篇:查看数据]

    1.我们可以用CE打开武林外传.运行CE,按照下图的次序打开(...\武林外传\element\elementclient.exe) 2.游戏启动后,别忘了选择游戏窗口. 3.这是游戏中人物的数据. ...

最新文章

  1. Android TextView
  2. head中meta name=viewport content=width=device-width,initical-scale=1的作用
  3. mac mysql启动问题
  4. php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST
  5. mysql range代表什么意思_MySQL数据表range分区例子
  6. 怎么从某个div跳转到另一个_另一个伊甸伊丝卡怎么样 伊丝卡使用攻略_
  7. CodeSmith实用技巧(五):利用继承生成可变化的代码
  8. 字符大小端aix linux,Go交叉编译的那些事
  9. hdu 1027 输出第m个全排列(next_permutation)
  10. Linux服务器查看日志方法小结
  11. 如何监控主从故障是否正常?MySQL数据库
  12. 16.4 多模态情感识别
  13. 统计分析干货 | 秩和检验及其两两比较的思路与解析
  14. win10读取linux硬盘,win10怎么读取lxext4格式硬盘
  15. Unity-WebGL遇到的各种坑(一)
  16. YGG Pilipinas: 台风奥黛特救灾工作更新
  17. 「经济/商学/理财」简说
  18. hp服务器改系统启动项,hp笔记本如何进入bios修改启动项
  19. oracle general ledger,处理 Oracle General Ledger 调整期间
  20. java程序如何解代数方程_基于代数方程库Algebra.js解二元一次方程功能示例

热门文章

  1. 后台管理界面的简单布局
  2. linux自动拨号脚本,arm中实现pppd连接GPRS上网的相关笔记,含GPRS自动拨号脚本(真正的实时监控,断线自动重拨)...
  3. 缓冲区溢出分析第06课:W32Dasm缓冲区溢出分析
  4. 中专生计算机专业周记,计算机应用专业中专毕业生自荐信
  5. Part 4 描述性统计分析(占比 10%)——上
  6. 蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现
  7. 程序,进程,线程的区别和联系
  8. 短视频特效“耍花招”:线上投篮、摆摊,让画中人摇摆,浅谈腾讯微视的AR基建...
  9. 全兼容增强版zc706单板照片
  10. 职场中生存的头等大事:保持尊重