Install
其中,GetPowershellCommand()函数经过封装,首先会通过创建委托,覆写AmsiScanBuffer来绕过Windows操作系统的AMSI反恶意软件扫描接口;之后会通过StrCatW函数,将stager相关命令行指令进行拼接,从注册表中取出并执行。
Stager
其中,UnhookDll是用于解除目标dll的钩子的函数,主要通过将目标dll的.text(代码部分)进行复原,从而解除原来dll中可能带有的钩子。
SetValue用于将R77 32/64.dll写入注册表中,等待调用。
其中,VirtualProtect函数用于更改当前进程地址空间中某个区域的内存保护属性,这里是将(long)dll + virtualAddress处的保护属性进行了修改,并在下面进行复制;修改完毕后再将保护属性恢复。
随后,将r77-x86.dll和r77-x64.dll写入到\HKEY_LOCAL_MACHINE\SOFTWARE\下的注册表中。
之后,通过内存指针找到service.exe,再启动一个dllhost.exe程序作为winlogon的子进程,最后,通过进程镂空技术,使用service.exe替换winlogon,从而实现service.exe进程的创建。
Service
先读取Stager运行时写入到注册表的\HKEY_LOCAL_MACHINE\SOFTWARE
\$77dll的值,也就是r77 x64/r77x86.dll文件的内容。
再实现一个类似全局注入的逻辑——创建一个监控进程,并提供一个回调函数。这个监控进程是尝试连接指定名称的管道pipe,当连接成功的时候读取获取到的内容(这个内容其实就是一个pid),然后调用提供的回调函数操作这个pid;这个回调函数是一个远程进程注入函数,通过指定的目的pid,向对应的进程注入第二步获取的r77x64/32.dll;
R77
这里就是上面在Stager写入注册表,servcie从注册表中读出的r77x32/x64.dll的实现。
这里通过微软研究部门开发的开源Detours库来进行函数的重定向。
Reference:r77Rootkit原理分析