[原创]样本分析中解决 ollydbg 多线程调试
最近在分析一个样本,然后样本核心payload里遇到了很多线程,关键的恶意代码也包含在这些线程里,之前调试多线程的时候笔者不是很熟悉,所以也是一点点实验,这次就总结下。
互联网一搜索,发现大多写的不明确。个人理解力有限,最初开始调试也没弄成功。
问题来源
Ollydbg如何调试多线程
https://bbs.pediy.com/thread-213379.htm
ollydbg只能单线程调试,也就是每次只能跟一个线程。那么如何进行多线程调试呢?
方法:首先是设置StrongOD,如下图:

去掉这个勾

来到CreateThread函数处

第三个参数ThreadFunction指定了新线程的入口地址,第四个参数pThreadPram为新线程所需的参数。在入口地址处下断点,然后按F8过CreateThread后,发现无法跳转到断点处,此时需要手动修改它下面接着的代码,一般修改为Sleep函数,如果Sleep函数无效的时候,可以尝试WaitForSingleObject函数。

执行到Sleep后,会跳转到新线程入口点地址。以上是第一种方法来调试线程,还有另一种方法对其他线程进行调试。
在ollydbg显示当前线程列表里,选中主函数的线程,将其设置为最低优先级。之后在需要调试的线程指令中下一个断点,之后运行的时候才能断在线程内部。
附测试demo
#include <iostream>
#include <windows.h>
using namespace std;
int g_i = 0;
//线程W
LRESULT myWorkThread(DWORD)
{
while (1)
{
g_i = g_i + 1; //这里改写变量
::Sleep(2000);
printf("myWorkThread:%d\n", g_i);
}
}
//线程R
int main(int argc, char* argv[])
{
CloseHandle(::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myWorkThread, NULL, 0, NULL));
while (1)
{
cout << "MainThread:" << g_i << endl;
//手动在这里断下,然后下硬件写断点,OD无法在 myWorkThread 中断下
Sleep(6 * 1000);
}
system("pause");
return 0;
}
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
