编程语言
首页 > 编程语言> > 【C/C++教学】劫持?劫持?劫持?!!!

【C/C++教学】劫持?劫持?劫持?!!!

作者:互联网

写在前面

今天有个小伙伴跟我说,哇塞你在教室就是学习,回宿舍就打代码,都没有娱乐活动耶。然后我蛋蛋一笑,很装逼地回了一句:卧槽打代码不快乐吗???

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

咳咳,回到今天正题

那么

今天讲的是???

没错

今天讲的是…

是…

传说中的【劫持】

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

本节纲要

- 什么是劫持

- detours的下载与编译

- detours的使用实例

01

什么是劫持

相信大家都有过这种经历,某一天你兴高采烈打开电脑想吃两把鸡的时候。突然发现电脑的所有程序都打不开了,无论怎么点击都只是弹了个错误窗口。这时候你的电脑就可能是被恶意程序给劫持了。


所以呢,本节讨论的劫持,就是指:程序通过修改目标函数的指针,使其指向了自定义的一个函数。


通俗点就是:当你双击桌面上某个程序的时候,本来系统是要通过调用CreateProcess函数创建一个进程,但是指向这个函数的指针被修改了,系统跑去调用了hacker自定义的那个函数。而原本的函数就被拦截了。

detours的下载与编译

02

- detours简介

Detours 是Microsoft开发一个库

它有下面这两方面的功能:

1 拦截x86机器上的任意的win32 API函数。

2 插入任意的数据段到PE文件中,修改DDL文件的导入表。


本节主要讨论它的第一功能。Detours拦截API的原理主要还是在汇编层改变目标API出口和入口的一些汇编指令,细节咱们跳过(其实我也不懂……)。


- detours的下载与编译

下载地址:http://research.microsoft.com/en-us/projects/detours/

下载得到的是一个名为Detours的压缩包,将其解压出来,比如我是解压到了C盘根目录下的detours文件夹。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

然后找到vs的开发者命令提示符。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

打开提示符后,切换到你解压出来的detours文件目录,进入里面的scr源文件目录,然后输入nmake回车,进行编译构建。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

等待构建完成之后,可以在include文件夹找到detours.h

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

在lib.X86文件夹找到detours.lib。将这两文件copy到一个目录,咱们一会写代码要用到。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

03

detours的使用实例

好了,万事俱备了,小伙伴们此时是不是按耐不住内心的激动想要搞点事情了呢?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

别急。咱们先来看看detours中的几个关键函数吧:


1.对detours进行初始化. DetourTransactionBegin() 


2。更新进行detours的线程. DetourUpdateThread(GetCurrentThread()) 


3.在进行上面两步以后,接下来就可以用DetourAttach()函数驱动detours执行了,它的定义如下:

LONG DetourAttach( 
PVOID * ppPointer, 
PVOID pDetour 
);

这个函数的职能呢是将目标API挂接起来。

第一个参数是一个指向将要被挂接函数地址的函数指针,就是指向原来的函数地址。

第二个参数是指向实际要调用的函数的指针,

一般我们都让它指向我们自定义的函数地址。


4.让detour函数起作用并检查函数的返回值判断是正确还是错误

DetourTransactionCommit()


最后在多说两句:

如果我们想把拦截的函数恢复的话,可以用下面这个函数,参数和DetourAttach一样,步骤和上面的基本一致。

LONG WINAPI DetourDetach( 
PVOID *ppPointer, 
PVOID pDetour) 


好了,下面我们的表演开屎。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

劫持自身

我们先来写一个简单小程序,来实现对自身函数调用的拦截试试。在这里呢主要是拦截程序中调用的system函数。让它不能干活。【顺带一提,请把前面编译好的detours.h和detours.lib放到构建工程目录下,编译的时候请设置为release模式才有效,因为debug模式本身就是劫持】

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

看看效果:


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

可以看到,hook()前的system能正常执行,打开了一个calc。hook()的system已经变成了我们自定义的newsystem函数了。成功劫持了自身。

劫持别人

可能已经有同学注意到,劫持自身也装不了什么B啊。能不能劫持别人,让它不能干活呢?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

答案是肯定的,劫持其他程序有多种方式,比如全局hook,dll注入等。这里介绍下dll注入。我们打算拦截CreateProcess创建进程这个函数,让它创建不了进程。

这里在程序属性里设置一下,配置类型改为dll.然后生成

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

哎,截不了那么长的图大家凑合着看一下。生成了dll以后,咱们借助咱的dll注入工具来测试一下效果吧。这里再写一个创建进程的小程序测试一下,每5秒打开一个记事本。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

可以看到。注入之后,notepad进程不再创建,而是弹出了交保护费的窗口。如果把这个dll注入到explorer.exe里面会发生什么,嘿嘿可想而知。关于dll注入有关知识,以后有时间再讲吧。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


标签:劫持,函数,C++,dll,编译,detours,拦截,教学
来源: https://blog.51cto.com/u_14328065/2871073