Hmily 发表于 2010-1-10 00:57

用dll解MoleBox打包的文件的一些思路

标 题: 【原创】用dll解MoleBox打包的文件的一些思路
作 者: resty
时 间: 2010-01-06,19:57
链 接: http://bbs.pediy.com/showthread.php?t=104648

上次上网的时候,意外的学会了dll注入的方式,有想到PE结构一直掌握的不怎么好。于是结合了一下,通过写一个工具来进行实践。
这个工具就是MoleBox的解包工具。

因为个人经验有限,所以我只选择了C语言的程序来进行尝试。
关键在于这msvcrt.dll这个文件,这个玩意几乎所有的C/C++语言的程序都会加载,然后它的导入表中又有一些我们需要的函数,于是就......

首先我们看看MoleBox打包的原理,我们自己写个程序,调用CreateFile, ReadFile等函数,再用MoleBox加上壳看看。
OD跟一下,很容易发现MoleBox在IAT里把CreateFile ReadFile LoadLibrary等等系列函数全部劫持重写掉了。也就是当你打开文件时,它会先检查是不是包中的,然后特殊处理= =

很好,这样的话我的思路就是这样的。
1.首先让目标程序正常的运行
2.向目标进程注入我们自己用来解包的DLL
3.DLL的注入后想办法解包

注入的方法文章非常多,这里就不细究了。大致思路就是用CreateRemoteThread使得其执行LoadLibraryA函数。
主要介绍下DLL注入后怎么办:
首先我们要把其打包的所有文件全部找出来,我利用了以下一些API:
FindFirstFile
FindNextFile
FindClose
要把其中的内容转存出来,我使用的API为:
CreateFileA
ReadFile
WriteFile
最后还有一个辅助的API
CloseHandle

使用这些函数,应该很容易构造一个将一个文件夹下的文件转存到另一个文件夹下。
而其实我们只要把其中一些API换成被MoleBox劫持走的函数,岂不是就可以实现将包中的文件转存出来的功能。

那么,在考虑最后一个问题,怎么得到MoleBox劫持走的API。

注意我最开始提到的msvcrt.dll, 对了,它是个很方便的工具。
我们可以通过GetModuleFileName来得到msvcrt.dll的文件地址。 然后快乐的打开它
然后就可以开始分析这个PE文件了。
这个是一个标准的DLL, 分析PE文件的文章也多的不可胜数了。 我们要做的事就是找出其导入表中我们需要的函数
然后再用GetModuleInformation来得到它在内存中的基址。这样就可以在内存中找到那几个需要的API对应的函数的地址的值了。

最后附上部分参考的代码

//DLL主过程
void MainProc() {
    CreateOutput() &&    //这个是我用来重定向stdout的, 以输出LOG
    GetModuleBase() &&   //这个就是取dll装载的基址
    GetIATInfo() &&      //然后读取IAT信息
    SearchFiles();       //最后搜索文件并转存
}

//参考函数 : GetModuleBase
bool GetModuleBase() {
    MODULEINFO modui;
    ZeroMemory(&modui, sizeof(modui));
    if (!GetModuleInformation(GetCurrentProcess(),
      GetModuleHandle("msvcrt.dll"),
      &modui,
      sizeof(modui))) {
      printf("Can't get Module Information!\n");
      return false;
    }
   
    dllBase = modui.lpBaseOfDll;
    return true;
}

//然后是最开始处的部分定义, 看得懂的就随便看看吧。
//需要的API类型
typedef HANDLE (WINAPI *TCreateFileAFunc) (LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
typedef HANDLE (WINAPI *TFindFirstFileAFunc) (LPCSTR,LPWIN32_FIND_DATA);
typedef BOOL (WINAPI *TFindNextFileAFunc) (HANDLE,LPWIN32_FIND_DATA);
typedef BOOL (WINAPI *TReadFileFunc)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
typedef BOOL (WINAPI *TCloseHandleFunc)(HANDLE);
typedef BOOL (WINAPI *TFindCloseFunc) (HANDLE);

//对应的API
TCreateFileAFunc CreateFileAFunc;
TFindFirstFileAFunc FindFirstFileAFunc;
TFindNextFileAFunc FindNextFileAFunc;
TReadFileFunc ReadFileFunc;
TCloseHandleFunc CloseHandleFunc;
TFindCloseFunc FindCloseFunc;


//然后是最开始处的部分定义, 看得懂的就随便看看吧。
//需要的API类型
typedef HANDLE (WINAPI *TCreateFileAFunc) (LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
typedef HANDLE (WINAPI *TFindFirstFileAFunc) (LPCSTR,LPWIN32_FIND_DATA);
typedef BOOL (WINAPI *TFindNextFileAFunc) (HANDLE,LPWIN32_FIND_DATA);
typedef BOOL (WINAPI *TReadFileFunc)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
typedef BOOL (WINAPI *TCloseHandleFunc)(HANDLE);
typedef BOOL (WINAPI *TFindCloseFunc) (HANDLE);

//对应的API
TCreateFileAFunc CreateFileAFunc;
TFindFirstFileAFunc FindFirstFileAFunc;
TFindNextFileAFunc FindNextFileAFunc;
TReadFileFunc ReadFileFunc;
TCloseHandleFunc CloseHandleFunc;
TFindCloseFunc FindCloseFunc;

hong811027 发表于 2010-1-10 01:27

来看看啊,呵呵

crackforchin 发表于 2010-1-10 15:45

看看怎么搞的

ccn1974 发表于 2013-12-15 07:48

的确很强大。。。。
页: [1]
查看完整版本: 用dll解MoleBox打包的文件的一些思路