首页
论坛
课程
招聘
雪    币: 409
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝

[原创]用dll解MoleBox打包的文件的一些思路

2010-1-6 19:57 7228

[原创]用dll解MoleBox打包的文件的一些思路

2010-1-6 19:57
7228
上次上网的时候,意外的学会了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;


  
--------------------------------------------------------------------------------
废话:
  这个程序写出来的话,应该不限于MoleBox打包的程序,采用类似的方法打包的壳应该都可以直接弄掉。 写的过程中学到了
  很多东西,发现果然还是要实践才能够有所收获。
  
  另提示的应该算是比较多了,于是不解释细节了。
  再者:如果没有调用msvcrt.dll怎么办?这个只是思路一,找IAT的方法可多了,总能找到突破口的哦。

HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

最新回复 (6)
雪    币: 189
活跃值: 活跃值 (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
davidhee 活跃值 2010-1-8 16:08
2
0
很强,不顶说不过去
雪    币: 324
活跃值: 活跃值 (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hmilywen 活跃值 2010-1-10 00:50
3
0
好贴
雪    币: 371
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
moodykeke 活跃值 2010-1-11 17:27
4
0
好思路。
雪    币: 41
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xtaymimk 活跃值 2010-1-11 20:10
5
0
高手啊,学习了
雪    币: 187
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5151 活跃值 2010-1-15 12:23
6
0
学习学习学习学习学习
雪    币: 414
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
abcluoasp 活跃值 2017-2-27 14:43
7
0
学习楼主了
游客
登录 | 注册 方可回帖
返回