反编译技术完全解析

article/2025/9/11 20:44:28

1.前言

作为一个Android 程序猿,如果没有反编译过别人的apk,那有可能你是个假的程序猿~我们反编译别人apk可能是想看看别人优美的界面是怎么写的,或者是去获取别人的资源文件,又或者是看看某个功能是怎么实现的。记得在大学里,参加一个软件创新大赛,当时缺少图片素材,只好无奈去反编译apk获取。

2.反编译工具

  • ApkTool : 将apk文件反编译成smali文件和资源文件等,生成一个文件夹,同样,也可以将这个文件夹生成apk文件。

    下载地址: http://ibotpeaches.github.io/Apktool/install/

  • dex2jar : 把dex文件转成jar文件

    下载地址:https://sourceforge.net/projects/dex2jar/files/

  • jd-gui : 将jar文件转换成java代码,可以更好的阅读代码

    下载地址:http://jd.benow.ca/

3.准备工作

我们准备一个反编译所需要的apk文件,这里我自己写了一个

这里写图片描述
登录功能一般是应用的入口,如果我们没有用户名和密码就进不去。

看到这里,大家可能想笔者肯定是想通过反编译来实现绕过登录功能。

错了,笔者今天重点要介绍的是如何通过反编译在这个登录页面添加一个View并实现相应的功能。附带内容:

  • 反编译实现更换应用图标
  • 反编译实现添加资源文件
  • 反编译实现添加View并实现点击事件
  • 反编译实现修改功能
  • 用ApkTool工具重新打包应用

一.反编译实现替换应用图标

1.通过apkTool工具将apk反编译生成一个文件夹。

进入cmd下切换到apktool目录下,输入apktool.bat d D:\apkTool\test.apk,会在apktool目录下生成一个test文件夹,如下是test文件夹的内容:(res:资源文件、smali:跟汇编类似的机器代码,如果需要添加四大组件,则需在AndroidManifest.xml下添加声明)

这里写图片描述

2.在生成的这个目录里找到res文件夹,进去后你会发现跟我们eclipse或as工程下的res文件夹结构一样,然后在对应目录下将应用图标换掉即可。(注意:图片格式一定要和原图片格式一样,不然会有莫名的错误)

二.反编译实现添加资源文件

比如我们想在strings.xml下添加一个字符串并在代码中引用,大家可能就说这个简单呐,在strings.xml里加上一个字符串声明,然后在smali文件中引用就好了,然后编译成smali文件时候,啪,报错了,打包成apk不成功,那么正确的做法是什么呢?

1.在res/values/strings.xml里添加一个字符串,如下:(笔者添加了一个注册)

这里写图片描述

2.在res/values目录下找到一个public.xml文件打开,找到最后一个String类型的一条,如下图一所示,它的id为0x7f060024,这些id是系统自动生成的,那么我们添加一个字符串就需要在这里手动生成一个id并且这个要唯一,默认在最后一个string的id加1就行,如下图二所示:(注意:name要和strings.xml声明的name一致)

图一:
这里写图片描述

图二:
这里写图片描述

3.在smali文件夹下根据包名去找到R文件,如下图一,其中R$string.smali的美元符号 表示内部类的意思。在string.smali文件里添加一条,如图二。

图一:
这里写图片描述

图二:
这里写图片描述

三.反编译实现添加View并实现点击事件

如我们想在登录界面添加一个注册按钮,那该怎么添加呢?

1.在res/layout/activity_main.xml里添加一个按钮,如下:

这里写图片描述

2.在res/values/ids.xml里添加声明,如下:

这里写图片描述

3.在res/values/public.xml里找到最后一条id的条目,添加一条记录,并且id要唯一,如下:

这里写图片描述

4.在smali文件夹里根据包名找到R文件,在R的id.smali文件下添加声明,如下图,到此所有的准备都做完了,下面就是修改smali文件添加这个注册按钮的点击事件。

这里写图片描述

5.在smali文件夹里根据包名找到MainActivity.smali文件,打开它,然后搜索onCreate,如下图一,我们可以看到findViewById这个字眼,我们可以跟着写,对新加的按钮设置文字,如下图二,在这里,一定要注意寄存器的使用,一不小心就出错了,如果不懂smali语法的,可以回头看一下smali语法整理

图一:
这里写图片描述

图二:
这里写图片描述

设置完文字后,接着就可以开始设置注册按钮的功能了,如下图,这里点击事件是直接跳转另外一个页面,MainActivity$1是一个内部类,onclicklistener的实现类。

这里写图片描述

4.反编译实现修改功能

如果我们想绕过登录直接进入应用,那么此时我们肯定想到去改登录逻辑,打开MainActivity.smali文件,搜索setOnclickListener,可以看到就是登录按钮设置的点击事件,但是登录的逻辑呢?在MainActivity$1.smali文件中,找到onClick方法中关键部分,笔者加上了注释,如下图:

这里写图片描述

那么我只要把跳转的逻辑搬到cond_0那里不就ok了嘛,我们试试:

这里写图片描述

5.用ApkTool工具重新打包应用

上面都是在修改资源文件,修改smali文件,我们改完怎么看效果呢?这个时候,就需要用强大的ApkTool工具重新打包应用了,在cmd下进入ApkTool目录,输入:apktool.bat b -f D:\apkTool\test(D:\apkTool\test这个目录是之前反编译生成的目录),如果我们修改没问题的话,就会在test目录下生成一个文件夹dist,在该文件夹里就是反编译后生成的apk文件。

这里写图片描述

此时,你肯定长叹一口气,我滴神呐!终于反编译完成了!

老铁,且慢,这时生成的apk还是不能用的,因为这是裸包,还没签名,系统是不会让你装的。

那么我们开始签名吧,怎么签名呢?同样还是用ApkTool工具,在cmd下进入ApkTool目录,输入:jarsigner -verbose -keystore 签名文件路径 -signedjar 签名后apk的路径 未签名apk的路径 签名别名,如下图:

这里写图片描述

这里写图片描述

签名完成后,我们安装已签名的apk,看看运行结果,是不是达到了自己想要的效果。

这里写图片描述

到此,smali反编译方法就讲完了,相信大家会有一点点的收获!如果大家觉得这篇博客对你有用的话,麻烦给笔者点个赞!谢谢大家的支持!

若大家有不懂的,欢迎留言讨论,笔者会在第一时间回复!


http://chatgpt.dhexx.cn/article/a254Ti4X.shtml

相关文章

idea反编译

1、问题描述 只有jar包,反编译下,看几个配置; 2、问题说明 用的idea里面的插件,java Decoplier,可以反编译jar包,效果挺好的,反编译出来的.java没乱码,可以直接看; 2…

超详细!apk安装包快速反编译,多种反编译及失败的解决方案(包含classes.dex的反编译,新增加快速反编译)

如要转载,请贴出原地址:https://blog.csdn.net/Nobody_else_/article/details/83996441 众所周知,我们开发所用的手机App安装包都是apk文件,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件供用户安装&a…

反编译与反汇编

反编译做的就是编译的相反动作。举例来说,例如一个程序用C语言来写,写完之后要编译成CPU可以识别和运行的机器代码,也就是生成EXE程序。而反编译是反过来,把EXE反编译成编程源代码,也就是C程序,不过一般反编…

VS的反编译

痛点: ● 在使用系统库或者第三方库遇到问题,感觉自己写的没问题,怀疑源码有BUG,非要钻牛角尖 ● 求知欲旺盛,很想知道别人的代码怎么实现的 ● 反编译工具安装难,源码定位难(主要是懒) 其实宇…

Android如何防止apk程序被反编译

作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。 Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹 proguard是…

反编译基础知识

!!! 严正声明 本文相关反编译技术仅限于技术研究使用,不能用于非法目的,否则后果自负. 1. apktool 逆向APK文件的工具 官方网站 apktool主要用于逆向apk文件,可以将资源解码,并在修改之后可以重新构建它们.它还可以用来重新构建apk. 1.1 功能 将资源解码成近乎原始的形式…

Android安全攻防战,反编译与混淆技术完全解析(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/49738023 之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情。不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能&…

通知(Notifications)

通知(Notifications) 如需转载,请注明地址http://blog.csdn.net/carrey1989/article/details/9027585 我们可以通过notification来在应用UI之外的地方来向用户展示信息。当你告诉系统来发布一个notification的时候,系统会首先在notification area里展示一…

解读Notification

综述 status bar notification添加一个图标(和一条可选的ticker-text消息)到系统的status bar(状态条),并且显示一个notification message(通知消息)在系统的notifications window(消息窗口)中。当用户选择了消息窗口中的一条消息,Android系统就发出一个…

Android-自定义Notification

Android-自定义Notification 2014年4月26日 消息栏的消息,想必各位Android发烧友很清楚知道是什么,比如我们下载了一个应用,它可能会定时推送些消息到我们的手机中,比如微信消息送达的时候,可能会在通知栏显示。本博文…

notification新旧用法 notification builder

api 11 版本之前: //显示通知信息protected void showNotification() {NotificationManager notificationManager (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Notification notification new Notification(this,R.drawable.ic_launche…

Android Notification 详解

下图是我对 Notification 做的思维导图,也是本文的主要逻辑。 本文主要讲述 Notification 的基本操作部分,进阶部分的内容还在学习ing~ Notification 概述 Notification,是一种具有全局效果的通知,可以在系统的通知栏…

Android Notification

日记月累第四天。发现做事情坚持真的很重要,其实我今天都有点凌乱了,不想记录了,在坚持一下吧,毕竟才第四天。今天对昨天同事所说的Notification进行了一下温故今天主要是拿来主意,明天代码实践。今天公司又有同事分享…

HTML5 桌面通知:Notification API

Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息。该通知是脱离浏览器的,即使用户没有停留在当前标签页,甚至最小化了浏览器,该通知信息也一样会置顶显示出来。 用户权限 想要向用户显示通知消息&#xf…

Android自定义Notification

Notification是一种让你的应用程序在不使用Activity的情况下警示用户,Notification是看不见的程序组件警示用户有需要注意的事件发生的最好途径。 作为UI部分,Notification对移动设备来说是最适合不过的了。用户可能随时都带着手机在身边。一般来说&…

Notification-通知

Notification-通知 通知是一种消息,这种消息呈现在应用UI之外,通过通知可以对用户进行提醒、可以和其他用户收发信息等。通过点击通知,可以唤起app页面或者直接在通知上执行一些操作。下面介绍通知的一些常用用法。 展示一条普通通知 先来…

全面解析Notification

Notification在Android中使用的频率可以说是非常高的,本篇博客,我将围绕着Notification的各方面进行解析,使大家对Notification有更好的认识。 Notification的使用步骤 1.获取NotificationManager NotificationManager mNotificationManager = (NotificationManager) get…

Android Notification使用

Android 通知栏适配 前言正文一、Android中通知的变化1. Android 4.1,API 162. Android 4.4,API 19 和 203. Android 5.0,API 214. Android 7.0,API 245. Android 8.0,API 266. Android 12.0,API 31 二、创…

Android之Notification的多种用法

我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问题的。 我们也知道Android系统也是…

Android--通知之Notification

前言 之前一篇博客讲了Android下使用Toast的方式提示消息。这篇博客讲解一下在Android中使用Notification提示消息给用户,Notification是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。在本篇博客中,将介绍…