E-Debugger易语言类似OD调试器

易语言 2020-07-10 09:12:58

E-Debugger易语言类似OD调试器

.判断循环首 (取反 (要退出吗) 且 WaitForDebugEvent (Debug, -1) ≠ 0)
.如果真 (Debug.dwDebugEventCode = 3) ' 进程被创建成功了
CreateProcessInfo = 置CREATE_PROCESS_DEBUG_INFO (GetU (Debug))
置状态 (“进程已创建:” + 文件_取文件名 (程序路径, 真) + “(” + 到文本 (Debug.dwProcessId) + “)”)
显示内存数据 (CreateProcessInfo.lpBaseOfImage)
processInfo.线程句柄 = OpenThread (2032639, 0, processInfo.线程标识符)
processInfo.进程句柄 = OpenProcess (2035711, 0, processInfo.进程标识符)
反汇编 (CreateProcessInfo.lpStartAddress, 300)
' 等待运行信号
刷新寄存器 (processInfo.线程句柄)
_启动窗口.超级列表框1.现行选中项 = 0
.判断循环首 (信号 = 0)
延迟 (200)
.判断循环尾 ()
' 解析信号
.如果真结束
.如果真 (Debug.dwDebugEventCode = 5) ' 进程退出了
ExitProcess = 置EXIT_PROCESS_DEBUG_INFO (GetU (Debug))
置状态 (“进程已退出:” + 文件_取文件名 (程序路径, 真) + “(” + 到文本 (Debug.dwProcessId) + “) Exit code:” + 到文本 (ExitProcess.dwExitCode))
结束调试 ()
要退出吗 = 真
.如果真结束
.如果真 (Debug.dwDebugEventCode = 2) ' 线程被创建了
CreateThread = 置CREATE_THREAD_DEBUG_INFO (GetU (Debug))
加入成员 (线程表, CreateThread)
置状态 (“线程已经创建:” + 到文本 (GetThreadId (CreateThread.hThread)) + “入口点:0x” + 进制_十到十六 (CreateThread.lpStartAddress))
' CloseHandle (CreateThread.hThread)
' 到循环尾 () ' 特殊处理
.如果真结束
.如果真 (Debug.dwDebugEventCode = 6) ' 加载DLL模块
LoadDll = 置LOAD_DLL_DEBUG_INFO (GetU (Debug))
加入成员 (DLL模块, LoadDll)
置状态 (“加载模块:” + 取moduleName (LoadDll.hFile))
.如果真结束
.如果真 (Debug.dwDebugEventCode = 7) ' 卸载模块
Unload = 置UNLOAD_DLL_DEBUG_INFO (GetU (Debug))
.计次循环首 (取数组成员数 (DLL模块), i)
' 删除对应的记录
.如果真 (DLL模块 [i].lpBaseOfDll = Unload.lpBaseOfDll)
置状态 (“卸载模块:” + 取moduleName (DLL模块 [i].hFile))
删除成员 (DLL模块, i, 1)
跳出循环 ()
.如果真结束

.计次循环尾 ()
.如果真结束
.如果真 (Debug.dwDebugEventCode = 1) ' 调试 核心中的核心的说
' 分类讨论
' 如果真 (Exception.ExceptionRecord.ExceptionCode = -2147483645)
' 调试输出 (Exception.dwFirstChance)
.如果真结束
ContinueDebugEvent (processInfo.进程标识符, processInfo.线程标识符, 65538)
.判断循环尾 ()

载入程序后会断在入口点,按下F9继续运行。
有兴趣的朋友可以继续开发。
最烦的就是DEBUG_EVENT结构体的u成员是一个共用体(union)结构,易语言模拟起来有些麻烦,不过还是比较好解决的,具体参看源码。
最后一点说明:BeaEngine.dll是反汇编引擎。