微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从用户模式win32应用程序中可靠地find当前进程的_write函数的地址

我正在编写一个应用程序,它可以捕获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

Python的钥匙圈 – 如何获取用户名

如何在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

Windows资源pipe理器 – 每个文件自定义图标?

关于你如何使用Windbg的问题,它使用Windows的调试API。 有了它,你就可以插入断点等。具体来说,要在程序中使用dbghelp DLL (你需要让PDB工作)的函数地址。

但是,对于使用你有一个更简单的解决方案,只要应用程序使用运行时作为DLL:在该入口点挂钩。 看看CodeProject中的这个页面

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐