IATHook
IATHookClass.h
#pragma once #include <Windows.h> class IATHookClass
{
private:
DWORD oldAddr;
DWORD newAddr; public:
BOOL Hook(char *apiName, DWORD callfunc);
BOOL UnHook(void);
};
IATHookClass.cpp
#include "IATHookClass.h" BOOL IATHookClass::Hook(char *apiName, DWORD callfunc)
{
BOOL bOk = FALSE;
HMODULE hMod = GetModuleHandle(NULL);
IMAGE_DOS_HEADER *pDosHeader = (IMAGE_DOS_HEADER *)hMod;
IMAGE_OPTIONAL_HEADER *pOptHeader = (IMAGE_OPTIONAL_HEADER *)((BYTE *)hMod + pDosHeader->e_lfanew + );
IMAGE_IMPORT_DESCRIPTOR *pImportDesc = (IMAGE_IMPORT_DESCRIPTOR *)((BYTE *)hMod + pOptHeader->DataDirectory[].VirtualAddress); while (pImportDesc->FirstThunk)
{
char *pszDllName = (char *)((BYTE *)hMod + pImportDesc->Name);
IMAGE_THUNK_DATA *pThunk = (IMAGE_THUNK_DATA *)((BYTE *)hMod + pImportDesc->FirstThunk);
IMAGE_THUNK_DATA *pThunkDesc = (IMAGE_THUNK_DATA *)((BYTE *)hMod + pImportDesc->OriginalFirstThunk); while (pThunkDesc->u1.Function)
{
if (!lstrcmpi(apiName, (char *)((BYTE *)hMod + (DWORD)pThunkDesc->u1.AddressOfData + )))
{
IATHookClass::oldAddr = pThunk->u1.Function;
IATHookClass::newAddr = (DWORD)callfunc;
DWORD dwOldProtect = ; VirtualProtect((LPVOID)&pThunk->u1.Function, , PAGE_EXECUTE_READWRITE, &dwOldProtect);
bOk = (pThunk->u1.Function = callfunc) ? TRUE : FALSE;
VirtualProtect((LPVOID)&pThunk->u1.Function, , dwOldProtect, &dwOldProtect);
CloseHandle(hMod);
return bOk;
}
pThunk++;
pThunkDesc++;
}
pImportDesc++;
}
CloseHandle(hMod);
return bOk;
} BOOL IATHookClass::UnHook(void)
{
BOOL bOk = FALSE;
HMODULE hMod = GetModuleHandle(NULL);
IMAGE_DOS_HEADER *pDosHeader = (IMAGE_DOS_HEADER *)hMod;
IMAGE_OPTIONAL_HEADER *pOptHeader = (IMAGE_OPTIONAL_HEADER *)((BYTE *)hMod + pDosHeader->e_lfanew + );
IMAGE_IMPORT_DESCRIPTOR *pImportDesc = (IMAGE_IMPORT_DESCRIPTOR *)((BYTE *)hMod + pOptHeader->DataDirectory[].VirtualAddress); while (pImportDesc->FirstThunk)
{
char *pszDllName = (char *)((BYTE *)hMod + pImportDesc->Name);
IMAGE_THUNK_DATA *pThunk = (IMAGE_THUNK_DATA *)((BYTE *)hMod + pImportDesc->FirstThunk);
while (pThunk->u1.Function)
{
if (IATHookClass::newAddr == pThunk->u1.Function)
{
DWORD dwOldProtect = ;
VirtualProtect((LPVOID)&pThunk->u1.Function, , PAGE_EXECUTE_READWRITE, &dwOldProtect);
bOk = (pThunk->u1.Function = IATHookClass::oldAddr) ? TRUE : FALSE;
VirtualProtect((LPVOID)&pThunk->u1.Function, , dwOldProtect, &dwOldProtect);
CloseHandle(hMod);
if (bOk)
{
IATHookClass::newAddr = ;
IATHookClass::oldAddr = ;
}
return bOk;
}
}
}
CloseHandle(hMod);
return bOk;
}
IATHook的更多相关文章
- PE格式: 分析IatHook并实现
Ring 3层的 IAT HOOK 和 EAT HOOK 其原理是通过替换IAT表中函数的原始地址从而实现Hook的,与普通的 InlineHook 不太一样 IAT Hook 需要充分理解PE文件的 ...
- 《逆向工程核心原理》——IAThook
hook逻辑写入dll中,注入dll. #include "pch.h" #include <tchar.h> #include "windows.h&quo ...
- WinNTSetup v3.8.7 正式版绿色增强版
最强系统安装利器:WinNTSetup 现已更新至 v3.8.7 正式版!这次更新修复调整了诸多问题,新版非常好用接近完美!WinNTSetup 现在已经自带BCDBoot 选项,并且完全支持Wind ...
- Qt StyleSheet皮肤(黑色,比较好看,而且很全)
使用方式如下 //设置皮肤样式 static void SetStyle(const QString &styleName) { QFile file(QString(":/imag ...
- EAT/IAT Hook
标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #in ...
- Windows系统版本号判定那些事儿
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Windows系统版本判定那些事儿
v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...
- hook 9大类
HOOK技术主要分为两大类,一是内核层HOOK,一是用户层HOOK. 用户层HOOK也就是在ring3环境下hook kenerl32.dll.User3.dll.Gui32.dll.Advapi.d ...
- Windows系统版本判定那些事儿[转]
Windows系统版本判定那些事儿 转自CSDN,原文链接,我比较不要脸, 全部给复制过来了 前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度 ...
随机推荐
- jdbc 操作步骤详解
package com.itheima.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql ...
- HBase 相关API操练(三):MapReduce操作HBase
MapReduce 操作 HBase 在 HBase 系统上运行批处理运算,最方便和实用的模型依然是 MapReduce,如下图所示. HBase Table 和 Region 的关系类似 HDFS ...
- Hadoop计数器
1. MapReduce计数器是什么 计数器是用来记录Job的执行进度和状态的,其作用类似于日志.我们可以在程序的某个位置插入计数器,记录数据或进度的变化情况. 2. MapReduce计数器能做什么 ...
- 【Linux】ubuntu安装jdk-6u45-linux-x64.bin
for : Android4.4源码编译 环境 : ubuntu12.04_desktop_amd64 1. 1.1.jdk-6u45-linux-x64.bin 放置于 /home 1.2.命令&q ...
- WebGL之物体选择
原文地址: WebGL之物体选择 使用WebGL将图形绘制到画布后,如何与外部进行交互?这其中最关键的就是如何实现物体的选择.比如鼠标点击后判断是否选中了某个图形或图形的某个部分. 本节实现的效果: ...
- CXF 发布rest服务
1.1 什么是rest服务 REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 做传输协议,REST 对于HTTP 的利用实现精确的资源定位. Rest要求对资源定位更加准 ...
- 利用rand7()构造rand10()
题意 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10 参考代码 int rand7() { srand((int)time(NULL)) ...
- 12.Visual Studio 2013中的默认快捷键
这篇大致是IDE的使用技巧,常用的也就那么几个. 我自己用的最多的是注释.取消注释.格式调整.运行测试.开始调试.断开调试.重新开始调试.删除行ctrl+L.保存.全部保存.打开资源管理器.搜索等几个 ...
- UIView剖析之Draw、Size、Layout方法
一.基于UIView的Layer的方法 关于UIView的Layer,IOS提供了三个方法: 1.layoutSubviews 在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空), ...
- json解析数组类型的数据
//微信里一个检测是否有发送模版消息的权限的方法//此处的openid代表的微信用户openid,templateId代表的是模版消息idpublic boolean checkIsSendTempM ...