Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54

MessageBox [asm & delphi]

02.05.2017, 06:54. Показов 2555. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
У меня такая проблема. Пытаюсь сделать функцию на подобие MessageBoxW, по средствам ассемблера.
Через IDA узнаю дизассемблированный код, получил:
Кликните здесь для просмотра всего текста

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
; Exported entry 2046. MessageBoxW
 
 
; Attributes: bp-based frame
 
; int __stdcall MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
public _MessageBoxW@16
_MessageBoxW@16 proc near
 
hWnd= dword ptr  8
lpText= dword ptr  0Ch
lpCaption= dword ptr  10h
uType= dword ptr  14h
 
mov     edi, edi
push    ebp
mov     ebp, esp
push    0               ; wLanguageId
push    [ebp+uType]     ; uType
push    [ebp+lpCaption] ; lpCaption
push    [ebp+lpText]    ; lpText
push    [ebp+hWnd]      ; hWnd
call    _MessageBoxExW@20 ; MessageBoxExW(x,x,x,x,x)
pop     ebp
retn    10h
_MessageBoxW@16 endp


Пытался сделать так:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function mainMessageBox(wnd : HWND; Text : LPCWSTR; Caption : LPCWSTR; uType : NativeUInt) : DWORD; stdcall;
asm
mov     edi, edi
push    ebp
mov     ebp, esp
push    0
push    [ebp+uType]
push    [ebp+Caption]
push    [ebp+Text]
push    [ebp+wnd]
call    [$75FFFD8A]
pop     ebp
ret    10h
end;


Длл компилится успешно, но, при вызове функции, застревает на моменте "push [ebp+uType]".
Пожалуйста, объясните, в чем моя ошибка или, что я делаю не так. Спасибо.
P.S. Если создал тему не в подходящем разделе, прощу прощения.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2017, 06:54
Ответы с готовыми решениями:

Delphi & MSSQL2K & NText - глюк!!!
Привет All. Вот в чем проблема: на сервере MSSQL 2000 валяется stored procedure app_ins_mat. Параметры: @PID UNIQUEIDENTIFIER, ...

Delphi и ASM
Не работает вызов ассемблерной функции Invoke. Вот часть кода asm invoke CloseHandle,ebx; invoke ExitProcess,0; Пишет ...

Delphi -> asm
Под линуксом си сначала транслируется в ассемблер, потом в .o, а потом уже в исполняемый файл. Под виндой чуть по другому код дельфи сразу...

6
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
02.05.2017, 15:37
Потому что:
1. Не надо писать [ebp+wnd], пишите просто [wnd] или wnd и т.п. Компилятор сам добавит [ebp+...]. А так получается [ebp+ebp+wnd].
2. push ebp + mov ebp,esp тоже делать не надо.
3. mov edi,edi и push 0 - это вообще зачем?
4. call [$...] - это вообще неверно, должно быть call MessageBox
5. retn добавляется автоматически.

В общем, вот так:
Delphi
1
2
3
4
5
6
7
8
function mainMessageBox(wnd : HWND; Text : LPCWSTR; Caption : LPCWSTR; uType : NativeUInt) : DWORD; stdcall;
asm
  push uType
  push Caption
  push Text
  push wnd
  call MessageBox
end;
Но именно в таком виде непонятен смысл. Потому как будет лишний вызов функции. И её даже inline не сделаешь из-за ассемблерной вставки...
1
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54
03.05.2017, 00:49  [ТС]
Спасибо большое, хотя бы теперь более понятна ситуация. На счет MessageBox, взял как пример, вообще, я хотел "вытащить" NtUserPostMessage из user32.dll, да и в целом, понять, как адаптировать ту или иную функцию, которая не экспортируется. По поводу второй функции, находил "переделанный" вид, выглядит он так:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
Function NtUserPostMessage(hWnd:handle;Msg:LongWord;wParam:WPARAM;lParam:LPARAM ): dword; stdcall; 
asm 
pop ebp 
mov eax, $11DB 
call @SystemCall 
ret $10 
@SystemCall: 
mov edx, esp 
sysenter 
end;

Однако, это не работает (возможно, различая в ОС, так как тема 2008 года, я же, использую 7 ос).
Код на "семерке", IDA выдает такой:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
; __stdcall NtUserPostMessage(x, x, x, x)
_NtUserPostMessage@16 proc near
 
arg_0= byte ptr  4
 
mov     eax, 100Fh
mov     ecx, 0
lea     edx, [esp+arg_0]
call    large dword ptr fs:0C0h
add     esp, 4
retn    10h

И тут мне уже не ясно, имен параметров нет, но, функция имеет те же параметры, что и обычная PostMessageW. Предположу, что параметры = регистры. Пытался провести параллели с "переделанным" видом, но не осилил. Да и вообще, может есть более правильный вариант достичь моих целей, или все же "перевод" с ассемблера?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
03.05.2017, 17:38
Цитата Сообщение от SPLER Посмотреть сообщение
я хотел "вытащить" NtUserPostMessage из user32.dll
NtUserPostMessage в user32.dll нет, боюсь идея обречена на провал изначально

Давайте по более простому пути, у меня есть подозрение, что этот путь есть. Потому как не зная броду не стоит лезть в воду, тем более в сегмент FS (если верить вот этому, fs:0C0h - это FastSysCall в Wow64, т.е. в 32-битной винде, боюсь, эффект будет не тот, какой ожидается).
Для чего все эти телодвижения, что требуется сделать в итоге?
0
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54
03.05.2017, 18:48  [ТС]
Спасибо за ответ. По поводу целей и итогового результата.. Я хочу понять, как грамотно адаптировать ассемблерный код под Паскаль и С++. Литературы по этой теме не нашел, хотя и искал не столь углубленно. По результату, хотелось бы получить "законный" доступ к функциям ядра, PostMessage взял как пример. Следуя логике (возможно, ошибочной) и тому, что выдает IDA, функция PostMessageW это своего рода "маска", так как в ее теле, происходит вызов Nt функции с теми же параметрами. То есть, если не сработает по той или иной причине PostMessage, хук или подмена, или еще что то, то по сути, прямое обращение к функции ядра, должно решить вопрос.
По поводу NtUserPostMessage, разве ее нет в user32? ИДА ее находит, но, в экспортируемых ее нет. То есть, если функции нет в экспорте, до до стучаться до нее нельзя? В ntdll ее так же нет (вообще).
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
03.05.2017, 21:16
Цитата Сообщение от SPLER Посмотреть сообщение
Я хочу понять, как грамотно адаптировать ассемблерный код под Паскаль и С++
Ну здесь много частных случаев, в двух словах не расскажешь...
В целом прологи/эпилоги/инструкции возврата генерируются автоматически. Доступ к параметрам можно осуществлять через имена переменных (тем более, что где-то используется соглашение fastcall (register), где-то доступ идёт через [esp], а где-то через [ebp] и пр. нюансы). Можно глянуть в исходники с ассемблерными вставками и поизучать (в Delphi этого добра навалом)...

Цитата Сообщение от SPLER Посмотреть сообщение
ИДА ее находит, но, в экспортируемых ее нет.
Я не знаю как он её находит и как понимает, что это именно она, поскольку строки "NtUserPostMessage" в файле user32.dll нет.
По поводу этой функции не подскажу ничего, не знаю о ней ничего
Попробуйте копать в сторону win2k.sys.

Цитата Сообщение от SPLER Посмотреть сообщение
хотелось бы получить "законный" доступ к функциям ядра
Что значит "получить доступ"?
Половина WinAPI-функций исполняются в ядре. Или нужно выполнить свой код в ядре? Или ещё что-то?

Если есть желание поковыряться во внутренностях Windows, можете полистать http://undocumented.ntinternals.net или книги типа "М.Руссинович, Д.Соломон. Внутреннее устройство Microsoft Windows".

Добавлено через 2 минуты
Кстати, у драйверов доступа к ядру гораздо больше, чем у пользовательских прог
1
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54
04.05.2017, 03:38  [ТС]
Спасибо за ответ и прояснения.
Цитата Сообщение от Jin X Посмотреть сообщение
По поводу этой функции не подскажу ничего, не знаю о ней ничего
Спасибо большое, Вы и так даете мне достаточно информации
Цитата Сообщение от Jin X Посмотреть сообщение
Что значит "получить доступ"?
На примере этой функции, я хотел опробовать "корень" PostMessage, попробовать отправить то или иное сообщение в обход хука или подмены. Поискав информацию в сети, опять же, касательно этой функции, так же наткнулся на статьи где она использовалась, и это были драйвера. Не уверен, что это мой вариант, так как дел с драйверами не имел, и возможностей взаимодействия пользовательского интерфейса и функциями драйвера не знаю, но, благодаря вашим ссылкам, возможно, открою для себя что то новое, интересное. Если это действительно единственный верный вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2017, 03:38
Помогаю со студенческими работами здесь

Delphi + asm(Вставки), строки.
Всем приветь ! Тот заинтересовался asm вставками в Дельфи, ну понял нормально работы с цифрами 1. А вот как реализовать работу...

Примеры работы IBX & InterBase & Delphi
Начал работать с IBX & InterBase & Delphi. может кто знает где можна найти нормальную доку, примери или описание работы с IBX...

Delphi&Access&logs
Добрый вечер у меня есть программка Есть форма авторизации, есть кнопка войти, при нажатии кнопки нужно независимости удачно или не...

Delphi & Excel & Color
Не могу присвоить цвет ни 1 ни 2 способом, в чем беда? var FXLS: variant; color:Tcolor; ... begin color:=Clred; ... ...

MessageBox в DataModule - Delphi
Не могу подружить Дата Модуль с диалоговым окном ошибки: Data_Modul.pas(285): E2003 Undeclared identifier: 'MessageBox' ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru