首页
论坛
课程
招聘
利用detour,写的filemonitor,菜菜戳作
2011-2-26 15:31 9658

利用detour,写的filemonitor,菜菜戳作

2011-2-26 15:31
9658
主题:filemonitor
工具:vc6.0
语言:c/c++,其实就是用C++写的sdk,知道很戳。。。莫笑。。。。
所用技术:利用detour的形式hook api,dll注入....

思想:filemonitor,主要是拦截一些程序运行途中所有的相关文件操作,所以无非是hook 一下ceatefile....,然后再所有新进程启动前,hook这些函数,这里就注入自己的dll实现hook,本来想用汇编写的....哈哈,上网一搜,就有看雪的大大写了一个,用win32汇编写的,hook技术用的是Hookapi的形式,自己就用detour技术写一个,语言就用其他的.....也算是对寒假学习《win32循序渐进》这本书的一个小小总结,对了!还不能忘了感谢这本书的作者以及看雪论坛.....谢谢你们,给我知识,给我力量!附(虽然东西想起来很简单,但对我来说还是信奉这句话:。。(纸上谈来终觉浅,绝知此事要躬行)

声明:
也没啥含量,所以就往这个板块发,如果斑竹觉得不是很合适,随便处置。(大大们请飘过....旨在和像我一样的新手交流为主,不要骂我就行....)

昨天星期五,有课,但心情很不爽,所以没去,就有了此拙作,上午写完了,心情就好了,不知道为什么。。。哈哈,我又在抒情。。。
代码很简单所有我就全部端上来了,里面有注释,不会论坛的代码那种漂亮显示技术(谁会的教教我。。)

1.主程序部分代码(完整程序及代码见附件):
#define DEF_BUF_SIZE 1024
        // 用于存储注入模块DLL的路径全名
        char szDllPath[DEF_BUF_SIZE] = {0} ;
        OPENFILENAME ofn;
        PROCESS_INFORMATION info;
        char szPathname[MAX_PATH]={0};
        char szName[MAX_PATH]={0};
        HINSTANCE hInst;
//注入远程注入通用函数
BOOL InjectModuleToProcessById(DWORD pID)
{
        if(pID==NULL)
                return FALSE;

        HANDLE hProcess =::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);
        if(hProcess == NULL)
                return FALSE;

        UINT nLen =(UINT)strlen(szDllPath)+1;
        LPVOID        lpRemoteDllName = ::VirtualAllocEx(hProcess,NULL,nLen,MEM_COMMIT,PAGE_READWRITE);
        if(lpRemoteDllName == NULL)
        {
                ::MessageBox(NULL,"errorAlloc","error",MB_OK);
                return FALSE;
        }

        if(::WriteProcessMemory(hProcess,lpRemoteDllName,szDllPath,nLen,NULL)==FALSE)
        {
                ::MessageBox(NULL,"errorWriting","error",MB_OK);
                return        FALSE;
        }
        HMODULE hModule = ::GetModuleHandle("kernel32.dll");
        LPTHREAD_START_ROUTINE fnStartAddr = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");
        if((DWORD)fnStartAddr == 0)
        {
                 ::MessageBox(NULL,"errorAddress","error",MB_OK);
                return FALSE;
        }
        HANDLE hRemoteThread = ::CreateRemoteThread(hProcess,NULL,0,fnStartAddr,lpRemoteDllName,0,NULL);
        if(hRemoteThread ==NULL)
        {
                ::MessageBox(NULL,"errorRemoteThread","error",MB_OK);
                return FALSE;
       
        }
        if(::WaitForSingleObject(hRemoteThread,INFINITE)!=WAIT_OBJECT_0)
        {
                ::MessageBox(NULL,"errorWaiting","error",MB_OK);
                return FALSE;
        }
        ::CloseHandle(hRemoteThread);
        ::CloseHandle(hModule);
        ::CloseHandle(hProcess);
        return true;
       
}
...........此处略去*字....

2.dll部分代码:
/************************hook函数相关挂靠赋值****************
static HFILE (WINAPI*OLD_OpenFile)(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff,UINT uStyle)=OpenFile;
static HANDLE (WINAPI*OLD_CreateFileA)(LPCTSTR lpFileName,DWORD dwDesiredAccess,\
                                DWORD dwShareMode,\
                                LPSECURITY_ATTRIBUTES lpSecurityAttributes,\
                                DWORD dwCreationDisposition,\
                                DWORD dwFlagsAndAttributes,\
                                HANDLE hTemplateFile\
)=CreateFileA;

static HANDLE (WINAPI*OLD_CreateFileW)(LPCWSTR lpFileName,DWORD dwDesiredAccess,\
                                DWORD dwShareMode,\
                                LPSECURITY_ATTRIBUTES lpSecurityAttributes,\
                                DWORD dwCreationDisposition,\
                                DWORD dwFlagsAndAttributes,\
                                HANDLE hTemplateFile\
)=CreateFileW;

.....此处略去*字....
//********************************************************
//********************** myfunctions 定义*****************
HFILE WINAPI myOpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff,UINT uStyle)
{       

        char szNameTemp[200]={0};
        lstrcpy(szNameTemp,"OpenFileName:");
        lstrcat(szNameTemp,lpFileName);
        SendMessage(hWndList,LB_ADDSTRING,0,(LPARAM)szNameTemp);//发送消息给listBox
        return OLD_OpenFile(lpFileName,lpReOpenBuff,uStyle);
}

HANDLE WINAPI myCreateFileA(LPCTSTR lpFileName,DWORD dwDesiredAccess,\
                                DWORD dwShareMode,\
                                LPSECURITY_ATTRIBUTES lpSecurityAttributes,\
                                DWORD dwCreationDisposition,\
                                DWORD dwFlagsAndAttributes,\
                                HANDLE hTemplateFile\
)
{
        char szNameTemp[MAX_PATH]={0};
        GetModuleFileName(NULL,szNameTemp,sizeof(szNameTemp));
        lstrcpy(szNameTemp,"CreateFileA-FileName:");
        lstrcat(szNameTemp,lpFileName);
        SendMessage(hWndList,LB_ADDSTRING,0,(LPARAM)szNameTemp);
        return OLD_CreateFileA(lpFileName,\
                                                        dwDesiredAccess,\
                                                        dwShareMode,\
                                                        lpSecurityAttributes,\
                                                        dwCreationDisposition,\
                                                        dwFlagsAndAttributes,\
                                                        hTemplateFile);                                               

}
......继续略.....
//***********detour 定义器******************
void WINAPI Hook()
{
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        //**********************detour加载开始点*******
        DetourAttach(&(PVOID&)OLD_OpenFile,myOpenFile);
        DetourAttach(&(PVOID&) OLD_CreateFileA,myCreateFileA);
        DetourAttach(&(PVOID&) OLD_CreateFileW,myCreateFileW);
        DetourAttach(&(PVOID&) OLD_ReadFile,myReadFile);
        DetourAttach(&(PVOID&) OLD_ReadFileEx,myReadFileEx);
        DetourAttach(&(PVOID&) OLD_WriteFile,myWriteFile);
        DetourAttach(&(PVOID&) OLD_WriteFileEx,myWriteFileEx);
        DetourAttach(&(PVOID&) OLD_DeviceIoControl,myDeviceIoControl);
        //**********************加入结束点*******
        DetourTransactionCommit();

}

void WINAPI UnHook()
{
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        //**********************detour恢复开始点***********
        DetourDetach(&(PVOID&)OLD_OpenFile,myOpenFile);
        DetourDetach(&(PVOID&) OLD_CreateFileA,myCreateFileA);
        DetourDetach(&(PVOID&) OLD_CreateFileW,myCreateFileW);
        DetourDetach(&(PVOID&) OLD_ReadFile,myReadFile);
        DetourDetach(&(PVOID&) OLD_ReadFileEx,myReadFileEx);
        DetourDetach(&(PVOID&) OLD_WriteFile,myWriteFile);
        DetourDetach(&(PVOID&) OLD_WriteFileEx,myWriteFileEx);
        DetourDetach(&(PVOID&) OLD_DeviceIoControl,myDeviceIoControl);
        //**********************detour恢复结束点***********
        DetourTransactionCommit();
}
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{

                switch(ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                {           保存listbox句柄
                        HWND hParent=::FindWindow(NULL,"FileMonitor by ycmint");
                        hWndList = ::FindWindowEx(hParent,0,"ListBox",0);
                        Hook();
                        break;
                }
        case DLL_PROCESS_DETACH:
                {       
                        UnHook();
                        break;
                }
                }
    return TRUE;
}

运行效果图:

源文件及用户程序(如果您的系统上没有detoured.dll,请搜索下载,一大批...)
Release.rar
注意由于涉及到系统的操作,可能会报毒什么的。。。相信俺的看官就下下看看。。。不信的,那就。。。

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 1112
活跃值: 活跃值 (88)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 活跃值 5 2011-2-26 15:33
2
0
对了,使用:先打开->启动->分析....
自己顶了。。。吃饭去了。。。学校又冷又饿。。。
雪    币: 178
活跃值: 活跃值 (19)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
AlexLong 活跃值 2 2011-2-26 16:51
3
0
sfilter
雪    币: 392
活跃值: 活跃值 (15)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
ImHolly 活跃值 1 2011-2-26 16:51
4
0
作为文件监控的话,只Hook了这几个函数略显单薄
还有类似文件映射等文件操作,可以一并带上。
雪    币: 1112
活跃值: 活跃值 (88)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 活跃值 5 2011-2-26 17:00
5
0
讲的有道理。。。。谢谢。。。。框架搭起来了,可以一并hook下去。。
雪    币: 195
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
forgives 活跃值 2011-2-26 21:15
6
0
inline hook各种问题,还是detour好!
雪    币: 220
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
广海混沌 活跃值 2011-2-27 00:27
7
0
呵呵 看了看 有所收获。
雪    币: 147
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
majinxin 活跃值 2011-2-27 10:15
8
0
CreateRemoteThread 确实会报毒,鸡肋.......
雪    币: 152
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hbwazxf 活跃值 2011-3-1 15:10
9
0
呵呵 看了看 有所收获
雪    币: 421
活跃值: 活跃值 (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
tornodo 活跃值 1 2011-3-2 22:38
10
0

观摩的同时提一句,学校怎么会又冷又饿呢?
雪    币: 206
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
三一九 活跃值 2011-8-18 19:35
11
0
正在找这个。谢谢了
游客
登录 | 注册 方可回帖
返回