最近在分析一个样本,然后样本核心payload里遇到了很多线程,关键的恶意代码也包含在这些线程里,之前调试多线程的时候笔者不是很熟悉,所以也是一点点实验,这次就总结下。
互联网一搜索,发现大多写的不明确。个人理解力有限,最初开始调试也没弄成功。
Ollydbg如何调试多线程
https://bbs.pediy.com/thread-213379.htm
ollydbg只能单线程调试,也就是每次只能跟一个线程。那么如何进行多线程调试呢?
方法:首先是设置StrongOD,如下图:
去掉这个勾
来到CreateThread函数处
第三个参数ThreadFunction指定了新线程的入口地址,第四个参数pThreadPram为新线程所需的参数。在入口地址处下断点,然后按F8过CreateThread后,发现无法跳转到断点处,此时需要手动修改它下面接着的代码,一般修改为Sleep函数,如果Sleep函数无效的时候,可以尝试WaitForSingleObject函数。
执行到Sleep后,会跳转到新线程入口点地址。以上是第一种方法来调试线程,还有另一种方法对其他线程进行调试。
在ollydbg显示当前线程列表里,选中主函数的线程,将其设置为最低优先级。之后在需要调试的线程指令中下一个断点,之后运行的时候才能断在线程内部。
附测试demo
有时候上面列举的方法不一定有效,所以下面记录一些查找到的操作步骤,已通过实践。首先下面就拿一个样本 https://bbs.pediy.com/thread-252833.htm 进行举例,该样本是最近分析的。如图,目前是已经来到了病毒核心payload部分。接下来直接步过来到创建线程的函数处。
0040A790内部就会开始创建线程,先步进看看。
如图所示,004068B0为CreateThread,所以新线程的函数的开始地址为0040A530。
跳转到反汇编窗口,或者直接使用快捷键Ctrl + G 输入需要跳转的地址,然后按下F2设置断点。
已经标识出主线程,现在我们要调试0040A530这个线程怎么办呢?来到主线程,也是就是发现CreateThread函数的位置。
那么目前已经进入了新线程,如何再次回到主线程呢?由于是做演示,该线程我们先实际运行小部分指令后,然后再回到主线程。再次来到线程窗口,会发现已经出现了新的线程入口为0040A530。
双击主线程,进入看看,能不能回到主线程里。
发现进入了主线程里,而且由于之前设置过断点,程序已经暂停下来了,就又可以对主线程进行调试了。记录一下,这里的关键是要随时设置好断点,这样切换进程调试的时候,才能让程序暂停下来,否则一旦切换到新的线程,会一直运行下去,根本停不下来,~~~。接着看一个情况,当新线程退出时,如何返回到主线程里?还是拿上面运行的样本举例,如图是创建了0040A530线程后,接着还会创建一个0040A710线程,还是按照刚刚描述的步骤进入到0040A710线程里。
目前的线程窗口如下
查看线程窗口,发现还没有出现新线程。
双击其中的系统空间入口,进入看看。
直接断了下来,接着F8运行,会直接跳转到0040A710新线程起始地址。
和之前描述的步骤一样,在主线程创建线程往下执行的任意位置设置一个断点。
在0040A710新线程中F8步过运行,来到退出线程的地方。
进入看看
回到刚刚的0040A710线程退出后的系统空间指令里
先暂停程序, 快捷键F12。
之前在本地测试没有成功,在文章中就不敢提及了,后来在楼下@Adventure师傅的评论中,想着还是实践成功了再对文章进行补充吧,最后测试成功了。
第三种调试的方式是在调试选项里选择进入到新线程时或者离开时中断,如下图:
之后运行样本到函数内部里的第二个创建线程处,由于已经执行完毕第一个创建的线程函数,所以0040A530已经创建成功,但此时还没有跳转到0040A530。接下来按F8运行会自动跳转到0040A530新线程处,如下图:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-8-30 00:05
被jishuzhain编辑
,原因: 补充