【Android论文栏目提醒】:网学会员Android论文为您提供Android Apk解密工程初探(4)-- Bao力破解与简单逆变换 - 软件工程参考,解决您在Android Apk解密工程初探(4)-- Bao力破解与简单逆变换 - 软件工程学习中工作中的难题,参考学习。
Android Apk解密工程初探4-- Bao力破解与简单逆变换 全文的Bao均为暴由于Bao力这个词存在所以不让发布只有这样改着---⊙⊙b汗 这一节要解密的apk要求输入用户名和序列号如果匹配则通过Toast显示一个Lisence Correct 否则 则显示 Lisence Uncorrect 启动界面 错误的用户名和序列号 和前面的apk不同的是这个apk要求输入用户名和序列号且采用了前文的第三种序列号保护验证模式即采用了 F1用户名 F2序列号 1、通过Bao破破解程序 通常来说若F1、F2其一可逆转。
找出正确序列号的方法就是要找出这么一种F1或F2的逆变换。
若F1或F2函数比较简单找出逆变换写出注册机是可行的这也是很多cracker追求的解密方式且此方法不破坏原apk的完整性。
但有些时候为了追求迅速解密软件的序列号保护很多人会选择使用Bao破解。
Bao力破解的着手点在最终的比较代码上。
不管采用哪种序列号的保护验证模式最后必然会存在这么一种类似的比较的方式。
以伪代码贴出 if A 等于 B //验证正确 //do something else //验证失败 //do something Bao力破解的要点在于修改判断语句的条件。
把“等于”改成“不等于”或者是把“不等于”改成“等于”。
那么此时随便输入错误的用户名和序列号就能进入到“验证正确”的板块去从而成功的注册软件。
在汇编语言中Bao力破解也是类似的原理。
je或jz //相等则跳机器码是74或84 jne或jnz //不相等则跳机器码是75或85 常见的修改就是把对比部分的机器码中74改成75或者84改成85在反编译的smali文件中也是类似的。
相等比较符号在smali中的表示 符号 smali语法 Bao力破解修改 if-eq if-eq改成if-ne if-ne if-ne 改成 if-eq equals if-eqz if-eqz改成 if-nez equals if-nez if-nez 改成if-eqz Bao力破解CrackMe-F1F2的过程 1、使用apktool反编译CrackMe-F1F Apk程序得到反编译后的文件。
2、在smali源码中找到判断比较的入口修改判断条件。
//若不相等则跳转到cond_4此处就是密文的比较 .line 80 if-ne v2 v3 :cond_4 .. //cond_4处使用Toast显示Lisence Uncorrect :cond_4 .. const-string v7 Lisence Uncorrectuff01 ?? invoke-virtual v6 Landroid/widget/Toast-showV 我们就是把上面的 if-ne v2 v3 :cond_4 修改成 if-eq v2 v3 :cond_4 至此该apk序列号Bao力破解的核心步骤就完成了。
3、使用apktool和signapk打包并签名apk。
4、上传到虚拟机中测试。
使用adb push到虚拟机中进行测试随便在用户名和序列号输入框中输入任意的非正确组合均能显示“Lisence Correct”。
如下图 2、逆变换—写出注册机 阅读F1和F2函数的smali代码就不再重复了这仅仅需要的是耐心因为反编译出来的smali代码多跳转也多相对比较难读不过比汇编还是容易读懂一些。
下面列举此apk使用的两个F1F2函数的JAVA代码。
完成其一函数大的逆转来帮助我们完成这个apk的注册机。
F1、F2函数 //F1函数部分s1为输入的用户名 1 int i 0k1 0 2 char ch 3 for i 0 i Z ch - 32 8 k1 k1 ch 9 10 k1 k1 0x5678 //F2函数部分s2为输入的序列号 1 int k2 0 2 for i 0i s2.length i 3 4 ch s2.charAti 5 ch – 48 6 k2 k2 10 ch 7 8 k2 k2 0x1234 原apk就是这样若k1k2那么验证成功否则验证失败。
可以看出 F2函数的循环部分仅仅是把序列号s2从字符串转换为整型存于k2中此处的k2我们成为k2序列号。
最后做异或运算从而得出密文覆盖于k2中此处的k2成为k2密文。
在异或运算中若存在 c a xor b 对应到F2函数中的最后一步即 k2密文 k2序列号 xor 0x1234 则ac xor b 对应着k2序列号 k2密文 xor 0x1234 也就是说通过 密文 xor 0x1234 就能得到序列号 在F1函数的结果也就是密文。
所以注册机的写法也就出来了把F1的结果 xor 0x1234就是对应用户名的正确的序列号。
注册机的核心代码 1 int i 0 2 int k3 0 3 char ch 4 for i 0 i s1.length i 5 6 ch s1.charAti 7 if ch A break 8 if ch Z 9 ch - 32 10 k3 k3 ch 11 12 k3 k3 0x5678 0x1234 //s1为用户名k3为根据s1算出来的正确的序列号单独写一个注册机然后通过注册机计算”Ethan”的序列号正确序列号为17724验证通过。
正确的用户名和序列号 原apk放于共享资源中需要的请自行前往下载。