7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
||||||
1 | ||||||
C/C++ Вызов NtUserPostMessage в ассемблерной вставке19.11.2014, 11:37. Показов 5489. Ответов 25
Метки нет (Все метки)
Доброе утро.
Достался "по наследству" код
Вобщем прошу помочь переписать его либо в AT&T, что бы MinGW скомпилил, либо (идеальный вариант) переписать в С++ Зарание спасибо.
0
|
19.11.2014, 11:37 | |
Ответы с готовыми решениями:
25
Замена элементов в строке в ассемблерной вставке Вызов ассемблерной процедуры из программы на C++ Прерывания в ассемблерной вставке Вывод массива в ассемблерной вставке |
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|||||||||||||||||||
19.11.2014, 12:16 | 2 | ||||||||||||||||||
WinstonCherchil,
попытайся переводить по одной строке, основное различие - это обратный порядок операндов и указание типа операндов в названии операции, то есть sub edx, 16 = subl $16,%edx точность не гарантирую но по моему так
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
||||||
19.11.2014, 13:20 [ТС] | 3 | |||||
Уже пытался, по томуже посту на сайбере. Не собирается, пишет:
Еще не понятно, что делать с этими _эмитами. Может это можно как-то на С++ переписать? Мне ведь этот код еще поддерживать придется. На сколько я понял он как-то сохраняет входные параметры, вызывает функцию системную и скармливает ей эти параметры, потом возвращается. Как мне в С++ вызвать эту 0x11FE функцию?
0
|
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|
19.11.2014, 14:01 | 4 |
WinstonCherchil,
0F34 это машинный код команды sysenter попробуй просто указать команду, может быть MinGW поймет а что должен делать этот фрагмент? вызвать NtUserPostMessage из win32k.sys ? А почему нельзя просто использовать PostMessage ?
0
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
||||||||||||||||
19.11.2014, 20:51 [ТС] | 5 | |||||||||||||||
Нативки быстрее. Это часть скриптого языка типа АутоИТ. В больших приложениях лагает, а в некоторых вообще не работает.
Вот что на данный момент имею:
Оригинал на Дельфи
Добавлено через 5 часов 14 минут Собралось.
0
|
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|
20.11.2014, 03:43 | 6 |
WinstonCherchil,
а что за расшифровка ошибки "SIGILL" ? sysenter вызывает нативные функции в зависимости от параметра в ЕАХ, может быть для твоей Винды для вызова NtUserPostMessage нужно другое число, не 0x11FE ? и насколько быстрее работают нативные функции по сравнению с функциями вызываемыми из юзер моды? Я же не знаю СМЫСЛА ускорения твоей программы...
0
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
||||||
20.11.2014, 14:35 [ТС] | 7 | |||||
Там не только ускорение, таким методом можно собирать инфу о скрытых процессах (ну не PostMessage'ом, а соответствующими функциями), которые обычные АПИ не видят, и еще много прикольных вещей. В данной ситуации PostMessage взят лишь потому что легко проверить работоспособность кода - сразу видишь реакцию программы. Ну конечно его потом оставят таким, раз уж его сделали.
Что касается SIGILL - Signal Illegal instruction. Гугл говорит что на семерке х64 больше нет сисэнтера. Вместо этого предложил использовать это:
0
|
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
|
|||||||||||
25.11.2014, 19:19 | 8 | ||||||||||
Ну, если доверять Hiew32, манам и коду выше, то на асм для x86 это будет:
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
||||||
27.11.2014, 19:47 [ТС] | 9 | |||||
Уже сам докатился. В тему никто не писал долго, вот и перестал проверять, но спасибо.
Сейчас с другим проблема. На гуглив всякой всяины пришел к этому (я перешел на студию потому что все гуглится под нее, для МинГВа почти ничего нет.)
Сообщение от Microsoft Visual Studio Express 2013
Сообщение от Microsoft Visual Studio Express 2013
Добавлено через 7 минут За основу кода брал примеры из этой статьи. Добавлено через 2 минуты Не по теме: П.С. За что Mikl'а то забанили?
0
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
|||||||||||
27.11.2014, 20:24 | 10 | ||||||||||
Для wow64 нет, а для x64 есть syscall.
А также x86.
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
|
28.11.2014, 15:15 [ТС] | 11 |
Спасибо.
В id, я так понял я подставляю номер своей функции, в данном случае 0x11fe. А retN как вычислять?
0
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
||||||
28.11.2014, 15:36 | 12 | |||||
Это значение служит для очистки стэка после вызова, и зависит от количества переданных аргументов в функцию.
Добавлено через 9 минут Кстати здесь у вас ошибочка
Добавлено через 1 минуту Это наверно для NtCreateFile .
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
||||||
28.11.2014, 16:09 [ТС] | 13 | |||||
В байтах? Попробовал сам посчитать - 3 указателя по 64 бита и 32 юинт = 0xE0, так же попробовал то что в примере (и еще пару других). Тоже не заработало.
Сообщение от Microsoft Visual Studio Express 2013
0
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
||||||
28.11.2014, 16:19 | 14 | |||||
Кх, кх а вы уверены что правильно передали параметры ? И как они расположены в стэке вы знаете ?
Для начала надо в заголовок функции добавить naked.
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
|
28.11.2014, 16:20 [ТС] | 15 |
А! Понял. NtCreateFile принимает 11 параметров по 32 бита = 2Сh => по аналогии для NtUserPostMessage [4] получаем (32/8) байт * 4 параметра = 16 = 0x10. Тоже пробовал не работает.
0
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
|
28.11.2014, 16:24 | 16 |
Я выше написал что вы не контролируете стэк. Запустите debbuger и смотрите что и как передаёте. Скорей всего ошибка в передаче аргументов.
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
|
28.11.2014, 16:29 [ТС] | 17 |
__declspec(naked) bool __stdcall
Сообщение от Microsoft Visual Studio Express 2013
Добавлено через 4 минуты Студия 2013 умеет это, или придется качать отдельную программу?
0
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
|
28.11.2014, 16:32 | 18 |
Не знаю как 2013 но в 2008 alt+8. Или скачайте debugger например OllyDbg - простой и мощный.
1
|
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
|
|
28.11.2014, 16:33 [ТС] | 19 |
Поспешил. Убрал у прототипа - все собралось и заработало. Однако кнопка так и не долетает до Калькулятора. По всей видимости, там в стеке действительно каша. Пошел гуглить.
0
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
||||||
28.11.2014, 17:15 | 20 | |||||
Вот рабочий вариант проверял windows 8.1.
1
|
28.11.2014, 17:15 | |
28.11.2014, 17:15 | |
Помогаю со студенческими работами здесь
20
Вычислить значение выражения в ассемблерной вставке в C++ Как использовать условные операторы в ассемблерной вставке Как обращаться к членам структуры в ассемблерной вставке на си? В ассемблерной вставке занести слово в регистр esi ASM + C++: получить значения элементов массива в ассемблерной вставке Ошибка в ассемблерной вставке (сортировка методом пузырька, Паскаль) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |