【求助】Detour3.0 如何把dll注入到一个已经正在运行的进程

Gary@Tokyo 2011-09-29 06:40:05

DetourCreateProcessWithDll,这个函数是开启一个新进程

Detour1.5中有个 DetourContinueProcessWithDll,但是在2.1以后就没有了

请问怎么实现DetourContinueProcessWithDll这个功能。

把代码直接拷贝过来,发现被注入的进程会崩溃。


...全文
824 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gary@Tokyo 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 duyalong 的回复:]

请教下楼主是怎么把detour编译成detour.dll的,我也在用detour3.0,以前用的是老版本的,现在在win7下好像不支持以前的老版本了
[/Quote]

我暂且只是用lib,没有用DLL,暂且只是一个调研阶段

应当是改MAKEFILE文件可以输出DLL吧
Gary@Tokyo 2011-10-11
  • 打赏
  • 举报
回复
没有人了解么

duyalong 2011-10-11
  • 打赏
  • 举报
回复
请教下楼主是怎么把detour编译成detour.dll的,我也在用detour3.0,以前用的是老版本的,现在在win7下好像不支持以前的老版本了
jamseyang 2011-10-02
  • 打赏
  • 举报
回复
可惜还是不支持64位的!
Gary@Tokyo 2011-10-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jamseyang 的回复:]

网上没找到Detour3.0,麻烦楼主把Detour3.0发给我,邮箱appview@163.com,谢谢!
[/Quote]
呃,你直接google 就好了

http://research.microsoft.com/en-us/projects/detours/
W1nds 2011-09-30
  • 打赏
  • 举报
回复
楼主是不是把拦截的东西写在一个DLL里面,用的是destour方式?
如果是的话注入的DLL就是你这个DLL呀
两种方法注入的DLL当然就是你这个DLL咯
Gary@Tokyo 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hxfjb 的回复:]

在detour 2.1中好像有这个函数,在creatwth.cpp中。
[/Quote]

这个是1.5中的

我现在用的3.0

之前的版本好像有bug
Gary@Tokyo 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 evi10r 的回复:]

如果运行了 通过钩子或远程线程或GetThreadContext r0下也好多注入DLL的方法拦截API
没运行 就可以用到你说的那个DetourCreateProcessWithDll运行某个程序同时给它附加一个DLL
[/Quote]
我也是这么考虑,但还是没有成功。

这两个注入的DLL也不一样,是么
hxfjb 2011-09-30
  • 打赏
  • 举报
回复
在detour 2.1中好像有这个函数,在creatwth.cpp中。
W1nds 2011-09-30
  • 打赏
  • 举报
回复
如果运行了 通过钩子或远程线程或GetThreadContext r0下也好多注入DLL的方法拦截API
没运行 就可以用到你说的那个DetourCreateProcessWithDll运行某个程序同时给它附加一个DLL
Gary@Tokyo 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hxfjb 的回复:]

如果仅仅考虑线程注入的话,你不妨使用《windows核心编程》中的源代码,现成的函数InjectLibW。
[/Quote]

主要是拦截API

比如某个程序,如果已经在运行了,那我就直接注入拦截对方的API

如果没在运行,则开启该程序并拦截API

Windows核心编程中的代码我没有仔细看,稍微看了看,那我再试试,Thanks
jamseyang 2011-09-30
  • 打赏
  • 举报
回复
网上没找到Detour3.0,麻烦楼主把Detour3.0发给我,邮箱appview@163.com,谢谢!
Gary@Tokyo 2011-09-30
  • 打赏
  • 举报
回复
没有啊,我测试了,没有死循环
hxfjb 2011-09-30
  • 打赏
  • 举报
回复
你的调用方法是不是死循环了啊?
int WINAPI MyMessageBoxW(HWND hWnd ,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType)
{
MessageBox(NULL,"MessageBox被拦截","API",MB_OK); //相对于调用MessageBoxA,该函数会自动调用//MessageBoxW,而MessageBoxW又被hook了,死循环?
return pMessageBoxW(hWnd,lpText,lpCaption,uType);
}
Gary@Tokyo 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 evi10r 的回复:]

楼主是不是把拦截的东西写在一个DLL里面,用的是destour方式?
如果是的话注入的DLL就是你这个DLL呀
两种方法注入的DLL当然就是你这个DLL咯
[/Quote]
嗯,我把要拦截的写在这DLL中

然后我用这个注入正在运行的程序拦截不到messagebox



#include "stdafx.h"
#include <cstdio>
#include <windows.h>

#include <detours.h>

#pragma comment(lib,"detours.lib")


int (WINAPI *pMessageBoxW)(HWND hWnd ,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType) = MessageBoxW;

int WINAPI MyMessageBoxW(HWND hWnd ,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType)
{
MessageBox(NULL,"MessageBox被拦截","API",MB_OK);
return pMessageBoxW(hWnd,lpText,lpCaption,uType);
}


BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
int error;
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pMessageBoxW, MyMessageBoxW);
if(DetourTransactionCommit() == NO_ERROR)
OutputDebugString("send() detoured successfully");
}
break;
case DLL_PROCESS_DETACH:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pMessageBoxW, MyMessageBoxW);
DetourTransactionCommit();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
W1nds 2011-09-29
  • 打赏
  • 举报
回复
#undef UNICODE
#include <cstdio>
#include <windows.h>
#include <detours\detours.h>
int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
char* DirPath = new char[MAX_PATH];
char* DLLPath = new char[MAX_PATH]; //testdll.dll
char* DetourPath = new char[MAX_PATH]; //detoured.dll
GetCurrentDirectory(MAX_PATH, DirPath);
sprintf_s(DLLPath, MAX_PATH, "%s\\testdll.dll", DirPath);
sprintf_s(DetourPath, MAX_PATH, "%s\\detoured.dll", DirPath);
DetourCreateProcessWithDll(NULL, "C:\\windows\\notepad.exe",
NULL,NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL,&si, &pi, DetourPath, DLLPath, NULL);
delete [] DirPath;
delete [] DLLPath;
delete [] DetourPath;
return 0;
}
它的参数就是在普通的CreateProcess基础上增加了两个DLL的路径参数,最后一个参数为创建进程的函数指针,默认为CreateProcessA,简单的说就是可以在创建进程的時候加载一個dll
貌似不是算是注入
hxfjb 2011-09-29
  • 打赏
  • 举报
回复
如果仅仅考虑线程注入的话,你不妨使用《windows核心编程》中的源代码,现成的函数InjectLibW。
hxfjb 2011-09-29
  • 打赏
  • 举报
回复
“把代码直接拷贝过来,被注入的进程崩溃。”原因应该是你的Detour函数有bug。
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的函数的入口地址 ---- 说明:DetourFindFunctio

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧