Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
SPLER
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54
1

MessageBox [asm & delphi]

02.05.2017, 06:54. Просмотров 567. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2017, 06:54
Ответы с готовыми решениями:

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

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

Delphi и ASM
Не работает вызов ассемблерной функции Invoke. Вот часть кода asm ...

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

Excel & Delphi
Функция PasteSpecial Запускаю с параметрами ...

6
Jin X
4636 / 1391 / 162
Регистрация: 14.12.2014
Сообщений: 2,686
Записей в блоге: 8
Завершенные тесты: 2
02.05.2017, 15:37 2
Потому что:
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
SPLER
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54
03.05.2017, 00:49  [ТС] 3
Спасибо большое, хотя бы теперь более понятна ситуация. На счет 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
Jin X
4636 / 1391 / 162
Регистрация: 14.12.2014
Сообщений: 2,686
Записей в блоге: 8
Завершенные тесты: 2
03.05.2017, 17:38 4
Цитата Сообщение от SPLER Посмотреть сообщение
я хотел "вытащить" NtUserPostMessage из user32.dll
NtUserPostMessage в user32.dll нет, боюсь идея обречена на провал изначально

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

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

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

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

Добавлено через 2 минуты
Кстати, у драйверов доступа к ядру гораздо больше, чем у пользовательских прог
1
SPLER
3 / 3 / 1
Регистрация: 16.03.2012
Сообщений: 54
04.05.2017, 03:38  [ТС] 7
Спасибо за ответ и прояснения.
Цитата Сообщение от Jin X Посмотреть сообщение
По поводу этой функции не подскажу ничего, не знаю о ней ничего
Спасибо большое, Вы и так даете мне достаточно информации
Цитата Сообщение от Jin X Посмотреть сообщение
Что значит "получить доступ"?
На примере этой функции, я хотел опробовать "корень" PostMessage, попробовать отправить то или иное сообщение в обход хука или подмены. Поискав информацию в сети, опять же, касательно этой функции, так же наткнулся на статьи где она использовалась, и это были драйвера. Не уверен, что это мой вариант, так как дел с драйверами не имел, и возможностей взаимодействия пользовательского интерфейса и функциями драйвера не знаю, но, благодаря вашим ссылкам, возможно, открою для себя что то новое, интересное. Если это действительно единственный верный вариант.
0
04.05.2017, 03:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2017, 03:38

Excel&Delphi
Нужна помошь!:help: Задача такова: Имеется расписание(в Excel'евском...

Delphi & ModBus
Привет! Ребята нужно реализовать протокол, работаем со счетчиками по RS 485, и...

Drag&Drop в Delphi
Народ привет!!!!! Подскажите пожалуйста, как в Delphi сделать перетаскивание...


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

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

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