前言
Trojanized系统二进制文件是一种恶意代码取得存活的方法之一,主要是恶意代码将修改系统的二进制文件,使得其变为被感染 的系统二进制文件,当被感染的系统二进制文件被加载或运行时,将会强制执行相应的恶意代码。主要目标是Windows系统正常操作时最常用的二进制文件,包括一些dll文件。
程序分析
还是通过一个具有代表性的例子来说明。
首先程序为一个PE文件和一个DLL文件构成,先分析这个可执行文件,main函数长这样
首先将DLL文件复制到system32目录下并更名为inet_epar32.dll,然后获取了cisvc.exe的filename,这个东西是一个系统级的二进制文件,负责限制某程序内存占用的,接下来它也将成为感染的二进制文件。
跳过这个用户定义的函数,最后是一个system()函数,执行了net start cisvc,意图也就很明显了,是开启cisvc,所以可以确定这个程序一定会被感染。
接下来进入这个用户定义的函数,前面的这一部分,有几个函数,CreateFileMappingA,MapViewOfFile,都是相关文件映射的,会将文件映射到内存中去,而这个文件就是cisvc.exe。
然后这个过程就将程序中的shellcode复制到cisvc.exe中了,当然这个只是猜测,至于这一段是否真的是shellcode,执行的过程会是怎样,还得再分析。
所以我们追踪到参数loc_409030的位置看一看,发现ida中调整为指令后真的是一系列可执行代码
其中,几次跳转后便来到了这里
不过再这个shellcode的最后是有两个字符串构成,这两个字符串应该会被调用,因为这两个字符串包含这个DLL。
我们执行程序后,开始在cisvc.exe中寻找shellcode的踪迹,发现shellcode被隐藏在文件头中,所以我们需要根据偏移量算出我们下选点的位置,0x1001B0A,OD加载后之前我们并不能看出的函数已经一清二楚了,参数也是明显了
也就是说shellcode调用函数先加载了inet_epar32.dll
然后调用GetProcAddress(),获取了zzz69806582()的地址
然后又调用了zzz69806582()函数,所以我们需要接下来关注DLL文件与其中的zzz69806582()函数了
这个函数长这样,我们进入StartAddress()函数继续观察
函数长这样,而观察发现OpenMutexA()之后的代码似乎与文件操作有关,filename是,而打开发现里面都是一些击键记录,所以这个函数sub_10001380一定是击键记录器,进入之后便验证了我的看法。
虽然程序并没有分析的很透彻,像shellcode隐藏的位置部分以及最后的击键记录器,不过却学到了一个程序是如何感染系统二进制文件的,收获不少。
程序与内容源自《恶意代码分析实战》一书11-3