特洛伊木马植入新方
14)为了使木马能够持续正常地运行,必须保证良好的隐蔽性。所以,成功植入木马DLL后,方案总流程的“安装后门”这一步骤必不可少。还需要解决与“安装后门”相关的技术问题。
选择获取
I等待确认小j5投放样序
¨杯进羁!II)
‰J.加载成功,释
l放¨杯进挫…
U
U
U
{f|i入小,}1)1.1.打"J|标进程If)
见陶【h)
巾请访问权
备份后门羁叭i
址(h)
U
U
U
驶W肝rj刷序运行小iI
I)1.1.
插入远称线鞋
{lj_次激沂条件
U
U
U
安装侨门她|冬|(c)
加裁术-0I)1I.
n销毁
她(c)
(a)总流程
(b)批入木马
(c)安装后f】
圈l木马植入方案实磊柽架
2植入新方案中4个主要环节的剖析
2.1木马程序DLIjl意块化
通常植入目标主机的木马服务端程序是一个独立的应用程序,和所有应用程序一样,要运行木马程序必须为此创建一个单独的进程。如果以DLL模块化的形式实现木马服务端程序,首先,可以避免在目标主机中留下木马进程踪迹,从而达到隐蔽性要求;其次,能够共享宿主进程(调用DLL的进程)的资源,进而根据宿主进程在目标主机中的级别未经
授权地访问相应的系统资源。
DLL是Windows操作系统的基础,它只是一个源代码模块,在DLL中通常没有用来处理消息循环或创建窗口的支持代码,这个模块包含了应用程序或另一个DLL将要调用的一
组函数。当所有源代码文件编译后,DLL就像应用程序那样
被链接程序所链接。一旦DLL的文件映像被映射到调用进程的地址空间中,DLL的函数就可以供进程中运行的所有线程使用,对于进程中的线程来说,DLL的代码和数据看上去就像进程地址空间中的额外代码和数据一样。但DLL又不同于应用程序,因为并没有为DLL分配独立的进程地址空间,也就是说DLL的运行并不需要创建单独的进程,所以从系统的进程列表里是看不见DLL的运行踪迹的。
另一方面,每个进程都有它自己的私有地址空间,当使用指针来引用内存时,指针的值将引用进程私有地址空间中的一个内存地址,而该进程不能创建一个其引用属于另一个进程的内存指针。可是DLL却有其特殊的属性,即能够动态地将自己插入另一个进程的地址空间,从而可以共享这个进
程的资源。
一个DLL可以拥有单个进入点函数,系统在不同时间调
万
方数据用这个进入点函数:
BOOL
WINAPIDllMain(
HINSTANCEhinstDll.
DWORDfdwReason,
LPVOIDIpvReserved);
参数hinstDll指明拥有该函数的DLL的句柄,fdwReason
指明系统调用该函数的原因。当DLL被初次映射到进程的地
址空间中时,系统将调用该DLL的DIIMain函数,给它传递
参数fdwReason的值DLL_PROCESSATTACH。当DIIMain函数处理DLLPROCESS_ATTACH时,可以对进程和线程进行一些初始化工作。利用这个属性,在木马DLL的DIIMain函数中就可以编写相应的代码获取目标进程信息,实现部分木马任务。
2.2远程线程插入木--马DLL的技术
本文通过使用远程线程将木马DLL插入到目标进程的地址空问,即利用目标进程中的线程调用LoadLibrary函数加载木马DLL,从而实现木马植入。由于除了自己进程中的线程外,我们无法随意地控制其他进程中的线程,因此需要在目标进程中创建一个新线程,对于自己创建的线程就能够控制
它执行什么代码。
3.2.1创建远程线程
在另一个进程中创建我们控制的远程线程需要调用
CreateRemoteThread
API(应用程序接口)函数:
HANDLE
CreageRemoteThread(
HANDLEhProcess,
PSECURITY_ATTRIBUTESpsa,
DWORDdwStackSize,
PTHREADSTART_ROUTINEpfnStartAddr,PVOIDpvParam,DWORDfdwCreate,
PDWORDpdwThreadld);
参数hProcess为指向拥有新创建线程的进程(eP目标进程)的句柄。参数pfnStartAddr指明远程线程进入点函数的内存地址,由于是将该线程插入目标进程地址空问中,因此该地址应该是与目标进程地址空间相关的,而不能位于本地进程的地址空间。参数pvPamm传递远程线程进入点函数的调
用参数。
在实际调用CreateRemoteThread时还需要预先进行以下
处理工作:
(1)参数pfnStartAddr不能使用对LoadLibrary的直接引用,因为这会造成将形实替换程序的地址作为远程线程的起始地址来传递,结果会造成访问违规。因此调用CreateRemoteThread之前需要调用GetProcAddress函数,获取l_x)adLibrary的准确内存位置:
PTHREAD——START——ROUTINE
pfnThreadRm2(PTHREAD—START_ROUTINE)
GetProcAddress
(GetModuleHandle(TEXT(”Kernel32”)),“LoadLibrary”);
(2)参数pfnStartAddr也不能直接引用木马DLL路径名字符串。因为路径名字符串是在本地进程的地址空间中。该字符串的地址作为远程线程函数的参数被赋予远程线程,当LoadLibrary取消对内存地址的引用时,路径名字符串将不再存在,此时远程线程就会发生访问违规。因此,必须将木马DLL的路径名字符串放入目标进程的地址空间,将放置该字符串的相对于目标进程的地址传递给CreateRemoteThread函
一11】一