吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7668|回复: 18
收起左侧

[Android 原创] Android逆向-Android逆向基础11(so demo分析)

  [复制链接]
BubblePig 发表于 2018-2-17 14:03

0x00 前言

导航

博客导航戳这里
这里有所有博客的集合,以及每一个博客的内容。
练习资源戳这里
这里有很多可以练习的资源,一起其他网上找不到的资源。

说明

感谢鬼哥的,跟着鬼哥学so分析系列。也感谢鬼哥提供的练习apk。
别人走的路,你总得走一下,才知道是什么感觉。看着别人走,得到的总没有自己走一走

内容

1.金币修改demo
2.用户等级更改demo

0x01 金币修改demo

样本地址

http://blog.csdn.net/qq_36869808/article/details/79290420

测试

找到需要进行实战的apk。
这里写图片描述

分析

这里出现的英文以及数值。
Current Coin is:目前的硬币
当前是100。
那么我们需要修改的就是这个数值了。
还是分析别人写的好。

start

虽然知道这里一个so层分析,但是还是按照不知道的步骤进行分析吧。

反编译

这里写图片描述

直接看到这里有一句getCoin,并且是Lcom/ggndktest1/JniGg,这个里面的函数。

打开JniGg

.method public static native getCoin()I
.end method

.method public static native ggPrintHello()Ljava/lang/String;
.end method

这里就是NDK函数的部分了。

尝试smali层修改。

invoke-static {}, Lcom/ggndktest1/JniGg;->getCoin()I

move-result v2
const/16 v2,0x100

因为之前的基础所以更改smali层很简单。

这里写图片描述

当然smali层不是我们的终点,只是顺便做一个练习。

so分析start

打开IDA。然后找到输出函数getCoin

这里写图片描述
这个就是我们主要的修改的地方了。

getCoin 分析

MOVS    R0, #0x64 ; 'd'
.text:00000C06                 BX      LR

恩。。。就两句话,本来准备好好分析一下的。

MOVS    R0, #0x64 ;

R0=100

BX      LR

BX: 带状态切换的跳转。最低位为1时,切换到Thumb指令执行,为0时,解释为ARM指令执行。

我们只要修改一下 R0的数值就可以了。

F5插件辅助(请勿依赖)

这里写图片描述

怎么说呢,简单明了。

修改

把so文件加载到FlexHex中

进行对照。

这里写图片描述

然后找到相同的位置进行修改。

这里写图片描述

然后修改保存。

这里写图片描述

回编测试

记得关了IDA

这里写图片描述

0x02 用户等级更改demo

样本地址

http://blog.csdn.net/qq_36869808/article/details/79290420

样本分析

这里写图片描述

smali层分析

还是用smali层来进行。

目的:
1.smali层分析
2.复习

1.反编译,分析

这里写图片描述

发现重点函数部分。我们把这一句拿出来看一下。

invoke-static {v0}, Lcom/ggndktest1/JniGg;->VipLevel(I)Ljava/lang/String;

这里看到了VipLevel(I),证明传进去了一个参数。这个参数就是v0。我们继续往上找。
找到了这样一句话。

const/4 v0, 0x5

综合一下就是 把v0的值传入VipLevel(I)函数。然后这个函数会返回一个字符串。也就是说我穿进去是5的时候,返回的是这个,那么我要是改成1的话,可能就返回是其他东西了,我们进行简单的修改测试

2.测试

这里写图片描述

恩,成功更改,但是这个肯定不是我的主菜。我们的主菜就是so文件分析

so层分析

ida打开

在IDA输出窗口中找到我们的函数。VipLevel,双击进入。
这里写图片描述

首先来看流程图

这里写图片描述

之前我们分析过的demo,可以轻而易举的看出这个是switch结构,好,我们进入窗口看一下。

分析

__unwind {
.text:00000C40                 PUSH    {R3,LR}
.text:00000C42                 CMP     R2, #2
.text:00000C44                 BEQ     loc_C60
.text:00000C46                 CMP     R2, #3
.text:00000C48                 BEQ     loc_C54
.text:00000C4A                 CMP     R2, #1
.text:00000C4C                 BNE     loc_C5A
.text:00000C4E                 LDR     R1, =(aGoldVip - 0xC54)
.text:00000C50                 ADD     R1, PC          ; "Gold Vip"
.text:00000C52                 B       loc_C64

这个是开始的部分。

PUSH    {R3,LR}

创建环境

CMP     R2, #2

比较R2和#2是否相等。

R2是我们输入的的东西,你问我咋知道,其实我也不知道,但是我可以猜出来。

BEQ     loc_C60

相等跳转到loc_c60

loc_C60                                 ; CODE XREF: Java_com_ggndktest1_JniGg_VipLevel+4↑j
.text:00000C60                 LDR     R1, =(aSilveryVip - 0xC66)
.text:00000C62                 ADD     R1, PC          ; "Silvery Vip"

如果输入的是2,那么就是"Silvery Vip"

剩下的类似,我就不往下看了。

修改

这里写图片描述

我的改法就是把R2重新赋值。

这里写图片描述

这里我们发现是16位的ARM,也就是Thumb。

我们这里使用一个新工具。armCode。

这里写图片描述

然后进行机器码转换

这里写图片描述

然后用16进制软件修改就行,当然你也可也以直接把前面的16进制码全部删掉,但是建议达到目的就行,能少该就少改。

测试

这里写图片描述

0x03 小黄人demo分析

说明

这个demo还是鬼哥的,不过鬼哥的链接好像失效了,这个是我自己找的。
http://blog.csdn.net/qq_36869808/article/details/79290420

smali层分析

这是一个和游戏,之前写了破解方式,挨着进行搜索就行了。

搜索onresult,然后跳转switch语句即可

.method public final onResult(ILjava/lang/String;Ljava/lang/Object;)V
    .locals 2

    const/4 v1, 0x1

    const/4 v0, 0x0

    goto :pswitch_0

    packed-switch p1, :pswitch_data_0

    sput-boolean v0, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->w:Z

    invoke-static {}, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->nativeShowedBilling()V

    invoke-static {v1}, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->nativeActiveoffline(I)V

    :goto_0
    return-void

    :pswitch_0
    sput-boolean v0, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->w:Z

    sget v0, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->m:I

    invoke-static {v0}, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->nativeBillingDone(I)V

    goto :goto_0

    :pswitch_1
    sput-boolean v0, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->w:Z

    invoke-static {}, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->nativeShowedBilling()V

    invoke-static {v1}, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->nativeActiveoffline(I)V

    goto :goto_0

    nop

    :pswitch_data_0
    .packed-switch 0x1
        :pswitch_0
        :pswitch_1
    .end packed-switch
.end method

测试

这里写图片描述

so层分析

这里写图片描述

数量分析

这里写图片描述

这里分析之后 当输入的数值是7,8,9的时候,香蕉的数字就会变成18888。

也就是更改我们输入的值就可以了。

数量修改

这里写图片描述

这里是32位ARM汇编。

C8 19 04 E3

这里我们想要更改数据,就要知道这些含义是什么。

原来的数值是 #0x49C8

和我们的数据进行对比。

c8 对应的是第一位,49被拆在了中间。

那么我们要更改的时候就是 ff 1f 0f E3

分析是可以这样分析的,但是对于学术研究的时候,还是要知根知底比较好。

这里的E3就是 mov

因为这里的数据是反的,先入高位,再入低位,实际顺序就是 E3 01 ff ff。

然后进行修改即可。

0x04 TTX连萌

这个demo也是鬼哥提供的,当然我们先不看鬼哥分析的,我们自己来搞

试玩

就是一个类似消消乐的东西。
这里写图片描述

smlai层分析

内购破解

mm应用。
搜索:onBillingFinish

删掉判断逻辑即可。

.method public onBillingFinish(ILjava/util/HashMap;)V
    .locals 4
    .param p1, "code"    # I
    .param p2, "arg1"    # Ljava/util/HashMap;

    .prologue
    .line 54
    const-string v1, "IAPListener"

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v3, "billing finish, status code = "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 55
    const-string v0, "\u8ba2\u8d2d\u7ed3\u679c\uff1a\u8ba2\u8d2d\u6210\u529f"

    .line 57
    .local v0, "result":Ljava/lang/String;

    .line 61
    :cond_0
    const-string v1, "IAPListener"

    const-string v2, "Success"

    invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    sget-object v1, Lcom/PopStar/org/PopStar;->mMain:Lcom/PopStar/org/PopStar;

    invoke-static {v1}, Lcom/sdk/wraper/SDKInvoker;->getInstance(Landroid/content/Context;)Lcom/sdk/wraper/SDKInvoker;

    move-result-object v1

    const/4 v2, 0x0

    const-string v3, ""

    invoke-virtual {v1, v2, v3}, Lcom/sdk/wraper/SDKInvoker;->onBillingFinish(ILjava/lang/String;)V

    .line 70
    :goto_0
    const-string v1, "IAPListener"

    invoke-static {v1, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 72
    return-void

    .line 67
    :cond_1
    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    const-string v2, "\u8ba2\u8d2d\u7ed3\u679c\uff1a"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-static {p1}, Lmm/purchasesdk/Purchase;->getReason(I)Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    goto :goto_0
.end method

修改后的代码。

反编译测试

这里写图片描述

so层分析

溯源找到nativeAddCoin。

sput-object v0, Lcom/PopStar/org/PopStar;->mHandler:Landroid/os/Handler;

    const-string v0, "xinxin"

    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

根据这个更改so文件。

打开IDA

这里写图片描述

loc_AA722                               ; CODE XREF: Java_com_PopStar_org_PopStar_nativeAddCoin+24↑j
.text:000AA722                                         ; Java_com_PopStar_org_PopStar_nativeAddCoin+30↑j ...
.text:000AA722                 BL      _ZN8GameMain11useGameCoinEi ; GameMain::useGameCoin(int)

跳转之后发现_ZN8GameMain11useGameCoinEi这样一个函数。

这里写图片描述

然后就是把R0的数值进行更改

修改这里即可。

这里写图片描述

具体可以看鬼哥的so分析。

0x04 结束语

收获

1.对ARM汇编进行一个了解。
2.对ARM进行一个熟练应用
3.对之前的内容进行一个复习。

以上。

免费评分

参与人数 9吾爱币 +8 热心值 +9 收起 理由
debug_cat + 1 + 1 看完了,很多语法看不懂,头晕,还有那个修改so的工具,不知道叫啥来着,还.
↑帝↑ + 1 + 1 我很赞同!
lin_xop + 1 + 1 热心回复!
xwzj20170829 + 1 + 1 谢谢@Thanks!
kilkilo502 + 1 用心讨论,共获提升!
最强王者小强 + 1 + 1 我很赞同!
冉哥无敌帅 + 1 + 1 新年快乐,辛苦了
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
noah88 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kilkilo502 发表于 2018-2-17 20:01
请问楼主一个问题  比如我拿到一个未知的程序 怎么确定他调用自定义的那个函数呢?
比如返回失败。 这个字眼在smail层的名字确定了叫  onresult   
那么在IDA里面是否可以去搜索onresult    来分析确定关键点?
xwzj20170829 发表于 2018-2-18 04:24
花了10多个小时终于过了0x02 找工具几小时 找到了又弄了几小时
本来想把一款学习英语的app打通关在来学你的所有教程   瞟一下看到有游戏实战的图片就跟着做了
noah88 发表于 2018-2-17 14:26 来自手机
forrest888 发表于 2018-2-17 14:40
感谢楼主持续更新,过程真详细
7001 发表于 2018-2-17 14:44
谢谢分享。
最好IDA 反汇编时,同步显示Hex代码。否则怎么知道赋值语句MOVS    R0, #0x64 ;是 0x64 x20?
MARNM 发表于 2018-2-17 15:53
教程挺详细的,看看有没有时间学学
yoyolin8722 发表于 2018-2-17 16:38 来自手机
有没有研究物联网设备的呢
菜鸟不疯狂 发表于 2018-2-17 17:30
这玩意没安卓的基础,好学吗
绝美之城 发表于 2018-2-17 17:42
感谢楼主。
进爱云儿 发表于 2018-2-17 22:18
最近学习修改qq
谢谢大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-23 16:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表