专栏首页csico反调试——9——调试器原理

反调试——9——调试器原理

调试一个程序分两种情况:

1 打开这个程序。

2:这个程序已经是一个运行状态了,将其进程进行附加。

打开进程

通过打开运行进程方式来调试进程需要调用一个API:

BOOL CreateProcessA(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);
//dwCreatetionFlags需要设置为DEBUG_PROCESS
//打开进程示例程序
    STARTUPINFOA sw{ 0 };
    PROCESS_INFORMATION pInfo{ 0 };
    auto retCP = CreateProcessA("F:\\Sublime Text 3\\sublime_text.exe",
        NULL,NULL,NULL,FALSE,
        DEBUG_PROCESS,NULL,NULL,&sw,&pInfo);
    if (retCP == 00)
    {
        cout << "打开进程失败" << endl;
        return;
    }

附加进程

通过DebugActiveProcess这个API来附加到进程。

BOOL DebugActiveProcess(
  DWORD dwProcessId
);

细节

无论是通过打开进程还是附加进程来实现调试,都只是开始调用的方式不一样,在调试器和操作系统之间的交互方式都是相同的。

创建了调试进程后接下来就是死循环等待调试事件

当调试进程时,被调试进程执行的一些操作事件将会被通知给调试器,比如dll的加载和卸载,thread的创建和销毁,异常信息等等。当这些事件需要被发送到调试器时,Windows内核将首先挂起进程中的所有线程,然后把发生的事件通知给调试器,等待调试器的处理。

调试器通过WaitForDebugEvent API来等待调试事件,调试事件被封装到了DEBUG_EVENT结构体中,调试器需要处理的就是循环接受调试事件然后处理DEBUG_EVENT结构体中传递过来的不同调试信息。

在发送事件event给调试器debugger时,被调试进程会被挂起,直到调试器调用了continueDebugEvent函数

利用调试器原理实现附加反调试

利用调试器的原理,我们可以通过创建一个调试模式下的进程,那么这个以调试模式创建的进程就不能被其它进程拿去调试了,因为它已经在被一个我们自己的进程以调试模式创建了。

#include<iostream>
#include<Windows.h>
using namespace std;
​
​
void TestDebugger()
{
    STARTUPINFOA sw{ 0 };
    PROCESS_INFORMATION pInfo{ 0 };
    auto retCP = CreateProcessA("E:\\test\\Debug\\02 CStaticText.exe",
        NULL, NULL, NULL, FALSE,
        DEBUG_PROCESS, NULL, NULL, &sw, &pInfo);
    if (retCP == 0)
    {
        cout << "打开进程失败" << endl;
        return;
    }
    while (TRUE)
    {
        DEBUG_EVENT debugEvent{ 0 };
        auto rDebugEvent = WaitForDebugEvent(&debugEvent, -1);
        if (rDebugEvent)
        {
            cout << debugEvent.dwDebugEventCode << endl;
            //dwDebugEventCode是用来区分不同事件的事件码,用来判断事件
        }
        ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId,
            DBG_CONTINUE);//在发送事件event给调试器debugger时,被调试进程会被挂起,直到调试器调用了continueDebugEvent函数
    }
}
​
int main()
{
​
    TestDebugger();
    system("pause");
    return 0;
}

然后来测试一下,这样启动后,是否还能被调试器附加上:

原文链接:https://www.cnblogs.com/Sna1lGo/p/15395697.html

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 反调试手法之CreateProcess反调试

    在学习Win32 创建进程的时候.我们发现了有一个进程信息结构体. STARTUPINFO. 这个结构体可以实现反调试.

    IBinary
  • 反反frida调试

    小小咸鱼YwY
  • Visual Studio 调试系列9 调试器提示和技巧

    如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看。 即使在重新启动后,固定的变量也能保持不动。 要固定数据提示,请在鼠标...

    张传宁IT讲堂
  • 新的反调试

    首先,我们将介绍两种与线程挂起有关的新方法。它们不是最具革命性或有用的,但我会尽力做到最好。

    franket
  • 配合LLDB调试器进行iOS代码调试 原

            在一款完整iOS移动应用的开发中,代码的调试和编写占着同等重要的地位。Xcode默认使用LLDB作为代码调试器,LLDB功能丰富且强大,恰当的使...

    珲少
  • JS破解--反反调试

    今天应小伙伴们意愿写一下过无限 debugger 的两个案例(其实都很简单,只要掌握一两个操作点的话)

    Python编程与实战
  • 原来... 反调试技术揭秘(转)

    在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编...

    战神伽罗
  • 反调试问题-debugger

    最近在爬取某个网页时,发现了一种奇怪的现象。在打开浏览器进入所要爬取的网页之后,我们通常会选择F12即打开开发者工具来对网页进行分析。但这个页面一打开控制台就不...

    老肥码码码
  • Android调试bug-2015-9-24

    09-24 12:56:16.471: E/AndroidRuntime(10696): FATAL EXC...

    wust小吴
  • dnSpy反编译、部署调试神器

    在工作当中,当程序部署了之后就算打了日志遇到极个别的特殊异常没有在程序日志中体现出来或者没有详细的报错原因会让开发者非常头疼,不得不盲猜bug到底出在哪里。这里...

    zls365
  • python 调试器

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈...

    py3study
  • 详解反调试技术

    反调试技术,恶意代码用它识别是否被调试,或者让调试器失效。恶意代码编写者意识到分析人员经常使用调试器来观察恶意代码的操作,因此他们使用反调试技术尽可能地延长恶意...

    战神伽罗
  • 64位内核开发第五讲,调试与反调试

    debugport是在EPROCESS结构中的.调试时间会通过DebugPort端口将调试事件发送给ring3进行调试的.如果设置为0.则ring3就无法进行调...

    战神伽罗
  • 64位内核开发第五讲,调试与反调试

    debugport是在EPROCESS结构中的.调试时间会通过DebugPort端口将调试事件发送给ring3进行调试的.如果设置为0.则ring3就无法进行调...

    IBinary
  • PHP CLI应用的调试原理

    我们在Eclipse里选中一个PHP文件,右键选择Debug As->PHP CLI Application。

    Jerry Wang
  • PHP CLI应用的调试原理

    我们在Eclipse里选中一个PHP文件,右键选择Debug As->PHP CLI Application。

    Jerry Wang
  • Scala println的实现原理调试

    Jerry Wang
  • Angular getOrCreateInjectable的实现原理调试

    入口:GreetingService是我在Angular项目里定义的abstract service,没有加上@Injectable注解:

    Jerry Wang
  • FPGA的调试-调试设计的指导原则

    对于FPGA调试,主要以Intel FPGA为例,在win10 Quartus ii 17.0环境下进行仿真和调试,开发板类型EP4CE15F17。主要包括一下...

    碎碎思

扫码关注云+社区

领取腾讯云代金券