欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]样本分析中解决 ollydbg 多线程调试

[原创]样本分析中解决 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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功