我的实现在一些程序上测试通过。 比如 notepad.exe, foobar. 但 TM 失败了...
今天偶然发现 detours 还有另一个程序 withdll.exe, 它和 setdll.exe 不同. setdll 修改了 exe 文件的 import table. 而 withdll 的做法是启动目标 exe, 挂起之, 然后注入 dll, 再让程序正常运行.
如果程序是靠检测 exe 自身的校验. 那么 withdll 的方法可能能逃过检测.
另外, 修改 import table 还导致其他的一些问题. 比如 TM 被修改之后, 启动时提示程序初始化错误.
使用 withdll 之后, TM能够正常启动, 而且实现了监视的功能.
使用 withdll.exe 来启动程序:
withdll /d:accessfile.dll yourprogram.exe
我重新打包了程序.
另外, 一直没有收到楼主的程序. 所以无法测试. 本来也将这个东东淡忘了. 但今天看 codeproject 上的一篇文章, 提到 detours 的 withdll, 用 TM 一试, 成功. 所以写了这个回复. :D 用什么写的?一句两句说不清楚,还是把源代码发上来,看看50元的量能不能解决。 没贴代码是因为代码实在很简单. 从 detours 的例子改的.#include <windows.h>
#include "detours.h"
/*
cl /LD /nologo /Zi /MT /Gm- /W4 /WX /I../../include /O1 accessfile.cpp /link /incremental:no /release /subsystem:windows /entry:_DllMainCRTStartup@12 /export:CreateFileW_ ../../lib/detours.lib ../../lib/detours.lib user32.lib
*/
static HANDLE (WINAPI *OriCreateFileW)
(LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile) = CreateFileW;
WCHAR lpwDocName = {0};
HANDLE WINAPI CreateFileW_
(LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
if (wcslen(lpwDocName) && wcsstr(lpFileName, lpwDocName))
{
OutputDebugStringW(L"W: Got it!");
HWND hWnd = FindWindowW(0, L"AccessFileClient");
if (hWnd)
PostMessage(hWnd, WM_USER + 12345, 0, 0);
}
return OriCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
LONG error;
(void)hinst;
(void)reserved;
if (dwReason == DLL_PROCESS_ATTACH) {
OutputDebugString("accessfile.dll: Starting.\n");
GetPrivateProfileStringW(L"config", L"docname", 0, lpwDocName, MAX_PATH, L"c:\\accessfile.ini");
if (! wcslen(lpwDocName))
MessageBoxW(NULL, L"没有读取到文档名称.文档名称应该保存在 c:\\accessfile.ini. 如下格式: \n\n\ndocname=myfile.ext", L"AccessFile", 0);
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)OriCreateFileW, CreateFileW_);
error = DetourTransactionCommit();
if (error == NO_ERROR) {
OutputDebugString("accessfile.dll: Detoured.\n");
}
else {
OutputDebugString("accessfile.dll: Error when detouring()\n");
}
}
else if (dwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)OriCreateFileW, CreateFileW_);
error = DetourTransactionCommit();
OutputDebugString("accessfile.dll: Ending.\n");
}
return TRUE;
}
//
///////////////////////////////////////////////////////////////// End of File. 看了下nico的代码,detour用起来倒是挺方便的,省去了修改函数调用跳转地址的麻烦。。不过,针对lz的需求,似乎hook ::ReadFile更合适些。
btw,既然lz知道有程序“偷”访问了某文件,而又无所作为,仅仅是关掉报警,那还不如别检测了,眼不见心不烦,呵呵。 看看,楼主的要求比较有意思
看来还是好银多哈 原帖由 rainwin 于 2007-5-18 11:20 发表 http://www.ibmnb.com/images/common/back.gif
虽然俺什么也不会。。。但说什么也要顶下。。
沙发。。。。。。。。。。。。。。。。。。。。。。
谢谢还记得我们哈
近半年来确实很忙。基本或很少时间来专门网了
楼主的要求不难,看完帖子已经有人做了,我就不参与了,若实在需要请留言 原帖由 汉唐 于 2007-5-18 15:47 发表 http://www.ibmnb.com/images/common/back.gif
对不起LZ啊.我不是编程的,没有MQK同学那么专业啊*.*lll
我现在是很忙。你在HANG还好吧 原帖由 cyzokok 于 2007-5-19 15:11 发表 http://www.ibmnb.com/images/common/back.gif
有这么多热情的高手,首先向你们致敬。我也要求你们帮编个小软,要在WIN98、WINME下运行的。
有响应的高手吗,如达到效果500我也舍。
(行业软件,不是犯法的。)
需求发贴告诉大家吧,热情人很多呢 原帖由 mqkng 于 2007-5-31 08:28 发表 http://www.ibmnb.com/images/common/back.gif
谢谢还记得我们哈
近半年来确实很忙。基本或很少时间来专门网了
楼主的要求不难,看完帖子已经有人做了,我就不参与了,若实在需要请留言
mqkng兄,等你好久了,以前用过你两个软件,这几天一直忙.说实话也有点灰心了,看了你的回贴,热情又依旧了.那就帮我整个吧.在此先谢了. 原帖由 nico 于 2007-5-30 09:26 发表 http://www.ibmnb.com/images/common/back.gif
今天偶然发现 detours 还有另一个程序 withdll.exe, 它和 setdll.exe 不同. setdll 修改了 exe 文件的 import table. 而 withdll 的做法是启动目标 exe, 挂起之, 然后注入 dll, 再让程序正常运行.
如果 ...
谢谢这么多热心的坛友,这几天没有上.刚试了下,好像还是不行.因这程序是依靠于另一程序的,比较大传过去不大方便.在此再谢谢nico兄和各位热心的人.
页:
1
[2]