1 Востаннє редагувалося Fox (01.02.2017 12:38:53)

Тема: [C++] Робота з памятью программи.

Маю я код.

DWORD *X = (*(DWORD**)(0xB6F5F0 + 0x14)) + 0x30;
DWORD *Y = (*(DWORD**)(0xB6F5F0 + 0x14)) + 0x34;
DWORD *Z = (*(DWORD**)(0xB6F5F0 + 0x14)) + 0x38;
float xPos = *((float*)&X);
float yPos = *((float*)&Y);
float ZPos = *((float*)&Z);
char buff[200];
format(buff, "%f %f %f", xPos, yPos, ZPos);

format то #define format strintf
И той код маэ вивести на екран позицiю игрока з buff.
Як що замiсть xPos, yPos, ZPos вписати числа то все виводить.
А як що використати  xPos, yPos, ZPos то якось криво...


Питання таке: Чому  xPos, yPos, ZPos завжди рiвнi 0 ?
Хоча працюэ сам мод...

Це я адресою помилився чи якось не так перетворюю з DWORD в float.
А може отримую не так.
Допоможiть будь ласка

2 Востаннє редагувалося Fox (01.02.2017 12:57:15)

Re: [C++] Робота з памятью программи.

Знайшов рiшення але не ясно як чого моэ не працюэ а це
float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
Идеально працюэ

3

Re: [C++] Робота з памятью программи.

якою мовою ви пишете? полінувались, навіть, українську розкладку ввімкнути? це неповага!

4

Re: [C++] Робота з памятью программи.

FakiNyan написав:

якою мовою ви пишете? полінувались, навіть, українську розкладку ввімкнути? це неповага!

Ну менi треба лiзти в налаштування.
Щоб змiнити мову.
Так як в мене 2 мови 1 россiйська поставилась з Windows сама.
Друга английська.

I взагалi...
От що за люди ?

Тут пишу на россiйськiй розкладцi "Це не повага"
На майл ру питаннях колись написв не "ты" а "ти" i теж завалили
"Учи язык" и тд...

Не подумайте що я прям проти чи за когось...

От чому всiм не все одно як я говорю ?
Наче не зрозумiло що я написав...

5

Re: [C++] Робота з памятью программи.

vtorgashov написав:

Ну менi треба лiзти в налаштування.

Дивно. Ви тільки за цей пасаж щонайменше 26 разів перемкнули розкладку з російської на англійську чи назад (у вас 13 латинських i) - і гадаєте, що це швидше, ніж один раз поставити нормальну розкладку?

6 Востаннє редагувалося Fox (01.02.2017 13:59:51)

Re: [C++] Робота з памятью программи.

koala написав:
vtorgashov написав:

Ну менi треба лiзти в налаштування.

Дивно. Ви тільки за цей пасаж щонайменше 26 разів перемкнули розкладку з російської на англійську чи назад (у вас 13 латинських i) - і гадаєте, що це швидше, ніж один раз поставити нормальну розкладку?

Я починаю писати транслитом або проскокую мову коли в мене 3 мови.
Писати так як я зараз може i довше...
Але мене починає (навiть є в гуглi знайшов) бiсити коли хочеш написати Hello а пишеш "Руддщ" (вибачте за транслит.)

I ще... По темi щось буде ?
Проблему то я вирiшив але от не розумiю в чому вона була.

7

Re: [C++] Робота з памятью программи.

У мене дві розкладки - англійська і розширена українська, на яку я пододавав різні ±≠ѣыэъў.
Що ж до вашого питання - спробуємо розібратися.

DWORD *X = (*(DWORD**)(0xB6F5F0 + 0x14)) + 0x30;

є константа 0xB6F5F0 + 0x14. Вона перетворюється на тип "вказівник на вказівник на DWORD" і розіменовується; маємо вміст комірки 0xB6F604 типу DWORD*. До нього додається 0x30 - очевидно, DWORD-ів, тобто ще 0xC0 байт. X - Вказівник на DWORD, що лежить на 0xC0 байт правіше за те, на що вказує комірка 0xB6F604. Сам X знаходиться десь в стеку.

float xPos = *((float*)&X);

Беремо адресу комірки X (яка може бути будь-яка, як стек ляже), перетворюємо її на вказівник на float і розіменовуємо. Отримуємо маячню - адреса, перетворена на float. Якщо пощастить із компілятором - порядок буде нульовий і, відповідно, матимемо 0 з високою точністю.
Втім, оскільки ви не хочете сказати нам, що і як розташовано у вас в пам'яті, а вимагаєте від нас сказати, в чому проблема, припускаю, що проблема в тому, що ви взагалі зеленої гадки не маєте, що робите, а просто копіюєте навмання шматки чужого коду. І доки ви це не припините і не почнете думати, ми вам не поможемо.

Подякували: Betterthanyou1

8 Востаннє редагувалося Fox (01.02.2017 20:53:57)

Re: [C++] Робота з памятью программи.

koala написав:

У мене дві розкладки - англійська і розширена українська, на яку я пододавав різні ±≠ѣыэъў.
Що ж до вашого питання - спробуємо розібратися.

DWORD *X = (*(DWORD**)(0xB6F5F0 + 0x14)) + 0x30;

є константа 0xB6F5F0 + 0x14. Вона перетворюється на тип "вказівник на вказівник на DWORD" і розіменовується; маємо вміст комірки 0xB6F604 типу DWORD*. До нього додається 0x30 - очевидно, DWORD-ів, тобто ще 0xC0 байт. X - Вказівник на DWORD, що лежить на 0xC0 байт правіше за те, на що вказує комірка 0xB6F604. Сам X знаходиться десь в стеку.

float xPos = *((float*)&X);

Беремо адресу комірки X (яка може бути будь-яка, як стек ляже), перетворюємо її на вказівник на float і розіменовуємо. Отримуємо маячню - адреса, перетворена на float. Якщо пощастить із компілятором - порядок буде нульовий і, відповідно, матимемо 0 з високою точністю.
Втім, оскільки ви не хочете сказати нам, що і як розташовано у вас в пам'яті, а вимагаєте від нас сказати, в чому проблема, припускаю, що проблема в тому, що ви взагалі зеленої гадки не маєте, що робите, а просто копіюєте навмання шматки чужого коду. І доки ви це не припините і не почнете думати, ми вам не поможемо.

Ну маю память в якiй записано x, y, z (позицiя гравця).
Яка саме комiрка я поняття не маю.
Тому що гра (gta sa) досить важка в планi пошуку адреси через CheatEngine.
Ну щоб знайти позицiю треба або знати позицiю або шукати float яке змiниться (и то не факт що флоат)
А тих float за 1 крок змiниться дофига...

I я взяв з гуглу пошук адреси пам'ятi.
Там думав просто все додати 0xB6F5F0 + 0x14 + 0x30 и по результату шукати.
Але потiм прочитав що так наче не працює i не намагався використати цей метод.

А що до копiювання коду... Ну не прям так копiюю але дивлюся як iншi роблять.
Це взагалi 1й раз коли я пишу щось на C++ так як я не люблю його.
Я навiть не дуже розумiю що значить "*" як сказав друг то для того щоб робити щось з пам'ятю

*(float)0x65263 = 5;

Як я зрозумiв знайде в оперативi (тiй що доступна программi) адрессу 0x65263 и задасть значення 5.
Ну як шукати адресу я поняття не маю.

Колись на C# робив програму яка мала залазити в оперативку процесу и казати скiльки хп у вас.
Ну зробити то зробив.
Воно навiть працювало але пiсля перезаходу адреса чогось iнша була...
I я бiльше не кодив нiчого з адресами оперативки.
Ну тут мало того що адреси яких я не розумiю так ще i мова на якiй перший раз щось роблю

Як будете то читати хоч скажiть як * цей оператор називается.
А то в мене передчуття що "Что значит * С++"
Або "How use * in C++" мало що дадуть.