郁金香外挂hook以后如何写内存
『壹』 如何模拟debug写内存地址的值
debug是16位dos上的调式器,如果你用的是windows,你必须创建基于VDM(DOS虚拟机)的exe程序,使用x86的虚拟8086来运行程序,此时的内存地址是0040:0017形式的。你可以给指针赋硬值来访问所有内存空间。
例:
char far * pvf = 0x40017;
*pvf = (你所要赋的值 );
如果你编写32windows程序,内存地址是32位的,例如0x0045C320形式。x86机器上使用实模式,开启分页机制。用指针只能访问本进程的地址空间,访问任意进程地址空间可以用WriteProcessMemory函数
『贰』 不用循环写内存的方式想锁定一个程序的一个内存地址里面的值。请问有什么方法hook技术可以胜任吗
include <iostream>
#include <stdio.h>
int jc(int m){
if(m!=1) return m*jc(m-1);
else return 1;
}
int c(int m,int n){
if(m>=n) return jc(m)/(jc(n)*jc(m-n));
}
int main(void){
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",c(m,n));
return 0;
}
『叁』 c++如何用hook禁用鼠标如何让编写
一、 介绍
本文将讨论在.NET应用程序中全局系统钩子的使用。为此,我开发了一个可重用的类库并创建一个相应的示例程序(见下图)。
你可能注意到另外的关于使用系统钩子的文章。本文与之类似但是有重要的差别。这篇文章将讨论在.NET中使用全局系统钩子,而其它文章仅讨论本地系统钩子。这些思想是类似的,但是实现要求是不同的。
二、 背景
如果你对Windows系统钩子的概念不熟悉,让我作一下简短的描述:
・一个系统钩子允许你插入一个回调函数-它拦截某些Windows消息(例如,鼠标相联系的消息)。
・一个本地系统钩子是一个系统钩子-它仅在指定的消息由一个单一线程处理时被调用。
・一个全局系统钩子是一个系统钩子-它当指定的消息被任何应用程序在整个系统上所处理时被调用。
已有若干好文章来介绍系统钩子概念。在此,不是为了重新收集这些介绍性的信息,我只是简单地请读者参考下面有关系统钩子的一些背景资料文章。如果你对系统钩子概念很熟悉,那么你能够从本文中得到你能够得到的任何东西。
・关于MSDN库中的钩子知识。
・Dino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。
・Don Kackman的《在C#中应用钩子》。
本文中我们要讨论的是扩展这个信息来创建一个全局系统钩子-它能被.NET类所使用。我们将用C#和一个DLL和非托管C++来开发一个类库-它们一起将完成这个目标。
三、 使用代码
在我们深入开发这个库之前,让我们快速看一下我们的目标。在本文中,我们将开发一个类库-它安装全局系统钩子并且暴露这些由钩子处理的事件,作为我们的钩子类的一个.NET事件。为了说明这个系统钩子类的用法,我们将在一个用C#编写的Windows表单应用程序中创建一个鼠标事件钩子和一个键盘事件钩子。
这些类库能用于创建任何类型的系统钩子,其中有两个预编译的钩子-MouseHook和KeyboardHook。我们也已经包含了这些类的特定版本,分别称为MouseHookExt和KeyboardHookExt。根据这些类所设置的模型,你能容易构建系统钩子-针对Win32 API中任何15种钩子事件类型中的任何一种。另外,这个完整的类库中还有一个编译的HTML帮助文件-它把这些类归档化。请确信你看了这个帮助文件-如果你决定在你的应用程序中使用这个库的话。
MouseHook类的用法和生命周期相当简单。首先,我们创建MouseHook类的一个实例。
mouseHook = new MouseHook();//mouseHook是一个成员变量
接下来,我们把MouseEvent事件绑定到一个类层次的方法上。
mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent);
// ...
private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){
string msg =string.Format("鼠标事件::(,).",mEvent.ToString(),x,y);
AddText(msg);//增加消息到文本框
}
为开始收到鼠标事件,简单地安装下面的钩子即可。
mouseHook.InstallHook();
为停止接收事件,只需简单地卸载这个钩子。
mouseHook.UninstallHook();
你也可以调用Dispose来卸载这个钩子。
在你的应用程序退出时,卸载这个钩子是很重要的。让系统钩子一直安装着将减慢系统中的所有的应用程序的消息处理。它甚至能够使一个或多个进程变得很不稳定。因此,请确保在你使用完钩子时一定要移去你的系统钩子。我们确定在我们的示例应用程序会移去该系统钩子-通过在Form的Dispose方法中添加一个Dispose调用。
protected override void Dispose(bool disposing) {
if (disposing) {
if (mouseHook != null) {
mouseHook.Dispose();
mouseHook = null;
}
// ...
}
}
使用该类库的情况就是如此。该类库中有两个系统钩子类并且相当容易扩充。
四、 构建库
这个库共有两个主要组件。第一部分是一个C#类库-你可以直接使用于你的应用程序中。该类库,反过来,在内部使用一个非托管的C++ DLL来直接管理系统钩子。我们将首先讨论开发该C++部分。接下来,我们将讨论怎么在C#中使用这个库来构建一个通用的钩子类。就象我们讨论C++/C#交互一样,我们将特别注意C++方法和数据类型是怎样映射到.NET方法和数据类型的。
你可能想知道为什么我们需要两个库,特别是一个非托管的C++ DLL。你还可能注意到在本文的背景一节中提到的两篇参考文章,其中并没有使用任何非托管的代码。为此,我的回答是,"对!这正是我写这篇文章的原因"。当你思考系统钩子是怎样实际地实现它们的功能时,我们需要非托管的代码是十分重要的。为了使一个全局的系统钩子能够工作,Windows把你的DLL插入到每个正在运行的进程的进程空间中。既然大多数进程不是.NET进程,所以,它们不能直接执行.NET装配集。我们需要一种非托管的代码代理- Windows可以把它插入到所有将要被钩住的进程中。
首先是提供一种机制来把一个.NET代理传递到我们的C++库。这样,我们用C++语言定义下列函数(SetUserHookCallback)和函数指针(HookProc)。
int SetUserHookCallback(HookProc userProc, UINT hookID)
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l)
SetUserHookCallback的第二个参数是钩子类型-这个函数指针将使用它。现在,我们必须用C#来定义相应的方法和代理以使用这段代码。下面是我们怎样把它映射到C#。
private static extern SetCallBackResults
SetUserHookCallback(HookProcessedHandler hookCallback, HookTypes hookType)
protected delegate void HookProcessedHandler(int code, UIntPtr wparam, IntPtr lparam)
public enum HookTypes {
JournalRecord = 0,
JournalPlayback = 1,
// ...
KeyboardLL = 13,
MouseLL = 14
};
首先,我们使用DllImport属性导入SetUserHookCallback函数,作为我们的抽象基钩子类SystemHook的一个静态的外部的方法。为此,我们必须映射一些外部数据类型。首先,我们必须创建一个代理作为我们的函数指针。这是通过定义上面的HookProcessHandler 来实现的。我们需要一个函数,它的C++签名为(int,WPARAM,LPARAM)。在Visual Studio .NET C++编译器中,int与C#中是一样的。也就是说,在C++与C#中int就是Int32。事情并不总是这样。一些编译器把C++ int作为Int16对待。我们坚持使用Visual Studio .NET C++编译器来实现这个工程,因此,我们不必担心编译器差别所带来的另外的定义。
接下来,我们需要用C#传递WPARAM和LPARAM值。这些确实是指针,它们分别指向C++的UINT和LONG值。用C#来说,它们是指向uint和int的指针。如果你还不确定什么是WPARAM,你可以通过在C++代码中单击右键来查询它,并且选择"Go to definition"。这将会引导你到在windef.h中的定义。
//从windef.h:
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
因此,我们选择System.UIntPtr和System.IntPtr作为我们的变量类型-它们分别相应于WPARAM和LPARAM类型,当它们使用在C#中时。
现在,让我们看一下钩子基类是怎样使用这些导入的方法来传递一个回叫函数(代理)到C++中-它允许C++库直接调用你的系统钩子类的实例。首先,在构造器中,SystemHook类创建一个到私有方法InternalHookCallback的代理-它匹配HookProcessedHandler代理签名。然后,它把这个代理和它的HookType传递到C++库以使用SetUserHookCallback方法来注册该回叫函数,如上面所讨论的。下面是其代码实现:
public SystemHook(HookTypes type){
_type = type;
_processHandler = new HookProcessedHandler(InternalHookCallback);
SetUserHookCallback(_processHandler, _type);
}
InternalHookCallback的实现相当简单。InternalHookCallback在用一个catch-all try/catch块包装它的同时仅传递到抽象方法HookCallback的调用。这将简化在派生类中的实现并且保护C++代码。记住,一旦一切都准备妥当,这个C++钩子就会直接调用这个方法。
[MethodImpl(MethodImplOptions.NoInlining)]
private void InternalHookCallback(int code, UIntPtr wparam, IntPtr lparam){
try
catch {}
}
我们已增加了一个方法实现属性-它告诉编译器不要内联这个方法。这不是可选的。至少,在我添加try/catch之前是需要的。看起来,由于某些原因,编译器在试图内联这个方法-这将给包装它的代理带来各种麻烦。然后,C++层将回叫,而该应用程序将会崩溃。
现在,让我们看一下一个派生类是怎样用一个特定的HookType来接收和处理钩子事件。下面是虚拟的MouseHook类的HookCallback方法实现:
protected override void HookCallback(int code, UIntPtr wparam, IntPtr lparam){
if (MouseEvent == null)
int x = 0, y = 0;
MouseEvents mEvent = (MouseEvents)wparam.ToUInt32();
switch(mEvent) {
case MouseEvents.LeftButtonDown:
GetMousePosition(wparam, lparam, ref x, ref y);
break;
// ...
}
MouseEvent(mEvent, new Point(x, y));
}
首先,注意这个类定义一个事件MouseEvent-该类在收到一个钩子事件时激发这个事件。这个类在激发它的事件之前,把数据从WPARAM和 LPARAM类型转换成.NET中有意义的鼠标事件数据。这样可以使得类的消费者免于担心解释这些数据结构。这个类使用导入的 GetMousePosition函数-我们在C++ DLL中定义的用来转换这些值。为此,请看下面几段的讨论。
在这个方法中,我们检查是否有人在听这一个事件。如果没有,不必继续处理这一事件。然后,我们把WPARAM转换成一个MouseEvents枚举类型。我们已小心地构造了MouseEvents枚举来准确匹配它们在C ++中相应的常数。这允许我们简单地把指针的值转换成枚举类型。但是要注意,这种转换即使在WPARAM的值不匹配一个枚举值的情况下也会成功。 mEvent的值将仅是未定义的(不是null,只是不在枚举值范围之内)。为此,请详细分析System.Enum.IsDefined方法。
接下来,在确定我们收到的事件类型后,该类激活这个事件,并且通知消费者鼠标事件的类型及在该事件过程中鼠标的位置。
最后注意,有关转换WPARAM和LPARAM值:对于每个类型的事件,这些变量的值和意思是不同的。因此,在每一种钩子类型中,我们必须区别地解释这些值。我选择用C++实现这种转换,而不是尽量用C#来模仿复杂的C++结构和指针。例如,前面的类就使用了一个叫作GetMousePosition的 C++函数。下面是C++ DLL中的这个方法:
bool GetMousePosition(WPARAM wparam, LPARAM lparam, int amp; x, int amp; y) {
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lparam;
x = pMouseStruct->pt.x;
y = pMouseStruct->pt.y;
return true;
}
不是尽量映射MOUSEHOOKSTRUCT结构指针到C#,我们简单地暂时把它回传到C++层以提取我们需要的值。注意,因为我们需要从这个调用中返回一些值,我们把我们的整数作为参考变量传递。这直接映射到C#中的int*。但是,我们可以重载这个行为,通过选择正确的签名来导入这个方法。
private static extern bool InternalGetMousePosition(UIntPtr wparam,IntPtr lparam, ref int x, ref int y)
通过把integer参数定义为ref int,我们得到通过C++参照传递给我们的值。如果我们想要的话,我们还可以使用out int。
五、 限制
一些钩子类型并不适合实现全局钩子。我当前正在考虑解决办法-它将允许使用受限制的钩子类型。到目前为止,不要把这些类型添加回该库中,因为它们将导致应用程序的失败(经常是系统范围的灾难性失败)。下一节将集中讨论这些限制背后的原因和解决办法。
HookTypes.CallWindowProcere
HookTypes.CallWindowProret
HookTypes.ComputerBasedTraining
HookTypes.Debug
HookTypes.ForegroundIdle
HookTypes.JournalRecord
HookTypes.JournalPlayback
HookTypes.GetMessage
HookTypes.SystemMessageFilter
六、 两种类型的钩子
在本节中,我将尽量解释为什么一些钩子类型被限制在一定的范畴内而另外一些则不受限制。如果我使用有点偏差术语的话,请原谅我。我还没有找到任何有关这部分题目的文档,因此,我编造了我自己的词汇。另外,如果你认为我根本就不对,请告诉我好了。
当Windows调用传递到SetWindowsHookEx()的回调函数时它们会因不同类型的钩子而被区别调用。基本上有两种情况:切换执行上下文的钩子和不切换执行上下文的钩子。用另一种方式说,也就是,在放钩子的应用程序进程空间执行钩子回调函数的情况和在被钩住的应用程序进程空间执行钩子回调函数的情况。
钩子类型例如鼠标和键盘钩子都是在被Windows调用之前切换上下文的。整个过程大致如下:
1. 应用程序X拥有焦点并执行。
2. 用户按下一个键。
3. Windows从应用程序X接管上下文并把执行上下文切换到放钩子的应用程序。
4. Windows用放钩子的应用程序进程空间中的键消息参数调用钩子回调函数。
5. Windows从放钩子的应用程序接管上下文并把执行上下文切换回应用程序X。
6. Windows把消息放进应用程序X的消息排队。
7. 稍微一会儿之后,当应用程序X执行时,它从自己的消息排队中取出消息并且调用它的内部按键(或松开或按下)处理器。
8. 应用程序X继续执行...
例如CBT钩子(window创建,等等。)的钩子类型并不切换上下文。对于这些类型的钩子,过程大致如下:
1. 应用程序X拥有焦点并执行。
2. 应用程序X创建一个窗口。
3. Windows用在应用程序X进程空间中的CBT事件消息参数调用钩子回调函数。
4. 应用程序X继续执行...
这应该说明了为什么某种类型的钩子能够用这个库结构工作而一些却不能。记住,这正是该库要做的。在上面第4步和第3步之后,分别插入下列步骤:
1. Windows调用钩子回调函数。
2. 目标回调函数在非托管的DLL中执行。
3. 目标回调函数查找它的相应托管的调用代理。
4. 托管代理被以适当的参数执行。
5. 目标回调函数返回并执行相应于指定消息的钩子处理。
第三步和第四步因非切换钩子类型而注定失败。第三步将失败,因为相应的托管回调函数不会为该应用程序而设置。记住,这个DLL使用全局变量来跟踪这些托管代理并且该钩子DLL被加载到每一个进程空间。但是这个值仅在放钩子的应用程序进程空间中设置。对于另外其它情况,它们全部为null。
Tim Sylvester在他的《Other hook types》一文中指出,使用一个共享内存区段将会解决这个问题。这是真实的,但是也如Tim所指出的,那些托管代理地址对于除了放钩子的应用程序之外的任何进程是无意义的。这意味着,它们是无意义的并且不能在回调函数的执行过程中调用。那样会有麻烦的。
因此,为了把这些回调函数使用于不执行上下文切换的钩子类型,你需要某种进程间的通讯。
我已经试验过这种思想-使用非托管的DLL钩子回调函数中的进程外COM对象进行IPC。如果你能使这种方法工作,我将很高兴了解到这点。至于我的尝试,结果并不理想。基本原因是很难针对各种进程和它们的线程(CoInitialize(NULL))而正确地初始化COM单元。这是一个在你可以使用 COM对象之前的基本要求。
我不怀疑,一定有办法来解决这个问题。但是我还没有试用过它们,因为我认为它们仅有有限的用处。例如,CBT钩子可以让你取消一个窗口创建,如果你希望的话。可以想像,为使这能够工作将会发生什么。
1. 钩子回调函数开始执行。
2. 调用非托管的钩子DLL中的相应的钩子回调函数。
3. 执行必须被路由回到主钩子应用程序。
4. 该应用程序必须决定是否允许这一创建。
5. 调用必须被路由回仍旧在运行中的钩子回调函数。
6. 在非托管的钩子DLL中的钩子回调函数从主钩子应用程序接收到要采取的行动。
7. 在非托管的钩子DLL中的钩子回调函数针对CBT钩子调用采取适当的行动。
8. 完成钩子回调函数的执行。
这不是不可能的,但是不算好的。我希望这会消除在该库中的围绕被允许的和受限制的钩子类型所带来的神秘。
七、 其它
・库文档:我们已经包含了有关ManagedHooks类库的比较完整的代码文档。当以"Documentation"构建配置进行编译时,这被经由Visual Studio.NET转换成标准帮助XML。最后,我们已使用NDoc来把它转换成编译的HTML帮助(CHM)。你可以看这个帮助文件,只需简单地在该方案的解决方案资源管理器中点击Hooks.chm文件或通过查找与该文相关的可下载的ZIP文件。
・增强的智能感知:如果你不熟悉Visual Studio.NET怎样使用编译的XML文件(pre-NDoc output)来为参考库的工程增强智能感知,那么让我简单地介绍一下。如果你决定在你的应用程序中使用这个类库,你可以考虑复制该库的一个稳定构建版本到你想参考它的位置。同时,还要把XML文档文件 (SystemHooks\ManagedHooks\bin\Debug\Kennedy.ManagedHooks.xml)复制到相同的位置。当你添加一个参考到该库时,Visual Studio.NET将自动地读该文件并使用它来添加智能感知文档。这是很有用的,特别是对于象这样的第三方库。
・单元测试:我相信,所有的库都应有与之相应的单元测试。既然我是一家公司(主要负责针对.NET环境软件的单元测试)的合伙人和软件工程师,任何人不会对此感到惊讶。因而,你将会在名为ManagedHooksTests的解决方案中找到一个单元测试工程。为了运行该单元测试,你需要下载和安装 HarnessIt-这个下载是我们的商业单元测试软件的一个自由的试用版本。在该单元测试中,我对这给予了特殊的注意-在此处,方法的无效参数可能导致 C++内存异常的发生。尽管这个库是相当简单的,但该单元测试确实能够帮助我在一些更为微妙的情况下发现一些错误。
・非托管的/托管的调试:有关混合解决方案(例如,本文的托管的和非托管的代码)最为技巧的地方之一是调试问题。如果你想单步调试该C++代码或在C++代码中设置断点,你必须启动非托管的调试。这是一个Visual Studio.NET中的工程设置。注意,你可以非常顺利地单步调试托管的和非托管的层,但是,在调试过程中,非托管的调试确实严重地减慢应用程序的装载时间和执行速度。
八、 最后警告
很明显,系统钩子相当有力量;然而,使用这种力量应该是有责任性的。在系统钩子出了问题时,它们不仅仅垮掉你的应用程序。它们可以垮掉在你的当前系统中运行的每个应用程序。但是到这种程度的可能性一般是很小的。尽管如此,在使用系统钩子时,你还是需要再三检查你的代码。
我发现了一项可以用来开发应用程序的有用的技术-它使用系统钩子来在微软的虚拟PC上安装你的喜爱的开发操作系统的一个拷贝和Visual Studio.NET。然后,你就可以在此虚拟的环境中开发你的应用程序。用这种方式,当你的钩子应用程序出现错误时,它们将仅退出你的操作系统的虚拟实例而不是你的真正的操作系统。我已经不得不重启动我的真正的OS-在这个虚拟OS由于一个钩子错误崩溃时,但是这并不经常。
『肆』 做游戏挂从哪学起
编程语言啊,,易语言 c++ vc 等等都可以,其实语言是相通的,,,
东西太多,容易放弃啊。。。我就是 - -
郁金香老师的编程课程。。。。还好我学了点c。。。
1 入门篇.以《QQ连连看为例》
1.1、一个最简单的外挂
1.1.1、游戏数据分析(SPY++)
1.1.1、游戏窗口数据分析(SPY++)
a、取得窗口相对坐标
b、读出游戏窗口信息GetWindowRect
c、移动鼠标指针SetCursorPos
1.1.2 用VC++写个最简单的外挂(实现游戏开局)
a、鼠拟鼠标单击mouse_event
b、鼠标指针移动还原
c、集成到startgame函数里
1.2、用CE查找棋盘数据
1.2.1、数据类型:Bit,Byte,Word,Dword
、用CE查找坐位号;
1.2.2、用CE查出4个棋盘基址;
1.3、用模拟技术编制外挂
1.3.1 模拟鼠标点击实现 交换棋子
1.3.2 把所有功能集成封装到 函数里
1.3.3 利用棋盘数据 ,模拟实现下棋功能
1.3.4 编写完整外挂,界面美化
1.4、游戏加速.去掉对动画效果.非HOOK
1.4.1:用OD找出 动画延时代码
1.4.2:写代码去掉延时,实现游戏加速
2 中级篇 以热血江湖为例
2.1、分析前的准备..CALL简介:
2.1.1、CALL调用示例分析.远程代码注入器
2.1.2、调试工具OD简介,血值,魔力值,坐标偏移;
2.1.3、游戏基址概念;
2.1.4、常用汇编指令详解
2.1.5、内联汇编编程实例
2.2、游戏分析利器OD(OllyDbg)
2.2.1、分析角色基址
2.2.2、找打坐CALL
2.2.3、读出角色当前血值
2.2.4、远程注入代码,调用打坐CALL;
2.2.5、实例分析:找技能栏对象数组基址+偏移:
2.2.6: 拦截F1-F8功能CALL
2.3、外挂框架构建
2.3.1、DLL动态链接库构建,与调用
2.3.2、API与回调函数
2.3.3、DLL中构建窗口
2.4、用OD分析游戏功能CALL.《热血江湖》为例:主要是找CALL
2.4.1、选怪CALL
2.4.2、找游戏物品背包的基址+偏移
2.4.3、 吃红药(补血)CALL
2.4.4、 吃蓝(补魔)CALL
2.4.5、 技能CALL1
2.4.6、技能CALL2
2.4.7、所有技能CALL
2.4.8、捡物CALL
2.4.9、所有动作CALL
3、进阶篇
主要讲功能CALL的参数分析
汇编浮点指令/浮点运行/浮点数整数转换/汇编里的指针
3.1、喊话功能
3.2、走路
3.3、 怪物过滤
3.3.1、怪物属性分析
3.3.2、怪物列表关键代码分析
3.3.3、怪物列表基址+大小
3.3.4、怪物列表编写代码
3.3.5、怪物过滤
3.4、 物品过滤
3.4.1、物品属性分析
3.4.2、物品列表关键代码分析
3.4.3、找出物品列表基址+偏移
3.4.4、物品过滤(编程读出物品列表数据)
3.5、 组队相关
3.5.1、 玩家列表
3.5.2、 组队功能
3.5.3、 离队功能
3.6、购物/售物
3.6.1、与NPC对话框
3.6.2、打开购物/售物对话框
3.6.3、购物功能
3.6.4、售物功能
3.7、 摆摊.开店
a、开店CALL参数分析
b、写代码测试
4、高级篇
4.1、编写完整的外挂
4.2、游戏更新后的外挂更新
4.3、脚本功能
4.4、游戏多开实现
4.5、盗号的实现
学技术
1.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
2.浮躁的人容易问:我到底该学什么;——别问,学就对了;
3.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
4.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
5.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
6.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
7.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
『伍』 C# 如何实现dx HOOK修改呢
寻找基址一般都用OD或者CE 至于你说的C#实现HOOK 这个网上资料很多的啊 网络文库"C# HOOK "以这个为关键词你搜下 取出战争迷雾 那你要找的就是一个函数的基址了 一个Call 具体的你网上找些教程吧 这个要你对汇编有基础才可以的 或者去看郁金香的教程
『陆』 听说郁金香灬游戏又出新教程了,不知道怎么安排的·
郁金香灬游戏 2015年课程
游戏一:精讲
一、人物角色对象分析
编写外挂框架
编写DLL部分
编写EXE部分
遍历显示人物信息
分析背包列表
分析背包对象常用属性
分析怪物列表
分析怪物对象属性
封装怪物结构
编写代码读取周围所有怪物信息
分析打怪CALL
分析技能CALL
分析装备列表
分析装备对象
分析技能树
选中技能对象
移动技能对象到F1-F10
分析技能使用CALL
分析技能使用CALL参数
封装技能使用CALL
快速更新游戏基址
动态定位基址
编写自己的基址定位函数
三、 分析气功列表
分析气功列表基址
分析气功对象属性
分析气功已加点数
分析气功可加点数
分析气功加点CALL
分析气功加点参数
封装气功加点CALL
武器强化属性分析
武器强化条件分析
武器强化CALL分析
武器强化CALL参数分析
LUA接口封装
LUA气功加点
LUA修练武功
四、移动分析
当前坐标分析
目的地坐标分析
寻路CALL分析
寻路CALL参数分析
LUA移动到
五、自动接任务
分析当前任务列表
分析NPC对话数据
分析NPC对话CALL
分析接任务数据
分析接任务CALL
分析任务完成进度数据
分析任务完成状态
分析交任务CALL
封装做任务函数
LUA做任务
六、自动打怪挂机
分析怪物列表
获取可攻击怪物
分析选中怪物功能
分析攻击技能
封装自动打怪功能
打怪过滤
定点打怪功能封装
范围打怪功能封装
保存挂机地点
载入挂机地点
LUA挂机
七、寻路系统分析
当前坐标分析
寻路CALL分析
寻路CALL参数分析
寻路CALL功能封装
穿墙数据分析
穿墙功能实现
LUA开启穿墙
LUA寻路
八、捡物及物品过滤
捡物功能一分析
捡物功能二分析
带参数的捡物功能分析
地上物品列表分析
地上物品属性分析
实现有选择的捡物(物品过滤)
自动打开指定类型盒子
LUA捡物
九、喊话功能封装
分析喊话CALL
分析喊话CALL参数
分析喊话类型参数
封装喊话函数
实现自动喊话
LUA喊话
十、提示
被人密检测提示
游戏掉线检测提示
仓库满检测提示
交易检测提示
被怪物杀死检测提示
被玩家杀死提示
十一、自动卖买物品(补给)
HP药品数量检测分析
MP药品数量检测分析
回城符数量检测分析
指定物品低于某个数量 回城补给后再来
回城补给时 指定物品保持在某个数量
LUA出售(物品,数量)
LUA购买(物品,数量)
十二、仓库
分析仓库数据
分析存仓库CALL
分析存仓库CALL参数
分析取仓库CALL
分析取仓库CALL参数
封装函数(回城补给是,仓库取物,让某个物品保持一定数量)
LUA存仓库(物品,数量)
十三、自动使用物品
分析物品使用CALL
分析物品使用CALL参数
低HP检测
低MP检测
低HP保护
低MP保护
检测速度分析
HP值低于XX时 优先使用物品列表排序设置
MP值低于XX时 优先使用物品列表排序设置
HP值低于XX百分比时 优先使用物品列表排序设置
MP值低于XX百分比时 优先使用物品列表排序设置
当HP值 低于XX百分比时,回城补给再来
十四、攻击保护
PK时用 当被攻击时 立刻使用XX数量 XX物品
十五、组队
分析组队状态
分析队伍列表
分析队员属性相关
定时给队员加辅助
当队员HP值低于XX百分比时 加指定辅助
自动组队所有人
自动组XXX入队
自动接受所有人组队
自动接受XXX组队
组队黑名单设置
自动移交队长给
跟随队长范围
组队搜索范围
十六、死亡处理
1、死亡检测
2、原地复活
4、复活延时
5、回城补给再来
6、使用百宝符
7、补给后返回方式选择
十七、武功和气功
疾风御气术分析
梯云纵分析
草上飞分析
疾龙云中行一式
疾龙云中行二式
轻功失效检测
自动使用轻功
自动使用XX技能
定点加辅助武功
帖身加辅助武功
辅助时自动更换武器为XX
打怪时自动更换武器为XX
十八、自动收货出货
交易CALL分析
交易CALL参数分析
交易检测
货物属性判断
自动交易
自动逛店
自动去店内扫货
十九 变态功能
1、修改攻击距离,增强攻击距离
2、CPU优化
3、黑屏处理
4、瞬移
5、穿墙
6、内存优化
7、隐藏游戏建筑
8、隐藏人物怪物
二十、人工智能算法
LUA脚本支持
自动增强攻击距离
自动寻路
自动打怪
自动高手怪处理
自动使用物品
自动使用技能
自动加点气功
自动修练武功
自动修装备
自动合成装备
自动强化装备
自动任务协作
自动回城补给
自动返回挂机点
自动等级选择挂机点
自动存仓库
自动出售物品
自动购买物品
自动开店出售
自动扫货
自动喊话
自动脚本功能支持
二十一、多开游戏
多开限制分析
突破多开限制
封装多开函数
二十二、自动登录账号
二十三、注册控制
至此可以开卡出售了
游戏二:
在先前的基础上,精讲数据分析,及功能封装部分
游戏三:
在先前的基础上,精讲数据分析,及功能封装部分
其它内容略...
『柒』 怎么做DNF辅助软件
首先声明:这个是在抄别人的,希望能帮到你。
一、先说一下写一个外挂需要什么条件
1、熟练的C语言知识
目前的外挂大部分都是用BC或者是Delphi或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件!
2、具有很强的汇编基础
一般游戏都不可能有原代码的,必须靠反汇编或者跟踪的办法来探索其中的机理
,所以有强的汇编基础也是必不可少的条件
3、熟练掌握跟踪和调试的工具
有了上面2个条件后,掌握一些工具也是很有必要的
跟踪的工具,softice当然是不二之选,至于反汇编的工具,我推荐用IDA PRO
这个工具反汇编出来的代码结构清晰,非常好读
如果你不具有上面的条件,还是先把基础打好,再来写外挂吧,一分耕耘,一分收获,天下没有白掉的馅饼的
二、写外挂面临的基本技术问题
1、修改进程的执行代码
要修改进程的执行代码,要先取得进程的ID,如果是由外挂程序启动,返回值里就有进程ID,如果不是的话,
需要用findwindow找到窗口句柄,再用GetWindowProcessID取得进程ID,取得进程ID以后,就可以用
writeprocessmemory来修改进程的执行代码了,使程序按照我们的意愿来执行,石器外挂里的不遇敌、寸步遇敌
就是用这样的方法来实现的
2、截获外挂发送和接收的封包
除了通过修改代码来实现的功能以外,很多的功能都是通过修改封包来实现的,要修改封包,首先要能截获它。
第一步是要跟踪出发和收的位置,至于怎么跟踪,我以后会提到,找到位置以后,有2个办法,一是在那个位置加一
个jmp语句,跳到你的处理函数位置,处理完后,再跳回来,这种方法要求比较高,需要处理好很多事情,另一种办法
是往那个位置写条能造成例外的指令,比如int 3,然后用DebugActiveProcess调试游戏进程,这样每当游戏执行到那个
位置的时候,就会停下来,到外挂程序里面去,等外挂程序处理完以后,用ContinueDebugEvent 继续运行程序。
今天先写这么多,下回将讨论外挂的具体功能该怎么实现
今天来谈谈地址的调查问题,地址调查是写外挂中最艰辛,最富有挑战性的事情,很多朋友问我要外挂的原程序,其实有了外挂原程序,如果你不会调查地址,还是没用的,
原程序和地址的关系就象武学中招式与内功的关系,没有内功的招式,只是一个花架子。而内功精深以后,任何普通的招式,都有可能化腐朽为神奇,外挂中的地址分为两类,一类是程序地址,一类是数据地址。象石器中的双石器,真彩,不遇敌,寸步遇敌,发送接收封包等,都属于第一类,而人物坐标,状态等,都属于第二类。对于第一类地址,主要依靠softice来
调查地址,对第二类地址,可以用一些游戏工具,比如fpe,game expert,game master等来调查,我一直用game expert,因为我找不到2000下能用的fpe,
各位以前用fpe改游戏的时候,没想过他也能用来干这个吧
对于第二类数据的调查方法,大部分人都很熟习了,我就不多说了,现在主要来谈谈第一类数据的详细调查过程,比如我们要调查发送封包的位置,如何着手呢,客户端往服务器要发很多封包,但最简单的办法莫过从说话的封包入手,先说一句很长的话,最好是英文,查起来方便,说完以后,用任意一种办法进入游戏程序的进程空间(比如先用spy查出游戏程序的窗口句柄,再切换到softice打入bmsg 窗口句柄 wm_lbuttondown,这样在游戏程序中一点鼠标就进入了他的进程空间)然后用s命令查出这句话所放的内存地址,记下这个地址,在softice中打入bpm 刚才调查到的地址,这个指令的意思是只要有访问这个内存的动作,立刻中断,然后再切换到游戏,说一句话,你会发现softice自动中断到某一个位置了,从这个位置跟踪下去,发送封包的位置也就不远了。
上面所说的都是针对一个全新的游戏程序而言,如果是一个老的程序,有前辈做了大量的工作,还可以用些别的办法,如反汇编等,来调查。以后游戏版本的更新也是如此,只要把老版本的地址位置附近的代码记下来,去新版本的代码里面search一下,就ok了。
恩,休息一会儿,休息一会儿
我主要对外挂的技术进行分析,至于游戏里面的内部结构每个都不一样,这里就不做讲解了,我也没有那么厉害,所有的都知道,呵呵!
1 首先游戏外挂的原理
外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服务器内存的哦,呵呵!其实修改服务器也是有办法的,只是技术太高一般人没有办法入手而已!(比如请GM去夜总会,送礼,收黑钱等等办法都可以修改服务器数据,哈哈)
修改游戏无非是修改一下本地内存的数据,或者截获api函数等等,这里我把所能想到的方法都作一个介绍,希望大家能做出很好的外挂来使游戏厂商更好的完善自己的技术.
我见到一片文章是讲魔力宝贝的理论分析,写的不错,大概是那个样子.
下来我就讲解一下技术方面的东西,以作引玉之用
2 技术分析部分
1 模拟键盘或鼠标的响应
我们一般使用UINT SendInput(
UINT nInputs, // count of input events
LPINPUT pInputs, // array of input events
int cbSize // size of structure
);api函数
第一个参数是说明第二个参数的矩阵的维数的,第二个参数包含了响应事件,这个自己填充就可以,最后是这个结构的大小,非常简单,这是最简单的方法模拟键盘鼠
标了,呵呵
注意:这个函数还有个替代函数:
VOID keybd_event(
BYTE bVk, // 虚拟键码
BYTE bScan, // 扫描码
DWORD dwFlags,
ULONG_PTR dwExtraInfo // 附加键状态
);和
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
这两个函数非常简单了,我想那些按键精灵就是用的这个吧,呵呵,上面的是模拟键盘,下面的是模拟鼠标的.
这个仅仅是模拟部分,要和游戏联系起来我们还需要找到游戏的窗口才行,或者包含快捷键,就象按键精灵的那个激活键一样,我们可以用GetWindow函数来枚举窗口,也可以用Findwindow函数来查找制定的窗口(注意还有一个FindWindowEx),FindwindowEx可以找到窗口的子窗口,比如按钮,等什么东西.当游戏切换场景的时候我们可以用FindWindowEx来确定一些当前窗口的特征,从而判断是否还在这个场景,方法很多了,比如可以GetWindowInfo来确定一些东西,比如当查找不到某个按钮的时候就说明游戏场景已经切换了,等等办法.有的游戏没有控件在里面,这是对图像做坐标变换的话,这种方法就要受到限制了.这就需要我们用别的办法来辅助分析了.
至于快捷键我们要用动态连接库实现了,里面要用到hook技术了,这个也非常简单,大家可能都会了,其实就是一个全局的hook对象然后SetWindowHook就可以了,回调函数都是现成的,而且现在网上的例子多如牛毛,这个实现在外挂中已经很普遍了.如果还有谁不明白,那就去看看msdn查找SetWindowHook就可以了.
这个动态连接库的作用很大,不要低估了哦,它可以切入所有的进程空间,也就是可以加载到所有的游戏里面哦,只要用对,你会发现很有用途的!
这个需要你复习一下win32编程的基础知识了,呵呵,赶快去看书吧!
2截获消息
有些游戏的响应机制比较简单,是基于消息的,或者用什么定时器的东西,这个时候你就可以用拦截消息来实现一些有趣的功能了.
我们拦截消息使用的也是hook技术,里面包括了键盘消息,鼠标消息,系统消息,日志等,别的对我们没有什么大的用处,我们只用拦截消息的回调函数就可以了,这个不会让我写例子吧,其实这个和上面的一样,都是用SetWindowHook来写的,看看就明白了很简单的.
至于拦截了以后做什么就是你的事情了,比如在每个定时器消息里面处理一些我们的数据判断,或者在定时器里面在模拟一次定时器,那么有些数据就会处理两次,呵呵,后果嘛,不一定是好事情哦,呵呵,不过如果数据计算放在客户端的游戏就可以真的改变数据了,呵呵,试试看吧!用途还有很多,自己想也可以想出来的,呵呵!
3拦截socket包
这个技术
难度要比原来的高很多哦,要有思想准备.
首先我们要替换winSock.dll或者winsock32.dll,我们写的替换函数要和原来的函数一致才行,就是说它的函数输出什么样的,我们也要输出什么样子的函数,而且参数,参数顺序都要一样才行,然后在我们的函数里面调用真正的winSock32.dll里面的函数就可以了
首先:我们可以替换动态库到系统路径
其次:我们应用程序启动的时候可以加载原有的动态库,用这个函数LoadLibary
然后定位函数入口用GetProcAddress函数获得每个真正socket函数的入口地址
当游戏进行的时候它会调用我们的动态库,然后从我们的动态库中处理完毕后才跳转到真正动态库的函数地址,这样我们就可以在里面处理自己的数据了,应该是一切数据.呵呵!
兴奋吧,拦截了数据包我们还要分析之后才能进行正确的应答,不要以为这样工作就完成了,呵呵!还早呢,等分析完毕以后我们还要仿真应答机制来和服务器通信,一个不小心就会被封号,呵呵,呜~~~~~~~~我就被封了好多啊!
分析数据才是工作量的来源呢,游戏每次升级有可能加密方式会有所改变,因此我们写外挂的人都是亡命之徒啊,被人娱乐了还不知道,呵呵!(声明我可没有赚钱,我是免费的)
好了,给大家一个不错的起点,这里有完整的替换socket源代码,呵呵!
http://www.vchelp.net/vchelp/zsrc/wsock32_sub.zip
4截获api
上面的技术如果可以灵活运用的话我们就不用截获api函数了,其实这种技术是一种补充技术.比如我们需要截获socket以外的函数作为我们的用途,我们就要用这个技术了,其实我们也可以用它直接拦截在socket中的函数,这样更直接.
现在拦截api的教程到处都是,我就不列举了,我用的比较习惯的方法是根据输入节进行拦截的,这个方法可以用到任何一种操作系统上,比如98/2000等,有些方法不是跨平台的,我不建议使用.这个技术大家可以参考windows核心编程里面的545页开始的内容来学习,如果是98系统可以用window系统奥秘那个最后一章来学习.
好了方法就是这么多了,看大家怎么运用了,其它的一些针对性的技巧这里我就不说了,要不然会有人杀了我的,呵呵!
记住每个游戏的修改方法都不一样,如果某个游戏数据处理全部在服务器端,那么你还是别写外挂了,呵呵,最多写个自动走路的外挂,哈哈!
数据分析的时候大家一定要注意,不要轻易尝试和服务器的连接,因为那有很危险,切忌!等你掌握了大量的数据分析结果以后,比较有把握了在试试,看看你的运气好不好,很有可能会成功的哦,呵呵!
其实像网金也疯狂的那种模拟客户端的程序也是不错的,很适合office的人用,就看大家产品定位了.
好了不说了,大家努力吧!切忌不要被游戏厂商招安哦,那样有损
『捌』 如何写HOOK 技能
This HOWTO deals with pre-hooks. For details on post-hooks, see 如何安全的Post-Hook一个函数.
For more information on the actual hooking of functions, see 如何Hook一个函数.
你通常这样使用么
Meet Joe Average Hook:
local orig_foo = foo
function foo(a1, a2)
-- some code that looks at a1
return orig_foo(a1, a2)
end
问题在于这个方法只能处理固定数目的参数, 如果方法的API改变了, 将导致无法使用. 幸运的是我们有办法使他继续工作.
Blizzard's APIs do change from time to time!
使用安全的方式
local orig_foo = foo
function foo(a1, )
--do something with a1
return orig_foo(a1, )
end
这样确保了所有的参数会传递到原始方法中, 即便你不知道具体有多少个参数. 同样确保了所有返回值都能正确返回. 另一个好处是, 我们使用了局部变量来保存原始方法并做了一个适当的尾调用可以带来更好的性能, 从而为我们的hook做了最小化的付出.
会带来巨大的性能影响么?
在WoW-2.0以前的设计中, 使用unpack(), 在每次hook被调用时创建一个垃圾回收表. 在新的设计中改进了, 使用''变量, 去掉了垃圾回收这部分源码. 在Lua5.1中, 在每次hook调用时包括传参和返回值都不会浪费表的内存.