js逆向、安卓逆向教程
JS基础
提示信息 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
安卓逆向
1.模拟器环境搭建
Magisk 是一套用于定制 Android 的开源软件,支持高于 Android 5.0 的设备。
以下是一些功能亮点:
MagiskSU:为应用程序提供 root 访问权限
Magisk 模块:通过安装模块修改只读分区
MagiskHide:从根检测 / 系统完整性检查中隐藏 Magisk(Shamiko)
MagiskBoot : 最完整的安卓启动镜像解包和重新打包工具
六.安装步骤
1.到官网下载9.0模拟器,并安装
雷电安卓模拟器-手游模拟器安卓版_android手机模拟器电脑版_雷电模拟器官网
[更新!]适用于几乎所有安卓模拟器(7+)安装magisk的教程-简单无脑向
[更新!]适用于几乎所有安卓模拟器(7+)安装magisk的教程-简单无脑向 - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
(出处: 吾爱破解论坛)
2.下载配置文件
3.安装面具
2.初识APK文件结构、双开、汉化、基础修改
apk 全称 Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为zip即可解压。
文件 | 注释 |
---|---|
assets目录 | 存放APK的静态资源文件,比如视频,音频,图片等 |
lib 目录 | armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件 |
META-INF目录 | 保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改) |
res目录 | res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计 |
AndroidMainfest.xml文件 | APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息 |
classes.dex文件 | classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑 |
resources.arsc文件 | resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源 |
2.双开及原理
双开:简单来说,就是手机同时运行两个或多个相同的应用,例如同时运行两个微信
原理 | 解释 |
---|---|
修改包名 | 让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP |
修改Framework | 对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开 |
通过虚拟化技术实现 | 虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间 |
以插件机制运行 | 利用反射替换,动态代{过}{滤}理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp |
选择apk共存
3.汉化APK
汉化:使用专门的工具对外文版的软件资源进行读取、翻译、修改、回写等一系列处理,使软件的菜单、对话框、提示等用户界面显示为中文,而程序的内核和功能保持不变,这个过程即为软件汉化
基本上字符串都是在arsc里,建议一键汉化,然后再润色。
少量没汉化到的字符串参考视频中的方法定位去逐个汉化。
流程图
<font color=#ED7001>这里还需要注意的是,如果要直装应用,那就应该先签名安装,看看是否有签名校验导致的闪退</font>
搜索应用内字符串,修改
核心破解:解决签名失败
开发者工具:
界面资源分析
最后一句搜索,需要打开dex文件: Reverse determines height, development determines depth.
4.初识AndroidManifest.xml
AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。
属性 | 定义 |
---|---|
versionCode | 版本号,主要用来更新,例如:12 |
versionName | 版本名,给用户看的,例如:1.2 |
package | 包名,例如:com.zj.52pj.demo |
uses-permission android:name="" | 应用权限,例如:android.permission.INTERNET 代表网络权限 |
android:label="@string/app_name" | 应用名称 |
android:icon="@mipmap/ic_launcher" | 应用图标路径 |
android:debuggable="true" | 应用是否开启debug权限 |
3.初识smali,vip终结者
1.了解JVM、Dalvik、ART
2.初识smali语法
3.实战修改smali
二、工具
1.教程Demo(更新)
2.MT管理器/NP管理器
3.雷电模拟器
4.jadx-gui(电脑反编译工具)
5.核心破解(1
三、课程内容
1.什么是JVM、Dalvik、ART
JVM是JAVA虚拟机,运行JAVA字节码程序
Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)
Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异
2.smali及其语法
smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。
关键字
名称 | 注释 |
---|---|
.class | 类名 |
.super | 父类名,继承的上级类名名称 |
.source | 源名 |
.field | 变量 |
.method | 方法名 |
.register | 寄存器 |
.end method | 方法名的结束 |
public | 公有 |
protected | 半公开,只有同一家人才能用 |
private | 私有,只能自己使用 |
.parameter | 方法参数 |
.prologue | 方法开始 |
.line xxx | 位于第xxx行 |
数据类型对应
smali类型 | java类型 | 注释 |
---|---|---|
V | void | 无返回值 |
Z | boolean | 布尔值类型,返回0或1 |
B | byte | 字节类型,返回字节 |
S | short | 短整数类型,返回数字 |
C | char | 字符类型,返回字符 |
I | int | 整数类型,返回数字 |
J | long (64位 需要2个寄存器存储) | 长整数类型,返回数字 |
F | float | 单浮点类型,返回数字 |
D | double (64位 需要2个寄存器存储) | 双浮点类型,返回数字 |
string | String | 文本类型,返回字符串 |
Lxxx/xxx/xxx | object | 对象类型,返回对象 |
常用指令
关键字 | 注释 |
---|---|
const | 重写整数属性,真假属性内容,只能是数字类型 |
const-string | 重写字符串内容 |
const-wide | 重写长整数类型,多用于修改到期时间。 |
return | 返回指令 |
if-eq | 全称equal(a=b),比较寄存器ab内容,相同则跳 |
if-ne | 全称not equal(a!=b),ab内容不相同则跳 |
if-eqz | 全称equal zero(a=0),z即是0的标记,a等于0则跳 |
if-nez | 全称not equal zero(a!=0),a不等于0则跳 |
if-ge | 全称greater equal(a>=b),a大于或等于则跳 |
if-le | 全称little equal(a<=b),a小于或等于则跳 |
goto | 强制跳到指定位置 |
switch | 分支跳转,一般会有多个分支线,并根据指令跳转到适当位置 |
iget | 获取寄存器数据 |
其余指令可用语法工具查询
定位方法:搜索弹窗关键字、抓取按钮id
中文 转 Unicode Unicode编码转换 - 站长工具
//一个私有、静态、不可变的方法 方法名
.method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z //(这里面是方法的参数)这里是方法返回值类型,表示布尔值类型,返回假或真.registers 7 //寄存器数量.line 33 //代码所在的行数iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I //读取p0(第一个参数,参考寄存器知识)中element的值赋值给p0const/4 p5, 0x1 //p5赋值1const/16 v0, 0xa //v0赋值10,在16进制里a表示10if-ge p0, v0, :cond_15 //判断p0的值是否大于或等于v0的值(即p0的值是否大于或等于10),如果大于或等于则跳转到:cond_15.line 34 //以下是常见的Toast弹窗代码check-cast p1, Landroid/content/Context; //检查Context对象引用const-string p0, "请先获取10个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0check-cast p0, Ljava/lang/CharSequence; //检查CharSequence对象引用invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; //将弹窗文本、显示时间等信息传给p1move-result-object p0 //结果传递给p0invoke-virtual {p0}, Landroid/widget/Toast;->show()V //当看到这个Toast;->show你就应该反应过来这里是弹窗代码goto :goto_31 //跳转到:goto_31:cond_15 //跳转的一个地址invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z //判断isvip方法的返回值是否为真(即结果是否为1)move-result p0 //结果赋值给p0if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址const p0, 0x7f0d0018 //在arsc中的id索引,这个值可以进行查询.line 37invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源const p0, 0x7f0d0008.line 38invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)Vconst p0, 0x7f0d000a.line 39invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V.line 40sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils; check-cast p1, Landroid/content/Context;const/4 p2, 0x2 //p2赋值2const-string p3, "level" //sp的索引invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //写入数据goto :goto_50 //跳转地址:cond_43check-cast p1, Landroid/content/Context;const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //请先充值大会员哦!check-cast p0, Ljava/lang/CharSequence;invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;move-result-object p0invoke-virtual {p0}, Landroid/widget/Toast;->show()V:goto_50return p5 //返回p5的值
.end method //方法结束//判断是否是大会员的方法
.method public final isvip()Z.registers 2const/4 v0, 0x0 //v0赋值0return v0 //返回v0的值.end method
修改方法:修改判断、强制跳转、修改寄存器的值
3.寄存器
在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)
在判断前加个赋值
move-result p0const/4 p0, 0x1if-eqz p0, :cond_44
四、课后小作业
1.关掉视频自己复现三种方法
2.完成这个作业demo(因为最近实在是太太太忙了,绝对不是因为我懒,咕咕咕。搞懂这个demo那也基本上能理解本节课的内容)
丑小鸭师傅的demo
链接:百度网盘 请输入提取码 密码:07p9
原文链接:教我兄弟学Android逆向02 破解第一个Android程序
作业:不知道goto是否符合要求?屏蔽掉第147行 #if-eqz p0, :cond_43,让上面的第124行if-ge p0, v0, :cond_15修改为:“goto :cond_15”这样程序就可以自上而下顺利一键三连了,
五、反思&答疑
关于jadx搜不到大会员的unicode编码,这是因为我录视频之前在设置里把unicode的转义打开而导致的,像你们第一次安装jadx都是默认关闭这个选项的,所以能直接搜到大会员的汉字!!!
由于准备不是很充足,我感觉我讲的不是太好,多看看我列举参考文档有利于理解smali语法。
对于开发者而言,在打包应用时,最好对代码进行混淆,否则逆向人员轻而易举得进行Crack,或者说在写代码的时候就不要用isvip、getvip等易辨识的单词作为方法名
推荐 控制流混淆
4、恭喜你获得广告&弹窗静默卡
1.了解安卓四大组件、Activity生命周期
2.弹窗定位、去更新
3.广告分析与布局优化
二、工具
1.教程Demo(更新)
2.MT管理器/NP管理器
3.算法助手
4.雷电模拟器
5.开发助手
三、课程内容
1.广告类型
启动广告 弹窗&更新广告 横幅广告
2.安卓四大组件
组件 | 描述 |
---|---|
Activity(活动) | 在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。 |
Service(服务) | Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。 |
Broadcast Receiver(广播接收器) | 一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。 |
Content Provider(内容提供者) | 作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等) |
1.activity的切换
<!---声明实现应用部分可视化界面的 Activity,必须使用 AndroidManifest 中的 <activity> 元素表示所有 Activity。系统不会识别和运行任何未进行声明的Activity。-----><activity android:label="@string/app_name" android:name="com.zj.wuaipojie.ui.MainActivity" android:exported="true"> <!--当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动--><!---指明这个activity可以以什么样的意图(intent)启动---><intent-filter> <!--表示activity作为一个什么动作启动,android.intent.action.MAIN表示作为主activity启动---><action android:name="android.intent.action.MAIN" /> <!--这是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity--><category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.zj.wuaipojie.ui.ChallengeFirst" /><activity android:name="com.zj.wuaipojie.ui.ChallengeFifth" android:exported="true" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeFourth" android:exported="true" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeThird" android:exported="false" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeSecond" android:exported="false" /> <activity android:name="com.zj.wuaipojie.ui.AdActivity" />
启动广告流程:
启动Activity->广告Activity->主页Activity
修改方法:
1.修改加载时间
2.Acitivity切换定位,修改Intent的Activity类名
switch (position) { case 0: Intent intent = new Intent(); intent.setClass(it.getContext(), ChallengeFirst.class); it.getContext().startActivity(intent); return; case 1: Intent intent2 = new Intent(); intent2.setClass(it.getContext(), ChallengeSecond.class); it.getContext().startActivity(intent2); return; case 2: Intent intent3 = new Intent(); //new一个Intent,intent3.setClass(it.getContext(), AdActivity.class); //传入要切换的Acitivity的类名it.getContext().startActivity(intent3); //启动对应的Activityreturn; case 3: Intent intent4 = new Intent(); intent4.setClass(it.getContext(), ChallengeFourth.class); it.getContext().startActivity(intent4); return; default: return; }
3.Activity生命周期
函数名称 | 描述 |
---|---|
onCreate() | 一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。 |
onStart() | 当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。 |
onResume() | 这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。 |
onPause() | 这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。 |
onStop() | 这个方法是在Activity完全不可见的时候调用的。 |
onDestroy() | 这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。 |
onRestart() | 当Activity从停止stop状态恢进入start状态时调用状态。 |
4.弹窗定位&堆栈分析
修改方法:
1.修改xml中的versiocode
2.Hook弹窗(推荐算法助手开启弹窗定位)
3.修改dex弹窗代码
4.抓包修改响应体(也可以路由器拦截)
5.布局优化
1.开发者助手抓布局
2.MT管理器xml搜索定位
3.修改xml代码
复制代码 隐藏代码
android:visibility="gone"
四、课后小作业
定位并去除作业demo首页中的弹窗
作业demo.apk - 蓝奏云
作业反馈贴
常见反爬措施
options请求(跨域预检)
options 请求就是预检请求,可用于检测服务器允许的 http 方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起 OPTIONS 请求,即 CORS 预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。
options请求(跨域预检)_幻彩希的博客-CSDN博客
参考资料:
爬虫从入门到精通(12) | js调试中的一些问题(无限debugger,调试干扰,内存爆破)_爬虫页面一直debug_不愿透露姓名の网友的博客-CSDN博客
js逆向、安卓逆向教程相关推荐
- 2021年巫妖易语言-js逆向-安卓逆向hook教程
链接:https://pan.baidu.com/s/1kdiAfXVNHgKT6BFdqzCYsw 提取码:jvw8 2021年最新巫妖易语言-js逆向-安卓逆向hook教程-10.12上课录像(这 ...
- 巫妖易语言+js逆向+安卓逆向
教程介绍 2021年最新巫妖易语言+js逆向+安卓逆向hook培训教程(修复画质声音不同步不加密版),课程主要讲解的内容是易语言+js逆向+安卓逆向hook,课程是2020年11月底刚培训结束的,也是 ...
- 安卓逆向例子--某菠菜APP token pwd 参数
我最近发现有很多小伙伴拿我上一次写的博客的东西进行盈利,就....以后不写大厂的吧. 本文只涉及 静态分析,建议无基础的同学,自行补足Java 基础,不要盲目的跳高,更不可眼高手低. 附APP样本例 ...
- 安卓逆向系列教程 4.1 字符串资源
安卓逆向系列教程 4.1 字符串资源 作者:飞龙 这篇教程是 APK 逆向实战的第一个例子,我会以一个非常简单的程序开始.主要内容就是修改字符串资源,除了破解所需之外,汉化也需要了解这个东西.我们的程 ...
- 安卓逆向系列教程(三)静态分析工具
安卓逆向系列教程(三)静态分析工具 作者:飞龙 以下工具可能都需要先安装 JDK,安装方法就不说了,随便一搜就是. Android Killer 几年之前,我们要破解 APK,可能需要用到 apkto ...
- 安卓逆向系列教程(二)APK 和 DEX
安卓逆向系列教程(二)APK 和 DEX 作者:飞龙 APK APK 是 Android 软件包的分发格式,它本身是个 Zip 压缩包.APK 根目录下可能出现的目录和文件有: 名称 用途 META- ...
- 安卓逆向系列教程(一)Dalvik 指令集
安卓逆向系列教程(一)Dalvik 指令集 作者:飞龙 寄存器 Dalvik 指令集完全基于寄存器,也就是说,没有栈. 所有寄存器都是 32 位,无类型的.也就是说,虽然编译器会为每个局部变量分配一个 ...
- 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )
From:Hook 神器家族的 Frida 工具使用详解:https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frid ...
- 记录第一次完整安卓逆向过程笔记
文章目录 前言 一.安卓逆向的准备 二.刷机+配置+安装app 1.安卓系统版本 2.手机root+面具安装 3.xposed安装 三.逆向app 总结 前言 作为新时代爬虫er,逆向技能是必不可少的 ...
最新文章
- seaborn使用violinplot函数可视化小提琴图、使用stripplot函数添加抖动数据点(jittered points)、显示数据的稠密程度
- 网易有毛病,我的账号被锁了,去解锁时候又几把提示不成功,浪费劳资感情啊
- start ssh-agent
- axure怎么做5秒倒计时_装修隔音怎么做,进屋秒变“静音”模式
- python后端数据发送到前端_Python Django 前后端数据交互 之 后端向前端发送数据...
- 追捕美国头号电脑通缉犯
- git pull VS git fetchmerge(good)
- 在项目中使用HTMLDom的事件冒泡机制
- dram和nand哪个难生产_终于有人说清楚了什么是DRAM、什么是NAND Flash
- React Native 入门第一篇
- html仿win10第一次开机效果,纯 HTML/CSS 高仿 Win10 加载动画
- Tomcat8zip版本安装与配置
- 自己怎么做网站,个人做网站的步骤
- 电脑如何查看wifi密码?
- vue vue-quill-editor 富文本 改变图片大小
- 波士顿大学研究生计算机科学专业排名,USnews2012美国大学排名计算机科学专业研究生排名...
- 有什么免费的思维导图软件可以推荐?
- Python异常处理:ImportError: cannot import name 'XXX' from 'XXXX'
- Scheme Language
- Android的图片缓存处理