首页
社区
课程
招聘
[原创]穿透ghost种植木马
发表于: 2014-7-25 17:21 23064

[原创]穿透ghost种植木马

2014-7-25 17:21
23064

好不容易过掉各种杀毒软件、防火墙种上的木马,不能当用户使用ghost镜像还原系统后就失效了。本文描述如何把木马写入ghost镜像中,当用户还原后木马仍然启用。

1、  前言:
GHO文件系统架构:
      GHO文件格式非常复杂。设计者在最初考虑到多种情况,例如是否分卷(分为多个文件),是否支持网络安装(多台机器使用网络同时安装),是否录制在磁带上(要求GHO文件具有流格式),可以支持多少种文件系统等等。这使得GHO文件格式具有分层特性。

      最下层的格式为GHO基础流。GHO基础流承载磁盘数据。基础流可以为压缩流或者非压缩流,根据不同的要求,压缩流又分为快速(FAST)压缩流和高比例(HIGH)压缩流。GHO基础流用自定义的结构,将磁盘上的冗余空间排除掉。实验发现,基础流承载的数据,都是磁盘中实际使用的数据,即在文件系统中登记的数据(文件或者目录结构等),而其它空白数据,比如已经删除的文件数据等等,并未在基础流中记录。由于涉及到文件系统,基础流并没有完全脱离上层流的映像。这是GHO文件格式难以破解的第一个原因。

      基础流上面是GHO文件系统流。通过IDA反汇编分析可以发现,GHO基础流上面的文件系统流是真正的文件系统操作。比如FAT32流使用的逻辑就是在文件系统中处理FAT32格式的逻辑,NTFS使用的逻辑也是真实的NTFS逻辑。这也意味着,对于Linux使用的EXT3等文件系统,GHO并没有文件系统层次上的支持(高版本可能已经开始支持了)。由于文件系统众多,GHO也不能完全支持一切文件系统,高层文件系统和GHO基础流之间还有相互依赖的关系,这是GHO文件格式难以破解的第二个原因。

      GHO文件提供非重整格式。原则上讲,应当是对磁盘的完全无损拷贝,但是试验中测试发现,即便使用非重整格式,生成的GHO文件也被修改过。其修改原则仍然依赖于GHO基础流。比如制作一个NTFS分区的非重整拷贝,根据NTFS文件系统格式寻找二进制位置,仍然不能准确定位,也就是说,非重整模式并不是对磁盘的真正的无损拷贝。这是GHO文件格式难以破解的第三个原因。

      经过一段时间研究,发现直接破解GHO文件格式,必须首先破解GHO基础流格式,然后破解基础流和高层文件系统比如FAT32和NTFS之间的关系,最后还要保证附加信息准确的翻译,这个工作有太多的不确定性。所以最后决定使用Symantec出品的GhostExp作为读写工具,进行GHO文件的读写,如下图:
                                                                         

      也就是说,借用现有的GhostExp读写功能,而不是通过分析文件系统格式来进行读写。这样做的好处在于,可以比较容易的实现GHO的压缩和非压缩,磁盘和分区模式,FAT32/NTFS等文件系统中的文件的读写,即只要Symantec支持的格式,我们都能操作。

2、插入代码并控制GhostExp的原理:
      Symantec 出产Ghost,必须向用户提供GHO文件的脱机修改功能;但是Symantec拒绝公开任何GHO文件格式的信息,所以Symantec必须自己提供一个修改该工具。这个工具必须能够修改该GHO文件中的内容,准确识别各个GHO文件版本,准确处理压缩非压缩和不同文件系统,准确处理分卷文件等等。这个GhostExp正是我们需要的功能。然而因为某种原因,用户只能手工操作GhostExp,进行文件的增删改操作。GhostExp不提供外部调用或者命令行模式,所以,修改GhostExp以提供命令行模式,进而允许其它进程调用,就成了这个项目的主要工作了。

      GhostExp是一个MFC程序,由VS2005开发,我获得的版本为Debug版,有少量Debug符号可以使用,而且IDA 对于MFC 架构的识别也比较好,这对分析较有帮助。

      修改一个现有的可执行文件,并使得它提供特殊功能,有很多限制。最简单点的方法,是在这个可执行文件的引入表中增加一个DLL,在适当的位置调用这个DLL中的特定函数,在DLL函数中再实现需要控制可执行文件的相关代码。也就是说,DLL将会分析命令行输入,按照命令行输入的要求,模拟人的操作,产生需要的效果。

      添加的DLL为GWDLL.DLL。DLL讲先于Application的执行。在DLL启动时,调用Initialize函数,使用
LPSTR cmd = ::GetCommandLineA();
获取当前命令行内容,对命令行内容进行分析,获得参数列表。稍后会创建一个线程,进行手工操作的模拟。

为什么选择模拟操作,能否直接调用GhostExp中的特定代码,实现直接读写?

      根据分析,GhostExp为提高性能,在文件系统格式分析和GHO文件读写上使用了多线程。比如启动GhostExp并打开GHO文件的时候,左边显示文件目录树的过程,就是由文件系统加载线程实现的。

      对于当前打开的GHO文件,文件系统加载线程(GhostImageLoadingThread,参看IDB文件)负责分析当前GHO文件,并建立内部的目录树表示。这个目录树表示再被主线程转化为TreeNode表示,最后显示出来。

      如果可以准确的使用内部目录树表示,那么也可以绕过GUI操作。可是内部目录树表示存在于不确定位置,而且结构随着文件系统不同而不同,所以只能使用GUI层操作TreeNode的方法定位特定目录和文件。

    为了找到TreeView和ListView,在CWinApp::OnInitialize的某个早期位置,生成主窗口之后,修改代码指向GWDLL中的Connect方法,传递CFrameWnd指针,从此指针+0x20处获得主窗口句柄。

void WINAPI  Connect(PVOID frame)
{
  __asm push esi;
  if (frame!=0)
  {
    if (ConnectMainWindow(*((HWND*)(((PCHAR)frame)+0x20))))
    {
      //OK
    }
  }
  __asm pop esi;
  __asm mov eax, [esi];
}
BOOL ConnectMainWindow(HWND hwnd)
{
  if (hwnd!=0)
  {
    MainWindow = hwnd;
if ((PrevWindowProc = (WNDPROC)::SetWindowLongPtr(
MainWindow,  
GWLP_WNDPROC, 
(LONG)MainWindowProc))!=0)
    {
      return ConnectControls(MainWindow);
    }
  }
  return FALSE;
}
LRESULT CALLBACK MainWindowProc(         
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
){
  if (hwnd == MainWindow)
  {
    if (uMsg == COMPLETE_MESSAGE)
    {
      LastSignature = -1;//标识当前操作已经完成。
    }
  }
  return PrevWindowProc!=0 ?
    ::CallWindowProc(PrevWindowProc,hwnd,uMsg,wParam,lParam) :
    0;
}
void WINAPI Hook(HANDLE handle)
{
  if (!Started && handle!=0 && Commanding)
  {
    Started = TRUE;
    if (MainWindow!=0)
    {
       //NOTICE: The main thread is started to continue working on commands.
      ::CreateThread(NULL, 4096, MainThread, (LPVOID)handle, 0, &ThreadID);
    }
  }
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (44)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
思路挺好,赞...
2014-7-25 17:31
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
gho文件再用rar加密压缩
2014-7-25 17:36
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
4
顶一个 。。。。。。。。。。。。。。
2014-7-25 17:38
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
火前留名
2014-7-25 17:38
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
太坏了
2014-7-25 18:05
0
雪    币: 11180
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很不错,,感谢分享~
2014-7-25 18:16
0
雪    币: 29
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好猥琐,学习下代码
2014-7-25 18:52
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好文章, 感谢分享
2014-7-25 18:56
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个不错

思路很好
2014-7-25 19:01
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
看第一小节差点以为是自己解析ghost文件格式了,不过依然很赞~
2014-7-25 19:52
0
雪    币: 47
活跃值: (68)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
N久前想过直接把文件注射到gho里,还原的时候就能直接带文件还原了,但是看到GHO文件的结构。。。果断放弃了,这个思路太有才了,真心想不到啊
2014-7-25 19:55
0
雪    币: 202
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
有源码有真相。
2014-7-25 20:35
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
14
你好坏
2014-7-25 20:37
0
雪    币: 144
活跃值: (46)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
不错 收藏了
2014-7-25 21:00
0
雪    币: 204
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
坏蛋.............
2014-7-25 21:07
0
雪    币: 6517
活跃值: (2387)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
17
木马有好有坏,给网警做侦查使用就是好的。
2014-7-25 21:11
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢分享
2014-7-25 21:43
0
雪    币: 7
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
思路简单。猥琐。且实用。赞一个。
2014-7-25 22:15
0
雪    币: 138
活跃值: (306)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
某年(2012?)的xkongfu上有人讲这个,被喷了.
跟楼主一样,看标题都以为是要解析,结果一看都是打包ghostexp.
2014-7-26 09:48
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
啥年代了,还研究木马
2014-7-26 10:44
0
雪    币: 327
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
肯定优秀!
2014-7-26 22:42
0
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我还可以mark 一下
2014-7-28 11:51
0
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我以为楼主逆向了 ghost的格式呢。。
前几年我看到过一个成品,叫小刀。  它不用第三方工具就可以插入文件到ghost
2014-7-28 12:00
0
雪    币: 22
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
思路不错。。不过很难用的上。。。
2014-7-28 12:39
0
游客
登录 | 注册 方可回帖
返回
//