Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2011, 17:28   #1
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию Перехват 64-bit

У кого-нибудь есть способ установки уже готового перехвата API на 64-битную систему? Я так и не смог заставить работать перехватчик ни с помощью AppInitDLLs, ни с помощью хуков, ни с помощью метода удаленных потоков.
hiho вне форума Ответить с цитированием
Старый 08.10.2011, 19:03   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

во-первых, под 64 битами перехватывать сложнее, в таких системах работает PatchGuard.
во-вторых, сплайсинг под 64-битными системами не всегда может сработать... вот ссылка с объяснениями
а вообще, перехват функций считается уже некошерным способом и к нему прибегают только в самом крайнем если больше ничего не помогает
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 08.10.2011, 19:47   #3
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Цитата:
Сообщение от haruhi Посмотреть сообщение
во-вторых, сплайсинг под 64-битными системами не всегда может сработать...
Перехват осуществлен подменой адреса функции в таблице импорта. Ошибок со всякими сдвигами быть не должно

Цитата:
Сообщение от haruhi Посмотреть сообщение
а вообще, перехват функций считается уже некошерным способом и к нему прибегают только в самом крайнем если больше ничего не помогает
Не подскажите кошерный аналог?

Последний раз редактировалось hiho; 08.10.2011 в 19:52.
hiho вне форума Ответить с цитированием
Старый 08.10.2011, 20:42   #4
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

для того чтобы поставить полноценный глобальный хук (лубой включая стандартные хуки через SetWindowsHookEx) надо иметь две версии библиотеки 32-битную и 64-битную

Цитата:
Сообщение от hiho Посмотреть сообщение
Перехват осуществлен подменой адреса функции в таблице импорта.
очень часто даже совершенно нормальные программы используют динамический импорт, и это факт. в этом случае данный способ будет бесполезен. когда-то я видела топик на форуме WASM там приводилось куча примеров (с листингами из IDA) когда использовался динамический импорт (это были IE, paint, блокнот и другие которые кажутся совершенно нормальными и в которых динамический импорт как бы и не нужен)

Цитата:
Сообщение от hiho Посмотреть сообщение
Не подскажите кошерный аналог?
в принципе, метод сплайсинга сам по себе нормальный, но ключевая проблема в том что если кто-то другой поставить повторный хук, то наш хук уже снять нельзя, он становится неснимаемым, ибо если его снять программа рухнет. как итог - нестабильность системы в целом
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 09.10.2011, 06:10   #5
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Да, обычно все программы сплайсят функции поверх чужих сплайсингов, хотя и эта проблема- вовсе не проблема и к х64 имеет отношение ровно такое же как и к хп и прочим миллениумам. Проверка режима в которой работает программа (х64 or х32) и сплайсинг. Делов то куча
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 09.10.2011, 09:44   #6
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Проверка режима в которой работает программа (х64 or х32) и сплайсинг. Делов то куча
для сплайсинга под x64 нужно выполнение нескольких важных условий, так как прыжок может произойти максимум на 2 ГБ, так как инструкций jmp rel64 и push imm64 не существует. нужно реализовывать более сложные конструкции.
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии

Последний раз редактировалось haruhi; 09.10.2011 в 09:51.
haruhi вне форума Ответить с цитированием
Старый 10.10.2011, 07:56   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Поразительно сложная конструкция, согласитесь, копипаста?
Код:
format PE64 GUI
entry start

over equ 42

start:
mov     rax,addr_stub_opi
jmp     rax
db 1024*100500*over*9000 dup (0x90)
addr_stub_opi:
ret
итого шеллкодес:
db 048h, 0B8h ;mov rax,
OPI dd 00h, 00h ; addr api, 64bit
db 0FFh, 0E0h ;jmp rax
Нет, ну правда..

Последний раз редактировалось yuran666666; 10.10.2011 в 08:23.
yuran666666 вне форума Ответить с цитированием
Старый 10.10.2011, 12:17   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

mov rax, addr
jmp rax

в целом вроде всё нормально, содержимое RAX в перед вызовом никому не нужно, но всякое может быть, а вдруг сама функция не меняет RAX (типа void), а программа, её вызывающая, держит в RAX какие-то нужные данные

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Код:
db 1024*100500*over*9000 dup (0x90)
ret
прикольно
rpy3uH вне форума Ответить с цитированием
Старый 10.10.2011, 19:29   #9
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Ну, подозреваю, что после вызова системной апи (обычно ж именно их перехватывают) не может быть такого, что хоть один высокоуровневый компилятор будет оперировать значением регистра rax до вызова, в котором для них возвращается результат работы данных функций, да и в случае с void, сомнительно, что в коде функции не будет использоваться самый ходовой регистр, а следовательно придется его значение где то сохранять, что опять же зачем бы делать. С другой стороны особо ярый извращенец, может написать на асме функцию, которая не требует возврата результата или же возвращает его в любом другом регистре, сохранить и использовать далее в коде значение данного регистра, что вызовет сбой логики. Подводя итог, функции таких извращенцев перехватывать никому не нужно, да и на асме под х64 пишут три с половиной человека потому что это также не нужно; и, исходя из всего этого, способ вполне себе такой нормальный и заслуживающий доверие.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 10.10.2011, 21:00   #10
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

в x64 нет jmp rel64, но есть jmp [var], и она позволяет прыгать по абсолютному адресу, но для такого прыжка нужно где-нибудь завести переменную с целевым адресом (ну например, где-нибудь рядом с перехватчиком). также в этом случае очень легко сменить перехватчик и в целом такой способ гибче.
такой же вариант с push [var]/ret

но конечно лучше использовать mov rax, addr/jmp rax так как он будет работать в 99,99% случаев
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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