Windbg 添加断点调试程序

文章介绍了如何利用WindbgPreview加载并调试名为ConsoleApplication3.exe的C++程序,设置断点在CAppInfo::PrintAppInfo函数,通过断点检测到内存被Corrupt覆盖,从而发现并分析内存腐蚀问题。
摘要由CSDN通过智能技术生成

使用windbg 来启动exe,然后添加断点来查看相关的变量值,我们使用的是Windbg Preview。

首先需要加载exe 文件到windbg 上面,我们的exe 名称是ConsoleApplication3.exe

 设置符号表路劲和源码路径,详细设置如下图

 测试代码结构如下:

 ConsoleApplication3.cpp的代码如下:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include"Test.h"

VOID SimulateMemoryCorruption();

Test test1;
int __cdecl main(int argv,wchar_t * pArgs[])
{
  //  std::cout << "Hello World!\n";

    wint_t iChar = 0;
   
    test1.g_AppInfo = new CAppInfo(const_cast <LPWSTR>(L"Memory Corruption Sample"), const_cast <LPWSTR>(L"1.0"));
    if (!test1.g_AppInfo)
    {
        return 1;
    }

    wprintf(L"Press: \n");
    wprintf(L"    1    To display application information\n");
    wprintf(L"    2    To simulated memory corruption\n");
    wprintf(L"    3    To exit\n\n\n>");

    while ((iChar = _getwche()) != '3')
    {
        switch (iChar)
        {
        case '1':
            test1.g_AppInfo->PrintAppInfo();
            break;

        case '2':
            SimulateMemoryCorruption();
            wprintf(L"\nMemory Corruption completed\n");
            break;

        default:
            wprintf(L"\nInvalid option\n");
        }
        wprintf(L"\n\n> ");
    }
    return 0;

}


VOID SimulateMemoryCorruption()
{
   const char* pszWrite ="Corrupt";
    BYTE* p = (BYTE*)test1.g_AppInfo;
    CopyMemory(p, pszWrite, strlen(pszWrite));
}

Test.h 代码如下:

#pragma once
#include"CAppInfoT.h"
class Test
{
	
public:
	Test();
	CAppInfo* g_AppInfo;

};

Test.cpp 代码如下:

#include "Test.h"


Test::Test()
{

}

CAppInfoT.h代码如下:

#pragma once
#include <stdio.h>
#include <windows.h>

class CAppInfo
{
public:
    CAppInfo(LPWSTR wszAppName, LPWSTR wszVersion);


    VOID PrintAppInfo();


private:
    LPWSTR m_wszAppName;
    LPWSTR m_wszVersion;
};

CAppInfoT.cpp 代码如下:

#include "CAppInfoT.h"

CAppInfo::CAppInfo(LPWSTR wszAppName, LPWSTR wszVersion)
{
    m_wszAppName = wszAppName;
    m_wszVersion = wszVersion;
}

VOID CAppInfo::PrintAppInfo()
{
    wprintf(L"\nFull application Name: %s\n", m_wszAppName);
    wprintf(L"Version: %s\n", m_wszVersion);
}

下面开始通过Windbg 来运行exe:

 我们在命令输入行输入设置的断点:bp ConsoleApplication3!CAppInfo::PrintAppInfo

断点设置在code,CAppInfo::PrintAppInfo() 函数处。


VOID CAppInfo::PrintAppInfo()
{
    wprintf(L"\nFull application Name: %s\n", m_wszAppName);
    wprintf(L"Version: %s\n", m_wszVersion);
}

 断点设置好后可以开始运行程序,命令输入行中输入g或者点击任务栏中的go按钮。

ConsoleApplication3.exe开始运行,我们输入1

 windbg 中显示断点被触发

 下面可以使用指令来查看变量:

 从中可以看到下面的代码处有问题:

  [+0x000] m_wszAppName     : 0x74707572726f43 : "--- memory read error at address 0x00747075`72726f43 ---" [Type: wchar_t *]

查看内存地址的数据,发现是Corrupt

 查看源码,下面将g_AppInfo 的内存地址处用“Corrupt”覆盖。


VOID SimulateMemoryCorruption()
{
   const char* pszWrite ="Corrupt";
    BYTE* p = (BYTE*)test1.g_AppInfo;
    CopyMemory(p, pszWrite, strlen(pszWrite));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>