ntcore CFF-Explorer
反汇编过程即二进制转汇编助记符,参考 intel 指令集手册 X86 为变长指令(灵活),arm 为定长指令(高效)[4G 寻址问题]
TIPS
多层封装 异步调用 动态加载 加密解密 自定义接口 壳 反调试
防御(内核)同步 & 异步 拦截的区别及应用场景
mov eax,42h
对应内核里 SSDT 表所在的 indexmov edx,7FFE0300h
0x7ffe0000 存储 _KUSER_SHARED_DATA 结构体,用于应用层和内核层共享数据Detour 微软提供的可用于多平台的“hook”库,提供:进程创建时的注入(模块)、指定函数 hook……
DetourCreateProcessWithDlls - 创建指定进程,并将指定模块注入至目标进程(加载时机早)
在修改导入表完成后,目前进程还处于“挂起”状态,后续调用“ResumeThread”后,系统按照标准的进程创建流程,遍历导入表将对应的模块进行加载(将模块映射至当前进程内存,并获取 AddressOfEntryPoint 调用入口点 DllEntry);
进程的首个线程(进程初始化)ntdll!_LdrpInitialize –> ntdll!LdrpInitializeProcess –> ntdll!LdrpRunInitializeRoutines –> ntdll!LdrpCallInitRoutine TLS 回调比模块的 dllmain 执行时机更早
typedef struct {
PVOID *pTable; // Service Table Pointer
PULONG pulTableCounter; // Table Item Counter. This table is only updated in checked builds.
ULONG ulServiceCounter; // Number of services contained in this table.
PUCHAR rguchParamTable; // Table containing the number of bytes of parameters the handler function takes.
} SERVICE_TABLE;
typedef struct {
PVOID *pTable; // Service Table Pointer
PULONG pulTableCounter; // Table Item Counter. This table is only updated in checked builds.
ULONG ulServiceCounter; // Number of services contained in this table.
PUCHAR rguchParamTable; // Table containing the number of bytes of parameters the handler function takes.
} SERVICE_TABLE;
防御基于 x86 架构上的监控实现,基本是以 hook(inline hook) + 注册系统回调实现的;但在 x64 构架上,微软引入 Driver Signature Enforcement + Kernel Patch Protection(PatchGuard,简称 PG) 安全机制,杜绝第三方驱动在系统关键“驱动”中进行的内存修改。因为 PG 的存在,无法继续使用 x86 的 hook 方式实现更多行为的监控,只能使用系统提供的标准回调;x86 hook 的方式可将 SSDT + SSSDT 里涉及到的各函数调用都进行监控,基本上涵盖了系统上所有的行为,而系统提供的标准回调,只有进程创建 / 退出、模块加载、注册表相关、文件、对象回调,所以,导致了一些在 x86 上可进行防御的行为,在 x64 上无效(或实现方法与 x86 不同);
Through the looking glass: webcam interception and protection in kernel mode
文件重启删除 读取注册表 smss.exe 删除的。
HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\
%SystemRoot%\system32\svchost.exe -k RPCSS
%SystemRoot%\System32\RpcEpMap.dll
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper
void KInstallFile::DeleteFile()
{
if ( m_bFolder && ::PathFileExists(m_strInstallPath))
KFunction::DeleteFolder(m_strInstallPath);
else
{
TCHAR szFileFullPath[MAX_PATH];
::GetModuleFileName(NULL, szFileFullPath, MAX_PATH);
if ( m_strInstallPath.Compare( szFileFullPath ) != 0 )
{
KProcessManager::KillProcessByPath( m_strInstallPath );
Sleep( 100 );
}
if (::PathFileExists(m_strInstallPath) && !::DeleteFile( m_strInstallPath ))
{
CString strTempFileName;
strTempFileName.Format(_T("%s_%d_del"), m_strInstallPath, int(::GetTickCount()));
if (::MoveFileEx(m_strInstallPath, strTempFileName, MOVEFILE_REPLACE_EXISTING))
{
::MoveFileEx(strTempFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
}
}
}
}
反汇编过程即二进制转汇编助记符,参考 intel 指令集手册。 X86 为变长指令(灵活),arm 为定长指令(高效)[ 4G 寻址问题 ]