安卓逆向学习笔记之分析AliCrackme_1

一个2015年初级练手 Crackme,因此很简单,但是很有趣,因此记录一下。样本链接地址:

https://pan.baidu.com/s/1PD_5K_gkT0FzBU8UhZb5bg 提取码: ea25

安装软件并打开,随便输入一个字符串,点击登陆:

将 apk拖入到 jadx,并搜索上面的字符:

发现啥也没有,既然是 Crakeme,那我们就先看看它的 MainActivity 吧:

我们的目的是要验证OK,即经过处理后的 输入的字符串 与 这个 pw相等才行:

这段代码的意思很清晰,一个table,一个pw,处理输入的字符串函数有传递 table进去,说明肯定与之有关,我们分别来看看 table和pw是啥吧:

原来与这个logo.png有关:读入图片,然后复制图片的部分内容,并经过UTF-8解码,分别保存到table和pw。

System.arraycopy由搜索引擎得知参数定义如下:

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)

 src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,destPos表示目标数组要复制的起始位置,length表示要复制的长度。

虽然

虽然暂时不知道table和pw是啥,但是可以猜出来,768 / 256 = 3,一个utf-8编码后的汉字刚好占三个字节,也就是256个汉字,打开assets目录,确实有个png文件。

根据JAVA的代码,用Python写个程序看看复制的到底是啥内容:

with open("logo.png",'rb') as fp:
    data = fp.read()


table = data[89473:89473+768].decode("utf-8")
print (table)

果然是一些汉字,那 pw也看看是啥吧:

是这么个字符串。根据代码逻辑,输入的字符串经过处理后与pw("义弓么丸广之")相比较,如果相等则弹出成功的对话框,否则验证失败,因此我们来看看 这个处理函数吧:

很简单的一个处理函数,就是对输入的字符串先转为byte类型,然后依次作为索引取table数组里面的值,再返回一个字串。这个返回的字串如果与pw相等则验证成功。有了这个逻辑,再写出逆向索引的代码很容易:

with open("logo.png",'rb') as fp:
    data = fp.read()
    
table = data[89473:89473+768].decode("utf-8")
pw = data[91265:91265+18].decode("utf-8")


pwd = ''.join([chr(table.index(ch)) for ch in pw])
print (pwd)

结果是:581026,输入这个字符串试试:

弹出了破解成功的对话框,至此,破解该Crakeme成功。

当然,获取table和pw也可以用frida来Hook,我感觉有点大材小用吧,另外别人写过的东西,我再去写就有点不好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值