零开始Android逆向教程(一)——初探Android逆向

摘要:
这一次,由于一些业务驱动因素,我开始研究一些与逆向相关的东西,并回顾了它们的一般内容。我发现这真的是一个新大陆,而且它与我之前听到和看到的一些表现并不相同,这确实印证了“起步难”这一说法。我想用这篇文章开始记录我的Android反向旅程。概述我们习惯于应用层开发。我们都知道,当一个应用程序上架时,它需要对程序进行编译、签名,并生成一个后缀为apk的文件,然后才能发布到应用程序市场。我知道的反向是从这个apk开始的(反向:

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

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

工具准备  
工欲善其身,必先利其器。这句话放到逆向对工具的描述上来说再适合不过。
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第1张

反编译代码的工具下载:

  • dex2jar: 把dex文件转成jar文件下载地址:https://sourceforge.net/projects/dex2jar/files/
  • jd-gui: 这个工具用于将jar文件转换成java代码下载地址:http://jd.benow.ca/

反编译资源的工具:

  • APKTool: 本文重要工具,APK逆向工具,使用简单下载地址: http://ibotpeaches.github.io/Apktool/install/这里简单介绍下大概流程,首先把后缀为.apk的文件改为.zip的一个压缩文件,方便解压。dex2jar和jd-gui配套使用,用于逆向代码部分,APKTool用于逆向res文件夹下的图片布局等部分。.apk 修改成.zip文件解压后的目录树长这样:
  • <ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第2张
  • 这里也贴上源码,很简单就一个输入框和一个按钮,输入框内输入“2018”点击按钮即可跳转到另外一个界面,否则提示一个Toast “验证码错误!”,而我们要做的就是突破这个“2018”,绕过验证。


<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第3张

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

  • d2j_invoke.bat
  • d2j-dex2jar.bat
  • lib将这三个文件复制到一个空的文件夹内,将刚才.apk解压后的classes.dex文件也一起复制到这里。如图:
  • <ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第4张
  • Windows  cmd到这个文件夹下 输入:d2j-dex2jar.bat classes.dex
  • Mac   到这个文件夹下 输入:sh d2j-dex2jar.sh classes.dex如此之后在这个目录里会生成一个classes-dex2jar.jar文件。如图:

<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第5张

这个时候就轮到JD-GUI工具出手了,运行jd-gui.exe  File--OpenFile--classes-dex2jar.jar 打开刚才生成的jar文件。就能很清晰的看到我们想要的代码了,如图。
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第6张

对照上面发过的主要代码,已经差不离十了,对于想要代码思路的我们来说,到这里已经基本可以摸透他的逻辑了。

反编译res资源部分
apktool下载后会有两个文件,一个.jar(例如apktool_2.3.3.jar 需要把名字改成apktool.jar) 一个apktool.bat 。(这两个文件在这里下载,如图:)
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第7张

同刚才一样在cmd命令下进入刚才文件夹(同样可以新建一个),连同我们刚才那个后缀为apk的安装包一起放入,输入如下命令:
apktool d app-release.apk   此处app-release为apk名称得到一个新的app-release(对应apk名称)文件夹。流程如图:
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第8张 <ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第9张

这个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这个文件用代码查看工具打开,如图:
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第10张

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

重新打包
在apktool文件夹路径的cmd下输入:apktool b [文件夹] -o test2.apk   (test2为新apk名称,[文件夹]为对应的有修改需要打包的文件夹)
例如:我当前就可以这样写  apktool b [F: oolsapktoolapp-release] -o test2.apk
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第11张

至此,我们的目标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
<ignore_js_op>零开始Android逆向教程(一)——初探Android逆向第12张

免责声明:文章转载自《零开始Android逆向教程(一)——初探Android逆向》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#操作MongoDB入门大数据系列(1)——Hadoop集群坏境搭建配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

软件工程知识点总结

软件的概念: 软件是计算机系统中与硬件相互依存的另一部份,是程序、数据、以及相关文件的完整集合。程序是事先设计的功能要求执行的序列。数据是使得程序能征程操作信息的数据结构。文档是程序开发,维护和利用的有关图文和材料。软件的表现形式分为有形和无形,软件的有形表现在软件的的文档、程序、代码、用户界面、输出表报、等。软件的无形部分表现在:软件的内部逻辑,是软件自...

关于.net调用com组件将word或exce转为pdf或html进行预览的问题整理

1.先贴代码(dll地址自己百度下载,名字叫做Microsoft.Office.Interop.Word.dll) / // <summary> /// 将word文档转换成PDF格式 /// </summary> /// <param name="source...

ASP.NET CORE中使用Cookie身份认证

大家在使用ASP.NET的时候一定都用过FormsAuthentication做登录用户的身份认证,FormsAuthentication的核心就是Cookie,ASP.NET会将用户名存储在Cookie中。 现在到了ASP.NET CORE的时代,但是ASP.NET CORE中没有FormsAuthentication这个东西,那么怎么做身份认证呢?答案...

ios真机调试时需要添加的UDID是什么?怎么获取?

很多开发者在真机调试测试ios应用时,会看到需要添加udid,搞不清这个是什么东西应该怎么获取。 udid就是手机的一个串号,相当于手机的身份证,具有唯一性。 下面介绍如何获取udid并添加到开发者中心后台。 有两种方式可以获取udid ios app真机调试到上架App Store完整教程 1、苹果手机助手获取UDID 如爱思助手,电脑下载爱思助手...

vue使用iframe嵌入html,js方法互调

前段时间 使用h5搞了个用cesium.js做的地图服务功能,后来想整合到vue项目,当然最简单的就是iframe直接拿来用了。但html和vue的方法交互就是成了问题,vue调用html种方法还好,尤其是html调用vue中的方法当初就没有解决,忙着项目上线直接搞了个setInterval不停轮询,哎不说他了;现在空点了来把问题解决了,俗话说得好闲时学来...

js scroll动画

知识点 1、window.scrollTo (x,y):可以把内容滚动到指定位置  scroll  scroll:卷动意思(书卷)  从上到下移动   1、window.onscroll 窗口滚动事件(必须有滚动条才可以触发) body{height: 5000px;} window.onscroll=function () {...