Вообще то пока никаких глюков в работе я не заметил, вроде все работает тип-топ.Хакер писал(а):Либо это просто баг от моих кривых рук.
Артур, ты просто изучаешь ради изучения или у тебя глюк проявился?
Модератор: BV
Вообще то пока никаких глюков в работе я не заметил, вроде все работает тип-топ.Хакер писал(а):Либо это просто баг от моих кривых рук.
ger_kar писал(а):Вообще то пока никаких глюков в работе я не заметил, вроде все работает тип-топ.
Private Declare Sub test_ptr Lib "*" ()
Sub a(): Debug.Print "Всё плохо": End Sub
Sub b(): Debug.Print "Всё хорошо": End Sub
Sub main()
MagicPointersOnOff True
FuncPointer("test_ptr") = L_(AddressOf a)
Call test_ptr
MagicPointersOnOff False
MagicPointersOnOff True
FuncPointer("test_ptr") = L_(AddressOf b)
Call test_ptr
MagicPointersOnOff False
End Sub
Всё плохо
Всё хорошо
Всё плохо
Всё плохо
- Код: Выделить всё
' А вот под IDE есть проблема: DFC не импортируется через им-
' порт, её адрес жестко вшит в динамически генерируемые куски кода.
' Так что единственный приемлемый способ её перехватить: найти эти
' динамически генерируемые кусочки кода (переходнички) и перезапи-
' сать адрес в них.
arthur2 писал(а):Хочу на основе MagicPointersOnOff написать для себя функцию перехвата произвольной функции из импорта
arthur2 писал(а):На сколько я понял, это относится и к другим функциям, которые берутся из подключенной к проекту тлб. Правильно понимаю?
Хакер писал(а):Во-втоых, не понял идею.
А откуда она берется?Хакер писал(а): Да и DFC не берётся же из TLB. В какой TLB ты её видел?
arthur2 писал(а):Идея - задекларировать разным способом нужные болванки функций в тлб, а затем переписать адреса функций.
mov esi, dword [...]
...
...
...
...
call esi
...
...
...
call esi
...
..
call esi
В общем-то, переделывать тлб не так уж и сложно, как оказалось. По крайней мере, если это примитивная тлб без всяких интерфейсов, а только с объявлениями функций.Хакер писал(а):Ну, ты понимаешь, это же дико неудобно. Будешь каждый раз переделывать и перекомпилировать TLB?
Я не хочу добиться того же изящества и удобства, какое есть в этом твоем кирпиче. Делаю для себя, так что даже не очень удобный вариант меня устроит.Хакер писал(а):Кроме того, неужели ты думаешь, что мне эта идея не приходила?
А где эти старые адреса хранятся? может, их тоже можно как-то найти и подменить? Асм, увы, не понимаюХакер писал(а):Таким образом, ты перепишешь ячейку IAT, но вызовы будут идти по старому адресу.
arthur2 писал(а):А где эти старые адреса хранятся? может, их тоже можно как-то найти и подменить? Асм, увы, не понимаю
Пробовал. Самому - не получается, нужно, чтобы кто-то объяснял. Такой у меня склад мышления. А курсов подобных не встречал.Хакер писал(а):Учись понимать асм.
Откуда они берутся, чтобы записать их в эту ESI перед цепочкой вызовов? Или это совсем бесполезно, концов не найти?Хакер писал(а): В регистре ESI, куда записываются перед цепочкой вызовов.
arthur2 писал(а):Пробовал. Самому - не получается, нужно, чтобы кто-то объяснял.
arthur2 писал(а):Откуда они берутся, чтобы записать их в эту ESI перед цепочкой вызовов?
Хакер писал(а):Т.е. последовательность действий будет такая
Qwertiy писал(а):А такая последовательность действительно может возникнуть в случае, кода изменение адреса в IAT происходит до первого вызова по нему?
Получается, что не сработает, если подменять адрес прямо перед вызовом, но ведь должно сработать, если подменить его заранее? Или я опять не понял?Хакер писал(а):Т.е. последовательность действий будет такая:
Адрес функции из ячейки IAT записывается в регистр ESI
Ты записываешь в ячейку IAT новый адрес, по которому ты хочешь, чтобы шли вызовы
Осуществляется вызов по адресу, который находится в регистре ESI, таким образом выполнение уходит по оригинальному адресу.
Я правильно понял, что если даже мы один раз подменим адрес успешно, после первого вызова мы его уже не сможем менять?Хакер писал(а):Может. Но даже если бы не могла, положение вещей, когда указатель должен быть проинициализирован всенепременно до первого вызова — это уже плохой подход и неудобное решение.
arthur2 писал(а):Получается, что не сработает, если подменять адрес прямо перед вызовом, но ведь должно сработать, если подменить его заранее? Или я опять не понял?
arthur2 писал(а):И откуда всё же берется DFC? Я так понимаю, что из импорта
arthur2 писал(а):Я правильно понял, что если даже мы один раз подменим адрес успешно, после первого вызова мы его уже не сможем менять?
Хакер писал(а):Перезапись в ячейки в одной процедуре, вызов по указателю — в другой
Да, неудобно. Ровно настолько, чтобы не связываться - планировал как раз менять указатели в циклеХакер писал(а):Если вызовов несколько, и они в одной процедуре, и подмена адреса в этой же процедуре, и один вызов уже состоялся, и ESI ничем не перезаписывается (например не перезаписывается необходимостью иметь адрес для вызова какой-то другой функции) — то облом.
arthur2 писал(а):Ровно настолько, чтобы не связываться - планировал как раз менять указатели в цикле
Хакер писал(а):Если вызовов несколько, и они в одной процедуре, и подмена адреса в этой же процедуре, и один вызов уже состоялся, и ESI ничем не перезаписывается (например не перезаписывается необходимостью иметь адрес для вызова какой-то другой функции) — то облом. Но если что-то не соблюдено, то наверное не облом. И речь, конечно же, про скомпилированный в Native-код проект.
Qwertiy писал(а):Получается, что если мы аналогичным способом из функции подмены вызовем пустую функцию, то значение в регистре сотрётся и при вызове будет верный (т. е. подмёнённый) адрес.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46