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

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

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

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

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

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


...全文
919 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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。

15,473

社区成员

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

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