2016-02-10 2 views
1

Я ввел DLL в exe. Теперь мне нужно прочитать данные с определенного смещения. Мой код из DLL:DLL-инъекция и память чтения с помощью смещения

DWORD ExeBaseAddress = (DWORD)GetModuleHandleA(0); 
// HANDLE baseAddr = GetModuleHandleA(0) 

uint16_t value = ExeBaseAddress + 0x7198BC + 0x70e; 

cout << value << endl; 

Проблема это не дает мне значение я ожидаю, что является 1000. Он также не дает мне правильный адрес.

Используя программное обеспечение для чтения памяти, я могу получить значение CORRECT. См:

cheatengine

Но я все еще получаю неправильное значение из кода, даже если я использую точно такой же сдвиг от чтения памяти приложения. Так что я пропущу?


Я пробовал это, но все еще давал мне неправильное значение.

HANDLE ExeBaseAddress = GetModuleHandleA(0); 

uintptr_t p = (uintptr_t)ExeBaseAddress + 0x7198BC + 0x70e; 
int value = *reinterpret_cast<int *>(p); 

cout << ExeBaseAddress << " - " << value << endl; 
+0

Вам нужно разыменовать значение в этом месте, вы просто печатаете адрес, на котором он расположен. Кроме того, значение 'ExeBaseAddress' +' 0x7198BC' + '0x70e' будет переполняться' uint16_t' – lcs

+0

Извините @cocarin, я не так хорош с 'C++'. Как это делается? – majidarif

+0

http://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer-mean содержит обзор разыменования. – lcs

ответ

3

Из все длинные комментариев и чаты (некоторые основные входные тоже) с ФП, решение нашли свой путь,

ЕХА загруженный имеет базовый адрес, хранящийся другой PE в месте 0x7198BC. Этот базовый адрес + смещение (0x70E) содержит требуемое значение.

HANDLE ExeBaseAddress = GetModuleHandleA(0); 

/*ExeBaseAddress is a HANDLE, so it's size is unknown to the compiler. 
That's why, we cast it to (unintptr_t). 
And overall, we need an address which can be dereferenced, 
to get the value kept at the location, so cast it to (uintptr_t*)*/ 

uintptr_t *p = (uintptr_t*)((uintptr_t)ExeBaseAddress + 0x7198BC); 
uintptr_t ModuleBaseAdrs = (DWORD&)*p ; 
printf("ModBaseAdrsLoc - %p, ModuleBaseAdrs - %X\n", p, ModuleBaseAdrs) ; 

uintptr_t *ValLoc = (uintptr_t *) (ModuleBaseAdrs + 0x70E); 
DWORD Val = (DWORD&)*ValLoc ; 
printf("ValLoc - %p, Val - %u\n", ValLoc, Val) ; 
Смежные вопросы