作品发布     邀请码    设为首页  收藏 

当前位置:文章免杀 → 文章内容 >> 逆向工程打造木马过360监控


逆向工程打造木马过360监控

更新时间:2010-12-15 6:03:58   作者:佚名  来源:不详
本篇文章源自《华中帝国》2008年1月刊
转载请注明版权

文/图 小鱼
===================================
玩木马的都知道,最近360安全卫士新版本也增加了监控功能,而我们的大多数木马在运行后,360安全卫士监控都会报警。就拿继鸽子时代后用得最多的Pcshare来说,它运行后,360安全卫士会提示“一个未知的系统服务正在被装入”。我想玩Pcshare的应该对这个再熟悉不过了。呵呵,没关系,看完今天这篇文章你就不会再烦恼了。下面就让我带领大家开始我们的逆向工程打造木马过360监控之旅吧!
   嘻嘻,开始之前呢,请大家耐心地听我说说这篇文章的题外话,也是今天这篇文章的思路。大家只有先明白了思路,然后再看文章,才能比较透彻地理解整篇文章的内容。
360监控的原理我就不说了,说下来估计半篇文章都说不完,而且怕编辑部的MM说我有骗稿费的嫌疑,嘻嘻……废话至此,切入正题吧!我的思路是这样的,不知道大家发现没有,360安全卫士监控的进程是没有做进程防杀的,什么意思呢?就是通过进程管理器就可以直接结束掉进程,大家可以回去拿自己的进程管理器试试,看能不能结束掉360监控的进程,360监控的进程是“360tray.exe”。它还有一个最大的弊端,就是结束掉进程后,任务栏的图标是需要触发焦点才可以消失的。呵呵,看到这里,大家肚子里的坏主意是不是已经出来了?只要我们的木马在运行前能结束掉360监控的进程,然后再运行木马,不就可以过360监控了吗?而且任务栏图标还不会消失。试想一下,谁没事情总去看看自己的360监控是否还在监控状态呢?只要他不触发任务栏图标的焦点,就不会消失的。所以,我们此次就是利用了这个假象。估计现在大家应该都是拿着鸡蛋、西红柿朝我砸来并说:“废话这么多,你还没告诉我怎么做呢”。呵呵,别急,大家接着往下看嘛!
首先呢,文章标题是逆向工程,所以我们需要用到的工具就是OllyDebug和Lordpe。这两个工具,相信看黑防杂志的地球人都应该有,不要拿砖拍我……前面已经说过,如果能使我们的木马在运行前先结束掉“360tray.exe”进程,然后再运行木马,就可以做到完美的过360监控。但是怎么做呢?不知道大家是否知道WinExec函数,微软对它的解释是运行一个指定的应用程序。我们拿它来做什么呢?先来看一个DOS命令“taskkill /im 360tray.exe /f”,在你的DOS下运行,看看你的“360tray.exe”进程是否还在。这里为了能让大家更好地利用这个winexec函数,我解释下这个函数的意思。

The WinExec function runs the specified application.
This function is provided for compatibility with earlier versions of Windows. For Win32-based applications, use the CreateProcess function.

UINT WinExec(
LPCSTR lpCmdLine,        // address of command line
UINT uCmdShow         // window style for new application
);        

从上面的这段英文我们可以知道,WinExec函数的第一个参数是lpCmdLine,后面的注释说明这个参数是一个命令行;第二个参数是uCmdShow,后面的注释说明它是标志着应用程序的外观。我们玩木马的当然不能让我们的程序显示出一个窗口,所以这里就提前说明一下,这个参数就是SW_HIDE。看到这里大家应该明白我之前那一番苦心的解释了吧?既然这个函数可以运行指定的应用程序,那么我们是否可以让它运行我们刚刚的那段杀360进程的DOS命令呢?答案是肯定的。那么接下来我们就来看看具体的实例吧。
开始之前,我觉得有必要说下我们的具体做法。我们通过OllyDebug加载木马,然后找一段0区域。因为我们的PE文件的区块不可能刚好和代码相匹配的,肯定会存在空隙的,所以我们就在这段空隙上来进行代码写入。找到一段0区域后,先把我们的“taskkill /im 360tray.exe /f”这段DOS命令写到一个地址里,因为API函数传递参数是通过堆栈来传递的,我们不可能直接把这段命令压入堆栈,因此只能把存放这段命令的地址压入堆栈。这里我就边说边做吧,下面通过一个本地配置Pcshare的服务端来给大家做测试。运行OllyDebug载入我们的服务端,记录木马服务端的入口点,因为我们要先让木马执行完杀“360tray.exe”进程代码后,再跳转到木马原入口点继续往下运行。这里我的Pchsare服务端的入口点是0040254F,记录完入口点后,再找一段0区域,这里我已经找好了,如图1所示。

图1

找到0区域后,再把“taskkill /im 360tray.exe /f”这段杀360进程的字符串写入到一个地址里。这里需要注意一点,千万不要NOP,因为NOP在汇编中是空指令的意思,对应的16进制就是90,编译器也会解释的,所以如果NOP的话,一会在写入代码的时候,后面就会有乱码出现的。我这里就把这段字符串写到00402707这个地址里,要写入“taskkill /im 360tray.exe /f”,仅仅00402707这个地址显然是不够的,所以我们从00402707这个地址开始往下选择一个比较大的区域,然后点击“二进制编辑”,写入代码,如图2所示。刚刚已经说过,我们不能直接把这些字符串压入堆栈,只能把存放这些字符串的地址压入堆栈。因为我们是通过00402707开始写入字符串的,并且这些字符串的后面是00区域,所以我们等一下只需把存放这些字符串的首地址压入堆栈就行了,也就是把00402707压入堆栈。

图2

好,接下来我们需要往下再找一段0区域,写入正式的代码。找到0区域后,我们需要NOP一下,因为“00”程序在运行的时候是不进行解释的,而NOP是能解释的。之所以如此,还因为WinExec函数是kernel32动态链接库里的,要调用WinExec函数,木马必须要加载kernel32动态链接库。如果没有加载,我们则需要手动加载,手动加载是通过LoadLibrary函数来实现的。两者的方法是一样的。kernel32动态链接库主要存放了一些系统服务功能的函数,而木马基本上都要加载这个动态链接库,所以我们这里就可以直接调用WinExec函数了。调用API函数一般遵循的是stdcall格式,也就是从右向左。也就是我们的WinExec的第2个参数先压入堆栈,再把第一个参数压入堆栈,然后再“CALL WinExec”。写入的具体代码是“PUSH SW_HIDE”(也可以为PUSH 0,因为动态链接库也可以通过数值来标示,0代表SW_HIDE)、“PUSH 00402707”和“CALL WinExec”(也可以是WinExec函数的地址,WinExec注意大小写一定要写正确。同样字母,大小写代表的ASCII码是不同的)。写完这些代码后,还需要跳转到程序的入口点,也就是“jmp 0040254F”。具体写入的代码如图3所示。

图 3

操作成功后,再记下新的入口地址00402746,等一下我们需要通过Lordpe修改程序的入口地址。全部完成后,我们就可以保存文件了。保存后,我们再通过Lordpe来修改入口地址,如图4所示。嘻嘻,现在你就可以测试一下看看,木马完美上线了,360监控无任何提示,任务栏的图标也不会消失。这样,我们的木马就可以完美地过360安全卫士的监控了。

图4

责任编辑:华中帝国        



本文引用网址: 

逆向工程打造木马过360监控的相关文章
发表评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码