狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網站管理員

聊天軟件利用Windows系統(tǒng)API函數(shù)SetWindowDisplayAffinity不讓截圖?我偏要!破解它!

admin
2024年9月17日 12:28 本文熱度 648

前幾天,有小伙伴反映:他手里有個聊天軟件,每次一截圖,聊天窗口就不見了,甚至按鍵盤上的PrtSc截圖鍵截下來都沒有這個聊天窗口的內容,他想盡各種辦法,就是截不了這個軟件的圖。

聽他這么一描述,我還有些好奇了起來。首先懷疑的是這軟件是不是安裝了什么消息鉤子,通過監(jiān)聽鍵盤按鍵,禁止截圖,于是有人建議他換個快捷鍵,結果發(fā)現(xiàn)也不行:

于是我建議讓他手動點擊微信的截圖按鈕,不要敲鍵盤,結果還是不行:

有群友建議他使用錄屏功能,直接錄視頻,發(fā)現(xiàn)居然仍然不行!

這一下挑起了我的興趣,這軟件還真有兩下子啊。

基于這么多操作都不行,于是我懷疑是不是這軟件安裝了什么內核驅動,在內核里面攔截捕捉屏幕像素內容的操作,于是建議用PChunter查一下:

鑒于這位小伙伴不是太會操作,于是我找他要到了這個聊天軟件的安裝包,自己安裝了來研究。結果發(fā)現(xiàn)居然啥驅動都沒裝!也沒有什么可疑的鉤子行為。甚至連軟件的登錄界面都截不了圖!

這一下讓我皺眉頭了,一個普通應用程序,它是咋做到這一切的?難道是有什么我不知道的操作?【本文來自微信公眾號:軒轅的編程宇宙,未經許可,禁止搬運

于是我打開ChatGPT,把上面的現(xiàn)象給它描述了一下,他告訴了我一個系統(tǒng)API,這個API可以辦到這樣的效果,這個API就是:SetWindowDisplayAffinity

根據MSDN的描述,這個函數(shù)可以用來設置窗口不被任何屏幕錄制行為捕獲:

為了驗證這聊天軟件是不是通過這個API實現(xiàn)的,我用APImonitor抓了一下它啟動的過程,果然發(fā)現(xiàn)了對這個函數(shù)的調用,而且第二個參數(shù)傳遞的值正是上面的0x11,也就是17。

問題搞清楚了,想要破解就好辦了,再調用一下這個函數(shù),把第二個參數(shù)設置為0,解除對窗口的保護就好了。

不過要注意,根據MSDN的描述,調用這個函數(shù)必須要窗口屬于當前進程才行,無法操作別的進程的窗口。所以我們得讓那個聊天軟件自己去調用這個函數(shù)解除它的窗口保護。【本文來自微信公眾號:軒轅的編程宇宙,未經許可,禁止搬運】

那如何讓聊天軟件主動去干這件事呢?用我們第26課學到的DLL注入就好了:我們編寫一個DLL,在DLL里面調用這個函數(shù)解除窗口保護,然后把DLL注入到目標聊天軟件進程中就好了。

我們先用Spy++看一下要解除保護的窗口,通過上面APImonitor中抓到的兩次調用SetWindowDisplayAffinity函數(shù)所設置的兩個窗口句柄值在Spy++中找到這兩個窗口:

查看兩個窗口的窗口類和窗口名稱,接下來,寫代碼解除保護:

在DLL加載的時候就執(zhí)行上述動作:

BOOL APIENTRY DllMain(HMODULE hModule,
 DWORD  ul_reason_for_call,
 LPVOID lpReserved
)

{
    // 注釋:本代碼來自公眾號:軒轅的編程宇宙
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
  MessageBoxA(NULL'dll注入成功!''CaptureCrack', MB_OK);
  Work();
  break;
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
  break;
 }
 return TRUE;
}

接下來,把DLL注入進去:

int main(int argc, char* argv[])
{
    // 注釋:本代碼來自公眾號:軒轅的編程宇宙
 DWORD dwProcessId = 4092; // 需要自己找到對應進程ID
 LPVOID pfnLoadLibraryA = GetFunctionAddress(dwProcessId, 'kernel32.dll''LoadLibraryA');


 // 2、拿到進程的句柄
 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
 if (!hProcess) {
  printf('can not open process!\n');
  return 0;
 }

 // 3、在進程中分配內存
 LPVOID address = VirtualAllocEx(hProcess, NULL100, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 if (!address) {
  printf('VirtualAllocEx failed!\n');
  return 0;
 }

 // 4、向分配到的內存中寫入要注入的DLL路徑,作為參數(shù)
 SIZE_T writeBytes = 0;
 const char* dllPath = 'CaptureCrack.dll';
 if (!WriteProcessMemory(hProcess, address, dllPath, strlen(dllPath) + 1, &writeBytes)) {
  printf('WriteProcessMemory failed!\n');
  return 0;
 }


 // 5、創(chuàng)建遠程線程
 HANDLE hThread = CreateRemoteThread(hProcess, NULL0, (LPTHREAD_START_ROUTINE)pfnLoadLibraryA, address, NULLNULL);
 if (!hThread) {
  printf('CreateRemoteThread failed!\n');
  return 0;
 }

 WaitForSingleObject(hThread, INFINITE);

 CloseHandle(hProcess);
 CloseHandle(hThread);

 return 0;
}

最后,執(zhí)行成功,終于可以截圖了:

上面的辦法,不是個長久之計,因為程序重啟后,又得要重新注入來改。挺麻煩的,那有沒有一勞永逸的辦法呢?

還真有!直接逆向分析找到程序調用SetWindowDisplayAffinity函數(shù)的地方,找到第二個參數(shù)傳參的指令,直接修改exe文件中的指令參數(shù),把它改為0,保存exe文件就好了!

來自:軒轅之風


該文章在 2024/9/18 12:00:17 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved