Pull to refresh

Реверс инжиниринг 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:


Черпал литературу
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings