detours hook其它进程的api

haifeng3326 2014-08-08 04:40:15
我想监视串口通信的数据,使用detours hook了createfile和readfile,进程中可以实现拦截,但是其它进程的就拦截不到。现在,通过串口通信的软件是不能做改动的,我该怎么实现呢?
...全文
461 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
haifeng3326 2014-08-12
  • 打赏
  • 举报
回复
使用PMonitorComm.dll搞定了,谢谢大家。
haifeng3326 2014-08-11
  • 打赏
  • 举报
回复
引用 8 楼 Saleayas 的回复:
先注入,在 Hook。
不加detours库中提供的函数就可以,加上就不行:

BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved )
{
	switch(ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		{
			MessageBox(NULL,L"dll已加载",NULL,0);
			
// 			DetourTransactionBegin();
// 			DetourUpdateThread(GetCurrentThread());
// 			DetourAttach(&(PVOID&)Sys_CreateFileW, Hook_CreateFileW);
// 			DetourTransactionCommit();
// 
// 			DetourTransactionBegin();
// 			DetourUpdateThread(GetCurrentThread());
// 			DetourAttach(&(PVOID&)Sys_ReadFile, Hook_ReadFile);
// 			DetourTransactionCommit();

			break;
		}
	case DLL_PROCESS_DETACH:
		{
// 			DetourTransactionBegin();  
// 			DetourUpdateThread(GetCurrentThread());
// 			DetourDetach((PVOID *)&Sys_CreateFileW, Hook_CreateFileW);
// 			DetourTransactionCommit();
// 			DetourDetach((PVOID *)&Sys_ReadFile, Hook_ReadFile);
			break;
		}
	}

	return TRUE;
}
这样就没问题,放开注释部分就不行,但是我要HOOK目标进程的 createfile和readfile这两个api,该怎么办
辰岡墨竹 2014-08-11
  • 打赏
  • 举报
回复
你可以用DetourCreateProcessWithDll()来启动那个程序。 另外对于已经运行的程序,可以用DetourCountinueProcessWithDll()。 Detours使用AllocEx和WriteProcessMemory 这些API在目标进程中写入一个Load­Library的调用代码,并使用Create­Remote­Thread来进行这个调用。 你需要在那个DLL里用detours拦截API调用。上面两种方法都需要一个额外的EXE来执行这个操作。 另外一种方法是利用detours提供的永久二进制操作函数(DetourBinary开头的函数),可以修改一个EXE文件的DLL导入表。改后的EXE文件会加载你的DLL。
阿呆_ 2014-08-11
  • 打赏
  • 举报
回复
widechar? use strlen()? so only copy 2 bytes(first widechar character) to remote buffer? Then what do you expect while calling LoadLibraryA()?
haifeng3326 2014-08-11
  • 打赏
  • 举报
回复
我的qq:283267042,谁可以加qq指教一下,谢谢了
haifeng3326 2014-08-11
  • 打赏
  • 举报
回复
引用 8 楼 Saleayas 的回复:
先注入,在 Hook。
StartHook();和StopHook()都注释起来,运行也是一样,MessageBox没有弹出 正常情况下是不是应该调用CreateRemoteThread函数后就进入dllmain函数了
Saleayas 2014-08-11
  • 打赏
  • 举报
回复
先注入,在 Hook。
haifeng3326 2014-08-11
  • 打赏
  • 举报
回复
引用 6 楼 gfm688 的回复:
写个dll来hook,使用 CreateRemoteThread 把这个dll注入到其它进程
自己写的注入dll的代码,从网上找的自己修改了一下:

bool CHookTestDlg::PutDllIntoProcess( LPCTSTR lpProcessName,LPCSTR lpDllPath )
{
	//根据进程名称查找进程pid
	DWORD dwProcessId = GetProcessId(lpProcessName);
	if (dwProcessId == 0)
	{
		MessageBoxW(L"获取进程id失败");
		return false;
	}

	// 根据进程ID得到进程句柄
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId); 
	if(hProcess == NULL)   
	{
		MessageBoxW(L"获取进程句柄错误");
		return false;     
	}    
	size_t iSize = strlen(lpDllPath)+1;  
	SIZE_T iHasWrite;    
	// 在宿主进程中为线程体开辟一块存储区域
	// 拷贝注入DLL内容到宿主空间
	LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,iSize,MEM_COMMIT,PAGE_READWRITE);   
	if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllPath,iSize,&iHasWrite))   
	{       
		if(iHasWrite != iSize)  
		{             
			MessageBoxW(L"写入远程进程内存空间出错"); 
			VirtualFreeEx(hProcess,lpRemoteBuf,iSize,MEM_COMMIT);     
			CloseHandle(hProcess);         
			return false;       
		}     
	}
	else
	{       
		MessageBoxW(L"写入远程进程内存空间出错"); 
		CloseHandle(hProcess);   
		return false; 
	}      

	DWORD dwNewThreadId;  
	LPVOID lpLoadDll = LoadLibraryA;  
	//在宿主进程中创建线程
	HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId); 
	if(hNewRemoteThread == NULL) 
	{       
		MessageBoxW(L"建立远程线程失败");       
		CloseHandle(hProcess);   
		return false;    
	}     


	// 等待LoadLibraryA加载完毕
	WaitForSingleObject(hNewRemoteThread,INFINITE);   

	return true;
}
dllmain: BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: { MessageBox(NULL,L"dll已加载",NULL,0);////////////////////////////////////////////////调用上面的注入时没有弹出来啊??? StartHook(); break; } case DLL_PROCESS_DETACH: { StopHook(); break; } } return TRUE; } 还有,动态库中有两个输出函数,我该怎么调用呢,谢谢
gfm688 2014-08-08
  • 打赏
  • 举报
回复
写个dll来hook,使用 CreateRemoteThread 把这个dll注入到其它进程
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
引用 2 楼 haifeng3326 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] http://jacquelin.potier.free.fr/index.php
不知道这是什么,看不懂啊[/quote] Windows API Override
oyljerry 2014-08-08
  • 打赏
  • 举报
回复
引用 3 楼 haifeng3326 的回复:
使用SetWindowsHookEx能不能Hook到api呢
这个只能hook一些消息,事件等。不能API
haifeng3326 2014-08-08
  • 打赏
  • 举报
回复
使用SetWindowsHookEx能不能Hook到api呢
haifeng3326 2014-08-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
http://jacquelin.potier.free.fr/index.php
不知道这是什么,看不懂啊

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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