Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват API-функции GetVersionEx и замена собственной  (Прочитано 29128 раз)
0 Пользователей и 1 Гость смотрят эту тему.
_serj_dev
Участник

ru
Offline Offline

« : 04-12-2008 03:57 » 

Есть такая проблема. Некая программа(HP Toolbox) которая прекрасно работает на WindowsXP, никак не хочет работать в Windows Server 2003. Я определил, что она при запуске вызывает API-функции GetVerson и GetVersionExA. Как можно их подменить. Или есть другой способ обойти это ограничение.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 04-12-2008 05:43 » 

_serj_dev, чё прям так и пишет - не буду работать, потому что W03 ?
Записан

while (8==8)
_serj_dev
Участник

ru
Offline Offline

« Ответ #2 : 04-12-2008 08:05 » 

нет, говорит что данное ПО не тестировалось на данной платформе и отказывается устанавливаться. т. е. обращение к функции GetVersionEx начинается уже при запуске setup.exe и при каждом этапе установки. во время установки каждый этап установки драйвера и ПО запускается с разных exe файлов и каждый использует эту функцию. Ну очень ему не хочется там работать.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 04-12-2008 08:43 » 

_serj_dev, а вкладка "Совместимость" не помогает? Хотя, эта фигня никогда не помогает...

Какое то странное предупреждение однако. Может это не setup, а отказ сервера от установки неподписанного ПО?
Какое значение в значении Policy ключа HKLM\SOFTWARE\Microsoft\Non-Driver Signing  ?
« Последнее редактирование: 04-12-2008 08:48 от sss » Записан

while (8==8)
zubr
Гость
« Ответ #4 : 04-12-2008 09:14 » 

Самый простой вариант: поставить патч на проверку версии.
Записан
_serj_dev
Участник

ru
Offline Offline

« Ответ #5 : 04-12-2008 17:50 » 

sss, это ничего не помогает. Сообщение выдает именно программа установки. Могу скинуть скриншот(но это не суть).
zubr, что есть такие универсальныке патчи? Можешь посвятить?
Функция GetVersionEx находится в kernel32.dll, интересно как там реализована эта функция? Она смотрит значение в реестре?
Я читал, что если в реестре менять значения версии винды то могут возникнуть глюки... Не очень то хочется чтобы сервак упал Быть такого не может тем более что это пахнет нарушением авторских прав её величества Windows.
Все сводится к тому, что есть МФУ на которой есть кнопка "Сканировать в", это МФУ подключено к локалке через сеть. Есть машина на которой есть HP ToolBox с установленной Windows XP, но безумно хочется чтобы эта программа работала не на левой машине, а как полагается, на сервере.
Тех. поддержка не канает, там нет ПО для Server 2003. Есть только дрова на принтер и сканер, но кнорка "Сканировать в" работать на МФУ не будет.
« Последнее редактирование: 04-12-2008 17:56 от _serj_dev » Записан
zubr
Гость
« Ответ #6 : 04-12-2008 18:36 » 

_serj_dev, в отладчике ищешь место проверки версий и подменяешь, то бишь патчишь exe-файл, так чтобы условие выполнялось правильно на проверку версий или джампить на точку входа после проверки, при правильном условии. Конечно метод хакерский, но имхо самый простой для данной задачи.
Записан
_serj_dev
Участник

ru
Offline Offline

« Ответ #7 : 05-12-2008 01:32 » 

zubr, ну ну. Как ты мне предлагаешь преодолеть этот тернистый путь? Патчить все exe-шники которые участвуют в процессе установки, тем более что я этим никогда не занимался. А черт его знает...
Записан
sss
Специалист

ru
Offline Offline

« Ответ #8 : 05-12-2008 02:42 » 

_serj_dev, какое еще нарушение авторских прав? Системная политика "Поведение при установке неподписанного ПО" не как не пересекается с авторскими правами.

Прилепи скриншот...
Записан

while (8==8)
_serj_dev
Участник

ru
Offline Offline

« Ответ #9 : 05-12-2008 03:13 » 

Я имею ввиду, что если в реестре версию винды менять, то это будет нарушением прав. http://www.fssr.ru/hz.php?name=News&file=article&sid=8416
Записан
sss
Специалист

ru
Offline Offline

« Ответ #10 : 05-12-2008 06:41 » 

А, ну это конечно... Еще там нет про число процессоров...
Покажи снимок экрана с предупреждением.
Записан

while (8==8)
zubr
Гость
« Ответ #11 : 05-12-2008 07:23 » 

zubr, ну ну. Как ты мне предлагаешь преодолеть этот тернистый путь? Патчить все exe-шники которые участвуют в процессе установки, тем более что я этим никогда не занимался. А черт его знает...
_serj_dev,
Цитата
Есть такая проблема. Некая программа(HP Toolbox) которая прекрасно работает на WindowsXP, никак не хочет работать в Windows Server 2003.
Как я понимаю речь идет об одной программе, а не группе программ.
Ну а если все таки о группе (опять таки зависит от их числа), то тогда можно сделать следующее:
1. Создаем свою программу, которая ставит хук с перехватом функции GetVersionEx (как перехватывать функции можно посмотреть на www.wasm.ru, ну и здесь на форуме можно найти)
2. Во внедренных процессах, при обращении к функции GetVersionEx проверяем имя процесса - и если это нужный нам процесс, то подменяем номер версии в данной функции.
3. Перед запуском интересующих программ, запускаем свою с перехватом.
Вариант с изменениями в реестре, имхо, очень кривой и чреват тем, что другие проги откажутся работать.
« Последнее редактирование: 05-12-2008 07:25 от zubr » Записан
_serj_dev
Участник

ru
Offline Offline

« Ответ #12 : 25-12-2008 06:00 » 

Цитата
_serj_dev, в отладчике ищешь место проверки версий и подменяешь, то бишь патчишь exe-файл, так чтобы условие выполнялось правильно на проверку версий или джампить на точку входа после проверки, при правильном условии. Конечно метод хакерский, но имхо самый простой для данной задачи.
Пожалуйста расскажи как это делается? И каким дебагом это лучше сделать?
Записан
zubr
Гость
« Ответ #13 : 25-12-2008 07:48 » 

Из отладчиков могу посоветовать W32Dasm, SoftIce. У первого дружественный интерфейс, но он по сравнению с SoftIce ограничен по возможностям. Для твоей задачи, думаю хватит и W32Dasm.
Как это делается в 2-х словах не расскажешь. Зайди на ресурс www. wasm.ru, там найдешь полно инфы по данному вопросу и множество примеров с пошаговым описанием действий. Ну и плюс ко всему, необходимо базовое знание ассемблера.
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 25-12-2008 08:40 » 

Функция GetVersionEx вызывает RtlGetVersion, которая берет из реестра только значение ключа:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions\ProductType
Все остальные данные зашиты константами в соответствующих DLL (kernel.dll и ntdll.dll). Ключ может принимать следующие значения: "WinNt", "LanmanNt", "ServerNt".
Предложение такое: скопировать kernel.dll и ntdll.dll с машины, на которой стоит WinXP в папку с инсталятором HP ToolBox и поменять значение ключа в реестре на "WinNt".
После установки (если запустится), вернуть значение ключа обратно (надеюсь проверка только в инсталяторе программы).
Все это не проверено на  практике и является результатом 10 минутного расковырыивания ДЛЛок в дисассемблере.  Улыбаюсь
« Последнее редактирование: 25-12-2008 08:50 от RuNTiME » Записан

Любимая игрушка - debugger ...
_serj_dev
Участник

ru
Offline Offline

« Ответ #15 : 26-12-2008 02:43 » new

RuNTiME, ничего не получилось. Запускаю программу с ловушками функций GetVersion, GetVersionExA, GetVersionExW, делаю все так как ты посоветовал, и ничего не получилось. Проверку версии делает всего одна программа. Она скорее всего при успешной проверке запускает другой файл, при запуске используя параметры командной строки. Может конечно это заблуждение. Вот сам файл http://depositfiles.com/files/kb34g4k7d. Помогите пожалуйста.
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 26-12-2008 07:32 » 

_serj_dev,  в твоей программе обнаружилась очень интересная функция на мой взгляд Улыбаюсь
Код:
; Attributes: library function bp-based frame

_IsPlatformNT proc near

VersionInformation= _OSVERSIONINFOA ptr -98h
var_4= dword ptr -4

push    ebp
mov     ebp, esp
sub     esp, 98h
mov     eax, dword_483D14
xor     eax, ebp
mov     [ebp+var_4], eax
push    90h             ; Size
lea     eax, [ebp+VersionInformation.dwMajorVersion]
push    0               ; Val
push    eax             ; Dst
call    _memset
add     esp, 0Ch
lea     eax, [ebp+VersionInformation]
push    eax             ; lpVersionInformation
mov     [ebp+VersionInformation.dwOSVersionInfoSize], 94h
call    ds:GetVersionExA
mov     ecx, [ebp+var_4]
xor     eax, eax
cmp     [ebp+VersionInformation.dwPlatformId], 2
setz    al
xor     ecx, ebp
call    sub_447ABB
leave
retn
_IsPlatformNT endp

Твоя задача сделать так, чтобы функция всегда возвращала 1. Сделать это проще простого, достаточно в самом начале функции написать:
Код:
mov eax, 1
ret
сделать это можно с помощью того - же OllyDbg.
Смещение функции 00427435. Когда загрузишь OllyDbg. Нажми [Ctrl+G] и скопируй туда смещение, затем жми ок. Программа перейдет на самое начало функции. Далее сделаешь двойной щелчек левой кнопкой мыши на текущей строчке кода. Откроется окно Assembly. Введи в него по очередно mov eax, 1 , а затем ret. После того как увидишь, что код программы поменялся, щелкни правой кнопкой мыши и найди в меню пункт Copy to executable, а в под меню - All modifications. Откроется еще окно с предупреждением, после того, когда ты нажмешь там Copy All, появится окно с кодом программы, его нужно закрыть и согласиться с вопросом. Программа предложит сохранить измененный файл на диск.

Программа вызывает функцию GetVersionEx еще в ряде мест. Так что могут быть еще проверки. Если изменения этой функции не помогут, будем думать дальше в этом направлении.

И еще, то, что программа распаковывает (обычно в Windows\Temp), а затем запускает, тоже может проверять версию винды. Так, что проверку может понадобиться сносить и в распакованных программах. И это кстати объясняет, возможную причину того, почему у тебя не заработал прошлый способ, о котором я писал выше. Ведь если программы запускаются из другого каталога, они подгрузят ДЛЛ из Windows\system32, а не те, которые ты скопировал с XP машины.
« Последнее редактирование: 26-12-2008 07:46 от RuNTiME » Записан

Любимая игрушка - debugger ...
_serj_dev
Участник

ru
Offline Offline

« Ответ #17 : 26-12-2008 08:16 » 

RuNTiME, нету никакой Temp директории. Все работает с рабочей папки. Проверял Spyware детектором.
Проделал все действия. Не получилось.
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 26-12-2008 08:21 » 

_serj_dev,  ну незнаю как ты проверял... у меня к примеру после запуска программы в Windows\Temp появляется лог HPZchk000.log

Много весит полный дистрибутив?
Записан

Любимая игрушка - debugger ...
_serj_dev
Участник

ru
Offline Offline

« Ответ #19 : 26-12-2008 08:25 » 

Образ 432 мегабайта.
Записан
_serj_dev
Участник

ru
Offline Offline

« Ответ #20 : 26-12-2008 08:29 » 

Может она просто лог туда пишет.
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 26-12-2008 08:30 » 

_serj_dev, что за программа Spyware детектор.... если я в инете нашел то чем ты проверяешь, оно нисколько не вызывает доверия.

Скачай лучше программу ProcessMonitor Марка Руссиновича. Она умеет мониторить. Реестр и файлы одновременно.

http://technet.microsoft.com/ru-ru/sysinternals/bb896645.aspx

И я не очень был бы уверен, в том что 432 мегабайтный архив никуда не распаковывается.... У самого есть сканер HP.... знаю какие там инсталяторы Улыбаюсь

Если и в правду выяснится, что программа ничего не распаковывает. То снесем аналогичным способом все проверки, где вызываются GetVersionEx.
« Последнее редактирование: 26-12-2008 08:35 от RuNTiME » Записан

Любимая игрушка - debugger ...
sss
Специалист

ru
Offline Offline

« Ответ #22 : 26-12-2008 09:11 » 

RuNTiME, а ты уверен, что найденная тобой функция именно та - нужная проверка? Может оказаться, что это просто выбор версий файлов к установке?
Записан

while (8==8)
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 26-12-2008 09:25 » 

sss, конечно же я не уверен. Просто решил начать с самой очевидной.  Улыбаюсь
Записан

Любимая игрушка - debugger ...
sss
Специалист

ru
Offline Offline

« Ответ #24 : 26-12-2008 09:44 » 

Ну тогда дорога на перехват MessageBoxA или трэйсить.
Записан

while (8==8)
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 26-12-2008 09:48 » 

sss,  проблема в том, что полного дистриба у меня нет, а весит он 432мб... качать не буду. А прога без своих архивов просто завершает свою работу.  Улыбаюсь
Записан

Любимая игрушка - debugger ...
sss
Специалист

ru
Offline Offline

« Ответ #26 : 26-12-2008 10:05 » 

RuNTiME, так я и не тебе Ага. Описаний по оле на русском полно в сети...
Записан

while (8==8)
_serj_dev
Участник

ru
Offline Offline

« Ответ #27 : 27-12-2008 03:17 » 

У меня такой вопрос, когда я прогоняю HPZChk01.exe в olly, я могу как-нибудь сделать точку останова в месте где вход в функцию при нажатии на кнопку "Повторить". Понятно выразился? Короче когда я нажимаю кнопку "Повторить", происходит процедура проверки. Это чтобы вычислить участок в котором она все таки делает проверку. Хотя не факт, что она тупо не перейдет на начало всей программы...
Записан
_serj_dev
Участник

ru
Offline Offline

« Ответ #28 : 11-01-2009 02:37 » 

Да кстати. Раз уж я завел эту тему, то вот файл, тем кому все же может это понадобиться.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines