Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/50: Рейтинг темы: голосов - 50, средняя оценка - 4.90
-4 / 0 / 1
Регистрация: 12.03.2013
Сообщений: 110
1

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

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

Author24 — интернет-сервис помощи студентам
К примеру есть адрес 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2013, 19:09
Ответы с готовыми решениями:

Выдает адрес вместо значения
Привет. Функция шоу эрэй должна отображать значения в массиве, но выдает адреса (помоему...). Где...

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

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

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

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

Перегрузка потокового оператора (<<). Выдает адрес вместо значения
Сабж. Все компелится нормально. Если делать &lt;&lt; void то работает ок см комменты если делать класса...

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

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

Адрес объекта, адрес указателя. Где что находится?
#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...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru