游戏外挂:劫持技术
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文件。
?
?
?
總結
- 上一篇: 江东六十四屯地图(江东六十四屯中国为什么
- 下一篇: 邮政快递电话客服电话人工服务电话(邮政快