Статья [Reverse-Engineering] Патч DRM Steam

  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 240
Шалом. Давно я хотел разобрать разные DRM от компаний, но никак руки не доходили. На выходных решил посмотреть как обстоят дела у DRM стима, больно часто его ломают.
Ну и как показала практика, для того чтобы отвязать к примеру singleplayer игру достаточно поставить два патча на экспортируемых функциях steam_api64.dll

Это довольно примитивный патч который рассчитан на то, что игра будет только singleplayer, иначе откуда ей хукать ник аккаунта в стиме? Краш игры будет обеспечен к примеру, когда вы попытаетесь таким образом отвязать одну из игр Valve с двумя патчами
По своей сути этот патч вполне работоспособный, если нет подводных камней по типу внутриигровых проверок в самом EXE

Первый патч заключается в том, чтобы занопать проверку на некую переменную с типом __int64, если условие проходит -> оно возвращает 1, что в нашем случае означает, что первая проверка на запуск стима прошла успешно

1622981617957.png


С информацией выше переходим к дебаггеру и экспортируемой функции и видим следующую проверку

1622981391340.png


Инструкция mov al, 0x1 говорит нам о том, что если условие выполнется, то мы получим функцию, которая будет возвращать 1
В дальнейшем напишем скрипт, который будет выполнять нужные патчи этих проверок

Идем дальше, следующий патч будем делать в функции SteamAPI_RestartAppIfNecessary, это своего рода функция которая нужна для страховки на случай, если SteamAPI_Init провалился с треском и пользователь пытается запустить его напрямую

1622981950762.png


Его суть это проверять запущен ли EXE в стиме, если нет -> возвращает true и перезапускает игру черех steam://run/id, нам же нужно чтобы эта функция возвращала false
Теперь собрав все паттерны с проверками напишем скрипт, который будет выполнять два патча

Сам скрипт:
C++:
find mem.base(cip), "74 0B B0 01"
cmp $result, 0
je first_pattern_not_found

mov $result, #90 90#
log "patched SteamAPI_Init"

find mem.base(cip), "0F 84 D3 05 00 00"
cmp $result, 0
je second_pattern_not_found

mov $result, #E9 D4 05 00 00#
log "patched SteamAPI_RestartAppIfNecessary"
ret

first_pattern_not_found:
log "first pattern not found"
ret

second_pattern_not_found:
log "second pattern not found"
ret

По итогу вы должны получить патчи как на моих двух скринах:

Первый патч:
1622982116680.png


Второй патч:
1622982149511.png


На этом у меня всё, такой вот забавный и простой обход получился этой DRM =)
Подписывайтесь на мой блог в ТГ: Colby5Covington / Back-Engineering

Всем добра и позитива
 
  • gunship
  • Куратор раздела «Создание скриптов для читов»
  • 129
  • 1
  • 33
Круто, но я так и не понял, для чего это может понадобиться?
 
  • 112
  • 92
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Круто, но я так и не понял, для чего это может понадобиться?
Для отвязки игры от стима
чтобы отвязать к примеру singleplayer игру достаточно поставить два патча на экспортируемых функциях steam_api64.dll
 
Сверху Снизу