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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
#1

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

12.08.2013, 19:09. Просмотров 2432. Ответов 10
Метки нет (Все метки)

К примеру есть адрес 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;
все отлично записывает , НО меняется только переменная

Пожалуйста помогите!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2013, 19:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись значения в адрес (C++):

Выводится адрес переменной, вместо ее значения - C++
Пишу программу просмотра логинов и паролей из хрома. Все работает, за исключением того, что в консоль выводятся, насколько я понял, адреса...

Узнать адрес значения, размещенного в регистре - C++
Всем привет Интересует вопрос Как можно получить адрес регистра памяти по определёному адрессу не прибегая к изменению памяти самого...

Cout пишет адрес вместо значения - C++
cout пишет адрес вместо значения. Спасибо

Перегрузка потокового оператора (<<). Выдает адрес вместо значения - C++
Сабж. Все компелится нормально. Если делать &lt;&lt; void то работает ок см комменты если делать класса std::ostream&amp; то возвращает 16чное...

Существует указатель p. Можно ли выяснить, содержит он адрес допустимого значения или нет - C++
если да, то как ?

Функция возвращает адрес , как передать этот адрес другой функции ? - C++
const int max = 5; double * fill_array(double, int); void show_array(const double, double *); // как передать этой функции в...

10
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.08.2013, 19:42 #2
Цитата Сообщение от ВДВ777 Посмотреть сообщение
крашит
Видимо, у данного адреса доступа на запись нет.
Сделайте ради интереса VirtualProtect c PAGE_EXECUTE_READWRITE.
0
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 19:48  [ТС] #3
Цитата Сообщение от Убежденный Посмотреть сообщение
Видимо, у данного адреса доступа на запись нет.
Сделайте ради интереса VirtualProtect c PAGE_EXECUTE_READWRITE.
к сожалению есть , "read\write" , доступ это фигня вот каким способом производить запись?
0
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.08.2013, 20:09 #4
C
1
2
DWORD *Addr = (DWORD *)REC;
*Addr = Value;
Добавлено через 50 секунд
Или, может, это адрес в другом процессе ?
1
ВДВ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 я так думаю имеет доступ ко всей памяти процесса?
0
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.08.2013, 20:45 #6
Как Вы проверяете, что адрес доступен на запись ?
0
ВДВ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);
все равно долбанный краш
0
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.08.2013, 21:22 #8
Цитата Сообщение от ВДВ777 Посмотреть сообщение
VirtualProtect ((void*)*Addr, 10 , PAGE_EXECUTE_READWRITE , &old_protect);
Разыменовывать Addr не нужно.
1
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
12.08.2013, 21:26  [ТС] #9
Цитата Сообщение от Убежденный Посмотреть сообщение
Разыменовывать Addr не нужно.
крашит все равно , дело не в защите определенно
0
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.08.2013, 21:27 #10
Цитата Сообщение от ВДВ777 Посмотреть сообщение
крашит все равно
Показывайте код. И адрес тоже. Может, у Вас там NULL.
0
ВДВ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;
}
 
}
собственно все , да забыл еще, функция в потоке выполняется

есть еще один способ , он работает отлично , но он трудоёмкий , хотелось бы по проще код (пример выслал вам в л\с)
0
12.08.2013, 21:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 21:43
Привет! Вот еще темы с ответами:

Адрес объекта, адрес указателя. Где что находится? - C++
#include &lt;iostream&gt; void Foo(int* val) { std::cout &lt;&lt; val &lt;&lt; &quot; &quot; &lt;&lt; *val &lt;&lt; &quot; &quot; &lt;&lt; &amp;val &lt;&lt; '\n'; } void Bar(int* &amp;val) ...

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны. - C++
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив - равны.

Запись значения переменной в файл - C++
Здравствуйте. Помогите, пожалуйста, в решении такой проблемы. Не могу найти код на С++, который бы позволял записывать значение вычисленной...

Запись значения в динамический массив - C++
Добрый вечер, Сел я на ночь глядя писать программу, но вот проблема int s=0,k=0,z=0; char *temp = new char; char *tempnum = new...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru