V tomto článku si popíšeme ako navrhnúť funkciu na vytvorenie novej plochy a následne sa do nej prepnúť.
 

 

Ide o veľmi peknú a zaujímavú funkciu, ktorá nám vytvorí nové okno desktopu do ktorého sa následne prepne.
V jednoduchosti sa užívateľovi načítanému pod desktopom, po spustení tejto funkcie zobrazží nová, čistá plocha než tá, pod ktorou bol prihlásenný.

Funkciu je možné využiť pri písaní malwaru, napríklad RansomWare, kedy chceme, aby sa uzžívateľovi skryla aktuálna plocha a spustila sa plocha nová.


  void CreateNewDesktop(::std::vector<char*>inputrunprocess)
{ char * desktop_name = "MyDesktop"; char explorer_path[MAX_PATH]; ::HDESK newdesktop = NULL; ::HDESK olddesktop; ::STARTUPINFOA d_STARTUPINFOA = {0}; ::PROCESS_INFORMATION d_PROCESS_INFORMATION = {0};
::ExpandEnvironmentStringsA("%windir%\\explorer.exe", explorer_path, MAX_PATH-1); newdesktop = ::OpenDesktopA(desktop_name, NULL, FALSE, GENERIC_ALL);
if(!newdesktop) { newdesktop = ::CreateDesktopA(desktop_name, NULL, NULL, 0, GENERIC_ALL, NULL); if(newdesktop) { if(SetThreadDesktop(newdesktop)) { d_STARTUPINFOA.cb = sizeof(d_STARTUPINFOA); d_STARTUPINFOA.lpDesktop = desktop_name;
::CreateProcessA(explorer_path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &d_STARTUPINFOA, &d_PROCESS_INFORMATION);
for (std::vector<char*>::iterator it = inputrunprocess.begin() ; it != inputrunprocess.end(); ++it) { ::CreateProcessA(*it, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &d_STARTUPINFOA,
&d_PROCESS_INFORMATION); }

::SetThreadDesktop(olddesktop);
} } }
if(newdesktop!=null) { ::SetThreadDesktop(newdesktop); ::SwitchDesktop(newdesktop); } ::CloseHandle(newdesktop); }



Do bloku //Blok pre vytvorenie procesov zo sÚborov, ktorÉ chceme na novej ploche spustiť// pridávame spustenie programov, teda vytvorenie procesov tých programov, ktoré chceme, aby sa pri načítaní novej ploche spustili.

 

 

 

-----------------------------------------------------------------

Celá funkcia je zakonpovaná do headeru WinAPI.h WinAPI.h


#include "WinAPI.h" //https://www.netbot.sk/sk/14-blog-headers/31-winapi

int _cdecl main (void) 
{
   ::std::vector<char*>runmodules; 
//Blok pre vytvorenie procesov zo suborov, ktore chceme na novej ploche spustit// runmodules.push_back("c:\\windows\\notepad.exe"); runmodules.push_back("c:\\windows\\regedit.exe"); //-----//
::Diall_WinApi::WinApi::GetInstance()->CreateNewDesktop(runmodules);

return 0; }