|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.08.2010, 05:50 | #1 |
Пользователь
Регистрация: 07.02.2009
Сообщений: 31
|
Хук CreateFile x64
Есть код на ObjectPascal (Delphi) компилируемый в FPC (из-под Lazarus'a) в dll x64. После запуска тестовой проги все процессы просто завершаются с ошибкой в kernel32 (там CreateFileW находится).
Вот код dll: Код:
Код:
Последний раз редактировалось Alex217Vish; 24.08.2010 в 05:53. |
24.08.2010, 08:50 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
вся проблема здесь
Код:
Код:
в 64 битном режиме адреса 64 битные, соответственно прыгать на по 64 битному адресу. Но возникает одна важная проблема инструкции PUSH imm64 просто не существует. Поэтому надо думать над другими вариантами. Например, JMP rel32, опкод у этой инструкции такой же как и в защищённом режиме и работает она так же как и в защищённом режиме. |
24.08.2010, 17:27 | #3 |
Пользователь
Регистрация: 07.02.2009
Сообщений: 31
|
Ну я догадывался что тут ассемблер примешан. Код позаимствован из adwarebox ms-rem'а. Но у меня собственно вопрос только один: как заставить код работать?) Т.е. проще говоря что на что тут надо поменять?)
Нашёл в забугорном инете константы $EB и $09. Вот такой код: Код:
Последний раз редактировалось rpy3uH; 26.08.2010 в 15:27. |
26.08.2010, 15:26 | #4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
трудно конечно, ставить хук на функцию не зная ассемблера.
во-первых, $EB это опкод JMP rel8, а тебе надо JMP rel32, её опкод $E9, во-вторых, адрес для $E9 вычисляется по определённым правилам здесь написано в-третьих, ReturnOperation не нужен вовсе! Последний раз редактировалось rpy3uH; 26.08.2010 в 15:34. |
29.08.2010, 05:08 | #5 |
Пользователь
Регистрация: 07.02.2009
Сообщений: 31
|
Спасибо за пинок, полетел в направлении вот такого кода:
Код:
|
29.08.2010, 21:41 | #6 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
следует быть внимательным, так как в x64 адреса стали 64 битными и следовательно если разница между адресами более чем 2 ГБ такой код работать не будет
|
21.09.2010, 00:59 | #7 |
Пользователь
Регистрация: 07.02.2009
Сообщений: 31
|
мм... тогда закономерный вопрос: как сделать чтобы работало?)
компилятор используется fpc x86 + x64 cross compile |
21.09.2010, 12:03 | #8 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
А Integer в FPC не 64-х битный, что-ли?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
22.09.2010, 12:50 | #9 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Цитата:
вся проблема в том что в x64 инструкции JMP rel64 и это главная проблема. есть JMP r/m64 т.е. адрес должен находиться в регистре или в ячейке памяти. т.е. надо что-то в духе Код:
Последний раз редактировалось rpy3uH; 22.09.2010 в 12:53. |
|
22.10.2010, 22:12 | #10 |
Пользователь
Регистрация: 07.02.2009
Сообщений: 31
|
А можно код на каком-нибудь из высокоуровневых языков?)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
CreateFile прочитать бут-сектор | RoS | Win Api | 6 | 06.07.2010 09:36 |
Перехват CreateFile | qwerc1 | Win Api | 6 | 29.06.2010 22:01 |
CreateFile, Delphi. | edmynt | Помощь студентам | 0 | 01.06.2010 18:23 |
Создание Pipe на C# (CreateFile) | WinApi | Помощь студентам | 0 | 23.12.2009 08:07 |
После CreateFile не срабатывает DeleteFile | Arkuz | Общие вопросы Delphi | 7 | 13.03.2009 00:04 |