1. 第一个APP
未解决问题
- Genymotion arm 手机中未安装成功
1.1 安装虚拟机
-
windows 安装 Vmware workstation pro
-
mac 安装 Vmware fusion
1.2 安装kali
-
打开虚拟机,编辑虚拟机
-
硬件 -> 更改内存
-
硬件 -> 显示器不选择加速3D图形
-
选项 -> 虚拟机名称,自己改个名字
-
1.3 修改配置kali虚拟机
-
更改时区
- dpkg-reconfigure tzdata 选择Asia -> shanghai
-
更新系统源
- apt update
-
安装中文字体 -> 非系统中文
-
apt install xfonts-intl-chinese
-
apt install ttf-wqy-microhei
-
-
更改系统字体大小
- file -> preferences -> Appearance -> Font -> Change -> Size
-
更改名字 -> hostname
- nano /etc/hostname -> 修改里面的名字内容
-
重启
- 右上角 -> Restart
1.4 安装 Android Studio
-
切换到桌面
- cd Desktop/
-
安装Android Studio
- wget Android Studio linux 下载地址
-
解压安装
-
tar -zxvf android-studio-ide-............-linux.tar.gz
-
cd android-studo/bin/
-
./studio.sh
-
选择 Do not import settings
-
选择 Dont send
-
不要选择代理 选择candel
-
next -> next -> next -> finsh
-
start a new Android Studio project
-
Empty Activity
-
修改 Name
-
修改 Language
-
finsh
-
-
-
android adb
-
cd Android -> cd Sdk/ -> cd platform-tools/
-
./adb --help
-
adb connect ip:port
-
adb shell
-
-
将adb命令加入到路径中
-
nano ~/.bashrc
-
PATH=$PATH:命令路径
-
-
安装软件3款
-
apt install tmux jnettop
-
apt install htop
-
1.5 安装QtScrcpy(最好用windows、mac,不在linux中使用)
-
每次投屏前刷新设备列表
-
可以使用usb线连接,也可以使用wifiadb无线连接
1.6 安装wifidb
1.7 模拟器->Genymotion
-
选择手机型号
-
Notework mode --> Bridge
-
桥接真正的网卡
-
报错修改 Processor(s)、Memory size
-
-
uname -a
- 查看设备信息-架构
-
Genymotion arm 桥
- Genymotion-ARM-Translation_for_8.0.zip
2. linux命令
2.1 kali科学配置
-
nano /etc/proxychains.conf -->配置
- socket5(协议) 192.127.1.0(地址) 1080(端口)
-
注释 proxy_dns
2.2 linux 命令
-
curl ip.sb >查看ip地址
-
proxychains curl ip.sb >查看代理ip
-
telnet ip port >ping 地址
-
neofetch > 查看android系统配置的工具
-
cat
-
file * > 查看文件格式
-
echo touch
- />/>
-
adb shell dumpsys activity top
-
grep 过滤
- i 忽略大小写
-
ps 查看进程信息
-
tree -NCfhl | grep ***
- 搜索
-
ln -s 命令路径 /usr/bin
- 添加软连接到usr/bin 里面
3. 运行环境手机刷机指南
3.1 安卓手机刷机方法论
-
google 搜索 lineageos
-
点击 DOWNLOAD
-
google 官方镜像
-
google factory image google factory image
- 8.1.0 (OPM1.171019.011, Dec 2017) Nexus 5x
-
-
解压
- 7z x file.zip
3.2 线刷谷歌官方系统
3.3 Twrp/Magisk/FridaServer
-
刷机流程
-
kali虚拟机 解压 bullhead-opml.171019.011-factory-3be6fdlc.zip
-
手机关机(电脑/虚拟机不需要连接手机)
-
重启,按住音量键↓+开关键;
-
进入bootloader, DEVICE STATE - unlocked这里必须是解锁的
-
通过手机线连接到虚拟机
-
进入 bullhead-opml.171019.011目录
-
执行命令 ./flash-all.sh, 等待命令执行结果完毕,手机会有连接断开的声音
-
这一步可能会失败(版本问题)
-
替换fastboot.zip
-
星球下载fastboot.zip
-
解压fastboot.zip 为 ELF 64-bit的文件
-
对这个fastboot 改名为 fastboot810rl
-
查看使用的fastboot路径 which fastboot
-
将改名后的fastboot 复制到 真正执行的fastboot cp fastboot810rl 路径
-
进入到fastboot 路劲中 将现在使用的fastboot改名备份(注意权限问题 chmod 777 fastboot810rl) 将fastboot810frl 改名为fastboot
-
-
刷机完毕后手机会自动重启(看到命令执行完后显示 finished rebooting)
-
选择中文, 跳过一直到 更多-同意 进入系统
-
系统将显示休眠时间调长, 打开不锁定屏幕, 打开开发者模式打开 USB调试
-
接下来root, 使用工具 twrp-3.3.1-0-bullhead.img
- google 搜索 twrp->选择版本twrp-3.3.1.0->devces page->LG Nexus 5x->Europe->选择3.3.1.0这个版本
-
adb reboot bootloader
-
fastboot flash recovery twrp-3.3.1.0-bullhead.img
-
选择手机进入recovery mode
-
向右滑动
-
将setting中的息屏关掉
-
Magisk-v20.4.zip
- github Magisk-> releases -> 下载zip包
-
adb push Magisk-V20.4.zip /sdcard/
-
Frida server 下载
-
github Frida -> releases Frida 12.11.7 -> frida-server-12.11.7-android-arm64.xz
-
7z -x frida-server-12.11.7-android-arm64.xz
-
-
adb push frida-server-12.11.7-android-arm64 /data/local/tmp/
-
拔掉手机连接线
-
点击手机页面install-> 下拉-> Magisk-V20.4.zip-> 右拉-> reboot system -> do not install
-
连接手机, 装wifiadb, 连接wifi
-
进入手机系统
-
cd /data/local/tmp/
-
/frida-server-12.11.7-android-arm64
-
frida-server 已经启动了
-
3.4 Twrp/SuperSU/KaliNethunter
-
刷机流程
-
下载kali NetHunter
-
google: kali nethunter
-
downloader
-
Nexus 5x Oreo 下载种子
-
-
adb reboot bootloader
-
通过手机线连接到虚拟机
-
进入 bullhead-opml.171019.011目录
-
执行命令 ./flash-all.sh, 等待命令执行结果完毕,手机会有连接断开的声音
-
这一步可能会失败(版本问题)
-
替换fastboot.zip
-
星球下载fastboot.zip
-
解压fastboot.zip 为 ELF 64-bit的文件
-
对这个fastboot 改名为 fastboot810rl
-
查看使用的fastboot路径 which fastboot
-
将改名后的fastboot 复制到 真正执行的fastboot cp fastboot810rl 路径
-
进入到fastboot 路劲中 将现在使用的fastboot改名备份(注意权限问题 chmod 777 fastboot810rl) 将fastboot810frl 改名为fastboot
-
-
刷机完毕后手机会自动重启(看到命令执行完后显示 finished rebooting)
-
选择中文, 跳过一直到 更多-同意 进入系统
-
系统将显示休眠时间调长, 打开不锁定屏幕, 打开开发者模式打开 USB调试
-
接下来root, 使用工具 twrp-3.3.1-0-bullhead.img
- google 搜索 twrp->选择版本twrp-3.3.1.0->devces page->LG Nexus 5x->Europe->选择3.3.1.0这个版本
-
adb reboot bootloader
-
fastboot flash recovery twrp-3.3.1.0-bullhead.img
-
选择手机进入recovery mode
-
向右滑动
-
将setting中的息屏关掉
-
adb push SR5-SuperSU-V2.82-SR5-20171001224502.zip /sdcard/
-
adb push nethunter-bullhead-oreo-kalifs-full-2020.1.zip /sdcard/
-
拔掉手机连接线
-
点击手机页面install-> 下拉-> SuperSU-> 右拉-> reboot system -> do not install
-
进入adb reboot bootloader
-
recovery mode
-
下拉 -> nethunter -> 右拉
-
3.5 开机后wifi有感叹号, 时间无法同步解决办法
在手机的shell里以root用户执行:
-
settings put global captive_portal_http_url https://www.google.cn/generate_204
-
settings put global captive_portal_https_url https://www.google.cn/generate_204
-
settings put global ntp_server 1.hk.pool.ntp.org
-
reboot
4. 四大组件
4.1 app下载网址:apkmirror
4.2 android项目目录结构
Android studio 项目建立完成后会有一个Android视图和Project视图
-
.gradle - Android Studio自动生成的文件
-
.idea - Android Studio自动生成的文件
-
app - 项目中代码、资源等内容放置在这个目录下
-
build - 编译生成的文件
-
libs - 第三方用到的jar包
-
src
-
androidTest - 用来编写Android Test的测试用例的
-
java
- com.example.demo10
-
-
main
-
java - 放置java代码的地方
- com.example.demo10
-
res - 放置资源文件,图片、布局、字符串的资源信息
-
drawable
-
drawable-24
-
layout - 项目的布局
-
mipmap-anydpi-v26
-
mipmap-hdpi
-
mipmap-mdpi
-
mipmap-xhdip
-
mipmap-xxhdpi
-
mipmap-xxhdpi
-
values
-
-
AndroidManifest.xml
-
-
test
- java
-
-
.gitgnore
-
build.gradle
-
proguard-rules.pro
-
-
gradle - 包含了gradle wrapper的配置文件,是一个android进行打包的文件
-
.gitignore
-
build.gradle
-
gradle.properties
-
gradlew
-
gradlew.bat
-
local.properties
-
settings.gradle
6. 自动化动态分析和快速定位
-
objection(免)root动态调试apk
-
objection内存漫游和组件控制
-
objection类和方法动态trace
-
objection+DEXDump内存暴力脱壳机
-
objection RPC可以直接curl 的 RPC
6.1 操作步骤
-
命令行确认安装objection objection version
- objection: 1.9.5
-
切换到Desktop创建文件夹 20200815
-
通过adb命令安装测试fulao2.apk
-
通过objection直接连接免root设备
-
https://github.com/sensepost/objection/wiki/Patching-Android-Applications
-
Patching: 依赖关系
-
aapt
-
aapt2
-
adb
-
jarsigner
-
apktool
-
-
添加软连接到/usr/bin
-
ln -s /root/Desktop/android-studio/jre/bin/jarsigner /usr/bin
-
ln -s /root/Android/Sdk/build-tools/30.0.1/aapt /usr/bin
-
ln -s /root/Android/Sdk/build-tools/30.0.1/aapt2 /usr/bin
-
ln -s /root/Android/Sdk/platform-tools/adb /usr/bin
-
-
解压apk看下它里面的lib是哪个架构,按架构来运行:
-
objection patchapk --architecture armeabi-v7a --use-aapt2 --source yourAPK.apk
-
-
app启动后用objection/frida直接连上即可
-
https://github.com/sensepost/objection/wiki/Patching-Android-Applications
-
-
安装apktool apktool.jar
-
mv apktool /usr/local/bin/
-
mv apktool.jar /usr/local/bin/
-
chomd 777 apktook*
-
-
切换到Desktoop/20200815
-
objection patchapk --source fulao2.apk
-
生成objection.apk
-
安装objection生成的apk
6.2 第二个APP
- 下载DEXDump
7. APP实操去广告去升级重打包
使用objection
-
android hooking list activities
-
android heap search instances android.app.AlertDialog
-
Class instance enumeration complete for android.app.AlertDialog Hashcode Class toString()
8564083 android.app.AlertDialog android.app.AlertDialog@82ad73
-
-
plugin load /root/.objection/plugins/Wallbreaker
- Loaded plugin: wallbreaker
-
plugin wallbreaker objectionsearch android.app.AlertDialog
- [0x2556] android.app.AlertDialog@82ad73
-
plugin wallbreaker objectdump 0x2556
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n593" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">package android.app
class AlertDialog {/* static fields /
static int SHOW; => 69
static int DISMISS; => 67
static int CANCEL; => 68
static String DIALOG_HIERARCHY_TAG; => android:dialogHierarchy
static String TAG; => Dialog
static String DIALOG_SHOWING_TAG; => android:dialogShowing
static int THEME_DEVICE_DEFAULT_LIGHT; => 5
static int THEME_DEVICE_DEFAULT_DARK; => 4
static int THEME_HOLO_DARK; => 2
static int LAYOUT_HINT_NONE; => 0
static int THEME_HOLO_LIGHT; => 3
static int LAYOUT_HINT_SIDE; => 1
static int THEME_TRADITIONAL; => 1
/ instance fields /
int shadowklass; => [0x2582]: class android.app.AlertDialog
DialogInterfaceLambda
ListenersHandler) {80d83e1}
Activity mOwnerActivity; => null
Window mWindow; => [0x265a]: com.android.internal.policy.PhoneWindow@cf5e506
int mActionModeTypeStarting; => 0
boolean mCreated; => true
AlertController mAlert; => [0x267a]: com.android.internal.app.AlertController@91e87c7
/ constructor methods */
void AlertDialog(Context);
void AlertDialog(Context, int);
void AlertDialog(Context, int, boolean);
void AlertDialog(Context, boolean, DialogInterfaceCallback);
ActionMode onWindowStartingActionMode(ActionModeContextMenuInfo);
void onActionModeFinished(ActionMode);
boolean onTrackballEvent(MotionEvent);
void setFeatureDrawableUri(int, Uri);
void unregisterForContextMenu(View);
void setOnDismissListener(DialogInterfaceOnShowListener);
boolean onContextItemSelected(MenuItem);
void setTitle(CharSequence);
void onWindowDismissed(boolean, boolean);
void setOwnerActivity(Activity);
void show();
void registerForContextMenu(View);
boolean onGenericMotionEvent(MotionEvent);
boolean takeCancelAndDismissListeners(String, DialogInterfaceOnDismissListener);
boolean onKeyUp(int, KeyEvent);
void onWindowAttributesChanged(WindowManagerOnKeyListener);
void lambdaLayoutParams);
void setContentView(int);
void setContentView(View);
void setContentView(View, ViewGroupOnCancelListener);
LayoutInflater getLayoutInflater();
void onContextMenuClosed(Menu);
void setCustomTitle(View);
void setButtonPanelLayoutHint(int);
void setIcon(int);
void setIcon(Drawable);
ListView getListView();
void setIconAttribute(int);
void setButton2(CharSequence, DialogInterfaceOnClickListener);
void setButton(int, CharSequence, Message);
void setButton(CharSequence, DialogInterfaceOnClickListener);
void setButton3(CharSequence, Message);
void setMessage(CharSequence);
void setInverseBackgroundForced(boolean);
}</pre> -
plugin wallbreaker objectdump 0x267a
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n596" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">package com.android.internal.app
class AlertController {/* static fields /
static int MICRO; => 1
/ instance fields /
int shadowklass; => [0x25d2]: class com.android.internal.app.AlertController
int mViewSpacingLeft; => 0
Message mButtonNegativeMessage; => null
boolean mShowTitle; => true
Message mButtonPositiveMessage; => [0x268a]: { when=-1d5h2m57s195ms what=-1 obj=com.zhibo.media.o@a48a1f4 target=com.android.internal.app.AlertControllerButtonHandler) {8fd7d1d}
TextView mMessageView; => [0x26ba]: android.widget.TextView{17b4b92 V.ED..... ........ 37,5-1213,314 #102000b android:id/message}
int mViewSpacingRight; => 0
Message mButtonNeutralMessage; => null
View mCustomTitleView; => null
int mViewLayoutResId; => 0
View mView; => null
Button mButtonNegative; => [0x26da]: android.widget.Button{771d963 GFED..C.. ......I. 0,0-0,0 #102001a android:id/button2}
int mViewSpacingBottom; => 0
\n 3.修复了一个严重BUGm不升级后期将无法进入超级直播!版V1.4.7更新了功能
boolean mViewSpacingSpecified; => false
ListAdapter mAdapter; => null
ScrollView mScrollView; => [0x271a]: android.widget.ScrollView{147e960 V.ED.V... ........ 33,0-1272,346 #10203a7 android:id/scrollView}
boolean mForceInverseBackground; => false
CharSequence mButtonPositiveText; => [0x266a]: 立刻升级
Drawable mIcon; => null
Window mWindow; => [0x23ca]: com.android.internal.policy.PhoneWindow@cf5e506
CharSequence mButtonNeutralText; => null
TextView mTitleView; => [0x2746]: com.android.internal.widget.DialogTitle{4f9ce19 V.ED..... ........ 0,0-1187,79 #1020199 android:id/alertTitle}
ListView mListView; => null
Button mButtonPositive; => [0x2756]: android.widget.Button{b7e8ede VFED..C.. ........ 312,11-926,137 #1020019 android:id/button1}
View1@21ea8bf
Context mContext; => [0x270a]: android.view.ContextThemeWrapper@d753948
Button mButtonNeutral; => [0x2796]: android.widget.Button{1323b8c GFED..C.. ......I. 0,0-0,0 #102001b android:id/button3}
int mMultiChoiceItemLayout; => 17367059
int mListItemLayout; => 17367057
DialogInterface mDialogInterface; => [0x27ba]: android.app.AlertDialog@82ad73
ImageView mIconView; => [0x27da]: android.widget.ImageView{ad032d5 G.ED..... ......I. 0,0-0,0 #1020006 android:id/icon}
int mButtonPanelSideLayout; => 0
int mCheckedItem; => -1
int mViewSpacingTop; => 0
CharSequence mTitle; => [0x27e6]: 发现新版本 V1.4.7 是否升级
/ constructor methods /
void AlertController(Context, DialogInterface, Window);
/ static methods /
static int identityHashCodeNative(Object);
static int identityHashCode(Object);
static AlertController create(Context, DialogInterface, Window);
static DialogInterface -get6(AlertController);
static Handler -get7(AlertController);
static int -get10(AlertController);
static int -get8(AlertController);
static int -get11(AlertController);
static int -get9(AlertController);
static ListAdapter -set0(AlertController, ListAdapter);
static int -set1(AlertController, int);
static boolean canTextInput(View);
static Button -get0(AlertController);
static Message -get1(AlertController);
static Button -get2(AlertController);
static boolean shouldCenterSingleButton(Context);
static Message -get3(AlertController);
static void manageScrollIndicators(View, View, View);
static Button -get4(AlertController);
static Message -get5(AlertController);
/ instance methods */
int hashCode();
void wait();
void wait(long);
void wait(long, int);
void notify();
void notifyAll();
boolean equals(Object);
Object clone();
void finalize();
Object internalClone();
String toString();
Class getClass();
void setButtonPanelLayoutHint(int);
void setIcon(int);
void setIcon(Drawable);
void setupButtons(ViewGroup);
void setCustomTitle(View);
void setInverseBackgroundForced(boolean);
Button getButton(int);
void setupView();
int getIconAttributeResId(int);
void setupContent(ViewGroup);
void centerButton(Button);
void setBackground(TypedArray, View, View, View, View, boolean, boolean, boolean);
void setTitle(CharSequence);
void setupTitle(ViewGroup);
void installContent();
void installContent(AlertControllerOnClickListener, Message);
boolean onKeyDown(int, KeyEvent);
void setView(int);
void setView(View);
void setView(View, int, int, int, int);
void setMessage(CharSequence);
ListView getListView();
void setupCustomContent(ViewGroup);
ViewGroup resolvePanel(View, View);
} </pre> -
从内存中得到了 立刻升级
使用hook方法
使用hook方法首先杀掉app进程,重新启动。
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n601" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">- adb shell 进入手机shell
- su 进入超级用户
- ps -e | grep zhibo 查看进程
- kill pid 杀掉进程</pre>
使用objection hook会出现来不及的情况,需要启动app立马执行命令,抢速度
-
打开app
-
objection -g com.hd.zhibo.explore
-
android hooking watch class android.app.AlertDialog
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n610" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">(agent) Hooking android.app.AlertDialog.-get0(android.app.AlertDialog)
(agent) Hooking android.app.AlertDialog.resolveDialogTheme(android.content.Context, int)
(agent) Hooking android.app.AlertDialog.getButton(int)
(agent) Hooking android.app.AlertDialog.getListView()
(agent) Hooking android.app.AlertDialog.onCreate(android.os.Bundle)
(agent) Hooking android.app.AlertDialog.onKeyDown(int, android.view.KeyEvent)
(agent) Hooking android.app.AlertDialog.onKeyUp(int, android.view.KeyEvent)
(agent) Hooking android.app.AlertDialog.setButton(int, java.lang.CharSequence, android.content.DialogInterfaceOnClickListener)
(agent) Hooking android.app.AlertDialog.setButton(java.lang.CharSequence, android.os.Message)
(agent) Hooking android.app.AlertDialog.setButton2(java.lang.CharSequence, android.content.DialogInterfaceOnClickListener)
(agent) Hooking android.app.AlertDialog.setButton3(java.lang.CharSequence, android.os.Message)
(agent) Hooking android.app.AlertDialog.setButtonPanelLayoutHint(int)
(agent) Hooking android.app.AlertDialog.setCustomTitle(android.view.View)
(agent) Hooking android.app.AlertDialog.setIcon(int)
(agent) Hooking android.app.AlertDialog.setIcon(android.graphics.drawable.Drawable)
(agent) Hooking android.app.AlertDialog.setIconAttribute(int)
(agent) Hooking android.app.AlertDialog.setInverseBackgroundForced(boolean)
(agent) Hooking android.app.AlertDialog.setMessage(java.lang.CharSequence)
(agent) Hooking android.app.AlertDialog.setTitle(java.lang.CharSequence)
(agent) Hooking android.app.AlertDialog.setView(android.view.View)
(agent) Hooking android.app.AlertDialog.setView(android.view.View, int, int, int, int)
(agent) Registering job 6esx9gc8sfj. Type: watch-class for: android.app.AlertDialog
com.hd.zhibo on (google: 8.1.0) [usb] # (agent) [6esx9gc8sfj] Called android.app.AlertDialog.resolveDialogTheme(android.content.Context, int)
(agent) [6esx9gc8sfj] Called android.app.AlertDialog.resolveDialogTheme(android.content.Context, int)
(agent) [6esx9gc8sfj] Called android.app.AlertDialog.onCreate(android.os.Bundle)</pre> -
android hooking watch class_method android.app.AlertDialog.onCreate --dump-args --dump-backtrace --dump-return
- 查看从哪里到的 android.app.AlertDialog.onCreate
-
objection如何处理开始时hook的问题
- objection -g com.hd.zhibo explore --startup-command "android hooking watch class_method android.app.AlertDialog.onCreate --dump-args --dump-backtrace --dump-return"
-
if-eqz vA, :cond_** 如果vA等于0则跳转到:cond__**
-
if-nez vA, :cond_** 不等于
-
apktool d zhibo.apk
-
修改smail问件
-
打包
- apktool b zhibo
-
生成签名 使用keytool
- keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore
-
使用jarsigner 来签名
- jarsigner -verbose -keystore abc.keystore -signedjar testx.apk zhibo.apk abc.keystore
8. 真实app实操带壳app重打包去强制升级
-
DEXDump三种使用模式脱壳
-
Objection快速自动化定位 基于hook
-
Wallbreaker内存可视化漫游 基于类的instance,类的声明周期
-
所见即所得的代码定位思路
-
修改源码重打包去强制升级
- top 查看进程信息
- frida -ps -U 列出手机上所有的进程信息
- grep(global search regular expression(RE) and print out the line) 文本搜索工具
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" cid="n664" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">-a 不要忽略二进制数据。 -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。 -b 在显示符合范本样式的那一行之外,并显示该行之前的内容。 -c 计算符合范本样式的列数。 -C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。 -d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。 -e<范本样式> 指定字符串作为查找文件内容的范本样式。 -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。 -f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。 -F 将范本样式视为固定字符串的列表。 -G 将范本样式视为普通的表示法来使用。 -h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。 -H 在显示符合范本样式的那一列之前,标示该列的文件名称。 -i 忽略字符大小写的差别。 -l 列出文件内容符合指定的范本样式的文件名称。 -L 列出文件内容不符合指定的范本样式的文件名称。 -n 在显示符合范本样式的那一列之前,标示出该列的编号。 -q 不显示任何信息。 -R/-r 此参数的效果和指定“-d recurse”参数相同。 -s 不显示错误信息。 -v 反转查找。 -w 只显示全字符合的列。 -x 只显示全列符合的列。 -y 此参数效果跟“ -i”相同。 -o 只输出文件中匹配到的部分。</pre>
- ps -e | grep .....
8.1 第一种脱壳方法
-
objection -g com.hello.qqc explore
-
frida 查看frida相关信息
-
env 环境?
-
plugin load /root/.objection/plugins/dexdump/frida_dexdump
-
plugin dexdump dump
- 得到dexdump解析后的dex地址
-
切换到生成dex文件的目录
-
grep -ril "MainActivity" *
- 得到搜索结果
8.2 第二种脱壳方法-直接运行main.py
-
在 frida_dexdump 目录下的 main.py
- /root/.objection/plugins/dexdump/firda_dexdump
-
python3 main.py
-
直接运行这个命令会失败,双进程保护
-
使用frida先占个坑?
-
objection -g com.hello.qqc explore
-
再执行 python3 main.py
-
8.3 pip install frida-dexdump
-
pip install frida-dexdump
-
frida-dexdump
9. App加固的种类、甄别和处理方式
9.1 libart.so和dex文件
- 安卓系统架构
9.2 Android混淆加固发展史
-
2010-> dex2jar、 apktool android逆向分析工具(没有保护的app)
-
代码混淆(ProGuard、 DexGuard)
-
动态加载
-
Native 层加密
- ollvm
-
核心数据、功能云端化
9.3 查壳脱壳(工具)的核心原理
-
一键(Dex保护+资源保护+Native保护) = app加固服务
-
梆梆安全成立
-
爱加密
-
娜迦
-
360、腾讯、百度、阿里、网易
-
文件落地加载
-
不落地加载
-
抹头
网友评论