kosmodrom1986, я согласен с
hypermozg-ом, что без теоретической подготовки ничего не получится, поэтому в добавок к
Искусству дизассемблирования взял еще
The IDA Pro Book, 2nd Edition, чтобы понимать чем хороша IDA и что она позволяет.
Как видно из
спойлера, теория достаточно проста и все основывается на 3х китах:
1. Взять отладчик, который позволяет ставить точки останова и дампить состояние процесса.
2. Найти OEP (original entry point) и поставить на нее точку останова.
3. Запустить программу и сдампить распакованные данные.
На практике поиск OEP - это искусство, которому или нужно учиться или знать, с чем имеешь дело.
На самом деле под Windows у steam есть не только steam stub, но и CEG (Custom Executable Generation):
https://www.steampowered.com/steamworks/publishingservices.php - описание о возможностях steam (заплатите и вашу игру зашифруют по полной)..
http://cs.rin.ru/forum/viewtopic.php?f=20&t=61395 - 2012 год про CEG,
http://cs.rin.ru/forum/viewtopic.php?f=10&t=65033 - 2014 год, утилиты по работе с CEG
Про Steam stub вообще ребята уже выкладывают на github исходники:
https://github.com/atom0s/Steamless - Steamless is a DRM remover of the SteamStub variants
https://github.com/atom0s/Steamless.NET - Steamless is a DRM remover of the SteamStub variants. This version of Steamless is written in .NET (C#).
Можно еще их посмотреть и портировать.
hypermozg, мне кажется, что лучше не заморачиваться на x64 и сложные схемы с Virtualbox и удаленной отладкой. Я как-то настроил с бубном отладку linux бинарника через windows-версию IDA. Там отладка у меня получилась "в потемках" (я не понимал, где нахожусь еще в файле или ушел в вызов какой-то стандартной библиотеки и как оттуда вернуться..). Или что-то совсем мне не понравилось, что я бросил это дело, даже когда она заработала.
Начать нужно с чего-нибудь по проще:
1. Взять простой x86 бинарник (не "Hello world", а типа "калькулятор" или "блокнот").
2. Запаковать чем-нибудь (может быть пойдет даже upx, но лучше что-нибудь серьезнее)
3. Научиться распаковывать его с помощью IDA или gdb.
Если будет понимание как делать дамп запущенной программы в IDA или gdb, чтобы после этого она являлась валидным работающим бинарником - это уже будет пол дела. Останется на сложном бинарнике найти OEP и повторить алгоритм снятия дампа.
Я не уверен, что в IDA умеет снимать дамп с запущенной программы без плагина и есть ли рабочий плагин для этого под Linux. Как снять дамп в gdb - тоже для меня вопрос.
Вот таким скриптом я делал дамп:
Код:
#!/bin/bash
grep libctest.so /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done
В принципе работает, но на выходе получаю несколько отдельных блоков с секциями из .elf файла. Про его структуру я, конечно, читал, но собирать руками из кусков побаиваюсь. Думаю, что лучше найти и научиться работать с IDA.