Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сплайсинг API в Vista 32bit, Перенос программы из ХР в Vista 
:(
    Опции темы
Smarts
Дата 12.10.2007, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: 2
Всего: 2



Использую данный код для замены первых байт функции, в ХР все работает, а в Висте замененная функция просто не вызывается, a программы, в которых был установлен перехват, вылетают с ошибкой kernel32.dll (хотя перехватываются Native API из ntdll.dll).
С вистой раньше дел не имел - установил на новый компьютер несколько дней назад. Возможно дело не в замене первых байтов, а в прототипах функций? Хукаю ZwQueryDirectoryFile и NtOpenFile/NtCreateFile. Изменились ли внутренние структуры и что нужно исправить, чтобы перехват работал на всех системах?

Код

struct CJmpFar
{
  BYTE    push; 
  DWORD    arg;  
  BYTE    ret; 
};

void HookFunction(    PROC real_NtFunction,  PROC old_NtFunction,  PROC new_NtFunction    )
{
    DWORD dwNumberOfBytes;

    CJmpFar jump;
    jump.push = 0x68;
    jump.arg  = (DWORD)new_NtFunction;
    jump.ret  = 0xC3;

    WriteProcessMemory(    GetCurrentProcess(), (void*)real_NtFunction, 
                        (void*)&jump.push, sizeof(jump.push), &dwNumberOfBytes    );

    WriteProcessMemory(    GetCurrentProcess(), (void*)( (DWORD)real_NtFunction + 1 ), 
                        (void*)&jump.arg, sizeof(jump.arg), &dwNumberOfBytes    );

    WriteProcessMemory(    GetCurrentProcess(), (void*)( (DWORD)real_NtFunction + 5 ), 
                        (void*)&jump.ret, sizeof(jump.ret), &dwNumberOfBytes    );

}

PM MAIL   Вверх
NiJazz
Дата 12.10.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Smarts, если бы сигнатуры функций изменились, то LoadLibrary вернула бы NULL. Плюс это невозможно, так как это API. У M$ с каждой версией винды всё меньше раздолья для хуков и незаконных путей, поэтому чисто гипотетически могу предположить, что данный способ обломен под вистой в принципе. Но это не диагноз, а так, рассуждения. smile
PM MAIL   Вверх
Smarts
Дата 12.10.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: 2
Всего: 2



В 64-битной версии действительно кое-что прикрыли и с драйверами стало сложнее... Поэтому я специально тестил на 32 бит.
Кстати процессор у меня новый, 64 битный, может команды push/ret тоже надо делать 64 битными, даже если винда 32 бит?
PM MAIL   Вверх
dumb
Дата 12.10.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(Smarts @  12.10.2007,  17:14 Найти цитируемый пост)
Кстати процессор у меня новый, 64 битный, может команды push/ret тоже надо делать 64 битными, даже если винда 32 бит?
нет.
проверять надо, что возвращает WriteProcessMemory.
PM MAIL   Вверх
Smarts
Дата 12.10.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: 2
Всего: 2



WriteProcessMemory возвращает единицу, GetLastError ноль, то есть ошибок нет.
GetProcAddress возвращает реальный адрес функции, то есть запись идет туда, куда надо.
Какие еще могут быть варианты решения проблемы?
PM MAIL   Вверх
NiJazz
Дата 12.10.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Цитата

Какие еще могут быть варианты решения проблемы? 

А без хука никак не решить задачу?
PM MAIL   Вверх
dumb
Дата 13.10.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(Smarts @  12.10.2007,  19:23 Найти цитируемый пост)
Какие еще могут быть варианты решения проблемы?
посмотреть, что находится по адресу записи после выполнения последнего WriteProcessMemory, и поставить туда breakpoint.
PM MAIL   Вверх
Smarts
Дата 13.10.2007, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: 2
Всего: 2



dumb, я сделал так - просто заменил перехваченную функцию на MessageBox(...), то есть если управление передается на мой код - создается окошечко. В Висте этого не происходит, а программа вывлетает с ошибкой при первом же вызове функции... То есть получается, что вместо замены первых байт на push/ret или записываются неправильные команды, или они записываются в неправильное место.
Самое интересное, что в программе нет ошибок и в ХР все работало отлично...

NiJazz
Цитата
А без хука никак не решить задачу?

 smile  



Это сообщение отредактировал(а) Smarts - 13.10.2007, 06:09
PM MAIL   Вверх
SeregaLBN
Дата 15.10.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



посмотри перехваты от самой MS
http://research.microsoft.com/sn/detours/
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.3534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.