注册

CpuDbg x96

查看: 474|回复: 0
收起左侧

CpuDbg无法在XP上运行的原因和解决办法

[复制链接]
发表于 2025-3-23 06:57:03 | 显示全部楼层 |阅读模式
CpuDbg调试器这个项目从开发到现在这么多年了, 还从未在XP上试过, 虽然已经兼容32位了, 但我猜大概率还是不能直接XP运行的.
今天试了一下, 果然一堆问题.下面是把遇到的问题全部列出来, 并给出解决办法.
因为XP是很久远的产物了, 和高版本的模块不兼容也是可以理解的.

比如调试器使用了高版本才有的函数, 但低版本的XP里面没有这个函数的声明和实现, 就会报错. 如下图:  

dbghelp没有SymInitializeW导出

dbghelp没有SymInitializeW导出



问题1:无法定位程序输入点 SymInitializeW 于动态链接库 dbghelp.dll 上。
图这个问题很好解决, 直接找一个XP也兼容的 dbghelp.dll就可以了. (我是直接复制微信自带的.)

问题2:无法定位程序输入点 inet_ntop 于动态链接库 WS2_32.dll 上。

inet_ntop的功能是将网络地址转成字符串, 在xp中是没有此函数的, 可以用 WSAAddressToString 代替. 两者功能差不多, WIN10和XP均有此函数实现.

问题3:无法定位程序输入点 GetThreadId 于动态链接库 KERNEL32.dll 上。
GetThreadId 这个函数是获取指定线程的ID. 在xp中是没有此函数.虽然XP有一个 GetCurrentThreadID, 但是这个函数是获取当前线程的ID.
想要解决此问题,只能使用 Windows NT API的
未文档化函数NtQueryInformationThread. 也可以使用 CreateToolhelp32Snapshot ,但这个效率要慢许多.(我选择用前者)

问题4:无法定位程序输入点 GetProcessIdOfThread 于动态链接库 KERNEL32.dll 上。
GetProcessIdOfThread是获取线程对应的PID. 在xp中没有此函数, 同上只能改成NtQueryInformationThread.

问题5:FlsAlloc  FlsFree  FlsGetValue  FlsSetValue 这几个FLS套餐组合也是无法定位, 位于kernel32.dll 上.
我看了我的代码并没有使用这几个函数. 用dumpbin能看出来kernel32.dll上使用了.

但看不出来是谁调用了.最后用 depsends 看出来是 x32_Zycore.dll 使用了.
这个是 zydis 反汇编引擎, 当初使用 capstone 觉得太慢了, 就又加上了 zydis 了.
我是直接把这几个函数注释掉就可以在XP上运行了.


问题6:调试器能正常运行起来, 但是F3加载目标程序,无反应...
在Windows XP中, OpenProcess 的第一个参数 dwDesiredAccess 如果设置为 PROCESS_ALL_ACCESS, 可能会导致访问被拒绝,尤其是在未打补丁的XP系统上.
避免使用 PROCESS_ALL_ACCESS, 改用更具体的权限组合, 如 PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION
或者打开进程前打开令牌, 提升一下权限也能解决此问题.

问题7:
to be continue...

目前是就遇到这几个问题了, 以后在开发过程中可能会有新的问题.到时候再来更新吧. 最后上一张XP上运行的截图,留念一下.

XP上正常运行

XP上正常运行


目前只能说是能在XP上跑,也能正常调试, 但调试器启动速度是真的明显很慢, 还有连续单步也是非常慢.
测试了x32dbg稍微有点卡, OD可以说是非常流畅.
日后还需要整体的优化一下代码才行...
路漫漫其修远兮~





回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2025-5-9 13:28 , Processed in 0.078125 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表