ISCC Android Crackme

此为2013年ISCC的一道移动题,相对简单的题,懂点 ARM 指令就差不多了。对于新入手安卓逆向可以做做看来练手。要求是注册为企业版程序。以下分析是建立在伪代码基础上,然后分析修改点,修改ARM汇编。

题目下载:APP

通过反编译代码简单查看功能逻辑,首先是从onCreate函数开始,函数一开始就调用了MyApp的m变量,查看对应的反编译代码。

1556518317348

MyApp是一个native方法的调用,调用了三个方法。

分别是initSN()、saveSN()、work()。并且执行了initSN方法,因此函数应该是注册码的对比和效验功能。

1556518441133

然后在回到以上的代码执行,点击按钮“执行功能”,进入toast弹出界面,通过判断m值来执行是否触发注册方法,默认为0触发,如果注册成功则调用work()函数来做执行功能。查看doRegister,点击确认后,程序进入com.bfs.crackme1.RegActivity类下,

1556519314726

方法判断是否输入注册码,调用saveSN来保存输入的注册码,然后弹窗关闭自身线程。到此,也基本确认了initSN的方法和上文判断一致。

1556520139524

看完基本的Java层函数现在来看so文件的相关代码实现和流程。

查看so的一些函数表,可以看到定义了JNI_Onload,Java层执行System.loadLibrary()后,将执行此函数。同样从函数表中可以看出加密处理为MD5。查看JNI_Onload做了什么处理。

1556520638909

查看伪代码,使用RegisterNatives实现JNI,而RegisterNatives是来做什么处理的,可以查看如下文章:

JNI:使用RegisterNatives方法传递和使用Java自定义类

而此处的作用基本可以看到是用来自定义函数命名,不然native中的函数名为Java_com_bfs_crackme1_MainActivity_initSN这种类型,下面只有n1、n2、n3来代替以上方法。

1556520977389

查看n1方法,读取sdcard下的reg.dat文件,来进行MD5效对,要求进行企业版注册,能看到的是注册成功将使用setValue进行对v1的赋值,其中按照MainActivity文件中的判断,猜测3为企业版MD5值。

1556522659413

n2则为如下,读写的形式来对reg.dat 进行重写。

1556524534479

work函数则为如下:

1556525011606

至此,函数名则分析清楚,n1对应initSN,n2对应saveSN,n3对应work。根据函数流程可以大概猜出判断行为:n2保存来自输入的参数的MD5->n1读取参数进行对应是否为注册值->注册成功则set到内存一个值->由work来读取这个值判断注册是否成功以及功能执行。

所以理论上说,patch点有如下处:

1、修改reg.dat为企业版的注册码,修改Java层代码让其不走注册函数。

2、解密MD5值,直接输入注册

3、修改n1,让其返回值永远为3

4、修改work函数获取的v2值。

修改时,发现第一种并不行,Java层参数值修改后,可能n2做了其他相关处理,第二种是可行,毕竟都获取到了注册码,但需要解密成功,此MD5只是简单的32345678。

第三种修改n1:

输入肯定为错误或者不输入值,因此只需要修改值为空或者其他未知情况下的返回值。

.text:0000133C                 CMP     R0, #0
.text:00001340                 MOVEQ   R1, #4
.text:00001344                 MOV     R0, R7
.text:00001348                 MOVNE   R1, R8

修改为:

.text:0000133C                 MOV     R0, #3
.text:00001340                 MOVEQ   R1, #3
.text:00001344                 MOV     R0, R7
.text:00001348                 MOVNE   R1, R8

让其在未输入的情况下返回企业版的返回值。修改编译安装后,打开即为企业版。

第四种修改work:

.text:000014A0 10 40 2D E9                                     STMFD   SP!, {R4,LR}
.text:000014A4 00 40 A0 E1                                     MOV     R4, R0
.text:000014A8 6F FF FF EB                                     BL      n1
.text:000014AC 04 00 A0 E1                                     MOV     R0, R4
.text:000014B0 35 FF FF EB                                     BL      getValue
.text:000014B8 00 00 50 E3                                     CMP     R0, #0

增加一条指令,修改为:

.text:000014A0 10 40 2D E9                                     STMFD   SP!, {R4,LR}
.text:000014A4 00 40 A0 E1                                     MOV     R4, R0
.text:000014A8 6F FF FF EB                                     BL      n1
.text:000014AC 04 00 A0 E1                                     MOV     R0, R4
.text:000014B0 35 FF FF EB                                     BL      getValue
.text:000014B4 03 00 A0 E3                                     MOV     R0, #3
.text:000014B8 00 00 50 E3                                     CMP     R0, #0             

这样达到从getvalue获取返回值后,重新修改v2的值为3,让其无论什么情况下都自动判断为已注册企业版。

网上其他的分析文章,同样是修改n1函数,只不过修改方式是同时修改几个mov语句,让其都赋值3来跳转判断。

详细文章:简单Android CrackMe分析





# Android逆向  

tocToc: