[英]The equivelant code %SystemDrive% in batch translated into C++
对于任何可以提供帮助的人,(我的操作系统是 Windows XP)我已经看过这个论坛,但没有找到类似的答案,我可以使用或适应这种特殊情况。 我将尝试解释(如果我的问题看起来令人困惑,我提前道歉)我正在构建一个批处理文件,该文件将调用 C++ 程序 (.exe) C++ 程序被硬编码到 C: 驱动器。 顺便说一下,我没有编写 C++ 程序,因为我无法用 C++ 编写,但想将 C++ 中的 C: 换成批处理 %SystemDrive% 中的内容。 C++中的代码行如下:
SetSfcFileException(0, L"c:\\windows\\system32\\calc.exe",-1);
// Now we can modify the system file in a complete stealth.
}
我想在上面的代码中更改的代码位是 C: 或“C”以将其更改为 %systemDrive% 但在 C++ 代码语言中,实际上更改了 C++ 程序的硬编码部分以读取系统路径变量在 XP 中。
我还查看了网上的其他地方,但没有找到合适的答案,因为我不想破坏您看到的 C++ 代码。
C++ 代码来自 Abdellatif_El_Khlifi 编写的以下网站:
https://www.codeproject.com/Articles/14933/A-simple-way-to-hack-Windows-File-Protection-WFP-u
非常感谢您提供的任何帮助,
大卫
您应该寻找的搜索词是已知文件夹。
具体来说,使用FOLDERID_System
标识符调用SHGetKnownFolderPath()
,这是在此处找到的众多 ID 之一。
那是为 Vista 或更好的。 对于更早的版本(例如 XP),您必须使用传递给SHGetFolderPath()
CSIDL 值, CSIDL_SYSTEM
(参见此处的列表SHGetFolderPath()
。
您仍然可以使用Vista 之前的版本,但我认为它们只是新版本的薄包装。
这是我能想出的最简单的控制台应用程序,它显示了这一点(Visual Studio 2019):
#include <iostream>
#include <shlobj_core.h>
#include <comutil.h>
int main()
{
PWSTR path = NULL;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_System, 0, NULL, &path);
_bstr_t bstrPath(path);
std::string strPath((char*)bstrPath);
std::cout << "Path is '" << strPath << "'\n";
}
我系统上的输出是:
Path is 'C:\WINDOWS\system32'
这并没有真正回答我自己的问题,好吧,它只是以另一种方式,可以说有很多方法可以给猫剥皮!
这是一个令人鼓舞的消息,尽管我偶然发现了我需要的名为 WFPReplacer 的东西,它是一个命令行窗口实用程序,可以很好地完成我想要的并且通常以相同的方式完成。 它对单一文件禁用 WFP,并且如果替换了正确的文件,则可用于批量关闭 WFP。 我需要做的就是编写一个批处理文件作为前端来备份我想禁用使用 WFPReplacer.exe 的系统文件。 因此,如果在诉讼过程中例程被塞满,我可以恢复到备份文件。 我认为这个程序使用了相同类型的嵌入式编码但是是用 Delphi/pascal 编写的,它被称为 Remko Weijnen 的博客(Remko's Blog)“替换 Wfp 保护文件”。
我通常喜欢以积极的态度离开我正在做的任何事情。 所以以防万一其他人登陆这个论坛并试图完成一个类似的练习,这里是一个可以编译的代码(这不是我的代码,它属于 Remko Weijnen 的博客(Remko 的博客))请注意它不是C++这是在此链接中找到的命令行 exe 德里/帕斯卡,因此所有学分都属于他。 链接是:
https://www.remkoweijnen.nl/blog/2012/12/05/replacing-wfp-protected-files/
DWORD __stdcall SfcFileException(RPC_BINDING_HANDLE hServer, LPCWSTR lpSrc, int Unknown)
{
RPC_BINDING_HANDLE hServerVar; // eax@2
int nts; // eax@6
__int32 dwResult; // eax@7
DWORD dwResultVar; // esi@9
int v8; // [sp+8h] [bp-8h]@1
int v9; // [sp+Ch] [bp-4h]@1
LOWORD(v8) = 0;
*(int *)((char *)&v8 + 2) = 0;
HIWORD(v9) = 0;
if ( !hServer )
{
hServerVar = _pRpcHandle;
if ( !_pRpcHandle )
{
hServerVar = SfcConnectToServer(0);
_pRpcHandle = hServerVar;
if ( !hServerVar )
return 0x6BA; // RPC_S_SERVER_UNAVAILABLE
}
hServer = hServerVar;
}
nts = SfcRedirectPath(lpSrc, (int)&v8);
if ( nts >= 0 )
dwResult = SfcCli_FileException((int)hServer, v9, Unknown).Simple;
else
dwResult = RtlNtStatusToDosError(nts);
dwResultVar = dwResult;
MemFree(v9);
return dwResultVar;
}
另外作为进一步的警告(除非您知道自己在做什么!!!)不要尝试使用该程序,在删除或更改之前始终备份您的系统文件。 该程序将做的是在您交换或修改文件的同时解除 WFP 的武装 60 秒。 示例用法例如:WfpReplacer.exe c:\\windows\\Notepad.exe(执行时将产生错误级别 true 或 false)。
最好的问候大卫
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.