最近由于工作需要,在研究银狐这套经典远控源码。特别申明:1. 本文介绍的内容仅做技术上的交流,请勿使用本文介绍的技术做其他用途,违者与本号无关。2. 作者不提供任何支持免杀版本的银狐源码,不做任何黑产,有此需求的读者请勿联系作者。
在银狐生成被控端的界面,有5个可选项,分别是:键盘记录结束蓝屏反查流量进程守护傀儡进程如下图所示:看这些名称都是感觉是一些“高大上”的功能,那么到底是否高大上呢,我们本次就从纯技术的角度来分析一下这几个选项到底实现了哪些功能。首先,勾选这些功能项之后,会在生成的被控端中设置相应的选项值,然后被控启动时,会检查这些值的设置,以确定是否启动这些功能,选项怎么设置的,本文就不展开了,逻辑比较简单,下面重点来说一下这几个选项背后对应的功能,咱们既然是学习技术,不会泛泛而谈,会逐一详解每个选项的技术实现细节,挨个来。键盘记录键盘记录起作用的位置位于登录模块中,如下图所示:登录模块启动后会开启一个键盘监控线程,线程代码如下:unsigned int __stdcall KeyLoggerThreadProc(LPVOID lparam)
HANDLE hObject;
do
hObject = CreateMutex(NULL, FALSE, MyInfo.Remark); //互斥下
if (GetLastError() != ERROR_ALREADY_EXISTS)
do
if (MyInfo.otherset.IsKeyboard || GetOpenKeyLoggerReg()) //等待授权
if (!Input::initialize(GetConsoleWindow(), GetModuleHandle(NULL)))
return 0;
Input::savekerboard();
Sleep(1000);
} while (TRUE);
Sleep(1000);
} while (TRUE);
return 0;
其中这一行if (MyInfo.otherset.IsKeyboard || GetOpenKeyLoggerReg()) 第一个判断条件MyInfo.otherset.IsKeyboard就对应生成被控时是否勾选了键盘记录选项。第二个条件GetOpenKeyLoggerReg()会检测下图注册表位置是否设置了值为1,如果为1,则表示开启,不存在该选项或值,或者为0,则关闭。这两个位置参数综合决定了被控上线时是否自动开启离线键盘记录功能,所谓离线键盘记录是指即使没有加载键盘记录插件,也会自动将用户的键盘输入记录到指定文件,一般位于程序数据目录下,例如C:\ProgramData\DisplaySessionContainers.log。这是一个未加密的二进制文件,看名字具有迷惑性,被普通用户发现了,也可能只是当做某些程序的日志文件。DisplaySessionContainers.log被银狐解析出来显示和注册表位置的开关在离线键盘插件位置如下图所示:银狐被控写入注册表位置和选项名也具有迷惑性,大多数人包括开发人员都不敢轻易删除这个位置的注册表项。我们可以使用Sysinternals工具ProcessMonitor可以发现这是一个非系统进程的行为。我之所以详细介绍这些非技术的内容是希望帮助那些被类似木马窃取信息的同学,让大家有个基础的判断、排查和防御能力。上述离线键盘记录线程函数KeyLoggerThreadProc使用了一个无限循环去不断检测注册表的开关项以决定是否开启离线键盘记录。笔者认为有点滥用被控电脑资源,更好的实现方式是利用是Windows提供了一个监测注册表指定项是否有变化的API——RegNotifyChangeKeyValue,可以利用这个API挂起和按需唤醒这个线程来优化资源利用率,开源VNC远控中就是这么做的。LONG RegNotifyChangeKeyValue(
HKEY hKey,
BOOL bWatchSubtree,
DWORD dwNotifyFilter,
HANDLE hEvent,
BOOL fAsynchronous
当然,离线键盘记录功能原版本也存在一些崩溃问题,我在前面一篇文章《详解银狐远控源码中那些C++编码问题》问题三中已经介绍过,这里不再赘述。结束蓝屏这个选项名起的有点让人费解,其本意是说如果被控被手动结束了,例如在任务管理中结束,会让被控所在的机器出现蓝屏。这是被控自我保护的措施。好在,这个功能在现在大多数电脑上已经失效。其实现逻辑在被控上线模块中,实现位置如下图,也是位于登录模块中。如果生成被控时勾选结束蓝屏选项,MyInfo.otherset.ProtectedProcess的值为true,会执行CallNtSetinformationProcess函数:typedef NTSTATUS(NTAPI* _NtSetInformationProcess)(
HANDLE ProcessHandle,
PROCESS_INFORMATION_CLASS ProcessInformationClass,
PVOID ProcessInformation,
ULONG ProcessInformationLength);
BOOL CallNtSetinformationProcess()
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
CloseHandle(hToken);
_NtSetInformationProcess NtSetInformationProcess = (_NtSetInformation
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290599.htm
[原创]银狐远控的被控端是如何隐藏和保护自己的
261 浏览
4 回复
src在哪?
所以你加了tooltip的src在哪?
师傅可以提供一下源码进行学习吗
源码是否可以提供一下