c语言劫持技术

来源:互联网 发布:解码器和矩阵的区别 编辑:程序博客网 时间:2024/06/07 06:35

劫持

劫持的原理就是把目标函数的指针的指向修改为自定义函数的地址。

函数是放在代码区的,而代码区是只读的。这个时候我们就要利用detours

detours


detours是微软亚洲研究院出品的信息安全产品,主要用于劫持。
detours根据函数指针改变函数的行为,

拦截任何函数,即使操作系统函数。

detours的下载链接:https://www.microsoft.com/en-us/download/details.aspx?id=52586&from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fdownloads%2Fd36340fb-4d3c-4ddd-bf5b-1db25d03713d%2Fdefault.aspx


简单的实现一下劫持

安装环境Windows , 编译器vs2013

步骤:

1.安装dotours。

2.找到dotours 的src目录并且利用vs2013的命令行工具来利用nmake来编译它,得到头文件和静态库


到:







3.我们要用的核心劫持函数代码:void Hook()
{




DetourRestoreAfterWith();//恢复原来状态
DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
DetourAttach((void **)&OLD_MessageBox, NEW_MessageBox);//实现函数拦截
DetourTransactionCommit();//拦截生效




}

解除劫持:

void UnHook()
{




DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
DetourDetach((void **)&OLD_MessageBox, NEW_MessageBox);//撤销拦截函数
DetourTransactionCommit();//拦截生效
}

4.引用detours头文件还有库文件
#include<detours.h>//一定要先调用windows.h这个头文件
#pragma comment(lib, "detours.lib")

5.我们先定义旧函数指针指向原来的函数
static int (WINAPI* OLD_MessageBoxW)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) = MessageBoxW;


定义新的函数
int WINAPI NEW_MessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
//重新定义函数的行为
        //为空可以禁止函数使用
        //加上if else可以限制函数的调用
        //加上对话框可以限制同意或者不同意
       /*if (IDYES == MessageBoxW(NULL, lpCommandLine, L"拦截成功!", MB_YESNO))
return 1;
else
return FALSE;*/


return ret;


}

6.利用hook来用自己的新函数替代老函数
修改外部程序
需要作为模块注射,需要导出声明
_declspec(dllexport) 

利用dll注射

实验一:我们先做个自我劫持

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include"detours.h"
#pragma comment(lib,"detours.lib")


 static int (*oldsystem)(const char * _Command) = system;//存储函数指针地址
 int newsystem(const char * _Comman)
 {
printf("%s", _Comman);//定义新功能
return 0;
 }
 //开始拦截
 void hook()
 {
DetourRestoreAfterWith();//恢复原来状态
DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
DetourAttach((void **)&oldsystem, newsystem);//利用二级指针进行函数拦截
DetourTransactionCommit();//拦截生效




 }




void main()
{
/*system("notepad");*/
hook();
system("notepad");
getchar();
}



本该实现打开画图板功能的结果只是显示了notepad

我们要在vsRelesa模式下进行而不是Debug下,Debug本身就是以一种劫持







原创粉丝点击