0x01 简介

有人称它为“钩子”,有人称它为“挂钩”技术。谈到钩子,很容易让人联想到在钓东西,比如鱼钩就用于钓鱼。编程技术的钩子也是在等待捕获系统中的某个消息或者动作。钩子的应用范围非常广泛,比如输入监控、API拦截、消息捕获、改变程序执行流程等方面。杀毒软件会用Hook技术钩住一些API函数,比如钩住注册表读写函数,从而防止病毒对注册表进行写入;病毒使用Hook技术有针对性的捕获键盘的输入,从而记录用户的密码等敏感信息;文件加密系统通过Hook技术在不改变用户操作的情况下对用户的文件进行透明加密,这些都属于Hook范畴的知识。

在windows系统下,Hook技术的方法比较多,使用比较灵活,常见的Hook方法有Inline Hook,IAT Hook,Windows钩子。。。Hook技术涉及DLL相关的知识。Hook技术也涉及注入的知识,想要把完成Hook功能的DLL文件加载到目标进程空间中,就要使用注入的知识。

0x02 常见Hook技术介绍

Inline Hook

API函数都保存在操作系统提供的DLL文件中,当在程序中调用某个API函数并运行程序后,程序会隐式地将API函数所在的DLL文件加载入内存中,这样,程序就会像调用自己的函数一样调用API。Inline Hook这种方法是在程序流程中直接进行嵌入jmp指令来改变流程的。

Inline Hook流程

构造跳转指令。

在内存中找到欲Hook函数地址,并保存欲Hook位置处的前5字节。

将构造的跳转指令写入需Hook的位置处。

当被Hook位置被执行时会转到自己的流程执行。

如果要执行原来的流程,那么取消Hook,也就是还原被修改的字节。

执行原来的流程。

继续Hook住原来的位置

这就是Inline Hook的大概流程。

导入地址表钩子-IAT HOOK

导入地址表是PE文件结构中的一个表结构。在可执行文件中使用其他DLL可执行文件的代码或数据,成为导入或者输入。当PE文件需要运行时,将被系统加载至内存中,此时windows加载器会定位所有的导入的函数或者数据将定位到的内容填写至可执行文件的某个位置供其使用。这个地位是需要借助于可执行文件的导入表来完成的。导入表中存放了所使用的DLL的模块名称及导入的函数名称或函数序号。

在加壳和脱壳的研究中,导入表是非常关键的部分。加壳要尽可能地隐藏或破坏原始的导入表。脱壳一定要找到或者还原或者重建原始的导入表,如果无法还原或修过脱壳后的导入表的话,那么可执行文件仍然是无法运行的。

windows钩子函数

windows下的窗口应用程序是基于消息驱动的,但是在某种情况下需要捕获或者修改消息,从而完成一些特殊的功能。对于捕获消息而言,无法使用IAT或Inline Hook之类的方式去进行捕获,不过windows提供了专门用于处理消息的钩子函数。

windows系统提供的钩子按照挂钩范围分为局部钩子和全局钩子。局部钩子是针对一个线程的,而全局钩子这是针对这个操作系统内基于消息机制的应用程序的。全局钩子需要使用DLL文件,DLL文件里面存放了钩子函数的代码。

在操作系统中安装全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件会被操作系统自动或强行加载到该进程中,由此可见,设置消息钩子也是一种可以进行DLL注入的方法。

windows下的钩子函数,主要用3个,分别是SetWindowsHookEx() 、CallNextHookEx()和UnhookWindowsHookEx()

0x03 实例

Inline Hook实例

首先通过Process Explorer可以查看程序的父进程,可以看出,大部分普通的应用程序都是由explorer.exe进程创建的(像360、QQProtect以及一些驱动程序除外),那么知道把Explorer.exe 进程中CreateProcessW()函数Hook住,就可以针对要完成的工作做很多事情了,比如,可以记录哪个应用程序被启动,也可以对应用程序进行拦截。

关键代码如下:

ILHook.cpp

#include "ILHook.h"

CILHook::CILHook()

{ // 对成员变量的初始化 m_pfnOrig = NULL; ZeroMemory(m_bOldBytes, 5); ZeroMemory(m_bNewBytes, 5);

}

CILHook::~CILHook()

{ // 取消HOOK UnHook(); m_pfnOrig = NULL; ZeroMemory(m_bOldBytes, 5); ZeroMemory(m_bNewBytes, 5);

}

/*

函数名称:Hook

函数功能:对指定模块中的函数进行挂钩

参数说明: pszModuleName:模块名称 pszFuncName: 函数名称 pfnHookFunc: 钩子函数

*/

BOOL CILHook::Hook(LPSTR pszModuleName, LPSTR pszFuncName, PROC pfnHookFunc)

{ BOOL bRet = FALSE; // 获取指定模块中函数的地址 m_pfnOrig = (PROC)GetProcAddress(GetModuleHandle(pszModuleName), pszFuncName); if ( m_pfnOrig != NULL ) { // 保存该地址处5个字节的内容 DWORD dwNum = 0; ReadProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bOldBytes, 5, &dwNum); // 构造JMP指令 m_bNewBytes[0] = '\xe9'; // jmp Opcode // pfnHookFunc是我们HOOK后的目标地址 // m_pfnOrig是原来的地址 // 5是指令长度 *(DWORD *)(m_bNewBytes + 1) = (DWORD)pfnHookFunc - (DWORD)m_pfnOrig - 5; // 将构造好的地址写入该地址处 WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bNewBytes, 5, &dwNum); bRet = TRUE; } return bRet;

}

/*

函数名称:UnHook

函数功能:取消函数的挂钩

*/

VOID CILHook::UnHook()

{ if ( m_pfnOrig != 0 ) { DWORD dwNum = 0; WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bOldBytes, 5, &dwNum); }

}

/*

函数名称:ReHook

函数功能:重新对函数进行挂钩

*/

BOOL CILHook::ReHook()

{ BOOL bRet = FALSE; if ( m_pfnOrig != 0 ) { DWORD dwNum = 0; WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bNewBytes, 5, &dwNum); bRet = TRUE; } return bRet;

}

HookCreateProcess.cpp

#include "ILHook.h"

CILHook CreateProcessHook;

// 我们实现的Hook函数

BOOL

WINAPI

MyCreateProcessW( LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation )

{ BOOL bRet = FALSE; if ( MessageBoxW(NULL, lpApplicationName, lpCommandLine, MB_YESNO) == IDYES ) { CreateProcessHook.UnHook(); bRet = CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); CreateProcessHook.ReHook(); } else { MessageBox(NULL, "您启动的程序被拦截", "提示", MB_OK); } // CreateProcessHook.UnHook();

// // 弹出被创建进程的进程名

// MessageBoxW(NULL, lpApplicationName, lpCommandLine, MB_OK);

//

// // 创建进程

// bRet = CreateProcessW(lpApplicationName,

// lpCommandLine,

// lpProcessAttributes,

// lpThreadAttributes,

// bInheritHandles,

// dwCreationFlags,

// lpEnvironment,

// lpCurrentDirectory,

// lpStartupInfo,

// lpProcessInformation);

//

// CreateProcessHook.ReHook(); return bRet;

}

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )

{ switch ( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: { // Hook CreateProcessW()函数 CreateProcessHook.Hook("kernel32.dll", "CreateProcessW", (PROC)MyCreateProcessW); break; } case DLL_PROCESS_DETACH: { CreateProcessHook.UnHook(); break; } } return TRUE;

}

钩子实例:

这里实现一个简单的键盘记录工具。

关键代码如下:

KeyBoradHookTest.cpp  主要来生成dll文件,在该dll文件中需要定义两个导出函数和两个全局变量。

// KeyBoradHookTest.cpp : Defines the entry point for the DLL application.

//

#include "stdafx.h"

extern "C" __declspec(dllexport) VOID SetHookOn();

extern "C" __declspec(dllexport) VOID SetHookOff();

// 钩子句柄

HHOOK g_Hook = NULL;

// DLL模块句柄

HINSTANCE g_Inst = NULL;

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )

{ // 保存DLL的模块句柄 g_Inst = (HINSTANCE)hModule; return TRUE;

}

// 钩子函数

LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information

)

{ if ( code < 0 ) { return CallNextHookEx(g_Hook, code, wParam, lParam); } if ( code == HC_ACTION && lParam > 0 ) { char szBuf[MAXBYTE] = { 0 }; GetKeyNameText(lParam, szBuf, MAXBYTE); MessageBox(NULL, szBuf, NULL, MB_OK); } return CallNextHookEx(g_Hook, code, wParam, lParam);

}

VOID SetHookOn()

{ // 安装钩子 g_Hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_Inst, 0);

}

VOID SetHookOff()

{ // 卸载钩子 UnhookWindowsHookEx(g_Hook);

}

0x04Reference

1.http://blog.csdn.net/u013761036/article/details/52268500 DLL劫持(HiJack)原理以及实现细节

没有一个系统是安全的 Know it,And hack it!

hook技术截取服务器信息,Windows Hook技术相关推荐

  1. 计算机技术+智能化水电站,济南研祥嵌入式技术在水库信息智能化系统中的应用———济南研祥嵌入式技术在水库信息...

    [编辑简介]:本文分析了水库信息智能化系统的现状和需求,介绍以研祥EVOC嵌入式智能平台为基础构建的系统解决方案,给出系统结构框图及硬件配置.[摘要]:阐述水库信息智能化系统的组成以及如何采用EIP嵌 ...

  2. 基于Windows Media技术的流媒体系统的设计与实现

    摘要:本文在简介流媒体技术及其中的Windows Media技术的基础上,结合实际简述了Windows Media服务器的安装.ASF文件的制作以及"点播单播发布点"." ...

  3. mysql报11004_使用mysqli扩展技术查看服务器连接错误报告的方法

    使用mysqli扩展技术查看服务器连接错误报告的方法 作为PHP的黄金搭档MySQL数据库,在PHP项目开发过程中有着举足轻重的作用,这不仅因为MySQL是完全免费的,而且和PHP一样都是完全跨平台的 ...

  4. 服务器虚拟化技术实现,服务器虚拟化关键技术及其系统实现

    <服务器虚拟化关键技术及其系统实现>由会员分享,可在线阅读,更多相关<服务器虚拟化关键技术及其系统实现(9页珍藏版)>请在人人文库网上搜索. 1.服务器虚拟化关键技术及其系统实 ...

  5. android hook技术教学视频,[科普向]hook技术简单介绍

    首先 1.  这只是科普向,会介绍相关Hook技术及原理,但是不会给源码.源码请自行百度 2.请至少有一点Windows编程经验,知道系统API是什么...以免看科普内容给您带来不适 3.这里结合了一 ...

  6. android hook 第三方app_【MiSRC】技术分享-浅谈android hook技术

    注:本文为"小米安全中心"原创,转载请联系"小米安全中心" 前言 xposed框架 xposed,主页:http://repo.xposed.info/modu ...

  7. Windows Hook 易核心编程勾子基本理念

    前言 以前我非常沉迷入黑客,每每看着高手们发到网上的攻击检测程序心中那个羡慕啊,要是那天我也能写出这样的程序该多好啊可是,我也就只有羡慕的份,谁叫自己不懂英语呢,又没有中文的编程语言直到有一天,我在一 ...

  8. Windows Hook 易语言核心编程勾子基本理念

    前言    以前我非常沉迷入黑客,每每看着高手们发到网上的攻击检测程序 心中那个羡慕啊,要是那天我也能写出这样的程序该多好啊 可是,我也就只有羡慕的份,谁叫自己不懂英语呢,又没有中文的编程语言 直到有 ...

  9. 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9

    <网络对抗技术>Exp6 信息搜集与漏洞扫描 Week9 一.实验目标与内容 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 使用搜索 ...

  10. 服务器内容推送技术(转)

    服务器内容推送技术 1.    传统轮询:利用WEB页面META刷新机制,指定一定时间间隔进行页面装载服务. 不足:用户体验差,服务器压力大 2.    Ajax轮询:采用异步响应机制 不足:有延迟, ...

最新文章

  1. linux 线程操作问题undefined reference to ‘pthread_create‘的解决办法(cmake)
  2. pycharm 提示 ennble Code compatibility inspection(代码兼容性检查)
  3. PyTorch机器学习从入门到实战
  4. 文献学习(part6)--Clustering ensemble based on sample’s stability
  5. [vue] webpack打包vue速度太慢怎么办?
  6. 结型场效应管的结构、特性、参数
  7. ibatis.net:第六天,QueryForList
  8. QGIS for Android 开发:一、Ubuntu环境搭建
  9. 3.2 选择最可能的句子
  10. 吴恩达《机器学习》--- Logistic分类
  11. hibernate的入门
  12. linux驱动之设备号与创建设备节点
  13. ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. TensorFlow requires that these DLLs be inst
  14. 为什么会出现数据库可疑_为什么要监视网络中的可疑活动
  15. 南开大学张昊计算机,纽约南开校友会隆重举办纪念南开大学建校100周年庆典
  16. 铺地毯(NOIP真题)
  17. 绿色建筑评定解析丨智行有嘉
  18. python绘制多个散点图_绘制多个散点图熊猫
  19. J2EE体系架构设计
  20. 批处理与管道-过滤器

热门文章

  1. c语言编程悬臂梁受力分析,悬臂梁-静力学分析(
  2. 非计算机专业考研软件工程,#考研报名#计算机类、软件工程类考生报名前必看...
  3. 【分布式机器学习】基本知识
  4. 百度网盘机器人软件工具自动发货管理文件好友群补发文件资料 (可用于拼多多淘宝闲鱼虚拟店商品自动发货)
  5. mysql新闻管理系统表_《新闻管理系统》数据库设计_参考答案.doc
  6. java web实现markdown_editormd实现Markdown编辑器写文章功能
  7. 【中等】迷你语法分析器
  8. AB工业计算机编程软件,罗克韦尔/AB VersaView 5100 工业监视器
  9. 学习weka(1):weka软件安装使用教程
  10. android 分辨率 720 1184 适配,墨迹天气 Android版最新!趋势界面可以横向滑动切换城市!...