游戏外挂:劫持技术

  1. 云栖社区>
  2. 博客>
  3. 正文

游戏外挂:劫持技术

涂作权 2014-07-28 01:14:00 浏览607
展开阅读全文

1.  安装DetoursExpress30.msi,点击安装,安装后的目录结构如下:


在sample里面有例子,可供查看使用

2.第一步,打开VS2013开发人员命令提示(E:\Installed\MicrosoftVisual Studio 12.0\Common7\Tools\Shortcuts\VS2013 开发人员命令提示),进入Detours安装目录下的src目录,效果图如下:


2.新建项目,暂定项目名称是“劫持”

3.lib知识点

选中解决翻案à添加à新建项目à常规,输入lib名称


创建一个1.c文件


同理,添加一个1.h,内容如下

void msg();

添加一个1.c,内容如下:

#include<Windows.h>

 

void msg()

{

    MessageBoxA(0, "11111", "2222", 0);

}

右击项目à属性à常规à配置类型à静态库.lib

 

然后,生成à生成lib,执行完成后发现资源目录里面的Debug目录下就有lib.lib文件了。

 

如果想在劫持项目中使用自己写的静态链接库。右击劫持项目à属性à链接器à常规à输入à附加依赖库,在最前面添加   lib.lib;  截图如下:

 

将lib.lib文件放到源文件同级目录下,截图如下:

 

在劫持项目里的hello.c文件中添加函数声明

#include <stdio.h>

#include <stdlib.h>

voidmsg();

 

void main()

{

    printf("hello world");

    getchar();

}

这时候运行的时候就可以调用了lib.lib了。

 

动态库随时加载,随时注入。

静态库只有在编译的时候才可以调用。

 

4.使用detours做劫持(将项目改成release模式),其中项目结构如下(下面是劫持自己的过程):

A放文件有:

detours.h   (src下)

detours.lib  (lib.X86下)

detver.h    (src下)

将上面的文件放在源文件目录下即可

B.添加

#include"detours.h"  //载入头文件

#pragma comment(lib, "detours.lib")//表明要使用静态库

 

C:定义一个新的函数取代旧的函数。

int  newsystem(const char *_Command) //新的函数

{

    return 0;

}

 

D:添加Hook()方法和UnHook();

 

E:设置上detours.lib,方法是:右击项目à属性à链接器à输入à附加依赖项。截图:

 

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

#include "detours.h" //载入头文件

#pragma comment(lib,"detours.lib")//表明要使用的静态库

//detour在realse模式生效

//创建函数指针等于地址,加上静态防止影响其它的源文件

static int(*oldsystem)(constchar* _Command) =system;

 

int newsystem(constchar * _Command) //新的函数

{

    return 0;

}

 

//开始拦截

void Hook()

{

    DetourRestoreAfterWith();//恢复原来状态,

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

    //这里可以连续多次调用DetourAttach,表明HOOK多个函数

 

    DetourAttach((void **)&oldsystem,newsystem);//实现函数拦截

    DetourTransactionCommit();//拦截生效

}

 

//取消拦截

void UnHook()

{

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

    //这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK

    DetourDetach((void **)&oldsystem,newsystem); //撤销拦截函数

    DetourTransactionCommit();//拦截生效

}

 

 

void main()

{

    system("calc");

    printf("%p,%p,%p",system, newsystem, oldsystem);

    Hook();

    printf("\n%p,%p,%p",system, newsystem, oldsystem);

    system("calc");

    getchar();

}

 

现象是加了Hook()之后只弹出了一次计算机窗口,如果去掉了Hook()方法,则出现两个计算器窗口。

 

5、劫持应用

A:创建一个基于窗口的MFC的应用程序->然后拖一个button->双击buttonà添加代码,事件代码如下:

void C劫持测试2Dlg::OnBnClickedButton1()

{

     // TODO:  在此添加控件通知处理程序代码

     #include<stdlib.h>

     system("calc");

}

窗口截图如下:


B:选中解决方案,新建一个常规空项目(项目名称:劫持其他程序),这时候要写一个库劫持MFC程序

将detours中的各种相关文件放到源文件下面。截图如下:


C:修改项目的依赖项:右击项目-->属性-->链接器-->输入-->附加依赖项-


D:将项目改成dll项目,也就是,修改配置属性里面的常规的目标文件名和配置类型,截图如下:


1、编写dll内容:

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

#include<string.h>

 

#include"detours.h"

#pragma comment(lib, "detours.lib")

 

static int(*poldsystem)(constchar * _Command) =system;//存储函数指针地址

 

int  newsystem(const char *_Command)

{

    //tasklist

    printf("%s",_Command); //禁止你干活

    return 0;

}

//开始拦截

void Hook()

{

    DetourRestoreAfterWith();//恢复原来状态

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

    //这里可以连续多次调用DetourAttach,表明HOOK多个函数

    DetourAttach((void **)&poldsystem,newsystem);//实现函数拦截

    DetourTransactionCommit();//拦截生效

}

 

//导出函数,可以加载的时候调用

_declspec(dllexport)void  go()

{

    MessageBoxA(0, "1", "2", 0);

    Hook();

}

E:生成dll文件,然后使用dllInject工具将它注入到应用里面。

 

6:劫持系统的原理是劫持CreateProcess()函数。同样也是编写dll文件。

 

 

 

网友评论

登录后评论
0/500
评论
涂作权
+ 关注