以前也遇到过winhex读取不到目标进程的情况, 我都是换成ce或者其它内存读取工具解决问题.
今天我用BOCHS分析一个MBR病毒样本, 这个病毒会HOOK BIOS的中断向量表. 我用WINHEX搜索内存.
发现又是找不到BOCHS进程, 今天我打算分析一下到底为什么WINHEX时好时坏? 并决定修复这个问题.
首先, 得搞清楚WINHEX是怎么枚举进程的. M$ SDK提供常规的方法有两种,一个是通过 kernel32.CreateToolhelp32Snapshot
另一个是通过 psapi.EnumProcesses
那就先对这两个API下断点. F9运行, 然后切换到WINHEX窗口中, 按 ALT+F9 呼出进程窗口列表.
然后就能看到中断在 psapi.EnumProcesses 函数.
[C++] 纯文本查看 复制代码
EnumProcesses
The EnumProcesses function retrieves the process identifier for each process object in the system.
BOOL EnumProcesses(
DWORD *lpidProcess, // array of process identifiers
DWORD cb, // size of array
DWORD *cbNeeded // number of bytes returned
);
Parameters
lpidProcess
[out] Pointer to an array that receives the list of process identifiers.
cb
[in] Specifies the size, in bytes, of the lpidProcess array.
cbNeeded
[out] Receives the number of bytes returned in the lpidProcess array.
Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
看下 EnumProcesses 函数, 第一个参数是枚举系统得到的PID数组.有了枚举到的PID数组, 我们只要在 PID 数组中寻找到 目标进程PID就行了.
如果找到了, 那大概率是 WINHEX 的BUG, 如果找不到, 那就说明是这个函数的问题了.
后经验证, 当获取不到目标进程的时候, EnumProcesses 返回的进程PID数组是不包含目标进程PID的.看来是 EnumProcesses 函数有问题.
那我们可以尝试将目标进程的PID强制写入这个数组里面试试. 下图是 EnumProcesses 返回的PID数组.
为了方便测试, 我们可以把 PID 为 4 的 系统进程, 修改成目标进程试试. (如果可行, 那应该会显示在第一行, 这样就不用每次都往下拉了.)
修改后效果如下图:
搜索试试, 也是有效果的. 这样就修复了WINHEX不能搜索目标进程的问题了 :)
随后我会录制个演示视频.
------------------------------------
|