Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39

Чтение из памяти по адресу или как перевести C++ программу на FASM

06.10.2016, 15:30. Показов 2227. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже два дня бьюсь с 4 строками кода.
У меня есть мой старый исходник на C++, вот часть кода:
C++
1
2
3
DWORD a_p1 = (DWORD)(0x00400000 + 0x00109B74); // a_p1 = некий адрес
DWORD *a_p2 = (DWORD*)(*(DWORD*)a_p1 + 0x150); //*a_p2 = (значение по адресу, который находится в a_p1 + смещение 0x150)
*a_p2 = 20; //вписываем в адрес(который находится в a_p2) значение 20 (hex 0x14)
Я написал, в буквальном смысле, тысяча и один вариант такого же на FASM`е; но не один не работает(чаще всего при моих вариантах ничего не происходит, а иногда и крит вылетает).
Вот пару примеров:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
;;;;;//////////ПЕРВЫЙ
;...секция даты...
     addr dd 0x00400000 + 0x00109B74 
;...секция кода...
     mov eax, dword[addr]
     mov eax, [eax + 0x150]
     mov dword[eax], 0x14 
 
;;;////////ВТОРОЙ
;...секция даты...
     addr dd 0x00400000 + 0x00109B74 
;...секция кода...
     mov eax, dword ptr addr
     add eax, 0x150
     mov dword ptr eax, 0x14 
 
;;;////////ТРЕТИЙ
;...секция даты...
     addr dd 0x00400000 + 0x00109B74 
     p1 dd 0x150
;...секция кода...
     mov eax, [addr]
     add eax, p1
     mov [eax], 0x14 
 
;;;И ТАК ДАЛЕЕ ВПЛОТЬ ДО БЕСКОНЕЧНОСТИ; ПРОСТО СЧИТАЮ ТЕ, ЧТО ВЫШЕ - НАИБОЛЕЕ БЛИЗКИ К РЕАЛЬНОСТИ
Я конечно знаю, что задача элементарна; но как ее сделать - хоть убейте, не знаю(совсем недавно начал учить этот язык)
Кст это dll`ка, проблем с доступом к памяти быть не может
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2016, 15:30
Ответы с готовыми решениями:

Как записать данные по адресу в памяти?
Как на FASM записать данные по адресу в памяти? Мой код: include 'win32ax.inc' .code start:

Необработанное исключение по адресу (чтение памяти невозможно)
набросал код, даже рабочий: #include <stdlib.h> #include <stdio.h> #include <time.h> void sorting(double **B, int U); void...

Заморозка или остановка по адресу памяти
В общем к примеру есть адрес F5EBE7F8 Мне нужно его "заморозить" - отключить. Как это сделать?

10
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
06.10.2016, 15:44
dima291000, дебагером вы, разумеется, не пользовались?
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
06.10.2016, 15:49  [ТС]
Kukuxumushu, я не совсем понимаю, как производить отладку dll внутри какого-либо приложения.
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
06.10.2016, 15:52
dima291000, создать в делфи/билдере приложение, которое использует эту DLL, и вперёд.
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
06.10.2016, 16:06  [ТС]
Kukuxumushu, проблема в том; что если я создам приложение - все указатели полетят, а искать новые и тестировать все это еще 3 дня нету ни сил, ни желания, ни времени, ни навыков(дебагер для меня страшнее самого языка). Хотелось бы просто получить либо толковый ман на эту тему, либо пару подсказок. Кст как идея можно пореверсить dll на c++ и глянуть asm код
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.10.2016, 16:07
Цитата Сообщение от dima291000 Посмотреть сообщение
C
1
DWORD *a_p2 = (DWORD*)(*(DWORD*)a_p1 + 0x150); //*a_p2 = (значение по адресу, который находится в a_p1 + смещение 0x150)
Оператор разыменования имеет более высокий приоритет, чем оператор '+'.
Поэтому в выражении '*a_p1 + 0x150' сначала берется содержимое по адресу 'a_p1' и
затем к нему прибавляется 0x150. А поскольку sizeof (DWORD) == 4, то "скалярное"
значение 'a_p1' увеличивается не на 0x150, а на 0x150*4.
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
06.10.2016, 16:33  [ТС]
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
сначала берется содержимое по адресу 'a_p1' и
затем к нему прибавляется 0x150
Это то я знаю, но вот:
Цитата Сообщение от Убежденный Посмотреть сообщение
значение 'a_p1' увеличивается не на 0x150, а на 0x150*4
Мне просто сломали мозг. В дебагере нашел лишь это
Assembler
1
2
3
4
5
6
CPU Disasm
Address   Hex dump          Command                                  Comments
61791005  />  83B8 50010000 /CMP DWORD PTR DS:[EAX+150],14
6179100C  |.- 73 F7         |JAE SHORT 61791005
6179100E  |.  C780 50010000 |MOV DWORD PTR DS:[EAX+150],14
61791018  \.- EB EB         \JMP SHORT 61791005
По сути я был прав, когда писал
Assembler
1
2
3
mov eax, dword[addr] ;загружаем значение по адресу 0x00400000 + 0x00109B74 
mov eax, [eax + 0x150] ;тут наверное ошибка, но вроде я прибавляю к тому самому значению смещение 0x150
mov dword[eax], 0x14 ;ложим 20 в адрес
Сейчас попробую сделать так:
Assembler
1
2
mov eax, dword[addr]
mov dword[EAX+0x150], 0x14
А потом, как вы сказали:
Assembler
1
2
mov eax, dword[addr] 
mov dword[EAX+0x150*4], 0x14
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.10.2016, 16:39
Пардон, может, я где-то выше не совсем правильно написал, лишь
хотел подчеркнуть, что DWORD+x и 'DWORD *'+x - это не одно и то же.

По идее, должно быть как-то так:
Assembler
1
2
3
4
5
6
7
8
; Берем DWORD по адресу 0x509B74 (0x400000 + 0x9B74).
mov eax, dword ptr [0x509B74]
 
; Прибавляем к нему 0x150
add eax, 0x150
 
; По полученному адресу пишем 0x14 (20).
mov dword ptr [eax], 0x14
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
06.10.2016, 16:41  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
0x150, а на 0x150*4
Цитата Сообщение от dima291000 Посмотреть сообщение
Сейчас попробую сделать так:
AssemblerВыделить код
1
2
mov eax, dword[addr]
mov dword[EAX+0x150], 0x14
А потом, как вы сказали:
AssemblerВыделить код
1
2
mov eax, dword[addr]
mov dword[EAX+0x150*4], 0x14
Ни первый, ни второй вариант не рабочие((

Добавлено через 1 минуту
Вот полный код dll
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
format PE DLL
include 'win32a.inc'
include 'macro/if.inc'
entry DllMain
 
section '.data' data readable writeable
        msg db 'fuck yeah!!', 0
        title db 'ok', 0
        addr dd 0x00400000 + 0x00109B74
 
section '.code' code executable
proc DllMain, hInstance, fdwReason, lpvReserved
     .if dword[fdwReason] = DLL_PROCESS_ATTACH
         invoke createthread, NULL, NULL, thread, NULL, NULL, NULL
     .endif
     mov eax, TRUE
     ret
endp
 
proc thread
     mov eax, dword[addr]
     mov dword[EAX+(0x150*4)], 0x14
 
     invoke messagebox, HWND_DESKTOP, msg, title, MB_OK
     ret
endp
 
section '.idata' import data readable
library user32, 'user32.dll',\
        kernel32, 'kernel32.dll'
 
import  user32,\
        messagebox, 'MessageBoxA'
 
import kernel32,\
       createthread, 'CreateThread'
 
section '.reloc' fixups data readable discardable 
if $=$$
    dd 0, 8
end if
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.10.2016, 16:49
Лучший ответ Сообщение было отмечено dima291000 как решение

Решение

А еще проще скомпилировать код на C/C++ из первого сообщения и
посмотреть, какой код сгенерировал компилятор. И вставить его в
свой проект на FASM-e.

Вот что сгенерировал MS C/C++ Compiler (Visual C++ 2008 SP1):
Assembler
1
2
3
    mov eax, DWORD PTR ds:5282676
    add eax, 336            ; 00000150H
    mov DWORD PTR [eax], 20 ; 00000014H
1
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
06.10.2016, 17:06  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Вот что сгенерировал MS C/C++ Compiler (Visual C++ 2008 SP1):
AssemblerВыделить код
1
2
3
* * mov eax, DWORD PTR ds:5282676
* * add eax, 336 * * * * * *; 00000150H
* * mov DWORD PTR [eax], 20 ; 00000014H
Спасибо! Это абсолютно работает)) А теперь я полез в гугл искать что такое ds:циферки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2016, 17:06
Помогаю со студенческими работами здесь

инструкция по адресу 0x7c91ac4a обратилась к памяти по адресу 0x00000010.Память не может быть written
Помогите разобраться пожалуйста!!!!! С:/rsit info.txt logfile of random's system information tool 1.06 2010-05-27 22:37:54 ...

Инструкция по адресу “0x490e355” обратилась к памяти по адресу “0x065ea847” память не может быть “written”
Здравствуйте, при загрузки картинки в хроме появляется такая ошибка и хром дохнет, также это наблюдается в других браузерах когда нажимаешь...

Ошибка: инструкция по адресу 0x00aeb5e2 обратилась к памяти по адресу 0x00000008.память не может быть read
инструкция по адресу 0x00aeb5e2 обратилась к памяти по адресу 0x00000008.память не может быть read . рамка выскакивает при установке...

Ошибка «Инструкция по адресу 0х0093bd32 обратилась к памяти по адресу 0х00000000.Память не может быть «read»
Недавно установили 2ой Windows на диск D, старый остался на C. На первом Windows программа iTunes работала исправно, на новом,при...

Разработать программу позволяющую получить дамп памяти по адресу содержащему вводимые числа
Разработать программу позволяющую получить дамп памяти по адресу содержащему вводимые числа. Программа должна предусматривать вывод...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru