Вступление
Это моя первая статья и я старался её сделать как можно интереснее.
Поэтому речь пойдёт о реверс инженеринге игры «2048» (заточенной под андроид)
Внимание
В этой статье я не буду говорить о свойствах apk, о декомпиляции dex в оп код smali и о прочих тонкостях.
Цель работы
А вот и она.
Инструкция
Для начала я закинул весь 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
вроде всё.
После компиляции получаем следующее.
Я немного подправил стилистику чтобы было покрасивее.
P.S:
Черпал литературу