初学安卓逆向(课是关卡+1)

本文最后更新于 2026年7月3日 下午

初学安卓逆向(课是关卡+1)

[TOC]

新手初学安卓逆向,有一点点pwn的二进制基础,直接从b站正己的教程上跟着做,先看一遍视频,然后再实操一下,忘了的再回头看(本来是跟着做的,结果发现那样子效率不高,容易忘)

b站教程地址:吾爱破解安卓逆向入门教程《安卓逆向这档事》

  1. 所储存显示字符串的地方

    • arsc
    • xml
    • dex
  2. 对于应用程序,先进行安装包提取

    image-20240911170033531

    1. np管理器里的通用编辑直接继承好了如何修改app名字和图表,本质是在xml文件内有配置信息,(但是修改了之后没有显示?)
    2. xml中mt管理器修改activity更稳定,activitiy的主页面修改可以选择跳转窗口。

第一关重现

  1. 改包名双开,直接在NP或MT管理器中,选择APK共存,修改包名,就能同时安装两个相同的文件了。image-20240913114012967

  2. 字符串的修改替换与汉化

    原本:

    image-20240913114137345

    • 逐个修改:定位选择后,找到对应的文件,然后修改。(比如将hello world修改为hello xyyr)

      image-20240913114233171

      寻找的方法是在这里搜索,然后找到对应的文件,进行修改(arsc文件在mt需要会员,这里用np)

      image-20240913114345509

      如图搜索到这里,进行更改即可(一般字符串都在这里,可以批量对这儿进行汉化)

      image-20240913114645576

替换后如图image-20240913115049374
3. 图片更改以及图标

用开发助手的布局查看,点击查看表项(长按可以复制)

image-20240913151650362

然后要用MT管理器的搜索,xml搜索,用资源id搜(np没有找到这个功能)

image-20240913152254616

搜索后找到jf.xml

image-20240913152446677

srcCompat是对应的路径,但是认不出来,把它复制下来,在mt管理器,打开arsc文件,选择arsc编辑器(只有这个不需要会员),id定位资源

定位后就可以找到它了,把cf.jpg删了,把想要的图片名字改成cf.jpg,就可以替换过去了。

image-20240913152956177

最终效果:

image-20240913153548749

第二关重现

搜索大会员找到相应的位置

image-20240913154221376

  1. 修改判断
    image-20240913154435786

    根据名字找到这个方法,如果p0>=v0,就跳转到了cond_15,否则继续走到.line34,unicode编码解码后的中文对应的是请先获得10个硬币哦

    将ge改为le,往下翻,点住跳转的isvip(),将返回值改为1,注意这里函数返回的是寄存器,所以把寄存器的复制改为1

    image-20240913155640585

    成功,还是比较简单的。

    image-20240913160114035

  2. 强制跳转

  3. 修改寄存器的值

    两种方法一起实践了,这里改值,0硬币就可以投币,并将到vip判断的强制跳转更改到line37的大会员投币成功

    image-20240913160505650

    image-20240913160615121

    重新安装签名后,成功。(后来看到,这不算是强制跳转,强制跳转是将if语句改为goto(区别不大,不再来一遍了,继续往下)

    image-20240913160911467

第三关重现

  1. 启动时的3s广告(这属于activity类的广子)

    (1)不推荐的用法:

    用算法助手辨析到对应的一整串名字后,搜索xml文件,将主activity直接修改到第三关的activity,这样一打开就会直接进入

    image-20240914164510710

(2)修改停留时长

这是开屏广告的activity

image-20240914164816093

搜索AdActivity

image-20240914164930380

找到对应的方法

把代码扒下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

// Decompiled by Jadx (from NP Manager)
//
package com.zj.wuaipojie.ui;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
import com.zj.wuaipojie.ui.AdActivity$.ExternalSyntheticLambda0;
import kotlin.Metadata;

@Metadata(d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0002J\b\u0010\u0005\u001a\u00020\u0004H\u0002J\u0012\u0010\u0006\u001a\u00020\u00042\b\u0010\u0007\u001a\u0004\u0018\u00010\bH\u0014¨\u0006\t"}, d2 = {"Lcom/zj/wuaipojie/ui/AdActivity;", "Landroidx/appcompat/app/AppCompatActivity;", "()V", "jump", "", "loadAd", "onCreate", "savedInstanceState", "Landroid/os/Bundle;", "app_release"}, k = 1, mv = {1, 7, 1}, xi = 48)
/* compiled from: AdActivity.kt */
public final class AdActivity extends AppCompatActivity {
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(2131427363);
loadAd();
}

private final void jump() {
startActivity(new Intent((Context) this, ChallengeThird.class));
finish();
}

private final void loadAd() {
new Handler().postDelayed(new ExternalSyntheticLambda0(this), 3000);
}

/* renamed from: loadAd$lambda-0 */
private static final void m0loadAd$lambda-0(AdActivity adActivity) {
adActivity.jump();
}
}

大致解释一下逻辑:

由于 onCreate 是 Android 活动生命周期的一部分,它并不需要在代码中手动调用。Android 框架会自动调用 onCreate 方法来初始化活动。–来自gpt

  • 调用oncreat先调用父类的初始化方法,然后布置布局文件,再调用loadAd方法,这个方法创建的控制器(可能是这个名字?,没学过Java,暂时这么认为),3000ms后调用下一个名字怪怪的方法,再走到jump方法,开启新的活动,终结当前活动。

  • 把3000改为0即可。(要在smail语言中改)

    现在一进去就是这个了,看不到3s的过屏广告。

    image-20240914172046960

另:突然想起activity记录可以用mt管理器直接获取,比用开发者助手拼手速强。

  1. 清除后续弹窗

    算法助手傻瓜式操作,且需要在环境中一直开着,迁移性低且简单,不再赘述。

  • 资源定位找到这里

    image-20240914173154863

后续忘记了,再去看一眼视频。。。

回头补第一个,可以直接根据程序内部的选择选项来跳转到thirdacitivty:

  • 去class.dex里搜索!!!!(看了一遍又忘了去哪儿搜索了,又回头看的)搜索类名(别复制成main了,问就是复制错了一次,发现找不到重改的)

    从adactivity里复制最后一条(类的smail路径代码)

image-20240914175016631

复制下来以后选择搜索代码,由于要选择调用它的,所以排除上面那俩多的,最终只剩一个结果(转成java需要vip,含泪换np,留下贫穷的泪水:cry:

image-20240914175101271

转成java后看的很明确,就是这一堆选择,改到third就好。

image-20240914175856395

根据跳转逻辑找到这里,把名字改了就

image-20240914180043290

改成ChallengeThird,测试一下,确实没有ad的那个广告了(而不是0ms看不到顺闪)

image-20240914180259201

好奇后续的广告弹窗都叫dialog,查了查

弹窗又称为对话框,是App与用户进行交互的常见方式之一。弹窗分为模态弹窗和非模态弹窗两种,两者的区别在于需不需要用户对其进行回应。 模态弹窗会打断用户的正常操作,要求用户必须对其进行回应,否则不能继续其它操作行为;非模态弹窗则不会影响用户的操作,用户可以不对其进行回应,非模态弹窗通常都有时间限制,出现一段时间后就会自动消失。

非模态弹窗一般被设计成用来告诉用户信息内容,而模态弹窗除了告诉用户信息内容外还需要用户对其进行功能操作。

来自Android 四个对话框区别(Toast、Dialog、Actionbar 和 Snackbar) - 一朵小红花儿 - 博客园 (cnblogs.com)

这里的就被设计为模态弹窗,不允许干别的。。

从算法助手里找到对应的调用堆栈,查看相应的内容进行分析,下面都是各种方法,要用方法查询。

image-20240914200031991

根据方法名搜寻到后,一下是java代码,根据java去看smail代码,

image-20240914201700267

将这两个dialog的show函数去掉

image-20240914201727898

image-20240914201759971

点进去检验,已经去掉。

  1. 去除挡着的横幅(这里也就是一个置于最顶层的图片)

    用开发助手的布局查看,复制其id

    image-20240914202803592

资源定位找到名字?(原视频没有这一步,但是我寻思之前查图片,使用这里的资源定位),嘶记混了,图片就是查xml,这里是改文字的。。。。。

image-20240914203001849

资源id搜索到这个xml

image-20240914203151027
下面这行代码可以让图片/文字隐藏,用这个,或者将图片宽高改为0dp。

1
android:visibility="gone"

成功

image-20240914203638371

第四关重现(太长了,跟着做的)

给安装包赋予debug权限

1
android:debuggable="true"

密钥错误的提示找到这里

image-20241011104203575

找到对应的判断。

debug得到密钥

debug的启动方式:

1
adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity

adb shell am start -D -n
adb shell am start -D -n 包名/类名
am start -n 表示启动一个activity
am start -D 表示将应用设置为可调试模式

包名:

image-20241011105012937

启动类名:

image-20241011105201129

启动debug模式后

image-20241011105353381

点调试后找不到对应的进程,可能安装包不一致,尝试一下

还是不行,看评论区,自行安装一个adb。。。

image-20241011110019097

安装了一个新的,还是不行(原来不是最新的),官网下载了一个最新的,然后重启jeb,显示出来了。

调试步入后在这里找到,按理说它应该是返回的v0,在函数的外面就能看到,但是这里显示不出来,去里面看的结果。(说是虚拟机与真机的区别。。)(虚拟机会有些奇奇怪怪的bug)

image-20241011114014227

密钥正确(v)

image-20241011114217973

log插桩。感觉不难,先写写作业,有时间再试一次。

1
invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V

先根据文字找到对应的判断,然后判断知道是ChallengFourth这个类,找到check方法,跳转过去,找到执行结果,插桩。

image-20241018191551204

那个一直报错,一细看,插错位置了。。。改到正确的位置,还是报错

image-20241018195450625

改成两个v0,可以保存,但是进去会闪退;

再回去改,弄成一个v0,这次没事了???(怀疑是classes2没有正常载入)

image-20241018200634573

注意,算法助手需要联网才能正常捕获日志。。。(怪不得重试了好几次都没有日志)

成功。

image-20241018201228243

image-20241018201146632


初学安卓逆向(课是关卡+1)
https://xyyr-c.github.io/2024/10/23/初学安卓逆向/
作者
xyyr
发布于
2024年10月23日
许可协议