Что-то типо такого, не проверял особоВот такой вопрос возник, как в автоматическом режиме узнать смещения _EPROCESS?
C++:
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib, "dbghelp.lib")
class ProcessOffsetFinder {
private:
HANDLE hProcess;
public:
ProcessOffsetFinder() {
// baza
SymInitialize(GetCurrentProcess(), NULL, TRUE);
}
DWORD64 GetEprocessOffset(const char* memberName) {
SYMBOL_INFO symbolInfo = { 0 };
symbolInfo.SizeOfStruct = sizeof(SYMBOL_INFO);
symbolInfo.MaxNameLen = MAX_SYM_NAME;
// --> базовый адрес _EPROCESS
if (!SymFromName(GetCurrentProcess(), "_EPROCESS", &symbolInfo)) {
printf("Failed to get _EPROCESS: %d\n", GetLastError());
return 0;
}
TI_FINDCHILDREN_PARAMS childParams = { 0 };
ULONG typeId = symbolInfo.TypeIndex;
if (SymGetTypeInfo(GetCurrentProcess(), symbolInfo.ModBase,
typeId, TI_GET_CHILDRENCOUNT, &childParams.Count)) {
childParams.Start = 0;
for (ULONG i = 0; i < childParams.Count; i++) {
WCHAR* name;
DWORD offset;
if (SymGetTypeInfo(GetCurrentProcess(), symbolInfo.ModBase,
typeId, TI_GET_OFFSET, &offset)) {
printf("%s offset: 0x%x\n", name, offset);
}
}
}
return 0;
}
~ProcessOffsetFinder() {
SymCleanup(GetCurrentProcess());
}
};
int main() {
ProcessOffsetFinder finder;
finder.GetEprocessOffset("UniqueProcessId");
finder.GetEprocessOffset("ActiveProcessLinks");
finder.GetEprocessOffset("ImageFileName");
return 0;
}