Я просто дундук в этом. Помогите нуберу. Плииииииииииииз Code (Text): PVOID Hook(PVOID Addr, PVOID NewFunc) { PVOID CallGate, Inst = Addr; ULONG Size = 0, CollectedSpace = 0, CallGateSize = 0; if (Addr == NULL) return 0; while (CollectedSpace < SIZEOFJUMP) { GetInstLenght(Inst, &Size); (ULONG)Inst += Size; CollectedSpace += Size; } CallGateSize = CollectedSpace + SIZEOFJUMP; CallGate = (PVOID)ExAllocatePool(NonPagedPool, CallGateSize); DbgMsg("Function addr : 0x%.8x\n", Addr); DbgMsg("Handler addr : 0x%.8x\n", NewFunc); DbgMsg("CallGate at : 0x%.8x; size : %d\n", CallGate, CallGateSize); memset(CallGate, ASMNOP, CallGateSize); memcpy(CallGate, Addr, CollectedSpace); memset(Addr, ASMNOP, CollectedSpace); GenJmp((ULONG)Addr + SIZEOFJUMP, (ULONG)CallGate + CollectedSpace); GenJmp((ULONG)NewFunc, (ULONG)Addr); return CallGate; } Как вернуть все обратно, тоесть расхукить это дело. Я ламка и вааще ничего не понимаю что тут сделали. Помогите пожалуйста
Подозреваю, что сделали хук через вставку jmp в начало функции. Снимается так: читаешь с диска оригинальные первые 5 байт перехваченной функции и в памяти пишешь их вместо этого самого jmp в начале функции
WaterGhost Объясняю, что здесь написано. в этом цикле получаем целое количество инструкций размером не менее SIZEOFJUMP Нопим пространство в пуле - хз зачем - не обязательно. Сохраняем старые инструкции в отдельном пуле Нопим начало функции - хз зачем - тоже необязательно. Вставляем переход в место после сохраненных инструкций. Переход на продолжение функции после вставленного далее перехода. Сплайсим функции обработчиком по адресу NewFunc.
Ух ты.. кажись что-то понял. А откуда взять оригинальные данные для обратной замены ? Или когда я ставлю хук мне нада их запонить ?
если это твой хук, то оригинальные байты лежат в Callgate, только тебе надо перезаписывать без последнего джампа.
а не могли бы помочь построить код функции UnHook... у меня имеется только функции с приставкой Old - это резултатьы выполнения функции Hook. Т.е. калгейты. Помогите пожалуйста... просто представить вю эту архитектуру по коду не могу. А так вроде понятно что просто перенаправляем при вызове в мой обработчик а потом обратно.
Т.е. в КАЛГЕЙТЕ который определяется до строчек Code (Text): GenJmp((ULONG)Addr + SIZEOFJUMP, (ULONG)CallGate + CollectedSpace); GenJmp((ULONG)NewFunc, (ULONG)Addr); лежит оригинальные байты которые мне нада перезаписать ? А как узнать размер калгейта? sizeof ?
сканю до jmp, отрезаю все что после jmp и сам jmp и потом заменяю так: Code (Text): memcpy(Addr, CallGate, sizeof(CallGate)); я все правильно понял ? А как скан проводить ? Code (Text): for(i = 0; sizeof(CallGate); i++) { if(CallGate + i = ASMNOP) { } } я вааще не представляю это, помогите пожалуйста =\
Нет. sizeof не поможет, надо так Code (Text): memcpy(Addr, CallGate, CollectedSpace); Чтобы проводить скан надо узнать какой вид перехода генерит GetJmp. И по этим инструкциям искать.
Code (Text): void GenJmp(ULONG To, ULONG From) { InsertDword(From + 1, To - From - 5); // dst - src - 5 InsertByte(From, ASMJMP); // jmp ... } Вот... Насчет размера... это что получается мне нада запоминать CollectedSpace из процедуры установки хука ? =\
Подскажите как это сделать пожалуйста. Как провести скан и отрезать в калгейте информацию по ASMJMP. Плииииииз =\