目录

劫持

detours

实现劫持

步骤:

1. 安装Detours

2. 编译Detours工程

3. 把静态库和头文件引入工程

4. 函数指针与函数的定义

5.拦截

劫持QQ

实现劫持system函数。

1. 设置项目生成dll

2. 源文件(注意:需要保存为.c文件,或者加上extern C,因为detours是使用C语言实现的,表示代码使用C的规则进行编译)

3. 生成"劫持1.dll"文件

4. 把dll注入到QQ.exe

5. 拦截QQ执行system函数

参考


劫持

  • 劫持的原理就是把目标函数的指针的指向修改为自定义函数的地址。
  • 函数是放在内存中的代码区,所以劫持与代码区密切相关。
  • 实现劫持需要使用detours。

detours

  • detours是微软亚洲研究院出口的信息安全产品,主要用于劫持。这个工具使用C语言实现,所以是跨平台的。
  • detours根据函数指针改变函数的行为,可以拦截任何函数,即使操作系统函数。

detours下载地址:
下载地址1: http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/default.aspx
下载地址2: http://pan.baidu.com/s/1eQEijtS

实现劫持

开发环境说明:win7、vs2012

步骤:

1. 安装Detours

2. 编译Detours工程

在安装目录C:\Program Files\Microsoft Research\Detours Express 3.0\src目录下的是工程的源文件。

(1) 打开VS2012命令行工具,进入src目录。

(2) 使用nmake(linux下是make)命令编译生成静态库。

(3) 在lib.x86目录下的.lib文件是win32平台下的静态库文件

(4) 在include目录下的是Detours工程的头文件

3. 把静态库和头文件引入工程

// 引入detours头文件
#include "detours.h"// 引入detours.lib静态库
#pragma comment(lib,"detours.lib")

4. 函数指针与函数的定义

(1) 定义一个函数指针指向目标函数,这里目标函数是system

例如:

detour在realse模式生效(因为VS在Debug模式下已经把程序中的函数劫持了)

static int ( *oldsystem)(const char * _Command) = system;//定义一个函数指针指向目标函数

(2) 定义与目标函数原型相同的函数替代目标函数

例如:

//3.定义新的函数替代目标函数,需要与目标函数的原型相同
int newsystem(const char * _Command){int result = MessageBoxA(0,"是否允许该程序调用system命令","提示",1);//printf("result = %d", result);if (result == 1){oldsystem(_Command); //调用旧的函数}else{MessageBoxA(0,"终止调用system命令","提示",0);}return 0;
}

5.拦截

//开始拦截
void Hook()
{DetourRestoreAfterWith();//恢复原来状态(重置)DetourTransactionBegin();//拦截开始DetourUpdateThread(GetCurrentThread());//刷新当前线程(刷新生效)//这里可以连续多次调用DetourAttach,表明HOOK多个函数DetourAttach((void **)&oldsystem, newsystem);//实现函数拦截DetourTransactionCommit();//拦截生效
}
//取消拦截
void UnHook()
{DetourTransactionBegin();//拦截开始DetourUpdateThread(GetCurrentThread());//刷新当前线程//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOKDetourDetach((void **)&oldsystem, newsystem); //撤销拦截函数DetourTransactionCommit();//拦截生效
}

劫持QQ

实现劫持system函数。

1. 设置项目生成dll

2. 源文件(注意:需要保存为.c文件,或者加上extern C,因为detours是使用C语言实现的,表示代码使用C的规则进行编译)

#include
#include
#include // 引入detours头文件
#include "detours.h"//1.引入detours.lib静态库
#pragma comment(lib,"detours.lib")//2.定义函数指针
static int ( *oldsystem)(const char * _Command) = system;//定义一个函数指针指向目标函数//3.定义新的函数替代目标函数,需要与目标函数的原型相同
int newsystem(const char * _Command){char cmd[100] = {0};int result = 0;sprintf_s(cmd,100, "是否允许该程序执行%s指令", _Command);result = MessageBoxA(0,cmd,"提示",1);//printf("result = %d", result);if (result == 1) // 允许调用{oldsystem(_Command); //调用旧的函数}else{// 不允许调用}return 0;
}// 4.拦截
//开始拦截
_declspec(dllexport) void Hook()  // _declspec(dllexport)表示外部可调用,需要加上该关键字其它进程才能成功调用该函数
{DetourRestoreAfterWith();//恢复原来状态(重置)DetourTransactionBegin();//拦截开始DetourUpdateThread(GetCurrentThread());//刷新当前线程(刷新生效)//这里可以连续多次调用DetourAttach,表明HOOK多个函数DetourAttach((void **)&oldsystem, newsystem);//实现函数拦截DetourTransactionCommit();//拦截生效
}//取消拦截
_declspec(dllexport) void UnHook()
{DetourTransactionBegin();//拦截开始DetourUpdateThread(GetCurrentThread());//刷新当前线程//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOKDetourDetach((void **)&oldsystem, newsystem); //撤销拦截函数DetourTransactionCommit();//拦截生效
}// 劫持别人的程序:通过DLL注入,并调用Hook函数实现劫持。
// 劫持系统:通过DLL注入系统程序(如winlogon.exe)实现劫持系统函数。_declspec(dllexport)  void main(){Hook(); // 拦截system("tasklist"); //弹出提示框UnHook(); // 解除拦截system("ipconfig"); //成功执行system("pause"); // 成功执行
}

3. 生成"劫持1.dll"文件

4. 把dll注入到QQ.exe

DLL注入工具下载: https://coding.net/u/linchaolong/p/DllInjector/git/raw/master/Xenos.exe
        (1) 打开dll注入工具,点击add,选择"劫持1.dll"

(2) 在Process中选择QQ.exe,点击Inject进行注入。

(3) 点击菜单栏Tools,选择Eject modules显示当前QQ.exe进程中加载的所有模块,如果有"劫持1.dll"表示注入成功。

5. 拦截QQ执行system函数

(1) 点击Advanced,在Init routine中填写动态库(dll)中的函数的名称,如Hook,然后点击Inject进行调用。此时,我们已经把system函数劫持了。
        (2) 点击Advanced,在Init routine中填写main,执行动态库中的main函数。

此时,弹出一个对话框,问是否允许执行tasklist指令,表示成功把system函数拦截下来了。

参考

DLL注入工具源码地址: https://coding.net/u/linchaolong/p/DllInjector/git
说明:
该工具来自以下两个项目
Xenos: https://github.com/DarthTon/Xenos.git
Blackbone: https://github.com/DarthTon/Blackbone

C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)相关推荐

  1. Android安全-SO动态库注入

    2019独角兽企业重金招聘Python工程师标准>>> 关于这方面技术,网上已经有大把的实现.在此,我只是记录下自己的学习过程. 0x1 原理 所谓的SO注入就是将代码拷贝到目标进程 ...

  2. WIN动态库注入(远线程注入)

    所谓动态库注入是指,将自己编写的动态库,通过自己的程序来注入到别的进程中去,然后运行. 原理: 在目标进程,开辟一段内存,然后写入要注入的动态库.dll .然后让目标运行加载动态库函数,将该动态库载入 ...

  3. 【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )

    文章目录 一.函数拦截流程 二.定位动态库及函数位置 一.函数拦截流程 函数拦截流程 : 定位动态库及函数位置 : 获取该动态库在内存中的位置 , 以便于 查找函数位置 ; 插桩 : 在函数的入口处插 ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )

    文章目录 前言 一.加载 libnattive.so 动态库 二. libnattive.so 动态库启动 三. pthread_create 线程开发 四. 线程执行函数 前言 libbridge. ...

  5. IOS上的几种注入动态库的方式

    0x00 准备环境 编译dylib 首先得先写一个测试用的动态库.Xcode 新建 iOS 工程的时候,选择 Framework 工程,默认文件格式为动态库 #import <Foundatio ...

  6. iOS Hacker 重签名实现无需越狱注入动态库 dylib

    iOS Hacker 重签名实现无需越狱注入动态库 dylib 一.获取 ipa 文件 iOS 的应用都是打包成 ipa 的文件格式,ipa 文件实际上就是 zip 格式的文件,通过 unzip 可以 ...

  7. SQL注入—跨库注入

    SQL注入-跨库注入 1.SQL注入-跨库注入 1.1.前言 1.2.跨库注入介绍 2.跨库注入 2.1.跨库注入准备 2.2.跨库注入流程 2.2.1.判断是否为管理员权限 2.2.2.获取数据库下 ...

  8. 动态库注入app以及在非越狱手机使用

    动态库注入app以及在非越狱手机使用 1. 动态库编写 动态库编写有多种方式,可以使用Xcode创建动态库,也可以通过tweak生成动态库 对于越狱手机,可以直接编写tweak,将tweak打包成动态 ...

  9. iOS安全攻防(十九):基于脚本实现动态库注入

    基于脚本实现动态库注入 MobileSubstrate可以帮助我们加载自己的动态库,于是开发者们谨慎的采取了对MobileSubstrate的检索和防御措施. 那么,除了依靠MobileSubstra ...

最新文章

  1. osgearth+vs2010安装
  2. linux制作共享服务器,Linux如何制作一个简单的共享服务器
  3. js webpack 配置路径_webpack中如何设置html引入js的路径
  4. Flink实时计算性能分析
  5. 你真的了解Maven pom.xml 的配置吗?【详解maven pom】
  6. kitten编程猫里的工具函数
  7. 13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)
  8. 如何使用C语言的面向对象?
  9. Scipy信号分析处理(基线漂移、滤波)(笔记01)
  10. 【基础教程】信噪比+香农公式【1748期】
  11. 一套适合入门的Oracle学习视频
  12. c#迁移文件的时候提示:对路径xxx的访问被拒绝
  13. 围观Razavi和Sansen打架——电流并联反馈
  14. 【vijos】在vijos的自己的域中创建题目
  15. 机器学习知识总结 —— 8. 什么是有监督学习、无监督学习、半监督学习
  16. 7-4 华氏度转摄氏度 (5分)_PTA_Java基础练习
  17. Using Oracle Database 11g Release 2 Result Cache in an Oracle RAC Environment
  18. Java 2 实用教程(第5版)耿祥义版 习题七
  19. 你还在关注 AGV,而 AMR 已经悄然崛起
  20. js实现人物移动(附有全部代码以及解析)

热门文章

  1. 生信宝典之傻瓜式 (五) - 文献挖掘查找指定基因调控网络
  2. 大联合 - 单细胞测序在新冠肺炎研究中的应用进展 (PPT)
  3. laravel 提交Request 请求后会莫名多出一个s参数,导致数据库报错问题的解决方法
  4. 【docker】第三节:nginx通过外部无法访问的情况解决方法。
  5. mysql抖动可能的原因_MySQL应对网络抖动问题
  6. 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
  7. oracle删除已创建的用户,ORACLE用户创建删除
  8. Linux笔记-iptables模拟公司环境配置
  9. Web前端笔记-解决NicSroll使用后页面跳动(每次刷新或进入跳动一下然后正常)问题
  10. PHP笔记-PHP中构造函数要注意的地方