void AdjustPrivilege(int pid, BOOL bEnable)
{
HANDLE hProcess;
HANDLE hToken=0;
TOKEN_PRIVILEGES tkp;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = 0;
if
(bEnable)
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if
(LookupPrivilegeValue(NULL,
"SeDebugPrivilege"
, &tkp.Privileges[0].Luid))
{
if
(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid))
{
if
(OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
{
if
(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL))
{
CloseHandle(hToken);
}
}
CloseHandle(hProcess);
}
}
}
DWORD FindExplorer()
{
HANDLE hC;
DWORD i;
BOOL Next;
char szName[MAX_PATH];
PROCESSENTRY32 p32 = {sizeof(p32)};
hC = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
Next = Process32First(hC, &p32);
i = 0;
while
(Next)
{
wsprintf(szName,
"%s"
, p32.szExeFile);
if
(lstrcmpi(szName,
"EXPLORER.EXE"
) == 0)
return
p32.th32ProcessID ;
Next = Process32Next(hC, &p32);
i++;
}
CloseHandle(hC);
return
0;
}
HANDLE hProcess;
DWORD ZwCP;
DWORD ZwCPEx;
DWORD NoCP;
DWORD NoCPEx;
void __declspec(naked) FuckZwCP()
{
__asm
{
mov eax, hProcess
mov [esp+0x10], eax
mov eax, NoCP;
push ZwCP;
add dword ptr [esp], 5
retn
}
}
void __declspec(naked) FuckZwCPEx()
{
__asm
{
mov eax, hProcess
mov [esp+0x10], eax
mov eax, NoCPEx;
push ZwCPEx;
add dword ptr [esp], 5
retn
}
}
void Patch()
{
DWORD odpt;
ZwCP = (DWORD)GetProcAddress(GetModuleHandle(
"ntdll.dll"
),
"ZwCreateProcess"
);
ZwCPEx = (DWORD)GetProcAddress(GetModuleHandle(
"ntdll.dll"
),
"ZwCreateProcessEx"
);
if
(ZwCP != 0)
{
NoCP = *(LPDWORD)(ZwCP+1);
VirtualProtect((LPVOID)ZwCP, 5, PAGE_EXECUTE_READWRITE, &odpt);
*(LPBYTE)(ZwCP+0x00) = 0xE9;
*(LPDWORD)(ZwCP+0x01) = (DWORD)FuckZwCP - ZwCP - 5;
}
if
(ZwCPEx != 0)
{
NoCPEx = *(LPDWORD)(ZwCPEx+1);
VirtualProtect((LPVOID)ZwCPEx, 5, PAGE_EXECUTE_READWRITE, &odpt);
*(LPBYTE)(ZwCPEx+0x00) = 0xE9;
*(LPDWORD)(ZwCPEx+0x01) = (DWORD)FuckZwCPEx - ZwCPEx - 5;
}
}
void entry()
{
AdjustPrivilege(GetCurrentProcessId(), TRUE);
DWORD Pid;
Pid = FindExplorer();
if
(Pid == 0)
{
return
;
}
hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION | PROCESS_CREATE_PROCESS, FALSE, Pid);
if
(hProcess == NULL)
{
return
;
}
Patch();
OPENFILENAME ofn = { sizeof(ofn) };
char szFilter[] =
"EXE Files\0*.EXE\0\0"
;
char szFileName[MAX_PATH];
char szFilePath[MAX_PATH];
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFileName;
ofn.nFilterIndex = 1;
ofn.lpstrFile[0] = 0;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle =
"Loader"
;
ofn.lpstrFilter = szFilter;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST;
if
(!GetOpenFileName(&ofn))
{
return
;
}
strcpy(szFilePath, szFileName);
*(strrchr(szFilePath,
'\\'
)+1) = 0;
//
神奇,贴出来后两个反的变成一个了
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi = {0};
CreateProcess(NULL, szFileName, NULL, NULL, FALSE, 0, NULL, szFilePath, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
ExitProcess(0);
}