然后,返回继续执行,当执行到BIOS初始化好,准备加载磁盘MBR代码的时候,就会执行木马的代码。木马这时候会挂接INT15H中断,然后恢复执行原来的代码,这样就完成了挂钩,后续就和暗云系列的MBR木马相似,通过挂钩INT15H来一步一步的挂钩内存,加载自身。 这样,当系统MBR获得执行的时候,木马已经在内存中挂好了INT15h的HOOK,之后,会HOOK bootmgr!Archx86TransferTo64BitApplicationAsm获得下次执行机会,直播,然后再HOOK winload!OslArchTransferToKernel,,然后等内核加载时候会HOOK ZwCreateSection,从而切入到内核运行,然后会设置线程回调。 2.3 线程回调挂钩 接下来会设置线程回调 PsSetCreateThreadNotifyRoutine和进程回调PsSetCreateProcessNotifyRoutine,进程回调中只打印了下"Process %d Create %d\n",线程回调才是关键内容。 线程回调中木马判断是否为csrss.exe进程,如果不是则跳过,如果是就创建一个系统线程,并且插入一个工作线程,将自身的线程回调抹去。 2.4 内核线程网络下载代码 在创建的系统线程内会先等待1分钟大概是为了等网络准备好。 然后会尝试使用两种方式去下载恶意Code到内核执行, 优先尝试UDP DownLoadShellCodeByUDP,函数为解析域名。 使用0xDEDE43D0 0x8080808,两组DNS域名转化过来,即(222.222.67.208 8.8.8.8) 与通信端口为0x801F即8064号端口。 优先使用0x3500即53号端口请求域名服务,拿到域名对应地址。 先请求服务器,询问Shellcode 长度分片大小,然后一个一个分片处理,最后拼接一起。 发送数据包为,长度为0x10。 接受数据包为: 总长度为0x28,头部长度为0x10,数据部分长度为0x18,校验和为0xd845672a。 Shellcode长度为0x1a32d,总共有 0xd2个分片,每个分片大小为 0x200。 在使用UDP方式收发数据时候会对数据部分进行校验。 校验成功才拼接在一起,否则丢弃,然后再申请非分页内存。 将之前的内存代码拷贝执行,将NT基地址作为参数传入。 2.5 解密恶意代码和投递APC 下载下来的代码仅头部可以执行,后面部分为加密数据,需要解密执行。 调用函数为RtlDecompressBuffer,解密后大小为150728,解密方式为COMPRESSION_FORMAT_LZNT1。 接着会调用填充导入表: 然后调用PsCreateSystemThread创建注入线程。 线程中: 优先查找系统进程注入找到的是spoolsv.exe。 然后再是杀软进程: 申请内存拷贝注入: 插APC注入: 2.6 执行用户层恶意下载代码 注入后从应用层执行,代码中包含一个DLL文件,执行函数为申请内存基地址。 然后获取Kernel32 模块基地址,跟 LoadLibraryA GetProcAddress VirtualAlloc, 填充内存中PE文件导入表,填充完成后执行DllMain函数。 会在DllMain中创建线程,执行下载并且运行,根据控制码暂停或者删除相关服务。 线程函数: 提权操作解密下下载地址数据。解密后内容为: 根据控制码暂停或者删除服务: 然后分三种方式运行: (DLL加载,父进程注入,直接创建EXE运行) 2.7 创建恶意账号 这里下载下来的是一个EXE,主要功能就是创建了一个管理员账号。 截图: 0x03结束语 (责任编辑:本港台直播) |