android逆向01:修改apk的资源文件,smali插桩

前提:

有需求才有实现。
android逆向能干什么?去除游戏中的广告,跳过各种支付达到付费效果,人为干预简化游戏流程直奔主题,无限增加各种付费道具,等等;当然可以对自己的apk进行逆向的逆向进行加固,毕竟冰冻三尺并非一日之寒。
有个朋友让我暴力破解个apk,达到改头换面的目的,那我把之前学习的逆向相关的内容整理下,列出个demo来演示一下,记录下自己的学习历程。
这篇就先简单演示下替换字符串,图片,简单在smali文件中插入一个提示,没什么实用价值,只当演示。

操作工具:

jdk7 + ApkIDE + genymotion;
eclipse当场编译一个apk来供测试试用;
反编译这个生成的apk,对其smali源文件进行插桩,再回编测试;

apk破解形式

修改资源  

换图片,字符串:(太简单,就不截图了,如有需要操作步骤截图,留言)

1.将apk文件改名为rar;解压找到要替换图片的目录,将准备好的同名文件扔进去覆盖一下;

2.然后再将含有新图片的rar文件后缀名改为apk;

3.用签名工具对其进行签名处理,当然此时的签名肯定不是正版软件的签名,可以用任意签名打包即可;

4.导入到模拟器中查看下资源替换是否已经成功;

修改业务逻辑

只有牵扯到具体业务逻辑的时候才需要修改smali源码;

为了显得高端一点,直接在实际项目中插入代码好了,不那么山寨。看图:

android逆向01:修改apk的资源文件,smali插桩_第1张图片

android逆向01:修改apk的资源文件,smali插桩_第2张图片

乍一看,挺高端的,其实就是加进去一段平常不怎么常见的dalvik指令,这段指令对应的java代码就是Toast.makeText().show();就这么简单;

dalvik指令集:

寄存器命名:

v1  v2 v3-----
p1  p2 p3-----

字节码:

V void          只能用于返回值类型

  Z  boolean       变量值只能是 真(true) 或 假(false)

  B  byte          字节型

  S  short         短整型

  C  char          字符型

  I  int           整数型

  J  long(64位)  长整型

  F  float         浮点型

  D  double(64位)  双精度浮点型

   L  java类类型package.name.ObjectName  Lpackage/name/ObjectName;

   [  数组类型 [I表示一个整型一维数组,等于java中的int[]。注意多位数数组的维数最大为255个。[[I=int[][] [[[I=int[][][]

跳转指令:

if-eq  等于则跳转 ==

   if-ne   不等于则跳转 !=

   if-lt   小于则跳转< 

   if-ge   大于或等于则跳转>=

   if-gt   大于则跳转  >

   if-le   小于或等于则跳转<=

   goto    无条件跳转

   switch  分支跳转

返回0 实现跳转

  Pswitch_0

   。。。

   。。。

   。。。

  Pswitch_1

   。。。

   。。。

   。。。

  Pswitch_2

   。。。

   。。。

   。。。

方法调用:Invoke

invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

数据定义指令 const  const-string  const/4(半字节)  const/16()

const v1, 0x2(v1=2赋值)

        constv1, “youren” (v1=”youren”赋值)

操作指令 move   

 movev1, v2(v2数据移动到v1中)

结语:

其实这就是smali语法的构成;多看就好,我也刚入门,慢慢来吧。


你可能感兴趣的:(Android逆向)