簡體   English   中英

批量翻譯成 C++ 的等效代碼 %SystemDrive%

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM