易语言写的调试器支持反汇编

易语言 2020-03-06 18:53:23

易语言写的调试器支持反汇编

很简单的一个程序调试器,调用相关API实现(DebugActiveProcess)(DebugActiveProcessStop)(WaitForDebugEvent_)(ResumeThread)
以及一些简易的数据类型

.如果真 (DebugActiveProcess (pid) = 假) ' DebugActiveProcess是连接调试进程
程序_清空输出 ()
程序_输出 (“DebugActiveProcess提示:打开进程失败”)
返回 (0)
.如果真结束
进程_信息.dwProcessId = pid ' 连接成功
进程_信息.dwThreadId = 取进程主线程 (进程_信息.dwProcessId) ' 取得主线程句柄
进程_信息.hProcess = OpenProcess (2035711, 0, 进程_信息.dwProcessId) ' 打开进程
.如果真 (进程_信息.hProcess = 0)
程序_清空输出 ()
程序_输出 (“DebugActiveProcess提示:打开进程失败”)
DebugActiveProcessStop (进程_信息.dwProcessId) ' 删除调试
返回 (0)
.如果真结束
进程_信息.hThread = OpenThread (#THREAD_ALL_ACCESS, 0, 进程_信息.dwThreadId) ' 打卡主线程句柄
.如果真 (进程_信息.hThread = 0)
程序_清空输出 ()
程序_输出 (“DebugActiveProcess提示:打开主线程失败”)
DebugActiveProcessStop (进程_信息.dwProcessId)
返回 (0)
.如果真结束
ResumeThread (进程_信息.hThread) ' 恢复线程工作
是否正在工作 = 真
程序_输出 (“DebugActiveProcess提示:附加成功!” + #换行符 + “Process:” + 到文本 (pid))
标签_处理屏蔽.调用反馈事件 (, , )
时钟1.时钟周期 = 1000
.判断循环首 (WaitForDebugEvent_ (调试_事件, -1)) ' 取回调试结果,注意不要对“调试_事件”进行改写,否则会出现严重的内存错误
.判断开始 (调试_事件.dwDebugEventCode = #EXCEPTION_DEBUG_EVENT) ' 程序异常,报告异常调试事件。对u.Exception值指定一EXCEPTION_DEBUG_INFO结构
Copy_Exception (异常信息, 调试_事件.unionData, GlobalSize_Exception (异常信息))
.判断开始 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_BREAKPOINT)
Error = “断点中断,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
程序_暂停 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_SINGLE_STEP)
Error = “单步中断,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
程序_暂停 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_ACCESS_VIOLATION)
Error = “内存错误,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_INT_DIVIDE_BY_ZERO)
Error = “除零错误,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_STACK_OVERFLOW)
Error = “堆栈溢出,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_INT_OVERFLOW)
Error = “计算溢出,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_ILLEGAL_INSTRUCTION)
Error = “无效指令,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.判断 (异常信息.ExceptionRecord.ExceptionCode = #EXCEPTION_ILLEGAL_INSTRUCTION)
Error = “当前计算机不允许的指令,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.默认
Error = “其他错误,地址:” + 十到十六 (异常信息.ExceptionRecord.ExceptionAddress, 真)
强制退出 = 真
.判断结束
程序_输出 (Error)
处理寄存器 (进程_信息.hThread)
读取进程汇编 (进程_信息.hProcess, 异常信息.ExceptionRecord.ExceptionAddress)
.如果真 (强制退出)
.如果 (信息框 (Error + #换行符 + #换行符 + “是否关闭程序?”, #是否钮 + #信息图标 + #位于前台, “程序异常”, ) = #是钮)
跳出循环 ()
强制退出 = 假
.否则
强制退出 = 假
.如果结束

.如果真结束
.如果 (取反 (程序_暂停))
ResumeThread (进程_信息.hThread)
.否则
信息框 (Error + #换行符 + “程序已经暂停!”, #信息图标, “温馨提示”, )
.如果结束

.判断 (调试_事件.dwDebugEventCode = #CREATE_THREAD_DEBUG_EVENT) ' 线程创建,报告一个创建线程的调试事件。该u.CreateThread值指定一个CREATE_THREAD_DEBUG_INFO结构。
Copy_CreateThread (线程_创建信息, 调试_事件.unionData, GlobalSize_CreateThread (线程_创建信息))
程序_输出 (“线程被创建,详细信息:HTHREAD:” + 到文本 (线程_创建信息.hThread) + “,LPSTARTADDRESS:” + 到文本 (线程_创建信息.lpStartAddress) + “,THREADLOCALBASE:” + 到文本 (线程_创建信息.lpThreadLocalBase) + “”)
.判断 (调试_事件.dwDebugEventCode = #CREATE_PROCESS_DEBUG_EVENT) ' 进程被创建,报告一个创建进程调试事件。该u.CreateProcessInfo值指定一个CREATE_PROCESS_DEBUG_INFO结构。
ResumeThread (进程_信息.hThread)
处理寄存器 (进程_信息.hThread)
.判断 (调试_事件.dwDebugEventCode = #EXIT_THREAD_DEBUG_EVENT) ' 退出线程,报告的退出线程的调试事件。该u.ExitThread值指定一EXIT_THREAD_DEBUG_INFO结构。
Copy_ExitThread (线程_退出, 调试_事件.unionData, GlobalSize_ExitThread (线程_退出))
程序_输出 (“退出线程,dwExitCode:” + 到文本 (线程_退出.dwExitCode))
处理寄存器 (进程_信息.hThread)
.判断 (调试_事件.dwDebugEventCode = #EXIT_PROCESS_DEBUG_EVENT) ' 退出进程
Copy_ExitProcess (进程_退出, 调试_事件.unionData, GlobalSize_ExitProcess (进程_退出))
程序_输出 (“退出线程,dwExitCode:” + 到文本 (线程_退出.dwExitCode))
处理寄存器 (进程_信息.hThread)
ContinueDebugEvent (调试_事件.dwProcessId, 调试_事件.dwThreadId, 十六到十 (#DBG_EXCEPTION_NOT_HANDLED))
跳出循环 ()
.判断 (调试_事件.dwDebugEventCode = #LOAD_DLL_DEBUG_EVENT) ' 装载动态链接库
Copy_LoadDll (DLL_加载, 调试_事件.unionData, GlobalSize_LoadDll (DLL_加载))
程序_输出 (“————” + #换行符 + “装载DLL,BaseOfDll:” + 十到十六 (DLL_加载.lpBaseOfDll) + #换行符 + “DLL名称:” + 文件_取文件名 (取moduleName (DLL_加载.hFile), 真) + #换行符 + “DLL路径:” + 取moduleName (DLL_加载.hFile) + #换行符 + “————”)
加入成员 (DLL_DLL加载信息, 处理_DLL加载信息 (DLL_加载.hFile, DLL_加载.lpBaseOfDll))
处理寄存器 (进程_信息.hThread)
.判断 (调试_事件.dwDebugEventCode = #UNLOAD_DLL_DEBUG_EVENT) ' 卸载动态链接库
Copy_UnloadDll (DLL_卸载, 调试_事件.unionData, GlobalSize_UnloadDll (DLL_卸载))
程序_输出 (“卸载DLL,BaseOfDll:” + 十到十六 (DLL_卸载.lpBaseOfDll))
删除_DLL加载信息 (DLL_卸载.lpBaseOfDll)
处理寄存器 (进程_信息.hThread)
.判断 (调试_事件.dwDebugEventCode = #OUTPUT_DEBUG_STRING_EVENT) ' 调试输出文本
Copy_OUTPUT_DEBUG_STRING_INFO (进程_调试输出文本, 调试_事件.unionData, GlobalSize_OUTPUT_DEBUG_STRING_INFO (进程_调试输出文本))
输出字节集 = 取空白字节集 (进程_调试输出文本.nDebugStringLength)
.如果真 (ReadProcessMemory (进程_信息.hProcess, 进程_调试输出文本.lpDebugStringData, 输出字节集, 进程_调试输出文本.nDebugStringLength, dBytes))
.判断开始 (进程_调试输出文本.fUnicode ≠ 0)
程序_输出 (“输出调试文本:” + W2A (输出字节集))
.默认
程序_输出 (“输出调试文本:” + 到文本 (输出字节集))
.判断结束

.如果真结束
处理寄存器 (进程_信息.hThread)
.默认

.判断结束
.判断循环首 (程序_暂停)
程序_延时 (100)
处理事件 ()
.判断循环尾 ()
.如果真 (程序_暂停 = 假)
ResumeThread (进程_信息.hThread)
.如果真结束
ContinueDebugEvent (调试_事件.dwProcessId, 调试_事件.dwThreadId, #DBG_CONTINUE)
.判断循环尾 ()
连续赋值 (假, 是否正在工作, 强制退出, 程序_暂停)
时钟1.时钟周期 = 0
标签_解除屏蔽.调用反馈事件 (, , )
DebugActiveProcessStop (进程_信息.dwProcessId)
TerminateProcess (进程_信息.hProcess, 0)
CloseHandle (进程_信息.hProcess)
进程_信息.hProcess = 0
CloseHandle (进程_信息.hThread)
进程_信息.hThread = 0
清除数组 (DLL_DLL加载信息)