编程c语言被windows拦截,C语言调用detours劫持WindowsAPI
本帖最后由 Git_man 于 2017-2-14 18:32 編輯
00??detours
detours是微軟亞洲研究院出品的信息安全產(chǎn)品,用于劫持
可用Detours Express 3.0編譯生成detours.lib
01??劫持MessageBoxW()
vs2015創(chuàng)建空項(xiàng)目,源文件中添加msg.c
把detours.h、detours.lib、detver.h文件復(fù)制到msg.c同目錄下
輸入MessageBoxW()右鍵選擇查看定義
pic1.png (21.98 KB, 下載次數(shù): 1)
查看定義
2017-2-14 17:23 上傳
復(fù)制MessageBoxW()的函數(shù)聲明
2.png (20.09 KB, 下載次數(shù): 1)
2017-2-14 17:26 上傳
修改函數(shù)聲明,去掉多余的調(diào)用約定,修改為一個(gè)指向原來函數(shù)的指針
并在前面加上static防止影響其他源文件
3.jpg (8.49 KB, 下載次數(shù): 1)
2017-2-14 17:29 上傳
創(chuàng)建一個(gè)同類型的函數(shù)以便攔截是調(diào)用
4.jpg (7.72 KB, 下載次數(shù): 1)
2017-2-14 17:30 上傳
添加靜態(tài)庫文件
#pragma comment(lib,"detours.lib")
調(diào)用劫持代碼
[C++] 純文本查看 復(fù)制代碼//開始攔截void Hook()
{
DetourRestoreAfterWith(); //恢復(fù)原來狀態(tài)
DetourTransactionBegin(); //攔截開始
DetourUpdateThread(GetCurrentThread()); //刷新當(dāng)前線程
//這里可以連續(xù)多次調(diào)用DetourAttach,表明HOOK多個(gè)函數(shù)
DetourAttach((void **)&OldMessageBoxW, NewMessageBoxW);//實(shí)現(xiàn)函數(shù)攔截
DetourTransactionCommit(); //攔截生效
}
//取消攔截
void UnHook()
{
DetourTransactionBegin(); //攔截開始
DetourUpdateThread(GetCurrentThread()); //刷新當(dāng)前線程
//這里可以連續(xù)多次調(diào)用DetourAttach,表明撤銷HOOK多個(gè)函數(shù)
DetourDetach((void **)&OldMessageBoxW, NewMessageBoxW); //撤銷攔截
DetourTransactionCommit(); //攔截生效
}
vs2015解決方案配置修改為Release
11.jpg (8.85 KB, 下載次數(shù): 1)
2017-2-14 17:44 上傳
msg.c:劫持MessageBoxW()完整代碼
[C++] 純文本查看 復(fù)制代碼#include
#include
#include
#include "detours.h"
#pragma comment(lib,"detours.lib")
static int (WINAPI *OldMessageBoxW)(
HWND hWnd,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType) = MessageBoxW;
int WINAPI NewMessageBoxW(
HWND hWnd,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType)
{
return 0;
}
void Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((void **)&OldMessageBoxW, NewMessageBoxW);
DetourTransactionCommit();
}
void UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((void **)&OldMessageBoxW, NewMessageBoxW);
DetourTransactionCommit();
}
void main()
{
MessageBoxW(0, "abcd", "test", 0);
Hook();
MessageBoxW(0, "1234", "test", 0);
system("pause");
}
運(yùn)行結(jié)果顯示第一個(gè)MessageBoxW()運(yùn)行成功第二個(gè)被劫持
02??攔截system函數(shù)
查看system()定義
1.jpg (5.69 KB, 下載次數(shù): 1)
2017-2-14 17:46 上傳
修改為一個(gè)指向system函數(shù)的指針
aa.jpg (2.42 KB, 下載次數(shù): 1)
2017-2-14 17:47 上傳
程序完整測試代碼
[C++] 純文本查看 復(fù)制代碼#include
#include
#include
#include
#include "detours.h"
#pragma comment(lib,"detours.lib")
static int(*oldsystem)(const char * _Command) = system;
int newsystem(const char * _Command)
{
printf("%s", _Command);
return 0;
}
int newsystemA(const char * _Command)
{
//實(shí)現(xiàn)過濾
const char *p = strstr(_Command, "tasklist");
if (!p == NULL) {
oldsystem(_Command);
}
else {
printf("%s禁止執(zhí)行", _Command);
return 0;
}
}
void Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((void **)&oldsystem, newsystem);
DetourTransactionCommit();
}
void UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((void **)&oldsystem, newsystem);
DetourTransactionCommit();
}
void main()
{
system("calc");
Hook();
system("calc");
system("tasklist");
getchar();
}
03??dll注入注入正在運(yùn)行的進(jìn)程劫持system函數(shù)
vs創(chuàng)建一個(gè)MFC程序
*解決方案配置選擇Release
a7.jpg (62.33 KB, 下載次數(shù): 1)
2017-2-14 17:55 上傳
工具箱中拖入button并添加代碼,并生成exe文件
asdf.jpg (10.78 KB, 下載次數(shù): 1)
2017-2-14 17:57 上傳
detours.h、detours.lib、detver.h文件復(fù)制到dll.c同目錄下
修改屬性為dll,配置設(shè)為Release
qqqq.jpg (68.44 KB, 下載次數(shù): 1)
2017-2-14 18:02 上傳
編寫dll.c生成jiechi.dll文件禁止button調(diào)用calc
[C++] 純文本查看 復(fù)制代碼#include
#include
#include
#include
#include "detours.h"
#pragma comment(lib,"detours.lib")
static int(*oldsystem)(const char * _Command) = system;
int newsystem(const char * _Command)
{
return 0;
}
void Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((void **)&oldsystem, newsystem);
DetourTransactionCommit();
}
_declspec(dllexport) void go()
{
MessageBoxA(0, "yes", "success", 0);
Hook();
}
運(yùn)行生成的mfc應(yīng)用程序,點(diǎn)擊按鈕可以調(diào)出計(jì)算器
用dll注入工具把生成的jiechi.dll注入到mfc應(yīng)用程序進(jìn)程中
aaaa.jpg (18.31 KB, 下載次數(shù): 1)
2017-2-14 18:06 上傳
這時(shí)system函數(shù)就被劫持了,程序無法調(diào)出計(jì)算器
04??劫持CreateProcessW()
CreateProcessW()可以創(chuàng)建進(jìn)程,此函數(shù)被劫持后將無法打開應(yīng)用程序
CreateProcessW()函數(shù)聲明
[C++] 純文本查看 復(fù)制代碼WINBASEAPI
BOOL
WINAPI
CreateProcessW(
_In_opt_ LPCWSTR lpApplicationName, //可執(zhí)行模塊名
_Inout_opt_ LPWSTR lpCommandLine, //命令行字符串
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, //進(jìn)程的安全屬性
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //線程的安全屬性
_In_ BOOL bInheritHandles, //句柄繼承標(biāo)志
_In_ DWORD dwCreationFlags, //創(chuàng)建標(biāo)志
_In_opt_ LPVOID lpEnvironment, //指向新的環(huán)境塊的指針
_In_opt_ LPCWSTR lpCurrentDirectory, //指向當(dāng)前目錄名的指針
_In_ LPSTARTUPINFOW lpStartupInfo, //指向啟動(dòng)信息結(jié)構(gòu)的指針
_Out_ LPPROCESS_INFORMATION lpProcessInformation //指向進(jìn)程信息結(jié)構(gòu)的指針
);
編譯生成dll文件并注入到explorer.exe進(jìn)程中
[C++] 純文本查看 復(fù)制代碼#include
#include
#include
#include
#include "detours.h"
#pragma comment(lib,"detours.lib")
static BOOL(WINAPI *Old_CreateProcessW)(
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
) = CreateProcessW;
BOOL New_CreateProcessW(
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
)
{
MessageBoxA(0, "success", "success", 0);
return 0;
}
void Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((void **)&Old_CreateProcessW, New_CreateProcessW);
DetourTransactionCommit();
}
void UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((void **)&Old_CreateProcessW, New_CreateProcessW);
DetourTransactionCommit();
}
_declspec(dllexport) void go()
{
Hook();
int i = 0;
while (1) {
if (i == 120) {
UnHook();
break;
}
i++;
Sleep(1000);
}
system("tasklist & pause");
}
總結(jié)
以上是生活随笔為你收集整理的编程c语言被windows拦截,C语言调用detours劫持WindowsAPI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstrap表单样式
- 下一篇: 中国生物能源行业市场规模预测及未来战略规