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本身就是以一种劫持
- c语言劫持技术
- 【C/C++】劫持技术
- 巩固C语言(九)----静态库文件的生成和使用、劫持技术
- “映像劫持”技术
- 映像劫持技术分析
- DLL劫持技术
- windows映像劫持技术
- linux库函数劫持技术
- linux库函数劫持技术
- 映像劫持技术 IFEO
- 新型Web劫持技术
- 注册表映像劫持技术
- 游戏外挂:劫持技术
- windows、linux劫持技术
- dll劫持技术
- DLL劫持技术
- linux库函数劫持技术
- 映像劫持与反劫持技术
- LeetCode | 74. Search a 2D Matrix
- yii框架文件缓存
- CodeForces787A【exgcd求不定方程解(模板)】
- 自定义绘制圆形
- JS中的数组
- c语言劫持技术
- adapert
- 【Shiro权限管理】4. Shiro工作流程
- 蓝牙搜索
- 洛谷八连测r4t3
- 按键精灵脚本笔记:基本语法
- 数据库视频总结(五)
- dao
- Linux安装