Форум программистов, компьютерный форум CyberForum.ru

Запись значения в адрес - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 19:09     Запись значения в адрес #1
К примеру есть адрес 0х777 и его значение в формате int 1234567 , мне необходимо в этот адрес записать своё значение к примеру 777777777 , как это сделать (из dll эти все дела произвожу)

пробовал такой код:
REC - это найденный адрес с помощью функции поиска адреса по байтам:

C++
1
DWORD REC = FindPattern(блаблабла);
(с помощью этой функции адрес найден верно 100000%,проверен и выведен на экран)




C++
1
2
DWORD* value = *(DWORD**)REC;
*value=777777777;
крашит

такой вариант:

C++
1
2
3
int value = 0;
value = *(DWORD*)REC;
value = 777777777;
не крашит , но и нечего не происходит

вот такой варик:

C++
1
(DWORD)REC = 777777777;
все отлично записывает , НО меняется только переменная

Пожалуйста помогите!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
12.08.2013, 19:42     Запись значения в адрес #2
Цитата Сообщение от ВДВ777 Посмотреть сообщение
крашит
Видимо, у данного адреса доступа на запись нет.
Сделайте ради интереса VirtualProtect c PAGE_EXECUTE_READWRITE.
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 19:48  [ТС]     Запись значения в адрес #3
Цитата Сообщение от Убежденный Посмотреть сообщение
Видимо, у данного адреса доступа на запись нет.
Сделайте ради интереса VirtualProtect c PAGE_EXECUTE_READWRITE.
к сожалению есть , "read\write" , доступ это фигня вот каким способом производить запись?
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
12.08.2013, 20:09     Запись значения в адрес #4
C
1
2
DWORD *Addr = (DWORD *)REC;
*Addr = Value;
Добавлено через 50 секунд
Или, может, это адрес в другом процессе ?
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 20:36  [ТС]     Запись значения в адрес #5
Цитата Сообщение от Убежденный Посмотреть сообщение
C
1
2
DWORD *Addr = (DWORD *)REC;
*Addr = Value;
Добавлено через 50 секунд
Или, может, это адрес в другом процессе ?
нет , я инжекчу свою dll в процесс и поэтому заинжекченная dll я так думаю имеет доступ ко всей памяти процесса?
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
12.08.2013, 20:45     Запись значения в адрес #6
Как Вы проверяете, что адрес доступен на запись ?
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 21:06  [ТС]     Запись значения в адрес #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Как Вы проверяете, что адрес доступен на запись ?
есть такая прога cheat engine для работы с памятью , этот адрес имеет read\write аргументы защиты

Добавлено через 9 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
Как Вы проверяете, что адрес доступен на запись ?
по вашему совету на всякий случай сделал это:
C++
1
2
3
4
DWORD *Addr = (DWORD*)REC;
VirtualProtect ((void*)*Addr, 10 , PAGE_EXECUTE_READWRITE , &old_protect);
*Addr = 358927976;
VirtualProtect ((void*)*Addr, 10 , old_protect , &old_protect);
все равно долбанный краш
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
12.08.2013, 21:22     Запись значения в адрес #8
Цитата Сообщение от ВДВ777 Посмотреть сообщение
VirtualProtect ((void*)*Addr, 10 , PAGE_EXECUTE_READWRITE , &old_protect);
Разыменовывать Addr не нужно.
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 21:26  [ТС]     Запись значения в адрес #9
Цитата Сообщение от Убежденный Посмотреть сообщение
Разыменовывать Addr не нужно.
крашит все равно , дело не в защите определенно
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
12.08.2013, 21:27     Запись значения в адрес #10
Цитата Сообщение от ВДВ777 Посмотреть сообщение
крашит все равно
Показывайте код. И адрес тоже. Может, у Вас там NULL.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 21:43     Запись значения в адрес
Еще ссылки по теме:

C++ Адрес объекта, адрес указателя. Где что находится?
Вычислить значения функции F на интервале от начального значения до конечного значения C++
C++ Запись значения переменной в файл

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 21:43  [ТС]     Запись значения в адрес #11
Цитата Сообщение от Убежденный Посмотреть сообщение
Показывайте код. И адрес тоже. Может, у Вас там NULL.
вот функция для поиска адреса по массиву байт - работает как часы не в ней дело 100%

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[SPOILER]bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
    for(;*szMask;++szMask,++pData,++bMask)
        if(*szMask=='x' && *pData!=*bMask)  
            return 0;
    return (*szMask) == NULL;
}
 
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
    for(DWORD i=0; i<dwLen; i++)
        if (bCompare((BYTE*)(dwAddress+i),bMask,szMask))  
        {
            return (DWORD)(dwAddress+i);
        }
 
    return 0;
}[/SPOILER]
сам код, в принципе и это был весь код:
перед функцией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DWORD REC = 0x0;
DWORD *Addr = (DWORD *)REC;//то что вы мне предложили использовать
 void blabla()
{
if (условие)
{
DWORD REC = FindPattern(0x4000000 , 0x8000000 , (PBYTE)"байты" , "маска")
}
 
if(если REC > 0x0)
{
*Addr = 358927976;
}
 
}
собственно все , да забыл еще, функция в потоке выполняется

есть еще один способ , он работает отлично , но он трудоёмкий , хотелось бы по проще код (пример выслал вам в л\с)
Yandex
Объявления
12.08.2013, 21:43     Запись значения в адрес
Ответ Создать тему
Опции темы

Текущее время: 23:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru