Можно ли запустить на DirectX 10?
Комментарии: 59
сначала
лучшие
Ваш комментарий
Crysis_Net_2
дальше смотри что написано
Additional Notes: Supported Video Cards at time of release: NVIDIA GeForce GTS 450 or better, GeForce 500, 600, 700, 900 series / AMD Radeon HD 5670 or better, Radeon HD 6000, 7000, R7, R9 series / Intel HD4600, HD5200
ни одной видеокарты, у которой DirectX 10 потолок.
ezumagumu
ну значит как я и говорил - при инициализации функции D3D11CreateDevice идёт перечисление аппаратного уровня поддержки
D3D_FEATURE_LEVEL featureLevels[]
{
D3D_FEATURE_LEVEL_9_1, // DirectX 9
D3D_FEATURE_LEVEL_9_2, // DirectX 9b
D3D_FEATURE_LEVEL_9_3, // DirectX 9c
D3D_FEATURE_LEVEL_10_0, // DirectX 10
D3D_FEATURE_LEVEL_10_1, // DirectX 10.1
D3D_FEATURE_LEVEL_11_0, // DirectX 11
D3D_FEATURE_LEVEL_11_1 // DirectX 11.1
};
nfstherun.1
да хоть васи пупкина, что от этого изменится?
кто-нибудь вообще вкуривает о чём я говорю? Или у всех всё завист от репаков, таблеток и прочего говна
Драйвер последний стоит, в системных требованиях написано что 10 тоже совместим
итак, открываем в дизассемблере IDA наш АСС.ехе (гораздо удобнее было бы использовать OllyDBG. но увы 64 битная версия отладчика до сих пор находится в стадии разработки), немного ждём (до конца не нужно, полная загрузка будет долгой) и переходим на вкладку Imports. Ищем там библиотеку, отвечающую за графику в целом (в нашем случае это d3d11.dll - эта библиотека инициализирует видеокарту), видим, что из неё импортируется одна функция - D3D11CreateDevice (расписывать её не буду, кому интересно читайте MSDN)
щёлкаем по ней мышкой и IDA автоматически перекидывает нас в секцию импорта
особенность IDA в том, что она умеет определять адрес, на который ссылается данная функция (т.е. адрес "шаг назад"). Щелкаем мышью по функции D3D11CreateDevice и попадаем уже в секцию кода
где у нас есть небольшая программа с безусловным переходом (ассемблерная команда jmp - сокращённо от JUMP). Т.е. процессор, выполняя последовательно код, дойдя до этого джампа перейдёт в секцию импорта и вызовет из библиотеки d3d11.dll функцию инициализации видеокарты D3D11CreateDevice одним из аргументов которой, является уровень аппаратной поддержки D3D_FEATURE_LEVEL, который принимает несколько значений, описанных мною выше.
щелкнув по переходу мы попадём в секцию кода
в которой определен вызов (ассемблерная команда call) той небольшой программы с jmp. Это и есть первая точка, с которой начинается вся эта эпопея с инициализацией видеокарты.
вот теперь есть 2 варианта дальнейшего развития событий:
- внедрять свой код прямо в экзешник (менять библиотеку на d3d10.dll и функцию на D3D10CreateDevice), но не факт, что игра заработает (возможно есть функции, зависящие от d3d11.dll, которых физически нет в d3d10.dll, нужно глубже анализировать), или же искать D3D_FEATURE_LEVEL (чтобы изменить D3D_FEATURE_LEVEL_11_0 на D3D_FEATURE_LEVEL_10_0), но это как иголку в стоге сена, т.к. имя аргументов не читается, и оно всего лишь одно из миллионов значений;
- либо второй, писать хук для D3D11CreateDevice с "правильным" параметром D3D_FEATURE_LEVEL и инжектить в загруженный в память код в ту небольшую программу с jmp с одной лишь разницой - этот джамп будет переходить в секцию импорта не на d3d11.dll, а на нашу загруженную в процесс игры библиотеку.
в общем я тут немного в крекинг влез уже)) обычно такое внедрение в таблицу импорта (IAT) делают крякеры, например реализация кряка этой игры от codex:
они вшили в IAT библиотеки binkw64.dll некую секцию кода .NewIT
посмотрев её в hex-редакторе можно увидеть, что это просто вызов их собственной библиотеки codex.dll
в которой есть три функции (я их подробно не анализировал, но там просто эмулятор uplay_r1_loader64.dll)
т.е. экзешник при вызове binkw64.dll по таблице импорта этой библиотеки переходит к библиотеки codex.dll, которая в свою очередь заставляет думать игру что запущен оригинальный загрузчик uplay.
иначе говоря, они сделали первый вариант (внедрили свой код прямо в исполняемый файл).
Dimchik94
попробую ещё что-нить придумать. Я особо решение не ищу (времени нет), это просто как бы озарение было :) увидел кое-что, сопоставил несколько фактов и сразу же мысль появилась как это использовать.
проблем доставляет ещё эта 64 битность, большинство программ не работает с 64 битным PE, поэтому приходится попутно ещё и тулзы всякие писать самому, а это тоже время.
Dimchik94
ну да, я об этом уже думал. Скорее всего дело в инфраструктуре DXGI.
к примеру функция CreateDXGIFactory, необходима для инициализации видеокарты. В игре используется CreateDXGIFactory1 (есть ещё CreateDXGIFactory2). Естественно они не совместимы, о чём MSDN мило нам сообщает
"This entry point is not supported by DXGI 1.0
Do not mix the use of DXGI 1.0 (IDXGIFactory) and DXGI 1.1 (IDXGIFactory1) in an application."
именно это (смешивание версий) и происходит когда я меняю featurelevel с 11 на 10.
теоретически всё ещё запустить игру на dx10 можно, просто "малой кровью" не обойтись и помимо редактирования параметра D3D_FEATURE_LEVEL нужно перенаправлять вызовы всех используемых интерфейсов, структур, переменных DXGI с версии 1.1 на 1.0 (заменой вызова функций).
Dimchik94
да.
andryhatuna
"Нельзя полностью отключить какой-то эффект, который мешает запуску?"
править скомпилированный файл само по себе не правильно. Что-то отключать или включать можно только на этапе разработки в исходном коде (а в данном случае мы работаем не конкретным языком программирования, а с потоком байт, который расшифровать может только процессор, переведя его в мнемокод). Необходимо соблюдать море условий, например размерность функции - был вызов call размером в 6 байт, мы переделали его в переход jmp размером 5 байт. Если не поставить "нулевой" байт (NOP, или 0х90), то всё разрушится, указатели на смещения будут перекидывать совершенно в другую функцию и процессор просто не сможет последовательно выполнять код, в результате чего игра выдаст appcrash. Иначе говоря, в скомпилированном файле нельзя просто так выкинуть чего-то, нужно обязательно чем-то заменять.
не знаю чего там в требованиях, но импорт только d3d11.dll с функцией D3D11CreateDevice
правда там может стоять уровень аппаратной поддержки D3D_FEATURE_LEVEL_10_0 (ещё не проверял) тогда должна запуститься
salinan
для кого написано выше
"импорт только d3d11.dll с функцией D3D11CreateDevice"
сделать что? Как это узнать что ли. Ну так любой менеджер по работе с импортом/экспортом/ресурсами PE файлов в помощь - PEiD, StudPE, LordPE, OllyDBG в конце концов IDA.
щас выложу несколько скринов из IDA и на пальцах постараюсь объяснить что нужно сделать для запуска игры на dx10 видеокартах.
Dimchik94
ну во-первых, к тому, что мне этим заниматься лень)) если кто-то что-то понял вперёд дерзайте, будут вопросы помогу. Если будет время свободное, попробую. Внедрением кода в исполняемый файл (крэкингом) я никогда не занимался, так что тема для меня новая и потребуется время чтобы всё собрать воедино (теорию я понимаю как и что должно быть, а с практикой надо опять лезть в WinAPI в недокументированные функции).
а во-вторых, человек попросил объяснить что и как нужно сделать для запуска на dx10, я и объяснил.
кстати, обратите внимание на 4 скрин на эти строки
mov [rsp+68h+var_18], 0B000h
mov [rsp+68h+var_14], 0A100h
mov [rsp+68h+var_10], 0A000h
тут ничего особого нет - операнд mov (передвинуть, от английского MOVE), перемещает значения, стоящие после запятой в 64 битные регистры. Я сразу не обратил внимание (время то уже позднее было), но 0A000h, 0A100h и 0B000h - ёмаё, это же значения самих D3D_FEATURE_LEVEL (0A000h и 0xA000 это одна и та же запись одного значения - первая с префиксом h используется в ассемблере (на чём и дизит IDA), а вторая с аббревиатурой 0х используется в сишных языках)
typedef enum D3D_FEATURE_LEVEL
{
D3D_FEATURE_LEVEL_9_1 = 0x9100,
D3D_FEATURE_LEVEL_9_2 = 0x9200,
D3D_FEATURE_LEVEL_9_3 = 0x9300,
D3D_FEATURE_LEVEL_10_0 = 0xA000,
D3D_FEATURE_LEVEL_10_1 = 0xA100,
D3D_FEATURE_LEVEL_11_0 = 0xB000,
D3D_FEATURE_LEVEL_11_1 = 0xB100,
D3D_FEATURE_LEVEL_11_2 = 0xB200,
D3D_FEATURE_LEVEL_12_0 = 0xC000
} D3D_FEATURE_LEVEL;
это уже интересно. Т.е. функция D3D11CreateDevice и данное перечисление выглядят следующим образом
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_11_0
};
D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, ARRAYSIZE(featureLevels), 1, D3D11_SDK_VERSION, &device, nullptr, &context);
короче, что-то не даёт воспользоваться значениями 0xA000 и 0xA100 и как-будто залочено на 0xB000.
tesla707
mov [rsp+68h+var_18], 0B000h
mov [rsp+68h+var_14], 0A100h
mov [rsp+68h+var_10], 0A000h
это уже интересно. Т.е. функция D3D11CreateDevice и данное перечисление выглядят следующим образом
D3D_FEATURE_LEVEL featureLevels[] =
{D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_11_0};
короче, что-то не даёт воспользоваться значениями 0xA000 и 0xA100 и как-будто залочено на 0xB000.
В результате ты что поменял? Просто 0B000h убрал?
tesla707
не заработает как я понял
mazinily
Увы, но я больше не занимаюсь программированием. Это было хобби (на протяжении нескольких лет, вроде начал заниматься во времена assassins creed 2 с её DRM))) ), теперь нет времени на это. Жизнь идёт, появляются новые ценности, новая работа, поэтому чем-то приходится жертвовать, от чего-то отказываться. Я уже больше чем полгода как не пишу программ и не анализирую код.
tesla707
чувак, тут похоже кроме тебя ничего не понимает так что надежда на тебя(
tesla707
чувак. есть прогресс. теперь если запускать без dxcpl то выдает ошибку драйвера, но если запустить с ним то игра запускается , есть звук можно лазит по меню, и это все без лагов, т.е фпс не 1,2 как до твоего фикса., но черный экран. получается игра работает нормально без лагов но с черным экраном. может как то получится у тебе убрать этот черный экран и играть через dxcpl ? может он тебе поможет? может эта прога будет работать как эмулятор dx11 ?
p.s. думаю ты понял о чем я. в общем прогресс есть и довольно таки большой.
кстати повышать аппаратный уровень поддержки даёт, т.е. можно сделать only dx11.1 (на видеокартах, которые не поддерживают dx11.1, а поддерживают максимум dx11 игра не запуститься). А вот понижать что-то не даёт - сразу крашит программу и всё.
Извините что вмешуюсь в разговор , но все-таки, когда вы уже выпустите этот патч для запуска assassins creed rogue на dx10???
andryhatuna
проблема в том, что я не пойму почему вылетает драйвер?
если предположить, что при изменении байтов соответственно меняется хеш, тем самым нарушается целостность потока. Но ведь я точно также меняю с dx11 на dx11.1 и игра прекрасно запускается (экзешник с only dx11.1 http://rghost.ru/8zhZ2WRVH ). Пока что я не знаю как это исправить.
Нельзя полностью отключить какой-то эффект, который мешает запуску???? Я могу и без освещения поиграть!!!!
andryhatuna
Что в far cry 4, что в watch dogs - экзешник (farcry4.exe) служит лишь лаунчером для запуска функций из библиотеки FC64.dll. Именно в ней и находится импорт из d3d11.dll с функцией D3D11CreateDevice. Но кроме этого, FC64.dll зашифрована, и подбирать ключ это пустая трата времени.
ребят, если есть возможность протестируйте Middle-earth: Shadow of Mordor
http://forums.playground.ru/middle_earth_shadow_of_mordor/tech/zapusk_na_directx_10-856389/
принцип хака аналогичен тому, что я здесь расписал. Во всяком случае, после модификации экзешника игра у меня запустилась на dx11 видеокарте.
xXxMoRpHiUsxXx
ну в принципе согласен, но не совсем. dx то написан 10, но посмотри на спи сок поддерживаемых видеокарт. там везде поддержка 11. так что никто и не врал.
tesla707
only DirectX11
Нет, системки из Steam:
OS: Windows 7 SP1 or Windows 8/8.1 (64bit versions only)
Processor: Intel Core2Quad Q6600 @ 2.4 GHz or AMD Athlon II X4 620 @ 2.6 GHzH
Memory: 2 GB RAM
Graphics: nVidia GeForce GTS450 or AMD Radeon HD5670 (1024MB VRAM) or Intel HD4600
DirectX: Version 10
Hard Drive: 12 GB available space
Sound Card: DirectX Compatible Sound Card with latest driver
ezumagumu
Чей репак?
Я ни как не вкурю!!! у меня BF бегал норм! на директе 10! здесь вроде как тот же двиган! но не прет!
где то читал что видяхи энвидео до 400ой серии не поддерживают 11DX. и поэтому асасин вылетает при запуске игры. у меня у самого GTX260 и вылетает при запуске игры. качал кучу репаков. и всегда оодна и таже ошибка. до лицухи ещё не добрался
а можешь расписать как это сделать? я просто дуб дубом в этом деле
вот спасибо тебе большущее. многим это пригодиться
tesla707
ЭЭЭМ. и к чему мы приходим?
пробуем
DirectX 10 http://rghost.ru/7pm6BW7kB
DirectX 10.1 http://rghost.ru/7sQf9Xfnq
игра должна подать признаки запуска и вывалиться с ошибкой драйвера. Чуть позже попробую ещё один хак.
tesla707
проверил. все равно вылетает точно так же "прекращена работа программы"
Ничего не ставил...
DirectX обновлен до последней версии + все остальные драйвера...
AMD Catalyst:
tesla707
а нет. ты прав. выбивает ошибку видеодрайвера теперь.
tesla707
и самое смешное то что фпс в игре показывает от 30 и выше :D даже побегать по звукам получилось.
tesla707
ну чувак будем надеяться что получится у тебя все) прост сейчас денег лишних нет совсем, еле концы с концами свожу, поэтому и не могу приобрести видеокарту нормальную, а после выхода юнити у меня вся надежда была на роуг, а тут такое(
tesla707
скорее всего просто освещение сделали на dx11. вот и все. запустить его на dx меньшей версии просто не возможно. значит нужно просто забить на него.
tesla707
или если не освещение то какие то другие эффекты.
tesla707
и это все в exe файле?
Ну блин!!!! Почему нельзя???? И вобще , почему все игры начали выходить под directx 11??? Денег на покупку новой видеокарты сейчас нет, и не будет ближайшее время...... Может как то попытаешься ????
А можешь попытаться переделать файл farcry4.exe из far cry 4 под dx10? Может здесь получиться ....
Игра у тебя установлена? Или мне заливать файл в инет????
andryhatuna
а какая разница? что в fс4 что в роуг dx11. никак не получится. забей.
xXxMoRpHiUsxXx
не факт что косяк. может просто такой ход от юби, дабы видяхи раскупали.
Dimchik94
Ну погоди. Пункт про 10-й директ стоит? Стоит. Тогда вопрос, какие карты поддерживающие данный директ, запустят игру? Ведь самая слабая из рекомендованных - поддерживает уже 11-й? Очень щекотливый вопрос для юбиков. Я бы с удовольствием купил и начал с ними общаться по этому поводу. Но я уже отдал почти 2 рубля за юнити (которую кстати так и не поиграл, ибо видяха сгорела) и не хочу отдавать столько же за "игру предыдущего поколения).
А ещё тот факт, что игра, по-умолчанию поддерживающая только 11-й директ (при этом официально заявлена поддерживающей 10-й), не выдаёт сообщение о том, что установленная видеокарта не отвечает системным требованиям, а тупо не запускается - это уже вообще криминал. Ибо вымогательство и экономическое преступление.
xXxMoRpHiUsxXx
все видеокарты в списке поддерживают 11.
xXxMoRpHiUsxXx
и в стиме ошибочные системки. как сейчас не знаю нораньше были ошибочные где и был казан 10. на оф сайте у юбов указан 11.
Dimchik94
оу...ну тогда какие могут быть претензии.
И всё же почему Роуг не выдаёт сообщение о некорректной версии директа, как это делает юнити...?
xXxMoRpHiUsxXx
в юнити пихнули это оповещение а в роуг нет.
Ну чё на Direct X 10 поиграть не удастся?
Ну так что, придумал кто чего-нибудь?
Ясно. Короче, нужно покупать новую видюху с поддержкой directx 11 . Без неё ни как . И за подсказки - спасибо!!!
Мне вот очень интересно стало - неужели никто не обратился к юбикам и не наорал на них за то, что они накосячили? Ведь они ж могут и патч выпустить, который сей косяк исправляет.
Dimchik94
Хорошо, тогда официально это незаконно, ибо в требованиях стоит 10-й директ. Хотя там же нет ни одной видяхи, которая сей директ поддерживает. Так же игра позиционирует себя, как ориентированная на предыдущее поколение. А стоит, падла, как юнити. Купившие игру имеют полное право засудить их за это.
Ребят как думаете у меня пойдет ассасин крид изгой?
Nik Jefferson
должна пойти, у меня было 4 гб оперативы и видеокарта на 1 гиг и проц интел атхлон и прошел игру на средних в фпс 30-40 (сам удивился, хотя 4 часть идет гораздо хуже) НО нужна 64 битная винда
Dimchik94
и чё толку он его обновит? Игра - only DirectX11
nfstherun.1
драйвер обнови.
Кто нибудь запустил на Directx 10? у меня например выдает ошибку с модулем nvwgf2umx.dll