目录
样本信息
字符串信息
导入表信息
资源信息
-
通过浏览这个资源感觉这个资源里的内容是与0x41异或之后的内容
-
还原之后是一个PE文件
样本分析
Lab03-03.exe分析
- 从资源释放出另一个文件,解密后得到一个PE文件
- 写入位置:C:\Windows\system32\svchost.exe
- 以挂起的方式创建出svchost进程
- 将svchost的文件映像去掉
- 将资源中的内容分批拷贝到目标进程中
- 使用SetThreadContext设置线程运行位置
资源分析
- 使用SetWindowsHook挂钩一个键盘记录函数
- 将按键记录写入到:practicalmalwareanalysis.log中
- 该恶意代码能够记录:A-Z,a-z,0-9,SHIFT,CAPSLOCK,`,@,等字符
动态分析
- 附加PID为2624的svchost.exe
查杀思路
- 样本没有自启动。将它结束就行了。
总结
- 使用调试器附加目标SVCHOST.exe进行调试记录器。
技巧
- 目标进程中申请指定地址的内存
VirtualAllocEx(进程句柄,指定地址,大小,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE)
- 将一个PE展开后要想让其运行起来,需要将入口点正确填入
- 将CONTEXT.eax赋值为目标的入ENTRYPOINT
- 使用SetThreadContext函数实现这个功能。
int main()
{
STARTUPINFO st = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = {};
if (CreateProcess(L"D:\\DLG.exe", 0, 0, 0, 0, CREATE_SUSPENDED, 0, 0, &st, &pi))
{
PCONTEXT pContext = (PCONTEXT)VirtualAlloc(0, sizeof(CONTEXT), MEM_COMMIT, PAGE_READWRITE);
pContext->ContextFlags = CONTEXT_FULL;
if (GetThreadContext(pi.hThread, pContext))
{
DWORD dwBase = 0;
PDWORD pBase = (DWORD*)pContext->Ebx + 8; // pContext.Ebx中的值为PEB的地址
DWORD dwRead = 0;
ReadProcessMemory(pi.hProcess, pBase, &dwBase, 4, 0);
typedef NTSYSAPI NTSTATUS(*NtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);
NtUnmapViewOfSection NUVOS = (NtUnmapViewOfSection)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtUnmapViewOfSection");
NUVOS(pi.hProcess, (PVOID)dwBase);
// 接下来获取另一个PE文件的 sizeofImage imageBase
// 修改目标进程的 PEB 中的IMAGEBASE
// 计算新的 OEP 修改后的 PEImageBase + 另一个PE文件的 AddressOfEntryPoint
// 将 pContext.eax 修改为新的 OEP
// SetThreadContext
// ResumeThread
//
}
}
return 0;
}
- 键盘记录使用SetWindowsHook挂钩子
- 获取前景窗口的API:GetForegroundWindow