首发:https://sec-in.com/article/2269
作者:梦幻的彼岸
测试程序来源:https://github.com/num1r0/android_crackmes
本篇文章涉及工具:GDA
通过快捷按钮进入APK入口点进行分析,如下图所示:
这段代码定义了一个名为MainActivity的Android应用程序类,它继承自AppCompatActivity。此类中定义了两个私有字段,name和description,分别用于存储应用程序的名称和描述。MainActivity的构造函数中,对这两个字段进行了初始化。
follow_clicked方法用于处理点击事件,它尝试打开一个指向特定Twitter用户的链接。如果第一种方式失败,它会尝试使用另一种方式打开链接。
onCreate方法是Android应用程序的生命周期方法之一,在应用程序启动时运行。在这个函数中,隐藏了应用程序的ActionBar,设置了应用程序的布局,并设置了一个点击监听器,当用户点击'submit'按钮时,会执行MainActivity$1类的实例的onClick方法。
代码内容
这段代码是一个名为MainActivity$1的Java的匿名内部类,它实现了View$OnClickListener接口,这个接口是Android开发中用于处理点击事件的。
分析一下这个类的各个部分:
这里找到了关键判断方法getFlag,双击进入查看
这段代码定义了一个名为FlagGuard的Java类,它具有以下功能:
又看到关键点了用来判断并输出内容,思路,更改判断不输出null,或查看getData方法涉及内容以查找对比的字符串很多概率就是flag
现在修改位置右键点击切换代码功能
smail代码
这里两个思路一个是NOP填充判断或修改判断指令将if-eqz修改为if-nez
两种修改思路都演示下
在要NOP的位置右键点NOP按钮
修改后的效果
此时按r键保存修改
点击OK进行之后的安装测试步骤
选择链接的设备
安装完毕
输入测试
弹出了flag
因之前NOP填充过,此时需要恢复DEX数据重新加载
恢复并重新加载后
在要修改的位置按M进入修改模式或右键修改指令功能
回车确定修改后的效果
这里解析下
if-nez: 对比如果不相等则跳转
if-eqz: 对比如果相等则跳转
这里修改为if-nez后达到输入错误的flag导致对比不先等以输出内容的目的
保存安装测试
同样获取到flag
getData位置双击
这是一个名为 Data 的 Java 类,它包含一个私有权限的 String 类型的变量 secret,以及两个公共方法:Data() 构造函数和 getData() 方法,但是,getData
方法并没有返回 secret
字段的值,而是返回了一个硬编码的字符串("s3cr37_p4ssw0rd_1337")。
前后分析,这个字符串就是对比的关键了
修改判断apk测试
看这样就是关键内容了,和正确的结果对比返回了错误的数据,
安装未修改apk验证
验证成功
同样的方法入口点查看
这里代码和之前类似就不讲解了
这里代码和之前类似就不讲解了
这段代码定义了一个名为 FlagGuard 的Java类。以下是对这个类的详细解析:
同样思路测试
轻松获得flag
这段 Java 代码定义了一个名为Data的类,位于com.entebra.crackme0x02.Data包中。该类有以下内容:
导入了一些所需的类:
java.lang.Object:继承自 Java 的基类Object。
android.content.Context:表示 Android 应用程序中的上下文对象,用于访问应用程序的资源。
java.lang.String:表示 Java 中的字符串类型。
验证
同样通过快捷按键进入
这段 Java 代码定义了一个名为 FlagGuard 的类。该类包含一个名为 flag 的字符数组,以及一个名为 generate 的私有方法。generate 方法的主要目的是生成一个字符串,该字符串基于输入的字符串 p0(在 getFlag 方法中使用)。
首先,代码导入了所需的类,如 Object、String、StringBuilder 和 android.os.Build$VERSION 等。
接下来,FlagGuard 类的构造函数创建了一个名为 uocharArray 的字符数组,并将其赋值给 this.flag。
generate 方法开始时,定义了几个整数变量,然后创建了一个名为 ointArray 的整数数组。接着,创建了一个名为 str 的字符串构建器,用于存储生成的字符串。同时,创建了一个名为 ointArray1 的整数数组,用于在后续的循环中进行操作。
在 if 语句中,检查 Build$VERSION.CODENAME 的长度是否大于 0。如果满足条件,将执行一个 while 循环。在循环中,对 ointArray1 数组的元素进行了一系列操作,如赋值、移位、相加等。这些操作的具体目的尚不明确,可能与生成字符串有关。
在另一个 if 语句中,如果输入字符串 p0 满足 Data 类的 isPasswordOk 方法,则调用 generate 方法生成字符串。
在 generate 方法中,首先检查输入字符串 p0 是否满足条件。如果满足,将执行一个 for 循环,遍历整数数组 ointArray,并将每个元素的值存储在 flag 数组中。最后,将 flag 数组拼接到字符串构建器 str 中,并返回结果。
总之,这段代码的主要目的是生成一个字符串,该字符串可能与密码验证有关。具体的生成逻辑涉及到一系列复杂的数学运算,但具体含义尚不明确。
总结:可修改判断或查看 generate 方法生成字符串或isPasswordOk内容
轻松获取flag
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2023-10-9 14:42
被梦幻的彼岸编辑
,原因: