├── Minecraft hacks
└── Forge
│ ├── 1.12.2
│ └── ForgeWurst.jar
│ ├── 1.5.2
│ └── EasyCheat.jar
│ ├── 1.6.4
│ └── EasyCheat.jar
│ └── 1.7.10
│ ├── CheatingEssentials.jar
│ ├── EHacks_Pro_v4.1.9.jar
│ ├── EasyCheat.jar
│ └── xenobyte_1.0.58.jar
├── README.md
├── logo.png
└── src
├── cheat.cpp
├── cheat.h
├── dllmain.cpp
├── utils.cpp
└── utils.h
/Minecraft hacks/Forge/1.12.2/ForgeWurst.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.12.2/ForgeWurst.jar
--------------------------------------------------------------------------------
/Minecraft hacks/Forge/1.5.2/EasyCheat.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.5.2/EasyCheat.jar
--------------------------------------------------------------------------------
/Minecraft hacks/Forge/1.6.4/EasyCheat.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.6.4/EasyCheat.jar
--------------------------------------------------------------------------------
/Minecraft hacks/Forge/1.7.10/CheatingEssentials.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.7.10/CheatingEssentials.jar
--------------------------------------------------------------------------------
/Minecraft hacks/Forge/1.7.10/EHacks_Pro_v4.1.9.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.7.10/EHacks_Pro_v4.1.9.jar
--------------------------------------------------------------------------------
/Minecraft hacks/Forge/1.7.10/EasyCheat.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.7.10/EasyCheat.jar
--------------------------------------------------------------------------------
/Minecraft hacks/Forge/1.7.10/xenobyte_1.0.58.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/Minecraft hacks/Forge/1.7.10/xenobyte_1.0.58.jar
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 
7 |
8 |
9 |
10 | This tool inject your jar file and allocates object of class, which name must be written in zip comment.
11 | Entry point of your main-class will be constructor.
12 | After building you classes, you should put them into archive using WinRAR of other archivator which can change archive comment.
13 | You should write main class in comment as single line.
14 | Example:
15 | Put class with name "Main" inside package "test", constructor will be your entry-point, e.g
16 | "public Main() { Your awesome code }", so you should set comment in your archive with classes to "test.Main" without quotes.
17 |
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/logo.png
--------------------------------------------------------------------------------
/src/cheat.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include "jni.h"
3 | #include "utils.h"
4 |
5 | jstring getZipCommentFromBuffer(JNIEnv *env, jbyteArray buffer) {
6 | byte endOfDirectoryFlag[] = { 0x50, 0x4b, 0x05, 0x06 };
7 | int endLength = sizeof(endOfDirectoryFlag) / sizeof(byte);
8 | int bufferLength = env->GetArrayLength(buffer);
9 | jbyte *byteBuffer = env->GetByteArrayElements(buffer, false);
10 |
11 | for (int i = bufferLength - endLength - 22; i >= 0; i--) {
12 | boolean isEndOfDirectoryFlag = true;
13 | for (int k = 0; k < endLength; k++) {
14 | if (byteBuffer[i + k] != endOfDirectoryFlag[k]) {
15 | isEndOfDirectoryFlag = false;
16 | break;
17 | }
18 | }
19 | if (isEndOfDirectoryFlag) {
20 | int commentLen = byteBuffer[i + 20] + byteBuffer[i + 22] * 256;
21 | int realLen = bufferLength - i - 22;
22 | jclass String = env->FindClass("java/lang/String");
23 | jmethodID Init = env->GetMethodID(String, "", "([BII)V");
24 | return (jstring)env->NewObject(String, Init, buffer, i + 22, min(commentLen, realLen));
25 | }
26 | }
27 |
28 | return NULL;
29 | }
30 |
31 | typedef jobjectArray(JNICALL *JVM_GetAllThreads)(JNIEnv *env, jclass dummy);
32 |
33 | void cheat(JNIEnv *jniEnv) {
34 | jclass fileChooserCls = jniEnv->FindClass("javax/swing/JFileChooser");
35 | jmethodID fileChooserInit = jniEnv->GetMethodID(fileChooserCls, "", "()V");
36 | jobject fileChooser = jniEnv->NewObject(fileChooserCls, fileChooserInit);
37 |
38 | jmethodID setDialogTitle = jniEnv->GetMethodID(fileChooserCls, "setDialogTitle", "(Ljava/lang/String;)V");
39 | jniEnv->CallVoidMethod(fileChooser, setDialogTitle, jniEnv->NewStringUTF("Select target file"));
40 |
41 | jmethodID setAcceptAllFileFilterUsed = jniEnv->GetMethodID(fileChooserCls, "setAcceptAllFileFilterUsed", "(Z)V");
42 | jniEnv->CallVoidMethod(fileChooser, setAcceptAllFileFilterUsed, false);
43 |
44 | jclass String = jniEnv->FindClass("java/lang/String");
45 | jobjectArray extensions = jniEnv->NewObjectArray(2, String, false);
46 | jniEnv->SetObjectArrayElement(extensions, 0, jniEnv->NewStringUTF("zip"));
47 | jniEnv->SetObjectArrayElement(extensions, 1, jniEnv->NewStringUTF("jar"));
48 |
49 | jclass extFilterCls = jniEnv->FindClass("javax/swing/filechooser/FileNameExtensionFilter");
50 | jmethodID extFilterInit = jniEnv->GetMethodID(extFilterCls, "", "(Ljava/lang/String;[Ljava/lang/String;)V");
51 | jobject filter = jniEnv->NewObject(extFilterCls, extFilterInit, jniEnv->NewStringUTF("ZIP or JAR file"), extensions);
52 |
53 | jmethodID addChoosableFileFilter = jniEnv->GetMethodID(fileChooserCls, "addChoosableFileFilter", "(Ljavax/swing/filechooser/FileFilter;)V");
54 | jniEnv->CallVoidMethod(fileChooser, addChoosableFileFilter, filter);
55 |
56 | jclass fileCls = jniEnv->FindClass("java/io/File");
57 | jmethodID initFileWithString = jniEnv->GetMethodID(fileCls, "", "(Ljava/lang/String;)V");
58 | jmethodID initFileWithTwoStrings = jniEnv->GetMethodID(fileCls, "", "(Ljava/lang/String;Ljava/lang/String;)V");
59 | jmethodID getParent = jniEnv->GetMethodID(fileCls, "getParent", "()Ljava/lang/String;");
60 | jmethodID getAbsolutePath = jniEnv->GetMethodID(fileCls, "getAbsolutePath", "()Ljava/lang/String;");
61 |
62 | jmethodID setCurrentDirectory = jniEnv->GetMethodID(fileChooserCls, "setCurrentDirectory", "(Ljava/io/File;)V");
63 | jclass System = jniEnv->FindClass("java/lang/System");
64 | jmethodID getProperty = jniEnv->GetStaticMethodID(System, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
65 | jobject Desktop = jniEnv->NewObject(fileCls, initFileWithTwoStrings, (jstring) jniEnv->CallStaticObjectMethod(System, getProperty, jniEnv->NewStringUTF("user.home")), jniEnv->NewStringUTF("Desktop"));
66 | jniEnv->CallVoidMethod(fileChooser, setCurrentDirectory, Desktop);
67 |
68 | jmethodID showDialog = jniEnv->GetMethodID(fileChooserCls, "showDialog", "(Ljava/awt/Component;Ljava/lang/String;)I");
69 |
70 | TCHAR tempPath[MAX_PATH];
71 | HMODULE hm = NULL;
72 |
73 | GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
74 | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
75 | (LPWSTR)&cheat, &hm);
76 | GetModuleFileName(hm, tempPath, sizeof(tempPath));
77 |
78 | char cPath[MAX_PATH];
79 | wcstombs(cPath, tempPath, wcslen(tempPath) + 1);
80 |
81 | jstring jPath = jniEnv->NewStringUTF(cPath);
82 | jobject dllFile = jniEnv->NewObject(fileCls, initFileWithString, jPath);
83 | jobject file = jniEnv->NewObject(fileCls, initFileWithTwoStrings, jniEnv->CallObjectMethod(dllFile, getParent), jniEnv->NewStringUTF("cheat.zip"));
84 | jstring comment = NULL;
85 | do {
86 | if (!file) {
87 | jint result = jniEnv->CallIntMethod(fileChooser, showDialog, NULL, jniEnv->NewStringUTF("Inject"));
88 |
89 | //result == JFileChooser.APPROVE_OPTION
90 | if (result == 0) {
91 | jmethodID getSelectedFile = jniEnv->GetMethodID(fileChooserCls, "getSelectedFile", "()Ljava/io/File;");
92 | file = jniEnv->CallObjectMethod(fileChooser, getSelectedFile);
93 | } else {
94 | return;
95 | }
96 | }
97 |
98 | if (file) {
99 | jmethodID existsMethod = jniEnv->GetMethodID(fileCls, "exists", "()Z");
100 | jboolean exists = jniEnv->CallBooleanMethod(file, existsMethod);
101 | if (!exists) {
102 | file = NULL;
103 | } else {
104 | jmethodID toPath = jniEnv->GetMethodID(fileCls, "toPath", "()Ljava/nio/file/Path;");
105 | jobject pathObj = jniEnv->CallObjectMethod(file, toPath);
106 | jclass Files = jniEnv->FindClass("java/nio/file/Files");
107 | jmethodID readAllBytes = jniEnv->GetStaticMethodID(Files, "readAllBytes", "(Ljava/nio/file/Path;)[B");
108 | jobject allBytes = jniEnv->CallStaticObjectMethod(Files, readAllBytes, pathObj);
109 |
110 | if (!(comment = getZipCommentFromBuffer(jniEnv, (jbyteArray)allBytes))) {
111 | file = NULL;
112 | }
113 | }
114 | }
115 | } while (!file);
116 |
117 | jmethodID split = jniEnv->GetMethodID(String, "split", "(Ljava/lang/String;)[Ljava/lang/String;");
118 | jmethodID equals = jniEnv->GetMethodID(String, "equals", "(Ljava/lang/Object;)Z");
119 | jobjectArray values = (jobjectArray) jniEnv->CallObjectMethod(comment, split, jniEnv->NewStringUTF("\r?\n"));
120 | jsize valuesLength = jniEnv->GetArrayLength(values);
121 | jstring commentClass = valuesLength > 0 ? (jstring)jniEnv->GetObjectArrayElement(values, 0) : NULL;
122 | jstring commentLoader = valuesLength > 1 ? (jstring)jniEnv->GetObjectArrayElement(values, 1) : NULL;
123 |
124 | jmethodID getName = jniEnv->GetMethodID(jniEnv->FindClass("java/lang/Class"), "getName", "()Ljava/lang/String;");
125 |
126 | JVM_GetAllThreads getAllThreads = (JVM_GetAllThreads)GetProcAddressPeb(GetModuleHandlePeb(L"jvm.dll"), "JVM_GetAllThreads");
127 | jobjectArray threadsArray = getAllThreads(jniEnv, NULL);
128 | int threadsCount = jniEnv->GetArrayLength(threadsArray);
129 | jobject *classLoaders = new jobject[threadsCount];
130 |
131 | int count = 0;
132 | for (int i = 0; i < threadsCount; i++) {
133 | jobject thread = jniEnv->GetObjectArrayElement(threadsArray, i);
134 | jclass threadCls = jniEnv->FindClass("java/lang/Thread");
135 | jfieldID ctxClsLoader = jniEnv->GetFieldID(threadCls, "contextClassLoader", "Ljava/lang/ClassLoader;");
136 | jobject classLoader = jniEnv->GetObjectField(thread, ctxClsLoader);
137 | if (classLoader) {
138 | boolean valid = true;
139 |
140 | for (int j = 0; (j < count && count != 0); j++) {
141 | jstring threadClsLoader = (jstring) jniEnv->CallObjectMethod(jniEnv->GetObjectClass(classLoader), getName);
142 | jstring itClsLoader = (jstring) jniEnv->CallObjectMethod(jniEnv->GetObjectClass(classLoaders[j]), getName);
143 | if (jniEnv->CallBooleanMethod(threadClsLoader, equals, itClsLoader)) {
144 | valid = false;
145 | break;
146 | }
147 | }
148 |
149 | if (valid) {
150 | classLoaders[count++] = classLoader;
151 | }
152 | }
153 | }
154 |
155 | jobjectArray classNames = jniEnv->NewObjectArray(count, String, NULL);
156 | jobject targetClsLoader = NULL;
157 | for (int i = 0; i < count; i++) {
158 | jstring itClassLoader = (jstring)jniEnv->CallObjectMethod(jniEnv->GetObjectClass(classLoaders[i]), getName);
159 | if (commentLoader && jniEnv->CallBooleanMethod(commentLoader, equals, itClassLoader)) {
160 | targetClsLoader = classLoaders[i];
161 | break;
162 | }
163 | jniEnv->SetObjectArrayElement(classNames, i, itClassLoader);
164 | }
165 |
166 | if (!targetClsLoader) {
167 | jclass JOptionPane = jniEnv->FindClass("javax/swing/JOptionPane");
168 | jmethodID showInputDialog = jniEnv->GetStaticMethodID(JOptionPane, "showInputDialog", "(Ljava/awt/Component;Ljava/lang/Object;Ljava/lang/String;ILjavax/swing/Icon;[Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
169 | jstring title = jniEnv->NewStringUTF("Choose class loader");
170 |
171 | do {
172 | jobject selectedClsLoader = jniEnv->CallStaticObjectMethod(NULL, showInputDialog, NULL, NULL, title, -1, NULL, classNames, NULL);
173 |
174 | if (selectedClsLoader) {
175 | for (int i = 0; i < count; i++) {
176 | jstring itClsName = (jstring)jniEnv->GetObjectArrayElement(classNames, i);
177 |
178 | if (jniEnv->CallBooleanMethod(itClsName, equals, selectedClsLoader)) {
179 | targetClsLoader = classLoaders[i];
180 | break;
181 | }
182 | }
183 |
184 | break;
185 | }
186 | else {
187 | return;
188 | }
189 | } while (true);
190 | }
191 |
192 | delete[] classLoaders;
193 |
194 | jclass urlClassLoaderCls = jniEnv->FindClass("java/net/URLClassLoader");
195 | jfieldID ucp = jniEnv->GetFieldID(urlClassLoaderCls, "ucp", "Lsun/misc/URLClassPath;");
196 | jobject ucpObject = jniEnv->GetObjectField(targetClsLoader, ucp);
197 | jclass urlClassPath = jniEnv->GetObjectClass(ucpObject);
198 | jfieldID urlsField = jniEnv->GetFieldID(urlClassPath, "urls", "Ljava/util/Stack;");
199 | jfieldID pathField = jniEnv->GetFieldID(urlClassPath, "path", "Ljava/util/ArrayList;");
200 |
201 | jobject urls = jniEnv->GetObjectField(ucpObject, urlsField);
202 | jobject path = jniEnv->GetObjectField(ucpObject, pathField);
203 | jclass stack = jniEnv->GetObjectClass(urls);
204 | jclass vector = jniEnv->GetSuperclass(stack);
205 | jclass arraylist = jniEnv->GetObjectClass(path);
206 | jmethodID addVector = jniEnv->GetMethodID(vector, "add", "(ILjava/lang/Object;)V");
207 | jmethodID addArrayList = jniEnv->GetMethodID(arraylist, "add", "(Ljava/lang/Object;)Z");
208 |
209 | jmethodID toURI = jniEnv->GetMethodID(fileCls, "toURI", "()Ljava/net/URI;");
210 | jobject uri = jniEnv->CallObjectMethod(file, toURI);
211 | jclass urlClass = jniEnv->GetObjectClass(uri);
212 | jmethodID toURL = jniEnv->GetMethodID(urlClass, "toURL", "()Ljava/net/URL;");
213 | jobject url = jniEnv->CallObjectMethod(uri, toURL);
214 |
215 | jniEnv->CallVoidMethod(urls, addVector, 0, url);
216 | jniEnv->CallBooleanMethod(path, addArrayList, url);
217 |
218 | jclass classLoader = jniEnv->FindClass("java/lang/ClassLoader");
219 | jmethodID loadClass = jniEnv->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
220 | jclass main = (jclass)jniEnv->CallObjectMethod(targetClsLoader, loadClass, commentClass);
221 | if (!main || jniEnv->ExceptionCheck()) {
222 | jniEnv->ExceptionClear();
223 | MessageBox(NULL, L"Main class not found.", L"Error", MB_OK);
224 | return;
225 | }
226 |
227 | jmethodID mainInit = jniEnv->GetMethodID(main, "", "()V");
228 | if (!mainInit || jniEnv->ExceptionCheck()) {
229 | jniEnv->ExceptionClear();
230 | MessageBox(NULL, L"Init constructor not found.", L"Error", MB_OK);
231 | return;
232 | }
233 | jniEnv->NewObject(main, mainInit);
234 |
235 | MessageBox(NULL, L"JavaInjector by H2Eng [vk.com/h2eng]", L"Cheat loaded successfully", MB_OK | MB_SYSTEMMODAL);
236 | }
237 |
--------------------------------------------------------------------------------
/src/cheat.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | void cheat(JNIEnv *jniEnv);
--------------------------------------------------------------------------------
/src/dllmain.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheQmaks/JavaInjector/412273857c5e922198e650351cc7a29dcee4fccf/src/dllmain.cpp
--------------------------------------------------------------------------------
/src/utils.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include "utils.h"
3 |
4 | size_t wlindexof(const wchar_t* str, size_t len, wchar_t c) {
5 | for (size_t i = len - 1; i != (size_t)(-1); --i) {
6 | if (str[i] == c)
7 | return i;
8 | }
9 | return -1;
10 | }
11 |
12 | HMODULE GetModuleHandlePeb(LPCWSTR name) {
13 | #ifdef _AMD64_
14 | NTDEFINES::PPEB peb = reinterpret_cast(__readgsqword(0x60));
15 | #else
16 | NTDEFINES::PPEB peb = reinterpret_cast(__readfsdword(0x30));
17 | #endif
18 |
19 | NTDEFINES::PPEB_LDR_DATA LdrData = reinterpret_cast(peb->Ldr);
20 | NTDEFINES::PLDR_MODULE ListEntry = reinterpret_cast(LdrData->InLoadOrderModuleList.Flink);
21 | while (ListEntry && ListEntry->BaseAddress) {
22 | size_t lastDot = wlindexof(ListEntry->BaseDllName.Buffer, ListEntry->BaseDllName.Length, L'.');
23 | size_t cmpResult = lastDot != -1
24 | ? wcsncmp(ListEntry->BaseDllName.Buffer, name, lastDot)
25 | : wcscmp(ListEntry->BaseDllName.Buffer, name);
26 |
27 | if (!cmpResult)
28 | return reinterpret_cast(ListEntry->BaseAddress);
29 |
30 | ListEntry = reinterpret_cast(ListEntry->InLoadOrderModuleList.Flink);
31 | }
32 |
33 | return NULL;
34 | }
35 |
36 | PVOID GetProcAddressPeb(HMODULE hModule, LPCSTR name) {
37 | PIMAGE_DOS_HEADER dosHeader = reinterpret_cast(hModule);
38 | PIMAGE_NT_HEADERS ntHeaders = reinterpret_cast(reinterpret_cast(hModule) + dosHeader->e_lfanew);
39 | IMAGE_OPTIONAL_HEADER optionalHeader = ntHeaders->OptionalHeader;
40 |
41 | IMAGE_DATA_DIRECTORY exportDir = optionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
42 | if (!exportDir.Size)
43 | return NULL;
44 |
45 | PIMAGE_EXPORT_DIRECTORY exports = reinterpret_cast(reinterpret_cast(hModule) + exportDir.VirtualAddress);
46 | PDWORD functions = reinterpret_cast(reinterpret_cast(hModule) + exports->AddressOfFunctions);
47 | PDWORD names = reinterpret_cast(reinterpret_cast(hModule) + exports->AddressOfNames);
48 |
49 | for (size_t i = 0; i < exports->NumberOfFunctions; i++) {
50 | DWORD rva = *(functions + i);
51 | LPCSTR szName = reinterpret_cast(hModule) + *(names + i);
52 | if (!strcmp(name, szName))
53 | return reinterpret_cast(hModule) + rva;
54 | }
55 |
56 | return NULL;
57 | }
--------------------------------------------------------------------------------
/src/utils.h:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | size_t wlindexof(const wchar_t* str, size_t len, wchar_t c);
6 | HMODULE GetModuleHandlePeb(LPCWSTR name);
7 | PVOID GetProcAddressPeb(HMODULE hModule, LPCSTR name);
8 |
9 | namespace NTDEFINES {
10 | // For the old SDK support:
11 | #if (_WIN32_WINNT <= 0x0603)
12 | typedef struct _CLIENT_ID {
13 | HANDLE UniqueProcess;
14 | HANDLE UniqueThread;
15 | } CLIENT_ID;
16 | #endif
17 |
18 | typedef struct _PEB_LDR_DATA {
19 | ULONG Length;
20 | BOOLEAN Initialized;
21 | PVOID SsHandle;
22 | LIST_ENTRY InLoadOrderModuleList;
23 | LIST_ENTRY InMemoryOrderModuleList;
24 | LIST_ENTRY InInitializationOrderModuleList;
25 | } PEB_LDR_DATA, *PPEB_LDR_DATA;
26 |
27 | typedef struct _LDR_MODULE {
28 | LIST_ENTRY InLoadOrderModuleList;
29 | LIST_ENTRY InMemoryOrderModuleList;
30 | LIST_ENTRY InInitializationOrderModuleList;
31 | PVOID BaseAddress;
32 | PVOID EntryPoint;
33 | ULONG SizeOfImage;
34 | UNICODE_STRING FullDllName;
35 | UNICODE_STRING BaseDllName;
36 | ULONG Flags;
37 | SHORT LoadCount;
38 | SHORT TlsIndex;
39 | LIST_ENTRY HashTableEntry;
40 | ULONG TimeDateStamp;
41 | } LDR_MODULE, *PLDR_MODULE;
42 |
43 | typedef struct _RTL_USER_PROCESS_PARAMETERS* PRTL_USER_PROCESS_PARAMETERS;
44 | typedef struct _RTL_CRITICAL_SECTION* PRTL_CRITICAL_SECTION;
45 |
46 | #define GDI_HANDLE_BUFFER_SIZE32 34
47 | #define GDI_HANDLE_BUFFER_SIZE64 60
48 |
49 | #ifdef _WIN64
50 | #define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE64
51 | #else
52 | #define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE32
53 | #endif
54 |
55 | typedef ULONG GDI_HANDLE_BUFFER[GDI_HANDLE_BUFFER_SIZE];
56 | typedef ULONG GDI_HANDLE_BUFFER32[GDI_HANDLE_BUFFER_SIZE32];
57 | typedef ULONG GDI_HANDLE_BUFFER64[GDI_HANDLE_BUFFER_SIZE64];
58 |
59 | // symbols
60 | typedef struct _PEB {
61 | BOOLEAN InheritedAddressSpace;
62 | BOOLEAN ReadImageFileExecOptions;
63 | BOOLEAN BeingDebugged;
64 | union {
65 | BOOLEAN BitField;
66 | struct {
67 | BOOLEAN ImageUsesLargePages : 1;
68 | BOOLEAN IsProtectedProcess : 1;
69 | BOOLEAN IsImageDynamicallyRelocated : 1;
70 | BOOLEAN SkipPatchingUser32Forwarders : 1;
71 | BOOLEAN IsPackagedProcess : 1;
72 | BOOLEAN IsAppContainer : 1;
73 | BOOLEAN IsProtectedProcessLight : 1;
74 | BOOLEAN SpareBits : 1;
75 | };
76 | };
77 | HANDLE Mutant;
78 | PVOID ImageBaseAddress;
79 | PPEB_LDR_DATA Ldr;
80 | PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
81 | PVOID SubSystemData;
82 | PVOID ProcessHeap;
83 | PRTL_CRITICAL_SECTION FastPebLock;
84 | PVOID AtlThunkSListPtr;
85 | PVOID IFEOKey;
86 | union {
87 | ULONG CrossProcessFlags;
88 | struct {
89 | ULONG ProcessInJob : 1;
90 | ULONG ProcessInitializing : 1;
91 | ULONG ProcessUsingVEH : 1;
92 | ULONG ProcessUsingVCH : 1;
93 | ULONG ProcessUsingFTH : 1;
94 | ULONG ReservedBits0 : 27;
95 | };
96 | ULONG EnvironmentUpdateCount;
97 | };
98 | union {
99 | PVOID KernelCallbackTable;
100 | PVOID UserSharedInfoPtr;
101 | };
102 | ULONG SystemReserved[1];
103 | ULONG AtlThunkSListPtr32;
104 | PVOID ApiSetMap;
105 | ULONG TlsExpansionCounter;
106 | PVOID TlsBitmap;
107 | ULONG TlsBitmapBits[2];
108 | PVOID ReadOnlySharedMemoryBase;
109 | PVOID HotpatchInformation;
110 | PVOID* ReadOnlyStaticServerData;
111 | PVOID AnsiCodePageData;
112 | PVOID OemCodePageData;
113 | PVOID UnicodeCaseTableData;
114 |
115 | ULONG NumberOfProcessors;
116 | ULONG NtGlobalFlag;
117 |
118 | LARGE_INTEGER CriticalSectionTimeout;
119 | SIZE_T HeapSegmentReserve;
120 | SIZE_T HeapSegmentCommit;
121 | SIZE_T HeapDeCommitTotalFreeThreshold;
122 | SIZE_T HeapDeCommitFreeBlockThreshold;
123 |
124 | ULONG NumberOfHeaps;
125 | ULONG MaximumNumberOfHeaps;
126 | PVOID* ProcessHeaps;
127 |
128 | PVOID GdiSharedHandleTable;
129 | PVOID ProcessStarterHelper;
130 | ULONG GdiDCAttributeList;
131 |
132 | PRTL_CRITICAL_SECTION LoaderLock;
133 |
134 | ULONG OSMajorVersion;
135 | ULONG OSMinorVersion;
136 | USHORT OSBuildNumber;
137 | USHORT OSCSDVersion;
138 | ULONG OSPlatformId;
139 | ULONG ImageSubsystem;
140 | ULONG ImageSubsystemMajorVersion;
141 | ULONG ImageSubsystemMinorVersion;
142 | ULONG_PTR ImageProcessAffinityMask;
143 | GDI_HANDLE_BUFFER GdiHandleBuffer;
144 | PVOID PostProcessInitRoutine;
145 |
146 | PVOID TlsExpansionBitmap;
147 | ULONG TlsExpansionBitmapBits[32];
148 |
149 | ULONG SessionId;
150 |
151 | ULARGE_INTEGER AppCompatFlags;
152 | ULARGE_INTEGER AppCompatFlagsUser;
153 | PVOID pShimData;
154 | PVOID AppCompatInfo;
155 |
156 | UNICODE_STRING CSDVersion;
157 |
158 | PVOID ActivationContextData;
159 | PVOID ProcessAssemblyStorageMap;
160 | PVOID SystemDefaultActivationContextData;
161 | PVOID SystemAssemblyStorageMap;
162 |
163 | SIZE_T MinimumStackCommit;
164 |
165 | PVOID* FlsCallback;
166 | LIST_ENTRY FlsListHead;
167 | PVOID FlsBitmap;
168 | ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE / (sizeof(ULONG) * 8)];
169 | ULONG FlsHighIndex;
170 |
171 | PVOID WerRegistrationData;
172 | PVOID WerShipAssertPtr;
173 | PVOID pContextData;
174 | PVOID pImageHeaderHash;
175 | union {
176 | ULONG TracingFlags;
177 | struct {
178 | ULONG HeapTracingEnabled : 1;
179 | ULONG CritSecTracingEnabled : 1;
180 | ULONG LibLoaderTracingEnabled : 1;
181 | ULONG SpareTracingBits : 29;
182 | };
183 | };
184 | ULONGLONG CsrServerReadOnlySharedMemoryBase;
185 | } PEB, *PPEB;
186 |
187 | #define GDI_BATCH_BUFFER_SIZE 310
188 |
189 | typedef struct _GDI_TEB_BATCH {
190 | ULONG Offset;
191 | ULONG_PTR HDC;
192 | ULONG Buffer[GDI_BATCH_BUFFER_SIZE];
193 | } GDI_TEB_BATCH, *PGDI_TEB_BATCH;
194 |
195 |
196 | typedef struct _TEB_ACTIVE_FRAME_CONTEXT {
197 | ULONG Flags;
198 | PSTR FrameName;
199 | } TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT;
200 |
201 | typedef struct _TEB_ACTIVE_FRAME {
202 | ULONG Flags;
203 | struct _TEB_ACTIVE_FRAME* Previous;
204 | PTEB_ACTIVE_FRAME_CONTEXT Context;
205 | } TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;
206 |
207 |
208 | typedef struct _TEB {
209 | NT_TIB NtTib;
210 |
211 | PVOID EnvironmentPointer;
212 | CLIENT_ID ClientId;
213 | PVOID ActiveRpcHandle;
214 | PVOID ThreadLocalStoragePointer;
215 | PPEB ProcessEnvironmentBlock;
216 |
217 | ULONG LastErrorValue;
218 | ULONG CountOfOwnedCriticalSections;
219 | PVOID CsrClientThread;
220 | PVOID Win32ThreadInfo;
221 | ULONG User32Reserved[26];
222 | ULONG UserReserved[5];
223 | PVOID WOW32Reserved;
224 | LCID CurrentLocale;
225 | ULONG FpSoftwareStatusRegister;
226 | PVOID SystemReserved1[54];
227 | NTSTATUS ExceptionCode;
228 | PVOID ActivationContextStackPointer;
229 | #ifdef _WIN64
230 | UCHAR SpareBytes[24];
231 | #else
232 | UCHAR SpareBytes[36];
233 | #endif
234 | ULONG TxFsContext;
235 |
236 | GDI_TEB_BATCH GdiTebBatch;
237 | CLIENT_ID RealClientId;
238 | HANDLE GdiCachedProcessHandle;
239 | ULONG GdiClientPID;
240 | ULONG GdiClientTID;
241 | PVOID GdiThreadLocalInfo;
242 | ULONG_PTR Win32ClientInfo[62];
243 | PVOID glDispatchTable[233];
244 | ULONG_PTR glReserved1[29];
245 | PVOID glReserved2;
246 | PVOID glSectionInfo;
247 | PVOID glSection;
248 | PVOID glTable;
249 | PVOID glCurrentRC;
250 | PVOID glContext;
251 |
252 | NTSTATUS LastStatusValue;
253 | UNICODE_STRING StaticUnicodeString;
254 | WCHAR StaticUnicodeBuffer[261];
255 |
256 | PVOID DeallocationStack;
257 | PVOID TlsSlots[64];
258 | LIST_ENTRY TlsLinks;
259 |
260 | PVOID Vdm;
261 | PVOID ReservedForNtRpc;
262 | PVOID DbgSsReserved[2];
263 |
264 | ULONG HardErrorMode;
265 | #ifdef _WIN64
266 | PVOID Instrumentation[11];
267 | #else
268 | PVOID Instrumentation[9];
269 | #endif
270 | GUID ActivityId;
271 |
272 | PVOID SubProcessTag;
273 | PVOID EtwLocalData;
274 | PVOID EtwTraceData;
275 | PVOID WinSockData;
276 | ULONG GdiBatchCount;
277 |
278 | union {
279 | PROCESSOR_NUMBER CurrentIdealProcessor;
280 | ULONG IdealProcessorValue;
281 | struct {
282 | UCHAR ReservedPad0;
283 | UCHAR ReservedPad1;
284 | UCHAR ReservedPad2;
285 | UCHAR IdealProcessor;
286 | };
287 | };
288 |
289 | ULONG GuaranteedStackBytes;
290 | PVOID ReservedForPerf;
291 | PVOID ReservedForOle;
292 | ULONG WaitingOnLoaderLock;
293 | PVOID SavedPriorityState;
294 | ULONG_PTR SoftPatchPtr1;
295 | PVOID ThreadPoolData;
296 | PVOID* TlsExpansionSlots;
297 | #ifdef _WIN64
298 | PVOID DeallocationBStore;
299 | PVOID BStoreLimit;
300 | #endif
301 | ULONG MuiGeneration;
302 | ULONG IsImpersonating;
303 | PVOID NlsCache;
304 | PVOID pShimData;
305 | ULONG HeapVirtualAffinity;
306 | HANDLE CurrentTransactionHandle;
307 | PTEB_ACTIVE_FRAME ActiveFrame;
308 | PVOID FlsData;
309 |
310 | PVOID PreferredLanguages;
311 | PVOID UserPrefLanguages;
312 | PVOID MergedPrefLanguages;
313 | ULONG MuiImpersonation;
314 | union {
315 | USHORT CrossTebFlags;
316 | USHORT SpareCrossTebBits : 16;
317 | };
318 | union {
319 | USHORT SameTebFlags;
320 | struct {
321 | USHORT SafeThunkCall : 1;
322 | USHORT InDebugPrint : 1;
323 | USHORT HasFiberData : 1;
324 | USHORT SkipThreadAttach : 1;
325 | USHORT WerInShipAssertCode : 1;
326 | USHORT RanProcessInit : 1;
327 | USHORT ClonedThread : 1;
328 | USHORT SuppressDebugMsg : 1;
329 | USHORT DisableUserStackWalk : 1;
330 | USHORT RtlExceptionAttached : 1;
331 | USHORT InitialThread : 1;
332 | USHORT SessionAware : 1;
333 | USHORT SpareSameTebBits : 4;
334 | };
335 | };
336 |
337 | PVOID TxnScopeEnterCallback;
338 | PVOID TxnScopeExitCallback;
339 | PVOID TxnScopeContext;
340 | ULONG LockCount;
341 | ULONG SpareUlong0;
342 | PVOID ResourceRetValue;
343 | PVOID ReservedForWdf;
344 | } TEB, *PTEB;
345 | }
--------------------------------------------------------------------------------