我正在编写一个应用程序,它可以捕获stdout / stderr并从系统上的任何用户模式进程debugging消息,并将其打印到控制台。 过去有几种情况我一直在编写程序,并且由于程序的性质,无论是GUI还是窗口服务等等。 控制台输出不能被简单的看到,因为没有控制台。 明显的解决方法是将打印语句更改为debugging打印语句(如OutputDebugString() ,然后附加一个debugging器并查看输出。 有时可能会比较棘手,特别是在内核模式debugging中,设置一个debugging器并查看所需的输出。
理想情况下,我正在编写的这个应用程序将允许您指定一个PID(并且最终将处理驱动程序,现在不用担心),并且不作为debugging程序附加到应用程序,它将显示所有输出到debugging器的输出, stdout或stderr。
为此,我创build了一个应用程序,将DLL注入到系统的任何进程中。 从DLL中,我在_write()过程中插入一个蹦床挂钩,以从cout,cerr,wcout,wcerr,printf和fprintf中捕获目标为stdout和stderr的数据。 我现在的问题是_write()过程的地址在目标应用程序的每次运行中都会改变。 目前,我正在windbg中运行目标应用程序,并执行x program!_write查找地址,对其进行硬编码并testing我的钩子。
TLDR@H_502_8@
Windows Update API c#代码无法获取更新历史logging
如何在Windows上的jenkins中编译和运行简单的java文件
Windows字体安装后不能立即在应用程序中使用?
Windows XP自动将数组初始化为零?
当我运行x program!_write命令时,Windbg如何find_write()的地址? 我怎样才能从注入到目标进程的DLL没有符号做同样的事情?
任何帮助将不胜感激。 我目前进度的源代码可以在这里find: https : //github.com/vix597/StJude
另外如果有一个更好的方式来redirectstdout / stderr从一个注入DLL的目标进程,我都耳朵。 我试过freopen但唯一的输出是redirect的输出源自注入的DLL本身,而不是注入DLL的应用程序。 我正在假设我无法控制目标应用程序源代码。 我还没有validation_write()被调用,当没有控制台。
UPDATE@H_502_8@
在问这个问题之前,我的testing程序是用MFC在静态库中编译的。 当使用标准窗口库时,Windbg在MSVCR120find_write() 。 对于那些试图回答这个问题的人来说,这可能会造成一些混淆:
不pipe目标应用程序中的C ++运行时被编译的方式如何,都可以find_write()方法的地址,而不pipe正在使用什么版本的C ++运行时环境?
我基本上想要这样的东西:
LPVOID fnWrite = GetProcAddress(GetModuleHandle(L"<module_name>"),"_write");
但是,这是行不通的。
我可以一次读取整个NTFS目录树到RAM中吗?
如何获得Windows解锁事件在C#窗口应用程序?
使用Java控制Windows应用程序
C + + getline(cin,缓冲区)不会停止当我按CTRL + Z
关于你如何使用Windbg的问题,它使用Windows的调试API。 有了它,你就可以插入断点等。具体来说,要在程序中使用dbghelp DLL (你需要让PDB工作)的函数地址。
但是,对于使用你有一个更简单的解决方案,只要应用程序使用运行时作为DLL:在该入口点挂钩。 看看CodeProject中的这个页面 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。