Исследуем игру с аркадного автомата ч. 1

    Уф, вот меня и разбанили на хабре, и у меня есть для вас отличная статья, так что всем привет!



    Введение


    Никогда не задумывались, что стоит в аркадных автоматах? Какие ОС, какие технологии используются для разработки игр? Как их защищают от копирования и модифицирования? Если да, то добро пожаловать в этот топик.

    Внутренности


    Итак, что же внутри нашего автомата?

    1. Обычный x86 компьютер с платой PIUIO и JAMMA
    2. Усилитель, кроссовер и эквалайзер
      image
    3. Панель со светодиодами
      image
    4. Панель управления с кнопками «TEST», «SERVICE» и крутилками эквалайзера
      image
    5. LCD или CRT экран

    Нас же, конечно, в первую очередь интересует компьютер.

    Есть несколько ревизий внутренностей последней версии компьютера:
    Материнская плата: Gigabyte GA-945GCM-S2L / Asrock G41M-S3
    Графический адаптер: Geforce 8400GS / Geforce 9300GS
    Память: DDR2 / DDR3 512 MB
    Процессор: Intel Celeron

    Сама игра находится на винчестере. В комплекте USB-донгл SafeNet MicroDog.
    image

    Исследование


    С чего же начать? Естественно, со снятия дампа винчестера. Это делается в линуксе одной командой:
    dd if=/dev/sdX of=./dump.bin bs=1M
    И идем пить чай, т.к. это займет минут 10-15. Винчестеры используются на 160 и 250 гигабайт.
    Никогда ничего не делайте на работающем винчестере! Всегда нужно использовать образ!

    Образ снят. Давайте запустим cfdisk на него.
    image

    Что же мы видим? Два раздела с файловой системой ext2, и подозрительно много неразмеченной области в начале диска. Файловая система сразу может навести на мысль, что внутри стоит что-то UNIX-подобное, с большой вероятностью это, конечно, Linux.

    Давайте же запустим его в виртуалке. Я люблю qemu, поэтому использую его.


    И больше ничего. Дальше либо qemu завершается с ошибкой вроде:
    qemu: fatal: Trying to execute code outside RAM or ROM at 0xa5ff00d8
    либо просто зависает. Честно говоря, я знал, что у этой игры привязка к винчестеру, и стало очевидно, что алгоритм достаточно простой и не использует проверку целостности данных, а сразу передает управление расшифрованным данным, а в случае с виртуалкой, просто мусору.
    Далее я, скорее больше ради интереса, а не в ожидании каких-то открытий, решил посмотреть, что же лежит на тех двух разделах с файловой системой ext2. А вот что:

    Раздел 1
    ├── [4.0K]  game
    │   └── [ 25G]  _00000.BIN
    ├── [4.3M]  i
    ├── [ 16K]  lost+found
    ├── [   0]  n
    ├── [8.5M]  p
    ├── [7.8M]  u
    └── [ 22M]  x
    
    game/_00000.BIN: data
    i:               data
    n:               empty 
    p:               data
    u:               data
    x:               ELF 32-bit LSB  shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
    
    Раздел 2:
    ├── [ 16K]  lost+found
    └── [144K]  PIUFESTAEX.INI
    


    Ну вот, все данные на разделе 1, кроме файла «x», являются обычными данными, либо же шифрованы. Один только «x» как-то выделяется из этой массы — это shared библиотека, которая, вероятно, подгружается игрой (на самом же деле — нет).

    Что же дальше? Ну, полезли в сам винчестер.
    00000000  fa 33 c0 8e d0 bc 00 7c  8b f4 50 07 50 1f fb fc  |.3.....|..P.P...|
    00000010  bf 00 06 b9 00 01 f3 a5  ea 1d 06 00 00 b6 00 b9  |................|
    00000020  02 00 bf 05 00 bb 00 07  b8 01 02 57 cd 13 5f 73  |...........W.._s|
    00000030  0c 33 c0 cd 13 4f 75 ed  be 8a 06 eb 3b b9 03 00  |.3...Ou.....;...|
    00000040  bf 05 00 bb 00 20 53 07  bb 00 00 b8 20 02 57 cd  |..... S..... .W.|
    00000050  13 5f 73 0c 33 c0 cd 13  4f 75 e8 be 8a 06 eb 18  |._s.3...Ou......|
    00000060  b9 ff 3f be 00 08 33 ff  ad 83 e6 bf 26 33 05 ab  |..?...3.....&3..|
    00000070  49 75 f5 ea 00 00 00 20  ac 3c 00 74 0b 56 bb 07  |Iu..... .<.t.V..|
    00000080  00 b4 0e cd 10 5e eb f0  eb fe 44 69 73 6b 20 49  |.....^....Disk I|
    00000090  2f 4f 20 45 72 72 6f 72  00 00 00 00 00 00 00 00  |/O Error........|
    000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000180  28 43 29 32 30 30 34 20  41 4e 44 41 4d 49 52 4f  |(C)2004 XXXXXXXX|
    00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001b0  00 00 00 00 00 00 00 00  9b f6 31 c9 00 00 00 00  |..........1.....|
    000001c0  41 8f 83 fe ff ff cf ce  61 00 b1 a1 a9 03 00 fe  |A.......a.......|
    000001d0  ff ff 83 fe ff ff 6f 56  36 04 80 60 1f 00 00 00  |......oV6..`....|
    000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000200  50 75 6d 70 20 49 74 20  55 70 3a 20 46 69 65 73  |Xxxx Xx Xx: Xxxx|
    00000210  74 61 45 78 00 00 00 00  00 00 00 00 00 00 00 00  |xxXx............|
    00000220  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000300  20 20 20 20 20 20 20 20  20 20 20 20 36 56 4d 51  |            6VMQ|
    00000310  57 54 34 37 43 43 34 36  20 20 20 20 53 54 33 31  |WT47CC46    ST31|
    00000320  36 30 33 31 38 41 53 20  20 20 20 20 20 20 20 20  |60318AS         |
    00000330  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
    00000340  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000400  0e a8 36 bd 22 ac ea 0e  a9 36 bb 22 82 66 80 70  |..6."....6.".f.p|
    00000410  dc 7a 36 37 c8 5d 18 36  ae fa 83 3a 74 d8 35 29  |.z67.].6...:t.5)|
    00000420  11 b9 2d 25 1f c8 7d 10  07 c8 7d 21 81 34 07 ae  |..-%..}...}!.4..|
    ...

    (Вместо «X» были название производителя и название игры. Я их убрал, чтобы этот топик не гуглился по этим данным. Если хотите, узнать, что же там было, HEX-данные я не менял.)

    Что это? Объясняю.
    По адресу 0-1BE располагается MBR-загрузчик, самый наипростейший, который грузит с первого нашедшего диска stage2-загрузчик, который начинается с адреса 400. Интереснейшая строчка расположена на 300-32F, очень похоже на серийный номер винчестера, версию прошивки и модель. Да что тут гадать, так и есть ;)
    Описание Данные
    Серийный номер (20 байт) (12 пробелов)6VMQWT47
    Версия прошивки (8 байт) CC46(4 пробела)
    Название модели (40 байт) ST3160318AS(29 пробелов)
    Я пошел по легкому пути: не стал разбирать алгоритм работы stage2-загрузчика, а просто чуть-чуть дописал кода в qemu, чтобы он брал данные винчестера из переменных окружения DRIVE_MODEL, DRIVE_SERIAL и DRIVE_VERSION. Также, qemu позволяет дампить память гостевой машины, что нам будет полезно.

    valdikss@valaptop:~/ % DRIVE_SERIAL="            6VMQWT47" DRIVE_VERSION="CC46    " DRIVE_MODEL="ST3160318AS" qemu-system-i386 disk.img -monitor stdio
    QEMU 1.4.1 monitor - type 'help' for more information
    (qemu) dump-guest-memory mem.bin
    (qemu) quit

    Определить правильность расшифровки данных можно было чисто визуально: если ядро успешно распаковалось и запустилось, то на момент появится курсор на экране, если же и файловая система распаковалось правильно, то моргнет экран виртуальной машины, это будут пытаться запуститься иксы.
    Как линуксоид, я сразу попытался переключиться на другую консоль с помощью комбинаций Alt+FN, и мне это удалось: на второй консоли был вывод иксов.
    Образ в qemu успешно запустили, уже хорошо, что же дальше? Нам же нужно как-то получить файловую систему. Наверняка, вместе с ядром грузится initrd или initramfs, в которой либо и лежат все необходимые файлы, либо который расшифровывает и подключает rootfs. Что же делать? Вернемся к нашему дампу памяти и пройдемся по нему замечательной утилитой BinWalk:
    DECIMAL         HEX             DESCRIPTION
    -------------------------------------------------------------------------------------------------------------------
    0               0x0             ELF 32-bit LSB core file Intel 80386, version 1 (SYSV)
    141888          0x22A40         Copyright string: " 1999-2003 XXXXXXXXxxx"
    1649782         0x192C76        CramFS filesystem, little endian size 279239 CRC 0x42c70000, edition 20, 141723904 blocks, 1589959 files  
    3848752         0x3ABA30        CramFS filesystem, little endian size 4947968 version #2 sorted_dirs CRC 0x9c99ddde, edition 0, 2433 blocks, 235 files  
    17648271        0x10D4A8F       mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit
    17752783        0x10EE2CF       mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit
    17773455        0x10F338F       mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit
    17966760        0x11226A8       Copyright string: " (C) 1996-2009 the UPX Team. All Rights Reserved. $l Rights Reserved. $"
    18179243        0x11564AB       Copyright string: " (C) 2009 Free Software Foundation, Inc.ion, Inc."
    18236316        0x116439C       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
    18261064        0x116A448       LZMA compressed data, properties: 0xBD, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes
    18261104        0x116A470       LZMA compressed data, properties: 0xB8, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes
    21033884        0x140F39C       ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV)
    21061669        0x1416025       ELF 32-bit LSB no file type, no machine, (GNU/Linux)
    21088103        0x141C767       ELF
    21152544        0x142C320       LZMA compressed data, properties: 0x6C, dictionary size: 16777216 bytes, uncompressed size: 838860800 bytes
    21435292        0x147139C       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
    21525404        0x148739C       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
    21537692        0x148A39C       ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV)
    21554076        0x148E39C       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
    21615281        0x149D2B1       Copyright string: " (C) 2006 Free Software Foundation, Inc.ion, Inc."
    21672860        0x14AB39C       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
    21926836        0x14E93B4       ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV)
    110031566       0x68EF2CE       gzip compressed data, was "cursor.pcf", from Unix, last modified: Fri Feb 13 07:15:31 2004
    116417852       0x6F0653C       CramFS filesystem, little endian size 4947968 version #2 CRC 0x86f06160, edition 16777216, 18 blocks, 0 files  
    121710143       0x741263F       LZMA compressed data, properties: 0x87, dictionary size: 1048576 bytes, uncompressed size: 256 bytes
    121721756       0x741539C       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
    122005647       0x745A88F       LZMA compressed data, properties: 0x87, dictionary size: 1048576 bytes, uncompressed size: 256 bytes
    122594740       0x74EA5B4       LZMA compressed data, properties: 0x7E, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes
    122614684       0x74EF39C       CramFS filesystem, little endian size 4947968 version #2 sorted_dirs CRC 0x9c99ddde, edition 0, 2433 blocks, 235 files  
    129803164       0x7BCA39C       CramFS filesystem, little endian size 4947968 version #2 sorted_dirs CRC 0x9c99ddde, edition 0, 2433 blocks, 235 files

    Ох, как же много всего!
    На самом деле, все срабатывания LZMA ложные, т.к. у него нет magic number, половина ELFов тоже фейковые. А вот CramFS с 235 файлами очень похож на реальный, и, с большой вероятностью, он используется в качестве initrd.
    Вытащить из памяти правильный CramFS не составляет труда. После того, как CramFS лежит у вас на винчестере в виде файла, попытаемся его распаковать. Я использовал cramfs-2.0 из пакета firmware-mod-kit.
    valdikss@valaptop:~/ % cramfsck -x root cram1.bin
    cramfsck: crc error

    Ну а что вы ожидали? Думали, все так просто будет?
    Если пропатчим проверку контрольной суммы в cramfsck, мы сможем «успешно» распаковать файловую систему:
    Дерево файловой системы
    ├── [4.0K]  bin
    │   ├── [   7]  ash -> busybox
    │   ├── [130K]  busybox
    │   ├── [   7]  cat -> busybox
    │   ├── [   7]  chmod -> busybox
    │   ├── [   7]  cp -> busybox
    │   ├── [   7]  df -> busybox
    │   ├── [   7]  dnsdomainname -> busybox
    │   ├── [   7]  echo -> busybox
    │   ├── [   7]  false -> busybox
    │   ├── [   7]  hostname -> busybox
    │   ├── [   7]  kill -> busybox
    │   ├── [   7]  ln -> busybox
    │   ├── [   7]  ls -> busybox
    │   ├── [   7]  mkdir -> busybox
    │   ├── [   7]  mknod -> busybox
    │   ├── [   7]  mount -> busybox
    │   ├── [   7]  mv -> busybox
    │   ├── [   7]  netstat -> busybox
    │   ├── [   7]  ping -> busybox
    │   ├── [   7]  ps -> busybox
    │   ├── [   7]  pwd -> busybox
    │   ├── [   7]  rm -> busybox
    │   ├── [   7]  sh -> busybox
    │   ├── [   7]  sleep -> busybox
    │   ├── [   7]  sync -> busybox
    │   ├── [   7]  true -> busybox
    │   ├── [   7]  umount -> busybox
    │   ├── [   7]  uname -> busybox
    │   └── [   7]  vi -> busybox
    ├── [4.0K]  dev
    │   ├── [   0]  console
    │   ├── [   0]  null
    │   ├── [   0]  tty1
    │   └── [   0]  tty2
    ├── [4.0K]  etc
    │   ├── [4.0K]  init.d
    │   │   ├── [  90]  mnttab
    │   │   ├── [ 754]  once
    │   │   ├── [ 412]  rcS
    │   │   └── [ 244]  run
    │   ├── [ 151]  inittab
    │   └── [4.0K]  X11
    │       └── [  23]  xorg.conf -> /usr/lib/xorg/xorg.conf
    ├── [4.0K]  lib
    │   ├── [111K]  ld-2.10.1.so
    │   ├── [  12]  ld-linux.so.2 -> ld-2.10.1.so
    ...
    │   ├── [ 78K]  libz.so.1.2.3
    │   └── [4.0K]  modules
    │       └── [ 25K]  atkbd.ko
    ├── [4.0K]  mnt
    │   ├── [4.0K]  0
    │   │   └── [   0]  invalid
    │   ├── [4.0K]  1
    │   │   └── [   0]  invalid
    │   └── [4.0K]  hd
    ├── [1.1M]  piu
    ├── [4.0K]  proc
    ├── [4.0K]  sbin
    │   ├── [  14]  halt -> ../bin/busybox
    │   ├── [  14]  ifconfig -> ../bin/busybox
    │   ├── [  14]  init -> ../bin/busybox
    │   ├── [  14]  insmod -> ../bin/busybox
    │   ├── [  14]  lsmod -> ../bin/busybox
    │   ├── [  14]  mdev -> ../bin/busybox
    │   ├── [  14]  poweroff -> ../bin/busybox
    │   ├── [  14]  reboot -> ../bin/busybox
    │   └── [  14]  route -> ../bin/busybox
    ├── [4.0K]  SETTINGS
    ├── [4.0K]  sys
    ├── [   4]  tmp -> /var
    ├── [4.0K]  usr
    │   ├── [4.0K]  bin
    │   │   ├── [ 18K]  amixer
    │   │   ├── [  17]  du -> ../../bin/busybox
    │   │   ├── [  17]  env -> ../../bin/busybox
    │   │   ├── [  17]  free -> ../../bin/busybox
    │   │   ├── [  17]  less -> ../../bin/busybox
    │   │   ├── [4.4K]  mountrd
    │   │   ├── [4.6K]  mount_tab
    │   │   ├── [  17]  telnet -> ../../bin/busybox
    │   │   ├── [ 25K]  usbdaemon
    │   │   ├── [   4]  X -> Xorg
    │   │   ├── [ 14K]  xinit
    │   │   └── [1.7M]  Xorg
    │   ├── [4.0K]  lib
    │   ├── [4.0K]  sbin
    │   │   └── [  17]  setlogcons -> ../../bin/busybox
    │   ├── [4.0K]  share
    │   │   ├── [4.0K]  alsa
    │   │   │   ├── [8.8K]  alsa.conf
    │   │   │   ├── [4.0K]  cards
    │   │   │   │   ├── [ 669]  AACI.conf
    │   │   │   │   ├── [ 687]  aliases.alisp
    │...
    │   │   │   │   ├── [ 839]  VXPocket.conf
    │   │   │   │   └── [1.3K]  YMF744.conf
    │   │   │   ├── [4.0K]  init
    │   │   │   │   ├── [1.8K]  00main
    │   │   │   │   ├── [6.9K]  default
    │   │   │   │   ├── [1.4K]  hda
    │   │   │   │   ├── [ 391]  help
    │   │   │   │   ├── [ 932]  info
    │   │   │   │   └── [ 11K]  test
    │   │   │   └── [4.0K]  pcm
    │   │   │       ├── [ 805]  center_lfe.conf
    ...
    │   │   │       └── [ 978]  surround71.conf
    │   │   └── [4.0K]  X11
    │   │       └── [4.0K]  xkb
    │   │           ├── [4.0K]  compiled
    │   │           │   └── [ 11K]  server.xkm
    │   │           └── [4.0K]  rules
    │   │               ├── [ 34K]  base
    │   │               ├── [ 31K]  evdev
    │   │               └── [   4]  xorg -> base
    │   └── [   4]  var -> /var
    └── [4.0K]  var
    


    Вот и, вроде бы, все, думаете вы? Текстовые файлы, вроде /etc/init.d/run, вроде-бы, нормальные. Но вот ни один исполняемый файл и ни одна библиотека не запускаются. Сначала я думал, что игра использует либо модифицированное ядро, либо модифицированный libc. Патчил исполняемые файлы, смотрел, как примерно они отличаются от hello world, т.к. все они либо завершались с segmentation fault, либо, что еще хуже, c illegal hardware instruction.
    Скомпилировал себе эталонный «hello world», т.к. уже с самого начала, с вызова __libc_start_main, оно улетало куда-то не туда. Затем грешил на релоки, т.к. некоторые были как будто бы побиты, и я предположил, что, возможно, модификация в этом, но нет, после правки релоков игра хоть и стала стараться запускаться, но все не то. Размышлял над этим около 3 дней. Пришел к выводу, что исполняемые файлы каким-то образом бьются в CramFS, а текстовые остаются в оригинальном виде. И был прав!

    /etc/init.d/run
    echo run
    export __GL_SYNC_TO_VBLANK=1
    export force_s3tc_enable=true
    export LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/hd/lib
    cd /mnt/hd/game
    xinit /piu /mnt/hd/game/ -- -br -quiet -logverbose 0 -verbose 0 -depth 24 -audit 0 -bs -tst -xinerama
    #/bin/sh

    /etc/init.d/once
    until /usr/bin/mount_tab /etc/init.d/mnttab; do sleep 1; done
    /usr/bin/mountrd
    insmod /usr/lib/modules/nvidia.ko
    insmod /usr/lib/modules/drm.ko
    insmod /usr/lib/modules/fb.ko
    insmod /usr/lib/modules/font.ko
    insmod /usr/lib/modules/softcursor.ko
    insmod /usr/lib/modules/bitblit.ko
    insmod /usr/lib/modules/fbcon.ko
    insmod /usr/lib/modules/drm_kms_helper.ko
    insmod /usr/lib/modules/cfbcopyarea.ko
    insmod /usr/lib/modules/cfbimgblt.ko
    insmod /usr/lib/modules/cfbfillrect.ko
    insmod /usr/lib/modules/i915.ko
    mkdir /dev/dri
    ln -s /dev/card0 /dev/dri/card0
    /usr/bin/usbdaemon
    amixer set Master 80% unmute
    amixer set PCM 75% unmute
    amixer set Front 90% unmute
    insmod /lib/modules/atkbd.ko

    /etc/init.d/run
    setlogcons 2
    mount -n -t tmpfs -o size=128k var /var
    mkdir /var/log
    mkdir /var/run
    mkdir /var/run/microdog
    mount -t sysfs sysfs /sys
    mount -t proc proc /proc
    mount -t usbfs none /proc/bus/usb
    mount -t tmpfs mdev /dev
    mkdir /dev/pts
    mount -t devpts devpts /dev/pts
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    mkdir /dev/snd
    cp -a /dev/controlC* /dev/snd
    cp -a /dev/pcmC* /dev/snd
    cp -a /dev/timer /dev/snd


    Т.к. на руках у меня был оригинальный CramFS, и, вспомнив, что я могу попасть в консоль ОС в виртуальной машине просто нажав Alt+F2, я решил попробовать заменить оригинальный /etc/init.d/run, заменив вызов xinit на /bin/sh. Но нам же нужно каким-то образом засунуть модифицированный CramFS обратно в образ. Поискав строку «Compressed RamFS» в образе винчестера, я был несколько удивлен, что он лежит незашифрованным! Только, конечно, не просто так, а с «паддингом», весь файл на винчестере разбит на блоки по 32КБ данных и 512 байт пустоты. Ну, это, вроде бы, не проблема!

    Так уж получилось, что изменил я не только /etc/init.d/run, но и /etc/init.d/once, закомментировав вызовы mount_tab, mountrd и usbdaemon, и как-то не особо и обратил внимание на цикл в вызове mount_tab.

    Итак, отредактировали /etc/init.d/run, собрали CramFS, записали ее в образ, И-и-и!… ничего. Ладно, собрал ФС с оригинальным /etc/init.d/run, и начал искать отличия в файлах. Как оказалось, их было много, я долго пытался понять, в чем же дело, оказывается, cramfs-2.0 из firmware-mod-kit собирает чуточку иначе. Хорошо, скачал обычный cramfs-tools из репозиториев, собрал им, и вдруг увидел, что, помимо контрольной суммы, различается последний байт у файлов. У оригинального файла 0x80, а у собранного мной, конечно же, 0x00. Удивленный таким положением дел, заменил в своем файле последний байт, засунул его в образ винчестера и УРА! Образ запустился с моей модифицированной ФС, и я получил консоль. Никакой сложности простое копирование файлов не создало, запускные файлы теперь действительно запускались на моей linux-системе, и именно на этом шаге я понял, что, действительно, CramFS специальным образом изменяет исполняемые файлы.

    Бегло посмотрев на mount_tab, mountrd и usbdaemon в IDA PRO, на тот момент я был уверен, что mount_tab просто монтирует файловую систему в нужные места (те два раздела на винчестере, первый в /mnt/game, а второй в /SETTINGS), mountrd сканирует AGP и PCI шины, расшифровывает, загружает в память и монтирует в /usr/lib один из файлов «p», «i» или «u», лежащих на первом разделе, которые содержат драйвера для видеокарты, а usbdaemon обеспечивает работу с USB-донглом посредством UNIX-сокетов.

    Ложная радость


    Сижу, исследую запускной файл игры, который вытащил копированием, и у меня начали закрадываться подозрения. Какой-то он не такой, упоминания это версии игры, которую я исследую, нет, и вообще, как-то что-то не то. Понял, что этот файл принадлежит другой версии игры, и выдвинул предположение, что, видимо, после проверки USB-донгла он откуда-то берет и расшифровывает другой файл. Все оказалось куда смешнее.
    Помните тот цикл при вызове mount_tab? При первом запуске он действительно просто монтирует файловые системы, но при повторном запуске он читает с винчестера некоторое количество данных со смещения 0x1F80200 или 0x2080200, в зависимости от заголовка по первому смещению, расшифровывает эти данные, и прямо в памяти подменяет запускной файл игры в CramFS на правильный. Вот этот ход мне действительно понравился! Я был в ярости, но, в то же время, горд находчивостью разработчиков.

    Заключение


    Статья получилась несколько скомканной и состоит скорее из моих мыслей, догадок и наблюдений. Надеюсь, ее было интересно читать. Часть 2 будет чисто техническая, и, возможно, будет содержать разбор файловой системы игры и отвязывание игры от USB-донгла.
    Вот вам видео, напоследок.

    Greetings to

    Пожалуйста, не пишите в комментариях название игры, чтобы она не гуглилась. Спасибо!

    Комментарии 66

      +2
      А где автомат стащили? Там ещё есть? :-)
        +1
        Так уж вышло, что мой домашний сервер практически точная копия железа, которое используется в этой игре. На нем и тестировал. Когда файл вытащил, уже просто в линуксе запускал.
        +2
        О! Месье знает толк в извpащениях! =)

        а вообще — зачем такие извраты защиты в аппарате? что-бы игру не слили?
          +2
          Да. Компания, которая эту игру делает, делает ее скорее ради фанатов, а не ради прибыли. Апгрейд до свежей версии стоит около 40-50 тысяч рублей, а им лишь бы поставить какую-нибудь степманию и вытащить свежие треки из свежих версий, и засунуть их в степманию.
            +5
            Что-то перечитал свой комментарий, и понял, что ничего из него непонятно.
            Эта игра пользуется большой популярностью в Латинской Америке, собственно, это основной рынок для компании. В то же время, на этом рынке больше всего пиратства. Есть, можно сказать, опенсорс аналог это игры, Stepmania, и было одно время, когда ее пытались сделать максимально похожей на оригинальную игру. Т.е. компания тратит время и деньги на разработку игры, на лицензирование новых треков и написания степчартов, а из нее выдирают все это и вставляют в степманию, и запускают именно бесплатную степманию на автоматах с целью извлечения прибыли. Для этого и защищают.
              0
              По идее, если там линукс, то должны быть и исходники всех защит где-то опубликованы. Разве не?
              (всё ж GPL — не BSD)
                +2
                Ну не все, а я только модифицированного CramFS, т.к. все остальное у них свое.
                Но это же корейцы. Им плевать.
                +1
                Так ведь всякие танец танец револиция популярны и в азии? Или там у них жёсткая конкуренция и конкретно этот вендро работает на латинскую америку?
                  +1
                  Танец танец революция значительно дороже, и, в основном, нацелена только на Японию.
                    +1
                    Я думал степмания копирует танец-танец. :). Никогда не видел оригиналов.

                    Спасибо что открыли одну из величайших тайн мира ^_^
                      +1
                      В самой степмании куча режимов, не только танец-танец.
                      А для игры в топике был отдельный форк — stepmania amx.
                      0
                      а памп — только на Корею
                    0
                    Эта игра пользуется большой популярностью в нескольких странах, и основной рынок кроме самих автоматов — запчасти.
                    Кроме того, могу заверить, что увлеченные игроки вполне способны купить такой автомат в личное пользование, несмотря на то, что танцевальный автомат гораздо дороже чем вообще среднестатистический аркадный автомат — в основном из-за лицензий на треки.

                    Бесплатная степмания, даже самая последняя, не соответствует в точности официальному автомату, а для профессионалов это имеет значение (сам участвовал в чемпионатах, и знаю о чем говорю).
                    Ну и USB не может повторить идеально тайминги Jamma, счет идет на милисекунды срабатывания.
                      0
                      От Jamma там только остался сам разъем, подключение к компьютеру происходит по USB, причем в реализован не самый быстрый способ взаимодействия с железом, которое читает датчики. В итоге, драйвер PIUIO для Linux работает быстрее оригинального.

                      Я наконец-то купил пады, если кому интересно. И других частей статьи не будет по просьбе Andamiro. Они и эту статью кучу раз просили убрать, но я не стал.
                        0
                        Интересные перцы. С ними пытаешься связаться — постоянно в отпуске, а с вами так сами связались.

                        P.S. у нас два набора падов — один полноценный аркадный, второй — степмания через usb. Но под виндой.
                        Разницу в общем-то видно ). Удачи с тренировками.
                          0
                          У меня аркадный пад, но датчики от него подключены напрямую к китайскому IO, которое видится как USB Gamepad, и софтово уже эмулируется как PIUIO. Никаких задержек не вижу, все синхронизировано замечательно, так что, возможно, это проблема степмании или вашего IO.
                –15
                00000180 28 43 29 32 30 30 34 20 41 4e 44 41 4d 49 52 4f |(C)2004 XXXXXXXX|

                Удачно скрыли.
                  +8
                  Ну ниже же написано, что HEX-данные я намеренно не менял.
                    –63
                    Да там и в дампе памяти прямым текстом: Copyright string: " 1999-2003 ANDAMIROang"
                      +3
                      Попросили же не писать.
                      Да, на скриншоте
                      image
                      тоже есть, если уж на то пошло.
                        0
                        Если обратить внимание то в дампе дальше тоже закрыто X именно название.
                        А так оно вообще на первой картинке поста есть. :)
                          +1
                          Когда я писал комментарий, закрыто не было. пруф

                          Итого, автор выложил в сеть легальный реверс-инжиниринг некоего продукта (в образовательных целях всегда легально), но зачем-то захотел скрыть эту информацию от гугла. Однако в «сокрытии» был очень неосторожен и пропустил много мест, в том числе и название компании открытым текстом в дампе.

                          Несколько человек иронично указали на этот факт. Иронично и не в ЛС просто потому что нет смысла скрывать легальный контент на коллективном блоге.

                          Автор втихаря поправил статью. Оба «ироничных доброжелателя» оказались прилично заминусованы.

                          Итого: исходная ошибка автора уже ушла во «внешний» интернет. За эту ошибку «наказаны» оказались посторонние люди.

                          Но, в отличие от автора, я не собираюсь брать свои слова назад. Я считаю, что в столь наивном и халатном «сокрытии» не было смысла. А не брать на себя ответственность за свои действия — подло.

                          P.S. Скриншот пруфлинка на всякий случай:
                            +1
                            Я на самом деле про фрагмент
                            00000200 50 75 6d 70 20 49 74 20 55 70 3a 20 46 69 65 73 |Xxxx Xx Xx: Xxxx|
                            00000210 74 61 45 78 00 00 00 00 00 00 00 00 00 00 00 00 |xxXx............|

                            Т.е. не копирайт разработчика а именно название игры.
                              +1
                              Сожалею, что так вышло. Я после вашего комментария и убрал текст в бинволке.

                              Скрывал название игры и производителя я для того, чтобы мексиканцы не могли найти этот топик в гугле. Пока они не умеют ничего делать с игрой.
                              Несколько лет назад, когда компания выпустила версию для ПК и ее поломали и научились вставлять свои песни, компания чуть не разорилась, т.к. и после выходы новых версий игры для игровых автоматов, мексиканцы брали эту версию для ПК, делали точную копию темы и пихали в автоматы. Ладно бы, если просто в свои автоматы пихали, так они начали продавать эти компиляция под видом оригинальных версий.
                                +1
                                Ну а модифицировать скриншоты смысла нет, они не гуглятся.
                                  +3
                                  На самом деле и по названию компании всё ещё не гуглится: ничего (видите, я теперь тоже закрываю крестиками) Дело в том, что строка в дампе не точно соответствует названию компании. А вот по картинке как раз очень хорошо гуглится: первый же результат. (Поиск по картинкам с названием компании и игры -> поиск похожих картинок -> ограничить хабром)

                                  То есть я точно не улучшил «гугливость» этого поста своим комментарием. Но всё равно словил много минусов.

                                  Всё это очень интересно. Так что не стоит Вам сожалеть. Я впервые стал жертвой бездумного хабра-минусования. Раньше я думал, что можно объяснить ситуацию и всё исправится. Но оказался в корне неправ. После моего предыдущего комментария исходный коммент собрал ещё столько же минусов и ни одного контр-плюса. Подозреваю, что и этот комментарий ничего не изменит.

                                  В любом случае, я рад что Вас разбанили. Поставил плюс в карму (пока моей ещё хватает ставить кому-то плюсы :)
                                    0
                                    По XXXXXXXX гуглится на 3 странице.
                                      0
                                      Хм… Гугл известен показом разных результатов разным людям, но я не ожидал чтобы на столько. Я даже проверил в google.ca на всякий случай. Когда ограничиваю сайтом хабра, то ничего не находится. А можете дать точную ссылку (без закрывания XXXX) через личные сообщения? Ну или скриншот…
                                        0
                                        Я имею в виду, что загуглить можно по буквально xxxxxxxx site:habrahabr.ru, значит и название фирмы скоро загуглить можно будет.
                                          +1
                                          Нет, не будет :) Google быстро индексирует. Например по слову «бинволке» из комментария ValdikSS выше уже находится. А по названию фирмы не находится, потому что название фирмы не один-в-один (а это всё-таки имя собственное).
                                            0
                                            По andamiroang уже второй результат. :(
                                            По a******o не находится даже с site:habrahabr.ru.
                                              +2
                                              Именно, но у a***ang больше нет других совпадений. То есть чтобы добраться до этого термина и начать гуглить по нему, надо уже загрузить ядро, которое расшифровывает rootfs. Не знаю поможет ли чем-то этот топик хакеру, который прошёл самую сложную часть (имхо) — загрузку образа в эмуляторе.

                                              Кстати другие результаты в гугле — это сохранённые роботами копии статьи. И находятся они выше, потому что a***ang там в самой статье, а не в комментарии.

                                              В общем, ЧТД: никакой «гугливости» мой несчастный комментарий не добавил.

                                              Спасибо за независимую проверку!
                                    0
                                    Это ненадолго.
                              –3
                              Я и не писал… Эх…
                        –11
                        Интересный топик. Спасибо.

                        Кстати, заметил оригинальную фишку у Ютуба — если пока ролик грузится и пока видно курсор загрузки нажать стрелки — то можно поиграть в змейку!!!
                          –3
                          Сначала не понял про какую вы змейку сказали. Покраснел.
                            +6
                            image
                            +3
                            Хе, я в свое время ковырял таким же образом операционку от KORG Kronos. Ковырял-ковырял, а потом плюнул после того как понял что все что связанно с шифрованием и гуи операционки сидит на отдельной плате в ARM проце (TI OMAP какой-то, подключен к основной материнке через usb) и эту плату я даже если захочу достать не смогу.
                              +3
                              Автор, выложи видео как ты сам фристайлишь
                                +1
                                Автор плохо играет, максимум десяточки.
                                  0
                                  Для зрителей, впервые видящих автомат живьем, 10-ки это круто.
                                  Грубо говоря, человек не совсем тюфяк, при нормальном задротства сможет с нуля взять десяточку примерно через месяц тренировок.
                                    +1
                                    Я себе домой пады купил.

                                      0
                                      Весьма неплохо, особенно учитывая обычные кроссовки )
                                      4 июня вроде отбор на eurocup начинается — мужская категория с 14-го левела, а учитывая что тут прайм — можно прямо из дому попробовать ;)
                                      Мы тоже на своем купленном автомате будем пробовать, но я не уверен что в топ-5 войду :(
                                        0
                                        а учитывая что тут прайм — можно прямо из дому попробовать ;)
                                        Нет, боюсь, нельзя ;)
                                +2
                                А у вас нету автомата Half-Life 2: Survivor?
                                  0
                                  У меня нет никаких автоматов. Я играю в центрах развлечений. Т.к. вы из Питера, могу сказать, что такого автомата нет ни в Галерее на 5 этаже, ни в Балкании НОВА2 на Купчино (это, в случае, если вы ищите, где поиграть).
                                    +1
                                    Я ищу, где бы достать саму игру, чтобы поиграть на ПК. Она на японском вообще.
                                      0
                                      Ну, просто так, я уверен, вы в нее не поиграете. Там, наверняка, тоже защита донглом и привязка к специфическим контроллерам.
                                      Если вам нужен дамп винчестера, могу только посоветовать посмотреть на каких-то закрытых торрент-трекерах, но сомневаюсь, что вам удастся что-либо найти.
                                        +1
                                        У меня друг играл, даже скриншоты в Steam есть, но давать никому, в том числе мне, не хочет. Достал откуда-то. Явно не торренты.
                                          +1
                                          5 минут гугления вывели меня на загрузчик для игр с этого автомата (автомат — обычный комп под windows xp/7 embedded, защиты донглами в большинстве случаев нет), штук 7 сдампанных игр и информацию что hl2 survivor сдампан, но в паблике его нет. (либо есть, но очень сложно найти) Так что вполне возможно стоит погуглить по-лучше и он найдется.
                                            0
                                            Дампа нет. Он в комментариях к скриншоту сказал, что вытащил игру из сломанного автомата.
                                        0
                                        Вместо японского DDR можете поискать ITG, которая практически полностью ее копирует, и когда-то их засудили, после чего они пошли к Андамиро делать пятикнопочный Pump-Pro.

                                        Но пока они работали с четырехкнопочным, они сделали официальный InTheGroove для PC и PS/2, то есть на этих платформах можно запустить полностью официальную эмуляцию аркадного автомата.

                                        Где-то на на торренте я вроде до сих пор раздаю PC вариант, если не найдете, напишите в личку.
                                          0
                                          Да, играл в PC-версию.
                                    +3
                                    Интересно, за что банили? за «Винде капец»?
                                      0
                                      Скорее, за выложенную ссылку на FTP-сервер с хентаем (в очередном топике про блеклист).
                                        0
                                        Не, это после разбана уже. За рекламу банили.
                                      0
                                      Любопытно, а плата «PIUIO» — она как к этому компьютеру подключена? По USB?
                                        +2
                                        Да. Она вставляется в PCI-E, но там нет контактов, просто чтобы держалась, и подключается по USB.
                                          0
                                          Компом видится как USB HID Device?
                                            +1
                                            Не, никак не видится. Игра общается с ней через libusb.
                                        0
                                        Еще это игра продавалась на дисках вместе с ковриками для танцев. Очень весело проводилось время дома. К сожалению, запустить ее у меня получалось только на 98 винде, так что после обновления пк все это добро было забыто где-то на антресолях.
                                          +1
                                          Ковры, конечно, все ужасны, но если хотите поиграть, то скачайте степманию.
                                          0
                                          Занимательно. Делали просто из интереса, что в типичных автоматах или какая то практическая мысль в этом есть? Не совсем просто уловил цель топика, да и почему так боитесь, что будет гуглится эта статья? Санкции от разработчиков игры?
                                            0
                                            Я не боюсь, просто не хотелось бы, чтобы это читали Мексиканцы, причины написаны выше.
                                            Делал из интереса.
                                              0
                                              А они русский знают?
                                                0
                                                Если надо, узнают. Материал-то эксклюзивный, так сказать.

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое