PDA

Просмотр полной версии : [C] Доступ к старой функции


VISTALL
03.05.2010, 14:41
Здраствуйте.
У мну есть файлик Test.exe + word.dll. В Test.exe я сначала вывожу с длл-ки word.dll метод Word() вывод:
- "Word from Dll Normal\n"
Потом хукаю метод и опять вывожу
- "Word is Hooked\n"

Вопрос как можно сделать что б я имел доступ к старому методу выво которого - "Word from Dll Normal\n", без снятия хука.

Сам проект: http://dump.ru/file/4561840. VS 2008

Забыл нада юзать чистый Си. не С++

slesh
03.05.2010, 14:55
ну так запоминай адрес старого метода и потом когда нужно, то юзай. Хотя смотря как хук ставил.

VISTALL
03.05.2010, 15:11
а пример) моно имхо я больше ява и шарп)(совсем другое)

Я пробывал у мну чето вызывалась новая(захуканая)...

VISTALL
03.05.2010, 16:17
можно и переписать метод "SetHook", я не силен, но мне нужно. Есть ли знающие люди?)

WNZRS
03.05.2010, 18:37
ты покажи свой код, тогда появятся умные люди.

VISTALL
03.05.2010, 18:42
интересно вот это http://dump.ru/file/4561840 что?)))

Сам проект: http://dump.ru/file/4561840. VS 2008

Забыл нада юзать чистый Си. не С++

с первогО:)

WNZRS
03.05.2010, 19:06
чтобы вызвать старую функцию тебе надо при хуке запоминать байты
BYTE old1 = *(BYTE*)pfnDst; // JMP FAR
DWORD old2 =*(DWORD*)((DWORD)pfnDst+1);
и когда надо вызвать старую функцию возвращаешь байты назад...

VISTALL
03.05.2010, 19:19
в кратком снимать хук, а если не снимать?

WNZRS
03.05.2010, 19:29
чтобы не снимать нужно не джамп делать, а просто поменять адрес в word_h

VISTALL
03.05.2010, 19:41
а можно пример ибо для мну указатели и управления памьять - это капец, путаюсь))

Смотри мне нужно хукнуть метод, и с хукнутого иметь доступ к старому, прослойка - как говоря.

Мож помочь?

имхо соображалка работает:) ток опыта мало:)

Ra$cal
04.05.2010, 03:44
вот и выросло поколение, которое не умеет работать и думать памятью...

Вобщем надо сменить реализацию хука. Спертые байты переть не по пяткаку, а целыми командами с помощью дизасма длин(учитывая стабильность функции можно просто руками забить длины) и в надежде не словить в начале функции относительных переходов. Переписываем команды на новое место/
originalWordCall: ; тут спертые первые байты
jmp originalFuncNotSplicedCodeStart ; адрес с которого в оригинале идут нетронутые байты


В момент хука высчитываем 4 байта перехода для команды call, чтобы попасть на originalWordCall и меняем их на лету, либо юзаем указатели на функции(хз есть ли они в си) и без всякого гемора
void (*originalWordFunc)();

void callOriginal(){
originalWordFunc = originalWordCall;
(*originalWordFunc)();
}

Как то так. Гугл на тему сплайсинга раскроет тему пошире. Давно я этим баловался, могут быть косяки.

VISTALL
04.05.2010, 10:56
вот и выросло поколение, которое не умеет работать и думать памятью...


согласен)

поищу, если камуто не тяжело сделать пример, буду благодарен

VISTALL
07.05.2010, 19:49
maybe up.

Ктото делал подобное?