HOOK 进程文件操作.

wllllll 2009-11-18 01:25:49
注入到某进程,并监视或拦截此进程对某文件的操作.


咋做.我HOOK了不少的API,发现这SB程序居然不是用API去打开文件,哭啊...解决不来,求解.求资料.求代码.
...全文
174 点赞 收藏 17
写回复
17 条回复
n99huanghuangzym 2011年01月23日
二楼的下载不了啊。。。
回复 点赞
wllllll 2009年11月18日
总结:

//检测目标模块是否存在
char DaTemeDLL[256] = {0};
DWORD DaBaseImage = (DWORD)GetModuleHandle(NULL) ;
if ( DaBaseImage == 0 ) return FALSE ;


GetModuleHandle(NULL)是取得当前进程的模块ID,默认情况就只是钩住了进程线程而已。

必须第一先钩住进程的模块ID的LoadLibrary函数,当LoadLibrary函数执行时。
又必须继续钩一次新加载的DLL模块。如:

[code=C/C++]
HOOK_ITEM HookItem_LoadLibraryA = {0};
typedef HMODULE (WINAPI* PFN_LoadLibraryA)( LPCTSTR lpFileName );
HMODULE WINAPI NEW_LoadLibraryA( LPCTSTR lpFileName,HANDLE hFile,DWORD dwFlags ){
File.PlusString("C:\\ini\\result\\KERNEL32.dll_LoadLibraryA.txt", Change.String(IniKERNEL32_dll++) + " lpFileName: " + ((CString)lpFileName) + "\n");
HMODULE Result = ((PFN_LoadLibraryA)HookItem_LoadLibraryA.dwOldValue)( lpFileName );
!RedirectApi_ ( Result, "KERNEL32.dll", "Sleep", (DWORD)NEW_Sleep, &HookItem_Sleep );
return Result;
}

void WINAPI KEEP_LoadLibraryA(){
if ( !RedirectApi ( "KERNEL32.dll", "LoadLibraryA", (DWORD)NEW_LoadLibraryA, &HookItem_LoadLibraryA ) )
File.PlusString("C:\\ini\\result\\KERNEL32.dll_LoadLibraryA.txt", "失败!\n");
else
File.PlusString("C:\\ini\\result\\KERNEL32.dll_LoadLibraryA.txt", "成功!\n");
}
回复 点赞
wllllll 2009年11月18日
终于解决了。菜鸟就是菜鸟。

散分了散分了。。。。蛋疼。
回复 点赞
zhp21 2009年11月18日
http://www.5177517.com/261593.html 这个是 hook 文件操作的例子
回复 点赞
vcTiro 2009年11月18日
[Quote=引用 13 楼 wllllll 的回复:]
我还没解决问题呢,我的代码对LoadLibrary的DLL没办法HOOK,
等偶解决了,就结。
[/Quote]
LoadLibrary 一样要调用CreateFile……文件操作函数!
要不,你就连这个函数也一并HOOK,不过是LoadLibraryA/W两个。
回复 点赞
wllllll 2009年11月18日
我还没解决问题呢,我的代码对LoadLibrary的DLL没办法HOOK,
等偶解决了,就结。
回复 点赞
MoXiaoRab 2009年11月18日
[Quote=引用 10 楼 wllllll 的回复:]
多谢楼上,说得偶毛厕蹲开
[/Quote]
回复 点赞
Dingnifei123 2009年11月18日
学习,如果能给点分更美好!!~
回复 点赞
wllllll 2009年11月18日
多谢楼上,说得偶毛厕蹲开
回复 点赞
StarsunYzL 2009年11月18日
原来是IAT Hook,这种Hook对加了保护壳的程序是不一定能Hook得住的,比如加了Themida壳,因为保护壳会对IAT加密处理,你遍历IAT根本就找不到你想Hook的API。

建议还是做Inline Hook吧
回复 点赞
wllllll 2009年11月18日
SetWindowsHookEx是不行滴
回复 点赞
fishion 2009年11月18日
可以参考下《windows核心编程》中的API HOOK源码
回复 点赞
wllllll 2009年11月18日
http://blog.csdn.net/wllllll/archive/2009/11/18/4828869.aspx

HOOK了相当多的API。。。。代码太多,贴在拨可里了

如:

void WINAPI KEEP_KERNEL32_dll(){
KEEP_GetModuleFileNameA();
KEEP_MultiByteToWideChar();
KEEP_Sleep();
KEEP_WaitForSingleObject();
KEEP_lstrcpyA();
KEEP_GetWindowsDirectoryA();
//KEEP_LoadLibraryA();
//KEEP_FreeLibrary();
KEEP_GetPrivateProfileStringA();
KEEP_lstrlenA();
KEEP_GetFileAttributesA();
KEEP_GetDriveTypeA();
KEEP_InitializeCriticalSection();
KEEP_DeleteCriticalSection();
KEEP_LeaveCriticalSection();
KEEP_EnterCriticalSection();
KEEP_MulDiv();
KEEP_ResumeThread();
KEEP_LockResource();
KEEP_SizeofResource();
KEEP_LoadResource();
KEEP_FindResourceA();
KEEP_ResetEvent();
KEEP_GetLongPathNameA();
KEEP_GetShortPathNameA();
KEEP_CloseHandle();
KEEP_ReadFile();
KEEP_OpenFileMappingA();
KEEP_SetFilePointer();
KEEP_SystemTimeToFileTime();
KEEP_LocalFileTimeToFileTime();
KEEP_SetFileTime();
KEEP_GlobalSize();
KEEP_GetCurrentThreadId();
KEEP_GetStartupInfoA();
KEEP_GetCurrentDirectoryA();
KEEP_WaitForMultipleObjects();
KEEP_SetEvent();
KEEP_ReleaseMutex();
KEEP_CopyFileA();
KEEP_FileTimeToSystemTime();
KEEP_FileTimeToLocalFileTime();
KEEP_CreateEventA();
KEEP_CreateSemaphoreA();
KEEP_WideCharToMultiByte();
KEEP_lstrcmpiA();
KEEP_WriteFile();
KEEP_CreateFileA();
KEEP_GetVersion();
KEEP_Process32Next();
KEEP_Process32First();
KEEP_CreateToolhelp32Snapshot();
KEEP_TerminateProcess();
KEEP_SetFileAttributesA();
KEEP_GetExitCodeProcess();
KEEP_OpenProcess();
KEEP_GetCurrentProcess();
KEEP_FindClose();
KEEP_FindFirstFileA();
KEEP_GetProcAddress();
KEEP_WritePrivateProfileStringA();
KEEP_TerminateThread();
KEEP_GetExitCodeThread();
KEEP_SetThreadPriority();
KEEP_OutputDebugStringA();
KEEP_GlobalFree();
KEEP_GlobalUnlock();
KEEP_GlobalLock();
KEEP_GlobalAlloc();
KEEP_GetLastError();
KEEP_MoveFileA();
KEEP_DeleteFileA();
KEEP_FindNextFileA();
KEEP_GetVersionExA();
KEEP_WinExec();
KEEP_GetTickCount();
KEEP_UnmapViewOfFile();
KEEP_MapViewOfFile();
KEEP_CreateFileMappingA();
KEEP_GetPrivateProfileIntA();
KEEP_CreateMutexA();
KEEP_OpenMutexA();
KEEP_GetCurrentProcessId();
KEEP_GetTempPathA();
KEEP_lstrcatA();
KEEP_DebugBreak();
KEEP_GetTempFileNameA();
KEEP_SetCurrentDirectoryA();
}
回复 点赞
wllllll 2009年11月18日
如果对方用DLL写打开文件,再用LoadLibrary来装载DLL,再继续用装载后的DLL来打开文件,可能就无法HOOK了

看来还得研究下LoadLibrary的HOOK

HOOK API


typedef struct _HOOK_ITEM {
DWORD dwAddr; //IAT项所在地址
DWORD dwOldValue; //IAT项的原始函数地址
DWORD dwNewValue; //IAT项的新函数地址
}HOOK_ITEM, *PHOOK_ITEM;



BOOL WINAPI RedirectApi(PCHAR DaDLL, PCHAR DaFunction, DWORD DaNewFunction, PHOOK_ITEM DaHookItem ){
//检查参数是否合法
if ( DaDLL == NULL || DaFunction == NULL || !DaNewFunction || !DaHookItem ) return FALSE ;

//检测目标模块是否存在
char DaTemeDLL[256] = {0};
DWORD DaBaseImage = (DWORD)GetModuleHandle(NULL) ;
if ( DaBaseImage == 0 ) return FALSE ;

// 取得PE文件头信息指针
PIMAGE_DOS_HEADER HaDosHeader = (PIMAGE_DOS_HEADER)DaBaseImage ;
PIMAGE_NT_HEADERS HaNtHeader = (PIMAGE_NT_HEADERS)(DaBaseImage + (HaDosHeader->e_lfanew)) ;
PIMAGE_OPTIONAL_HEADER32 HaOptionalHeader = &(HaNtHeader->OptionalHeader) ;
PIMAGE_SECTION_HEADER HaSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)HaNtHeader + 0x18 + HaNtHeader->FileHeader.SizeOfOptionalHeader ) ;

//遍历导入表
PIMAGE_THUNK_DATA HaThunk, HaIat ;
PIMAGE_IMPORT_DESCRIPTOR HaIid = (PIMAGE_IMPORT_DESCRIPTOR)(DaBaseImage+HaOptionalHeader->DataDirectory[1].VirtualAddress ) ;

while ( HaIid->FirstThunk ){
//检测是否目标模块
if ( strcmp ( String.MakeUpper((CString)(PCHAR)(DaBaseImage+HaIid->Name)), String.MakeUpper((CString)DaDLL) ) ){
HaIid++;
continue;
}
HaIat = (PIMAGE_THUNK_DATA)( DaBaseImage + HaIid->FirstThunk ) ;
if ( HaIid->OriginalFirstThunk )
HaThunk = (PIMAGE_THUNK_DATA)( DaBaseImage + HaIid->OriginalFirstThunk ) ;
else
HaThunk = HaIat ;

//遍历IAT
DWORD HaThunkValue = 0 ;
while ( ( HaThunkValue = *((DWORD*)HaThunk) ) != 0 ){
if ( ( HaThunkValue & IMAGE_ORDINAL_FLAG32 ) == 0 ){
//检测是否目标函数
if ( strcmp ( (PCHAR)(DaBaseImage+HaThunkValue+2), DaFunction ) == 0 ){
//填充函数重定向信息
DaHookItem->dwAddr = (DWORD)HaIat ;
DaHookItem->dwOldValue = *((DWORD*)HaIat) ;
DaHookItem->dwNewValue = DaNewFunction;

//修改IAT项
DWORD DaOldProtect = 0 ;
VirtualProtect ( HaIat, 4, PAGE_READWRITE, &DaOldProtect ) ;
*((DWORD*)HaIat) = DaNewFunction ;
VirtualProtect ( HaIat, 4, PAGE_READWRITE, &DaOldProtect ) ;
return TRUE ;
}
}
HaThunk ++ ;
HaIat ++ ;
}
HaIid ++ ;
}
return FALSE ;
}


回复 点赞
fishion 2009年11月18日
那你具体是hook 了哪些api了?或者说是它是经过传命令行来调用其它程序的?
回复 点赞
wllllll 2009年11月18日
- -
回复 点赞
StarsunYzL 2009年11月18日
不可能不用API吧,HOOK ntdll.ZwCreateFile试试。
你用Process Monitor监视一下它读写文件的过程就知道了,Process Monitor可以看到进程堆栈,很容易就知道它读写文件时调用的什么API。
回复 点赞
发动态
发帖子
硬件/系统
创建于2007-09-28

2260

社区成员

1.7w+

社区内容

VC/MFC 硬件/系统
社区公告
暂无公告