我们都知道OllyDbg会把目标调试程序中调用OutputDebugString输出的调试信息拦截.而OllyDbg的调试输出过滤等功能都不如DbgView.所以,如果你习惯使用DbgView,那这个插件是你需要的,它可以在不影响OllyDbg记录显示的情况下再输出一份调试信息到DbgView.
下面是代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; OD 的一个插件例子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
szDbgStr db 1024 dup (?) ; 调试输出缓冲区
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; dll 的入口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry proc _hInstance,_dwReason,_dwReserved
mov eax,TRUE
ret
DllEntry Endp
szPluginName db "调试输出重定向",0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; OD 获取插件名称的函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ODBG_Plugindata proc C _lpStr
pushad
invoke lstrcpy,_lpStr,offset szPluginName
popad
mov eax,06Ch ; OD 版本信息(#define PLUGIN_VERSION 108)
ret
_ODBG_Plugindata endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 初始化函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ODBG_Plugininit proc C _dwVersion,_hWnd,_Features
xor eax,eax
ret
_ODBG_Plugininit endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主循环函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ODBG_Pluginmainloop proc C stDE
local @hProc
pushad
mov edi,stDE
.if edi != 0
mov eax,(DEBUG_EVENT ptr [edi]).dwDebugEventCode
.if eax == OUTPUT_DEBUG_STRING_EVENT ; 调试输出事件
invoke OpenProcess,PROCESS_ALL_ACCESS,0,(DEBUG_EVENT ptr [edi]).dwProcessId
.if eax != 0
mov @hProc,eax
mov edx,(DEBUG_EVENT ptr [edi]).u.DebugString.lpDebugStringData
movzx ecx,(DEBUG_EVENT ptr [edi]).u.DebugString.nDebugStringiLength
invoke ReadProcessMemory,@hProc,edx,offset szDbgStr,ecx,0
invoke CloseHandle,@hProc
invoke OutputDebugString,offset szDbgStr
.endif
.endif
.endif
popad
ret
_ODBG_Pluginmainloop endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End DllEntry