Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101

динамическое выполнение машинного кода

04.05.2010, 22:28. Показов 2581. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некий набор ассемблерных команд, переведенный уже в машинный код. Нужно загнать его в память в Heap и выполнить, а затем вернуть управление. Делаю так, но не получается
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var h:Cardinal;
p,p2:Pointer;
i:integer;
begin
h := GetProcessHeap();
p:=HeapAlloc(h,0,1);
i:=3;
p2:=@i;
 asm
mov eax, 195d //одна единственная команда должна выполниться - ret,
mov ebx, p    //где C3 в 16-ричной записи это 195 в десятичной
mov [ebx], al
call [ebx]
 end;
Пример в Делфи, но в асмовской вставке. Пишет следующее
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2010, 22:28
Ответы с готовыми решениями:

Перевод из машинного кода в команду
Здравствуйте. Моя задача- перевести из машинного кода в команду. Мой пример- нужно перевести BB 6400. Пробовала проверить на OllyDbg...

таблицу машинного кода и асма
хотел спросить, таблицу машинного кода и асма, тока не такую как все пишут, раньше не такие были, наверное время ушло бесследно . раньше...

Документ описывающий структуру машинного кода IA-32/64
Intel должна выпускать документ для разработчиков, в котором будет описано как должен быть сформирован "машинный код" чтобы его...

11
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.05.2010, 22:59  [ТС]
Идея в том, чтобы выполнить некие машинные инструкции (в основном там add и mul) размещенные в памяти, то есть нужно грамотно передать на них управление, а затем вернуть управление назад в программу, то есть последней инструкцией должна быть ret или C3 в 16 ричной записи. Помогите найти ошибку
0
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
04.05.2010, 23:01
защищенный режим процессора ихмо, в дос прокатит главное определить альфа смещение данных
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.05.2010, 23:15  [ТС]
И обойти никак? Перевести? Может создавать длл писать инструкции туда а потом передавать управление?

Добавлено через 2 минуты
Я просто должен в свойе проге периодически менять код маленького куска несколько раз за время обного сеанса пользователя. Я понисаю что десь только динамическая компиляция нужна, но я нехочу тягать компилятор с ней. Я написал сам код, который генерит простейшую длл, и теперь можно туда эти коды загонять и потом загружать её заново, но там очень критично к размеру программы, поэтому хотелось бы без dll(

Добавлено через 7 минут
Цитата Сообщение от airyashov Посмотреть сообщение
защищенный режим процессора ихмо, в дос прокатит главное определить альфа смещение данных
Это в Windows желательно. Может есть какие-то способы модификации машинного кода в своем же процессе? Ну скажем если я сделаю отдельный метод, компиятор переведет его в машинный код, запустит на выполнение, а я потом если нужно позаменяю машинные команды в памяти на те, которые мне нужны?

Добавлено через 3 минуты
Раньше метод складывал 2 числа, а теперь я там add eax, ebx на sub eax, ebx заменю? (но конечно в 2 коде, то есть что-то типа 66 01 D8 (Hex) на 66 29 D8 (Hexademical).
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
04.05.2010, 23:29
Во-первых ошибка в строке call [ebx]. Должно быть без скобок.
Во-вторых там скорее всего установлены аттрибуты на чтение-запись, но не выполнение.

Цитата Сообщение от galileopro Посмотреть сообщение
Может есть какие-то способы модификации машинного кода в своем же процессе?
Изменить аттрибуты можно с помощью VirtualProtect.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.686
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
include windows.inc
include kernel32.inc
include user32.inc
 
 
includelib kernel32.lib
includelib user32.lib
.data
old dd ?
.code
start: 
    invoke VirtualProtect,addr start,4,PAGE_EXECUTE_READWRITE,addr old
    mov byte ptr [return],0c3h
return:
db ?
end start
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.05.2010, 23:34  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Во-вторых там скорее всего установлены аттрибуты на чтение-запись, но не выполнение.
Это у страницы памяти, где эти команды я записал, да? А можно как-то разрешить выполнение?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
04.05.2010, 23:39
Ну так, например, работает.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.686
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
include windows.inc
include kernel32.inc
include user32.inc
 
 
includelib kernel32.lib
includelib user32.lib
.data
 
.code
start: 
    
    invoke VirtualAlloc,0,1,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    mov byte ptr [eax],195
    call eax
 
    ret
end start
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.05.2010, 23:46  [ТС]
У меня тоже управление оно возвращает. Но вот такое не работает:
Delphi
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
var h:Cardinal;
p,p2:Pointer;
i:integer;
begin
h := GetProcessHeap();
p:=HeapAlloc(h,0,5);
i:=3;
p2:=@i;
 asm
mov ecx, p
mov al, 67h
mov ah, 66h
mov bl, 89h
mov [ecx], al
mov [ecx+1], ah
mov [ecx+2], bl
mov al, 18h
mov ah, 195d
mov [ecx+3], al
mov [ecx+4], ah
mov ebx, 5656
mov eax, p2
call ecx
 end;
 Form1.Caption:=IntToStr(i);
Теперь объясняю что такое 67 66 89 18 C3 (Hex) это просто
Assembler
1
2
mov [eax], ebx
ret
то есть в eax, где у меня адрес переменной i оно должно занести 5656 из ebx но вылетает с ошибкой чтения-записи(
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.05.2010, 00:02
Ну можно и в отладчике поглядеть, что там. У меня нет дельфи, не могу скомпилить, но вот переделывая под такой вариант мой же код.
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
.686
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
include windows.inc
include kernel32.inc
include user32.inc
 
 
includelib kernel32.lib
includelib user32.lib
.data
 
data dd 0
 
 
format db " data = %d",0
string db 30 DUP(?)
.code
start: 
    
    invoke VirtualAlloc,0,5,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    mov dword ptr [eax],0c31889h
    mov ecx,eax
    mov eax,offset data
    mov ebx,5656
    call ecx
 
;--------
    invoke wsprintf,addr string,addr format,data
    invoke MessageBox,0,0,addr string,MB_OK
 
    ret
end start
67 и 66 из опкода нужно убрать, кстати. Они для реального режима нужны, чтобы можно было обращаться к 32битным регистрам.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.05.2010, 00:20  [ТС]
Да этот код заработал. Просто у меня весь проект на C++ и его на асм переводить долго( А компилятор что Делфи, что Visual C++ на инструкцию mov [eax], ebx компилит (выполняет) что то вроде mov [es+bx], ebx. Хотя я вроде из таблиц правильно беру Hex коды команд. Как-то еще можно на асме занести значение по адресу, если адрес лежит в eax? Может оно неправильно интерпретирует эту инструкцию(
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.05.2010, 00:25
Я в таких случаях открываю olly вписываю нужную команду и смотрю код. Сейчас она мне ясно написала, что mov [eax],ebx, это 89 18. А со всеми 66 и 67 это и будет mov [es+bx], ebx.
То, что вы смотрите, это вероятно опкоды для реального, а не защищенного режима.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.05.2010, 00:38  [ТС]
Да теперь все правильно. Спасибо) Как раз то, что нужно. Теперь надо сделать генерирование самого массива команд (транслятор) и для fpu оппкоды сверить так как функция эта должна с вещественными числами работать, и все будет ок)

Добавлено через 3 минуты
Кстати если все так просто, то можно сделать довольно просто транслятор со своего языка программирования, или даже компилятор, не разбираясь долгими ночами с форматом PE - exe. Просто путем "мутации") или "модификации" уже имеющегося exe-файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.05.2010, 00:38
Помогаю со студенческими работами здесь

Определить адрес операнда в DS из машинного кода команды ADD
Определить адрес операнда NUM в DS из машинного кода команды ADD процессора іх86 add ax, NUM + (9 OR 2) машинный код команды:...

Динамическое выполнение кода
Доброго всем времени! С Новым годом! У меня вот какой вопрос: я пытаюсь создать программку с динамическим выполнением кода, вроде бы и...

Динамическое выполнение кода
Здравствуйте, помогите пожалуйста, нужно сделать некий конструктор программы для исполнителя робот, т.е. код задается во время выполнения...

Динамическое выполнение кода
есть необходимость добавить поле с помощью которого пользователь сможет управлять формой и имеющимися переменными к примеру имею...

Динамическое выполнение программного кода
Как создать mini Visual studio с поддержкой языка vb net (на VB.NET) Типа такой:


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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