武林外传寻路call
// 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相关推荐
- 【Android】基于A星寻路算法的简单迷宫应用
简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...
- 在A*寻路中使用二叉堆
在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序: 这一篇文章,是"A* Pathfinding ...
- 03、NavMesh--导航网格寻路
一.概述: NavMesh是3D游戏世界中用于实现动态物体自动寻路的一种技术,他将游戏场景中复杂的结构组织关系简化为带有一定信息的网格, 进而在这些网格的基础上通过一些列的计算来实现自动寻路. 二.简 ...
- A*寻路算法的探寻与改良(三)
A*寻路算法的探寻与改良(三) by:田宇轩 第三分:这部分内容基于树.查找算法等对A*算法的执行效率进行了改良,想了解细 ...
- 从 NavMesh 网格寻路回归到 Grid 网格寻路。
上一个项目的寻路方案是客户端和服务器都采用了 NavMesh 作为解决方案,当时的那几篇文章(一,二,三)是很多网友留言和后台发消息询问最多的,看来这个方案有着广泛的需求.但因为是商业项目,我无法贴出 ...
- cocos2d-x的A*寻路
如果你还不熟悉A*寻路,请先看下这篇文章http://blog.csdn.net/dssdss123/article/details/11494065 一.先介绍几个函数和结构: 1.virtual ...
- 关于A*寻路算法的认识
最近要参加学校的APP比赛,我们组做的是一个3D迷宫的小APP,我负责的是迷宫的生成与寻路. 寻路算法选择的是A*寻路算法,具体参考的是下面的这篇博客. 本文主要是谈谈自己对A*算法的理解,具体细节, ...
- 开发ing经验关于游戏中寻路
开发ing经验关于游戏中寻路 任何的游戏几乎都需要寻路吸,最常用的则是A星寻路,这个算法在网络上可以找到很多的版本,然而,今天则是一起探讨寻路算法的问题. 在我们当前的正在开发的项目中,使用的就是A* ...
- 武林外传辅助工具详细制作过程[第二篇:查看数据]
1.我们可以用CE打开武林外传.运行CE,按照下图的次序打开(...\武林外传\element\elementclient.exe) 2.游戏启动后,别忘了选择游戏窗口. 3.这是游戏中人物的数据. ...
最新文章
- Android TextView
- head中meta name=viewport content=width=device-width,initical-scale=1的作用
- mac mysql启动问题
- php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST
- mysql range代表什么意思_MySQL数据表range分区例子
- 怎么从某个div跳转到另一个_另一个伊甸伊丝卡怎么样 伊丝卡使用攻略_
- CodeSmith实用技巧(五):利用继承生成可变化的代码
- 字符大小端aix linux,Go交叉编译的那些事
- hdu 1027 输出第m个全排列(next_permutation)
- Linux服务器查看日志方法小结
- 如何监控主从故障是否正常?MySQL数据库
- 16.4 多模态情感识别
- 统计分析干货 | 秩和检验及其两两比较的思路与解析
- win10读取linux硬盘,win10怎么读取lxext4格式硬盘
- Unity-WebGL遇到的各种坑(一)
- YGG Pilipinas: 台风奥黛特救灾工作更新
- 「经济/商学/理财」简说
- hp服务器改系统启动项,hp笔记本如何进入bios修改启动项
- oracle general ledger,处理 Oracle General Ledger 调整期间
- java程序如何解代数方程_基于代数方程库Algebra.js解二元一次方程功能示例
热门文章
- 后台管理界面的简单布局
- linux自动拨号脚本,arm中实现pppd连接GPRS上网的相关笔记,含GPRS自动拨号脚本(真正的实时监控,断线自动重拨)...
- 缓冲区溢出分析第06课:W32Dasm缓冲区溢出分析
- 中专生计算机专业周记,计算机应用专业中专毕业生自荐信
- Part 4 描述性统计分析(占比 10%)——上
- 蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现
- 程序,进程,线程的区别和联系
- 短视频特效“耍花招”:线上投篮、摆摊,让画中人摇摆,浅谈腾讯微视的AR基建...
- 全兼容增强版zc706单板照片
- 职场中生存的头等大事:保持尊重