Реверс инжиниринг 2048

Вступление


Это моя первая статья и я старался её сделать как можно интереснее.
Поэтому речь пойдёт о реверс инженеринге игры «2048» (заточенной под андроид)

Внимание
В этой статье я не буду говорить о свойствах apk, о декомпиляции dex в оп код smali и о прочих тонкостях.

Цель работы


А вот и она.

image

Инструкция


Для начала я закинул весь apk в онлайн декомпилер

ссылки на декомпилеры

Небольшое отступление


Дело в том, что в игре 2048 после начала генерируютя фишки с числом 2, которые надо складывать между собой чтобы получить числа в два раза больше предыдущих. И нашей целью является заменить фишки с числом 2 на более крупные (например с числом 16384).

Вернёмся к теме


После того как я закинул файл в декомпилер и получил zip с изменённым dex на java. Я это сделал для того чтобы посмотреть в каком методе реализовывается генерация тех самых фишек и оказалось что это метод

addRandomTile

Он же реализовывается в smali.

.method private addRandomTile()V
    .registers 7

    .prologue
    .line 84
    iget-object v2, p0, Lcom/tpcstld/twozerogame/MainGame;->grid:Lcom/tpcstld/twozerogame/Grid;

    invoke-virtual {v2}, Lcom/tpcstld/twozerogame/Grid;->isCellsAvailable()Z

    move-result v2

    if-eqz v2, :cond_25

    .line 85
    invoke-static {}, Ljava/lang/Math;->random()D

    move-result-wide v2

    const-wide v4, 0x3feccccccccccccdL    # 0.9

    cmpg-double v2, v2, v4

    if-gez v2, :cond_26

    const/4 v1, 0x2

    .line 86
    .local v1, "value":I
    :goto_17
    new-instance v0, Lcom/tpcstld/twozerogame/Tile;

    iget-object v2, p0, Lcom/tpcstld/twozerogame/MainGame;->grid:Lcom/tpcstld/twozerogame/Grid;

    invoke-virtual {v2}, Lcom/tpcstld/twozerogame/Grid;->randomAvailableCell()Lcom/tpcstld/twozerogame/Cell;

    move-result-object v2

    invoke-direct {v0, v2, v1}, Lcom/tpcstld/twozerogame/Tile;-><init>(Lcom/tpcstld/twozerogame/Cell;I)V

    .line 87
    .local v0, "tile":Lcom/tpcstld/twozerogame/Tile;
    invoke-direct {p0, v0}, Lcom/tpcstld/twozerogame/MainGame;->spawnTile(Lcom/tpcstld/twozerogame/Tile;)V

    .line 89
    .end local v0    # "tile":Lcom/tpcstld/twozerogame/Tile;
    .end local v1    # "value":I
    :cond_25
    return-void

    .line 85
    :cond_26
    const/4 v1, 0x2

    goto :goto_17
.end method

Так как фишке с двойкой принадлежит

0x2

а так же

v1

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

const/16 v1, 0x5000

Да кстати 0x5000 это 16384, т.к. 2048 светится в директиве .field как 0x800 вот код

.field private static final startingMaxValue:I = 0x800

вроде всё.

После компиляции получаем следующее.

Я немного подправил стилистику чтобы было покрасивее.

image

P.S:


Черпал литературу
Метки:
разработка