安卓逆向学习笔记之分析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,我感觉有点大材小用吧,另外别人写过的东西,我再去写就有点不好了。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/109508029
- 点赞
- 收藏
- 关注作者
评论(0)