X64dbg功能介绍

同时只能有一个软件调试器附加同一个进程。可以将x64dbg附加到一个已经打开的进程上,点击文件-----附加-------找到需要的进程附加即可。当调试完以后脱离进程。

当被调试程序与调试器之间建立调试关系以后,就可以开始进行动态调试分析了,在x64dbg中有许多的窗口,例如CPU窗口,寄存器窗口,堆栈窗口,十六进制窗口等,如下图所示则是x64dbg运行后的主界面;这里增加一个知识点,关于动态反汇编调试与静态反汇编调试的区别:

  • 动态反汇编调试(Dynamic Disassembly Debugging)是指在程序运行时动态地反汇编机器码,从而获取指令级别的执行信息和内存访问情况,以辅助调试和分析程序。动态反汇编调试需要借助特殊的调试工具,如GDB、x64dbg、Ollydbg等,通常用于调试崩溃、死锁、内存泄漏等问题。

  • 静态反汇编调试(Static Disassembly Debugging)是指对程序进行反汇编分析,不需要运行程序,只需要对程序进行静态分析就可以获得指令级别的执行信息和内存访问情况,以辅助调试和分析程序。静态反汇编调试需要使用特殊的工具,如IDAPro、Binary Ninja等,通常用于逆向工程、恶意代码分析、漏洞挖掘等方面。

如上图所示,当调试器运行后最大的窗口则是CPU窗体,CPU窗体是x64dbg的默认主窗口,用户所有的调试工作都在CPU窗体中完成,因为CPU窗体就是用于反应当前CPU以及寄存器执行状态的,CPU窗体其内部包含了五个子窗口,分别是反汇编窗口,寄存器窗口,栈地址窗口,十六进制数据窗口,以及堆栈参数解析窗口。

按一下H再选择需要高亮显示的部分,此时所有跟选中部分一样的信息都高亮显示; 按*号会返回到RIP位置;

以编写代码读写基址偏移为例。

跨进程读写
1、FindWindow获取目标进程  窗口句柄
2、OpenProcess(打开权限,false,进程PID)获取目标进程句柄,而且这个句柄 需要有读写权限
3、ReadProcessMemory()
4、CloseHandle释放掉进程句柄

获取窗口的句柄和类可以通过VS2019中的调试工具Spy++进行查找。

跨进程读写的实现代码

UINT64 R8(UINT64 地址)
{
    UINT64 返回值=0;
    HWD 窗口句柄=FindWindowA("#32770","GameTest");
    if(窗口句柄)
    {
        DWowd 进程PID = 0; 
        GetWindowThreadProcessId(窗口句柄,&进程PID);
        HANDLE 进程句柄=OpenProcess(PROCESS_ALL_ACCESS,FALSE,进程PID);
        if(进程句柄)
        {
            //读取内存
            ReadProcessMemory(进程句柄,(LPVOID)地址,&返回值,8,NULL);
        }
    }
    return 返回值;
}

//读取整数
DWORD R4(UINT64 地址)
{
    return (DWORD)R8(地址);
}

//读取浮点数
float R4F(UINT64 地址)
{
    float 返回值=0;
    HWD 窗口句柄=FindWindowA("#32770","GameTest");
    if(窗口句柄)
    {
        DWowd 进程PID = 0; 
        GetWindowThreadProcessId(窗口句柄,&进程PID);
        HANDLE 进程句柄=OpenProcess(PROCESS_ALL_ACCESS,FALSE,进程PID);
        if(进程句柄)
        {
            //读取内存
            ReadProcessMemory(进程句柄,(LPVOID)地址,&返回值,sizeof(float),NULL);
        }
    }
    return 返回值;
}

int  _tmain(int argc,_TCHAR* argv[])
{
    //读取变量 dword
    printf("整数变量1=%u  整数变量2=%u \r\n", R4(R8(0x1400000000+0x8A58 + 0x160),
    R4(R8(0x1400000000+0x8A58 + 0x164));

        //读取变量 float
    printf("浮点数变量1=%f  浮点数变量2=%f \r\n", R4F(R8(0x1400000000+0x8A58 + 0x168),
    R4F(R8(0x1400000000+0x8A58 + 0x16C));

    getchar();
    return 0;
}

此时就读取出了窗口中的变量的值了。

当把需要动态破解的程序拖放到x64dbg以后,点击1处的搜索字符串是搜索不到的,因为2处有明显显示是ntdll库中是搜索不到有用信息的。

此时就点击3处,让其运行到用户代码区才能搜索到有用信息。

此时在比较函数的地方加个断点并点击运行,就会出现正确的密码信息。将正确密码信息拷贝到程序中进行验证。

如何绕过反调试检测。先运行一下测试有Wrong key的错误提示

将程序拖到x64dbg一直点运行出现反调试提示

重启程序隐藏dbg

隐藏后再次点运行此时已经绕过了反调试检测。

根据Wrong key的提示信息来查找关键信息。rbx存的是错误的注册信息 与另一个正确的做比较。复制rbx行的16进制数据到计算器中进行计算

转载请注明出处:  https://www.cntworld.cn
智能工控 » X64dbg功能介绍

发表回复

提供最优质的资源集合

立即查看 了解详情