Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
ВДВ777
-4 / 0 / 1
Регистрация: 12.03.2013
Сообщений: 110
1

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

12.08.2013, 19:09. Просмотров 3366. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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


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

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

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