android逆向安全技术大全,Android逆向系列(一):初探Android逆向

这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法。

谨此以本文开始记录我的Android逆向之旅吧。

总述

习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场,而我认识的逆向就从这个apk开始(逆向分为多种逆向,为了避免混淆概念这里的逆向暂且就特指apk的逆向)。

工具准备

工欲善其身,必先利其器。这句话放到逆向对工具的描述上来说再适合不过。

92ca07dc702cde679bfe95aa6888c39d.png

反编译代码的工具下载:

反编译资源的工具:

APKTool: 本文重要工具,APK逆向工具,使用简单下载地址: http://ibotpeaches.github.io/Apktool/install/

这里简单介绍下大概流程,首先把后缀为.apk的文件改为.zip的一个压缩文件,方便解压。dex2jar和jd-gui配套使用,用于逆向代码部分,APKTool用于逆向res文件夹下的图片布局等部分。

.apk 修改成.zip文件解压后的目录树长这样:

6e3a860e800a3fce1c855877c601044f.png

这里也贴上源码,很简单就一个输入框和一个按钮,输入框内输入“2018”点击按钮即可跳转到另外一个界面,否则提示一个Toast “验证码错误!”,而我们要做的就是突破这个“2018”,绕过验证。

02c4a595ee4dec881c1ab7297e7e7c4e.png

反编译代码部分

需要用到的是dex2jar包里面的三个文件(当前是在windows环境下,Mac环境用对应的.sh文件):

d2j_invoke.bat

d2j-dex2jar.bat

lib

将这三个文件复制到一个空的文件夹内,将刚才.apk解压后的classes.dex文件也一起复制到这里。如图:

cc616b68da05029584bd796452c58702.png

Windows cmd到这个文件夹下 输入:d2j-dex2jar.bat classes.dex

Mac 到这个文件夹下 输入:sh d2j-dex2jar.sh classes.dex

如此之后在这个目录里会生成一个classes-dex2jar.jar文件。如图:

888c95cd6baa7a0b78e6a6e5affdd79c.png

这个时候就轮到JD-GUI工具出手了,运行jd-gui.exe File–OpenFile–classes-dex2jar.jar 打开刚才生成的jar文件。就能很清晰的看到我们想要的代码了,如图。

7f659c52bd051005fa37111255926aaa.png

反编译res资源部分

apktool下载后会有两个文件,一个.jar(例如apktool_2.3.3.jar 需要把名字改成apktool.jar) 一个apktool.bat 。(这两个文件在这里下载,如图:)

03beb04a1c49384d9400ba80d9d55203.png

同刚才一样在cmd命令下进入刚才文件夹(同样可以新建一个),连同我们刚才那个后缀为apk的安装包一起放入,输入如下命令:

apktool d app-release.apk   此处app-release为apk名称

得到一个新的app-release(对应apk名称)文件夹。流程如图:

40b2f4e391c9ff0ea4298c4be2901c35.png

0b9a05e6395211f045a68fd2141fe2c5.png

这个app-release文件夹下会得到若干文件,主要内容介绍如下:

AndroidManifest.xml:描述文件

res:资源文件

smail:反编译出来的所有代码,语法与java不同,类似汇编,是Android虚拟机所使用的寄存器语言

到此我们想要的都有了。下一步就是实现我们想法的时候了。

修改原代码逻辑

在刚才的JD-GUI中可以看到跳转的逻辑判断如下:

public void onClick(View paramAnonymousView)

{

if (MainActivity.this.code.getText().toString().trim().equals("2018"))

{

paramAnonymousView = new Intent(MainActivity.this, SuccessActivity.class);

MainActivity.this.startActivity(paramAnonymousView);

return;

}

Toast.makeText(MainActivity.this, "验证码错误!", 0).show();

}

我们只需要修改if后面的判断条件,设置为否即可if (!MainActivity.this.code.…),这样就成功绕过了条件约束。

Δ 接下来还有一部很重要那就是修改smali文件,找到MainActivity$1.smali这个文件用代码查看工具打开,如图:

6ea6cfda4085c679c99ff2d3d56ec16b.png

找到这个if-eqz 修改成if-nez (nez对应为非,符号“!”),到这里要修改的部分都成功了,最后一步要做的就是重新打包了。

重新打包

在apktool文件夹路径的cmd下输入:

apktool b [文件夹] -o test2.apk   (test2为新apk名称,[文件夹]为对应的有修改需要打包的文件夹)

例如:我当前就可以这样写  apktool b [F:\tools\apktool\app-release] -o test2.apk

9eca662cb9a9c2784a2f52195bf1ebe9.png

至此,我们的目标apk文件已经生成,当然如果你想装到你自己手机上还需要重新签名一下。

重新签名

首先我们需要一个用于签名的.keystore文件,生成命令如下(这里我们假设生成的是demo.keystore)。

keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

(cmd到apktool文件夹下跟待签名的apk放同个文件夹内便于操作)

这里我们利用Java JDK提供的一个jarsigner进行签名,在刚才的cmd下继续操作,输入:

jarsigner -verbose -keystore demo.keystore test2.apk demo.keystore

168a64120aa6033d5a58784748310fc8.png

以上。我们目的apk已经可以投入使用,如果需要更快更好的体验还需要进行一次字节对齐的操作(后续分析)。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值