|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.10.2011, 17:28 | #1 |
Форумчанин
Регистрация: 29.04.2008
Сообщений: 100
|
Перехват 64-bit
У кого-нибудь есть способ установки уже готового перехвата API на 64-битную систему? Я так и не смог заставить работать перехватчик ни с помощью AppInitDLLs, ни с помощью хуков, ни с помощью метода удаленных потоков.
|
08.10.2011, 19:03 | #2 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
во-первых, под 64 битами перехватывать сложнее, в таких системах работает PatchGuard.
во-вторых, сплайсинг под 64-битными системами не всегда может сработать... вот ссылка с объяснениями а вообще, перехват функций считается уже некошерным способом и к нему прибегают только в самом крайнем если больше ничего не помогает
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
|
08.10.2011, 19:47 | #3 | |
Форумчанин
Регистрация: 29.04.2008
Сообщений: 100
|
Цитата:
Не подскажите кошерный аналог? Последний раз редактировалось hiho; 08.10.2011 в 19:52. |
|
08.10.2011, 20:42 | #4 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
для того чтобы поставить полноценный глобальный хук (лубой включая стандартные хуки через SetWindowsHookEx) надо иметь две версии библиотеки 32-битную и 64-битную
очень часто даже совершенно нормальные программы используют динамический импорт, и это факт. в этом случае данный способ будет бесполезен. когда-то я видела топик на форуме WASM там приводилось куча примеров (с листингами из IDA) когда использовался динамический импорт (это были IE, paint, блокнот и другие которые кажутся совершенно нормальными и в которых динамический импорт как бы и не нужен) в принципе, метод сплайсинга сам по себе нормальный, но ключевая проблема в том что если кто-то другой поставить повторный хук, то наш хук уже снять нельзя, он становится неснимаемым, ибо если его снять программа рухнет. как итог - нестабильность системы в целом
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
|
09.10.2011, 06:10 | #5 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Да, обычно все программы сплайсят функции поверх чужих сплайсингов, хотя и эта проблема- вовсе не проблема и к х64 имеет отношение ровно такое же как и к хп и прочим миллениумам. Проверка режима в которой работает программа (х64 or х32) и сплайсинг. Делов то куча
Нет, ну правда..
|
09.10.2011, 09:44 | #6 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
для сплайсинга под x64 нужно выполнение нескольких важных условий, так как прыжок может произойти максимум на 2 ГБ, так как инструкций jmp rel64 и push imm64 не существует. нужно реализовывать более сложные конструкции.
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
Последний раз редактировалось haruhi; 09.10.2011 в 09:51. |
10.10.2011, 07:56 | #7 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Поразительно сложная конструкция, согласитесь, копипаста?
Код:
db 048h, 0B8h ;mov rax, OPI dd 00h, 00h ; addr api, 64bit db 0FFh, 0E0h ;jmp rax
Нет, ну правда..
Последний раз редактировалось yuran666666; 10.10.2011 в 08:23. |
10.10.2011, 12:17 | #8 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
mov rax, addr
jmp rax в целом вроде всё нормально, содержимое RAX в перед вызовом никому не нужно, но всякое может быть, а вдруг сама функция не меняет RAX (типа void), а программа, её вызывающая, держит в RAX какие-то нужные данные прикольно |
10.10.2011, 19:29 | #9 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Ну, подозреваю, что после вызова системной апи (обычно ж именно их перехватывают) не может быть такого, что хоть один высокоуровневый компилятор будет оперировать значением регистра rax до вызова, в котором для них возвращается результат работы данных функций, да и в случае с void, сомнительно, что в коде функции не будет использоваться самый ходовой регистр, а следовательно придется его значение где то сохранять, что опять же зачем бы делать. С другой стороны особо ярый извращенец, может написать на асме функцию, которая не требует возврата результата или же возвращает его в любом другом регистре, сохранить и использовать далее в коде значение данного регистра, что вызовет сбой логики. Подводя итог, функции таких извращенцев перехватывать никому не нужно, да и на асме под х64 пишут три с половиной человека потому что это также не нужно; и, исходя из всего этого, способ вполне себе такой нормальный и заслуживающий доверие.
Нет, ну правда..
|
10.10.2011, 21:00 | #10 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
в x64 нет jmp rel64, но есть jmp [var], и она позволяет прыгать по абсолютному адресу, но для такого прыжка нужно где-нибудь завести переменную с целевым адресом (ну например, где-нибудь рядом с перехватчиком). также в этом случае очень легко сменить перехватчик и в целом такой способ гибче.
такой же вариант с push [var]/ret но конечно лучше использовать mov rax, addr/jmp rax так как он будет работать в 99,99% случаев
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Colinux и Windows 7 32 bit !!! | Koctuk111 | Помощь студентам | 0 | 14.01.2011 21:48 |
Bit-staffing | Александр_Темпо | Помощь студентам | 0 | 12.12.2010 00:48 |
Эмуляция Dendy (8-bit) | kta87 | Общие вопросы Delphi | 8 | 05.09.2010 13:22 |
Импорт 32-bit dll в 64-bit | valchakov | Общие вопросы Delphi | 8 | 25.12.2009 15:18 |