使用Microsoft驱动程序开发工具包(DDK),这个错误困扰着我,因为我甚至试图构建DDK附带的默认驱动程序.
我在通过Google追踪原因和解决方案时遇到了一些困难.为了帮助可能遇到同样问题的其他人,我在这里记录它.
解决方案: 确保您构建的目录不包含空格.
我能够找到的有关升级到我需要的适当权限的所有内容都与我当前的方法一致,但问题依然存在.我希望也许某人有一些Windows Vista/Windows 7内部体验可能会在只有黑暗的地方发光.我相信这会很长,但请耐心等待.
我正在开发一个需要访问当前机器上其他进程内存的应用程序.显然,这需要管理员权限.它还要求SeDebugPrivilege(不,它不是拼写错误SetDebugPrivilege),我相信自己要正确获取,尽管我怀疑是否有更多的特权是不必要的,因此我的问题的原因.到目前为止,Code已成功应用于所有版本的Windows XP,以及我的测试Vista 32位和Windows 7 64位环境.
Access Token以包含SeDebugPrivilege权限.EnumProcesses该系统上创建当前PID列表OpenProcess具有PROCESS_ALL_ACCESS访问权限的句柄打开ReadProcessMemory读取其他进程的内存.在开发和个人测试期间,一切都运行良好(包括Windows XP 32和64,Windows Vista 32和Windows 7 x64).但是,在同事的Windows Vista(32位)和Windows 7(64位)计算机上进行测试部署期间,似乎存在权限/权限问题,导致OpenProcess一般Access Denied错误失败.当以受限用户身份运行时(如预期的那样)以及以管理员身份明确运行(右键单击?以管理员身份运行以及从管理员级别命令提示符运行时)都会发生这种情况.
但是,在我的测试环境中,这个问题对我自己来说是不可再现的.我亲眼目睹了这个问题,所以我相信这个问题存在.我能够在实际环境和我的测试环境之间辨别的唯一区别是,在UAC提示符下使用域管理员帐户时发生了实际错误,而我的测试(无错误地工作)使用了本地管理员帐户. UAC提示.
看来虽然使用的凭据允许UAC"以管理员身份运行",但该流程仍未获得能够OpenProcess在另一个进程上运行的正确权限.我对Vista/Windows 7的内部结构不太熟悉,知道这可能是什么,我希望有人知道可能是什么原因.
报告此错误的人,以及谁的环境可以定期重现此错误,有一个小应用程序,RunWithDebugEnabled其名称是一个小的引导程序,似乎升级其自己的权限,然后启动传递给它的可执行文件(从而继承升级的特权).使用此程序运行时,在UAC提示符下使用相同的域管理员凭据,程序可以正常工作,并且能够成功调用OpenProcess并按预期运行.
因此,这肯定是获取正确权限的问题,并且已知域管理员帐户是应该能够访问正确权限的管理员帐户.(显然获得这个源代码会很棒,但如果可能的话,我不会在这里).
如上所述,失败OpenProcess尝试报告的错误是Access Denied.根据MSDN文档OpenProcess:
如果调用者启用了SeDebugPrivilege特权,则无论安全描述符的内容如何,都会授予所请求的访问权限.
这让我相信在这些条件下可能存在以下问题:(1)获取SeDebugPrivileges …
所以在这里我相信我在查看其他人的代码时发现了一个小的缓冲区溢出问题.它立刻让我觉得不正确,而且有潜在危险,但不可否认,我无法解释这个"错误"的实际后果,如果有的话.
我写了一个测试应用程序来演示错误,但发现(令我沮丧的是)无论溢出如何,它似乎都能正常运行.我想相信这只是偶然的,但是需要一些反馈来确定我的想法是否错误,或者是否真的存在问题,而不是在我的测试应用程序中显示出来.
问题代码(我认为无论如何):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
Run Code Online (Sandbox Code Playgroud)
现在,这对我来说很突出,我想把它标记为可能的缓冲区溢出是因为第一个strlen.由于指针运算,"错误"放置+ 1将导致strlen返回26而不是27(取"他的字符串的长度为27个字符长").sprintf我相信,然后将27个字符打印到缓冲区并导致缓冲区溢出.
这是正确的评估吗?
我编写了一个测试应用程序来为我正在查看的代码演示这个,并发现即使在调试器中字符串也会正确打印.我还尝试在此代码之前和之后将其他变量放在堆栈和堆上,以查看是否可以影响邻近的内存区域,但仍然收到正确的输出.我意识到我新分配的堆内存可能不相邻,这可以解释缺乏有用的溢出,但我真的想确认其他人的意见,如果这实际上是一个问题.
由于这是一个非常简单的"问题",如果你能通过某种参考来支持你的答案,那就太好了.虽然我重视并欢迎您的意见,但我不会接受"是的"作为最终答案.提前谢谢你.
更新:许多有很多额外见解的好答案.不幸的是,我无法接受所有这些.感谢您分享您的知识并成为我的"第二意见".我很感激帮助.
如果你想在完整的解释之前阅读它们,我的问题就在这篇文章的底部.
我正在使用XSL将XML文档转换为漂亮的网页,并且无法正确传递变量.我xsl:template定义了很多,并且需要将特定参数传递给其中一个.我希望我能够传递一个命名参数,该参数可能被发送到所有xsl:templates,但只能被一个人使用而被其他人忽略.然而,当我试图为自己测试这个(以及我对XSL的有限理解)时,我根本无法传递参数,更不用说测试它是否意外地干扰了任何其他xsl:template的.
以下是简化的示例代码(为此问题键入,可能包含一两个错字).我有很多不同xsl:template的定义来处理XML中的节点,到目前为止一切都运行良好.在为这些模板添加参数时,我似乎遇到了问题.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="main.xsl"?>
<wrapperNode>
<testNode>
<subNode/>
</testNode>
</wrapperNode>
Run Code Online (Sandbox Code Playgroud)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="test.xsl"/>
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates>
<xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="testNode">
<xsl:param name="testParam" />
TEST1
<xsl:value-of select="$testParam" />
TEST2
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
TEST1 TEST2
Run Code Online (Sandbox Code Playgroud)
TEST1 TEST_PARAMETER TEST2
Run Code Online (Sandbox Code Playgroud)
我对此有疑问:
是否可以xsl:template使用xsl:apply-templateswith
向我的所有s
发送命名参数
xsl:with-param,但name= …
我正在尝试使用PEM(X.509)证书(存储在磁盘上的privateKey.pem文件中)来签署通过Java中的套接字发送的消息,但是在找到一个接近的示例时遇到了很多麻烦.我通常是一个C++人,他只是在帮助这个项目,所以我把它们整合到代码中有点困难,因为我不熟悉API.
不幸的是,我只限于Java(1.6.0 Update 16)标准的方法,所以虽然我发现了一个使用BouncyCastle的PEMReader的类似例子,但它对这个特定的项目没有多大帮助.
我的privateKey.pem密钥是passphrase protected,格式为:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED DEK-Info:
DES-EDE3-CBC,63A862F284B1280B
[...]
tsjQI4H8lhOBuk+NelHu7h2+uqbBQzwkPoA8IqbPXUz+B/MAGhoTGl4AKPjfm9gu
OqEorRU2vGiSaUPgDaRhdPKK0stxMxbByUi8xQ2156d/Ipk2IPLSEZDXONrB/4O5
[...]
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
它们是使用OpenSSL生成的:
openssl.exe genrsa -out private_key.pem 4096
Run Code Online (Sandbox Code Playgroud)
我无法在运行之前将此密钥转换为DER或其他格式,所需的任何转换都需要在代码内部完成,因为密钥需要易于更换且格式仍为PEM.
我听过各种各样的事情,我并不完全确定,并且希望这里的集体思想可以帮助将各个部分拉到一起.
我听说它说PEM证书需要Base64解码才能将其转换为可以使用的DER证书.我有一个名为MiGBase64的Base64解码工具,但我不完全确定如何/何时需要解码.
我已经迷失在Java API文档中,试图追踪存在的15种不同类型的Keys,KeyStores,KeyGenerators,Certificates等,但我对它们中的任何一种都不熟悉,无法正确识别我需要的使用,以及如何一起使用它们.
基本算法看起来很简单,这就是为什么我无法编写同样简单的实现特别令人沮丧的原因:
1)从文件中读取privateKey.pem
2)将私钥加载到XXX类中,使用密码短语解密密钥
3)使用带有Signature类的密钥对象对消息进行签名
非常感谢帮助,特别是示例代码.我一直在努力寻找这个问题的有用示例,因为大多数"关闭"示例都是使用BouncyCastle生成新密钥,或者只是使用不适用于此处的不同形式的密钥/类.
这似乎是一个非常简单的问题,但它让我发疯,任何非常简单的答案?
使用Windows API在C++中创建子进程时,可以允许从父对象继承句柄.在Microsoft示例"使用重定向输入和输出创建子进程"中,将子进程'std in/out重定向到父进程创建的管道,必须允许继承以使重定向管道可用.
我正在开发一个小型演示类,它启动一个外部可执行文件,读取输出,然后将其吐回调用者(将返回的输出记录到文件中).我正在尝试建立一个超时功能,它只会在呼唤TerminateProcess()孩子并继续生活之前阻止一段时间.
但是,我发现通过允许句柄继承,子进程还有一个句柄(使用Process Explorer可见)到输出文件.我不希望子进程获得这个句柄,但是在这种情况下父进程(这个演示类)也不知道句柄,因此我目前无法SetHandleInformation()专门取消标记输出文件以将其从继承中排除.
我敢肯定,必须有一个更好的方式来继承ONLY,我想具体的把手,而不让"一刀切"基业通过无意识且不需要手柄.不幸的是,我一直无法找到解决方案,浏览了尽可能多的相关MSDN文章,并且将Google自己置于沮丧状态.
至少,我需要做一些事情来移除子句中的句柄,而不必在演示类中使用这些句柄(它们由调用类使用,并且此演示类没有明确知道它们的存在).
任何更具选择性继承的解决方案?我特别感兴趣的是允许我明确声明要继承的句柄的解决方案,如果存在这样的解决方案,则不会继承所有未指定的句柄.
非常感谢你.
我无法找到合理的方法将另一个进程的内存转储到文件中.
经过广泛的搜索,我已经能够在CodeProject找到一篇很好的文章,它有*我想要的大部分功能: 执行另一个进程内存的十六进制转储.这在解决权限问题方面做得很好,并奠定了良好的基础.
但是,使用此实用程序,我已经看到即使是一个小的进程,例如干净的Notepad.exe或Calc.exe实例,也可以生成大小超过24MB的转储文件,而根据TaskManager,进程本身在内存中运行不到20KB .
这篇文章让我相信,也许它也会将内容转储到共享内存中,可能还有DLL空间等.例如,Calc.exe转储将包含来自Kernel32.dll的方法名称(以及可能是内存)的部分:
²³´µKERNEL32.dll ActivateActCtx AddAtomA AddAtomW AddConsoleAliasA AddConsoleAliasW AddLocalAlternateComputerNameA AddLocalAlternateComputerNameW AddRefActCtx AddVectoredExceptionHandler AllocConsole AllocateUserPhysicalPages AreFileApisANSI AssignProcessToJobObject AttachConsole BackupRead BackupSeek BackupWrite BaseCheckAppcompatCache BaseCleanupAppcompatCache
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来转储不会导致这种开销的另一个进程的内存,或者可能是对解决此问题的链接文章代码的改进?我想获得实际属于进程本身的内存.我可以转储DLL中实际使用的函数的内存空间,但似乎没有必要转储多个DLL的*whole*内容来获取进程的运行内存.
我正在寻找一种方法来获得30-60KB的30KB进程,而不是30MB进程的30KB进程.或者至少比目前更接近.
提前感谢您的建议和指导,非常感谢.
注意:这适用于控制台实用程序,因此像CodeProject文章中的GUI元素并不重要.
这个问题是关于我目前正在处理的权限问题的这个问题的后续和延续。
问题摘要:
我在没有Debug programs (SeDebugPrivilege)权限的域管理员帐户下运行程序,但我需要在本地计算机上使用它。
Klugey 解决方案:
该程序可以将自己安装为本地机器上的服务,并启动该服务。所述服务现在在该SYSTEM帐户下运行,这使我们能够使用我们的SeTCBPrivilege特权创建一个新的访问令牌,该令牌具有SeDebugPrivilege. 然后我们可以使用新创建的令牌重新启动具有提升权限的初始程序。
我个人不喜欢这个解决方案。我觉得应该可以以管理员身份获得必要的权限,而无需进行系统修改,例如安装服务(即使只是暂时的)。
我希望有一种解决方案可以最大限度地减少系统修改,并且最好可以即时完成(即:不需要自行重新启动)。我曾经失败尝试LogonUser的SYSTEM,并试图OpenProcessToken在已知的系统进程(如CSRSS.EXE)(其失败,因为你不能OpenProcess用PROCESS_QUERY_INFORMATION得到的句柄过程中没有特权,我试图获取)。
我只是在我的智慧尽头试图想出一个替代解决方案来解决这个问题。我希望有一种简单的方法可以在主机上获取特权令牌并为该程序模拟它,但我还没有找到方法。
如果有人知道解决这个问题的方法,或者甚至对可能有效的事情有建议,请告诉我。我非常感谢您的帮助,谢谢!
我会直接进入,简短而具有描述性:
C++,Windows API
我正在使用CreateProcess运行外部(命令行)应用程序创建子进程.我已经内置了超时,如果子进程到那时还没有返回正常执行,我希望强制终止该子进程.
理想情况下,我希望该子进程的行为与调用它一样ExitProcess,或者就像Ctrl+C发送到其控制台(ExitProcess从默认控制台控制处理程序调用)一样.
到目前为止,我的解决方案一直是TerminateProcess强行杀死孩子.这确实迫使孩子立即终止,但不幸的是,如果那个孩子产生了自己的孩子,他们就会一直运行直到他们"自然"完成.
有没有办法告诉子进程调用ExitProcess,或强制所有孩子的孩子在TerminateProcess被叫时终止?
这些外部应用程序是我无法控制的,因此我无法修改它们以提供自定义解决方案.
假设不知道允许我TerminateProcess单独手动调用grand-child进程的grand-child进程(名称/ pids/etc).虽然这可以通过手动枚举所有进程,映射进程关系和跟踪所有进程来完成,但我不认为这是一个有效的解决方案,除非作为绝对的最后手段.
感谢您的时间.
c++ ×6
windows ×4
parent-child ×2
privileges ×2
build ×1
c ×1
fatal-error ×1
handle ×1
java ×1
memory ×1
openprocess ×1
parameters ×1
pem ×1
printf ×1
process ×1
signature ×1
stylesheet ×1
uac ×1
wdk ×1
xslt ×1