安卓逆向笔记-逆向思路教程
Android逆向助手使用说明
1、“源文件”处支持文件或文件夹拖放;
2、必须安装【.NET Framework2.0简体中文版】框架;
3、部份功能依赖java运行环境,因此必须安装java。
12、替换dex;
13、修复dex;
14、加密xml转txt;
15、字符串unicode编解码。
更新日志
v2.1主要修改:
1、部份功能新增错误回显;
2、修复java环境判断错误的bug;Android逆向助手是一款针对安卓平台的强大逆向辅助软件,功能涵盖apk反编译打包签名;dex/jar互转替换提取修复;so反编译;xml、txt加密;字符串编码等。支持直接将文件拖放到源和目标文件,不用每次都点浏览选择。软件暂时支持WinXP、Win7、Win2003系统。
功能介绍
1、反编译apk;
2、重新打包成apk;
3、对apk进行签名;
4、反编译dex;
5、重新打包成dex;
6、dex转jar;
7、dex转ddx;
8、dex导出成txt;
9、反编译so;
10、jar转dex;
11、提取dex;
软件逆向工程原理与实践第8章Android应用程序逆向分析
第8章 Android应用程序逆向分析
(3) AndroidManifest.xml:Android配置文件,编译过程 依然被转换为AXML格式;
第8章 Android应用程序逆向分析
8.2.1 APKTool APKTool是Google提供的APK反编译工具,可安装反编
译系统APK所需要的framework-res框架,能够反编译APK, 并且可以清理上次反编译文件夹。
安装和使用步骤如下: (1) 配置Java运行环境; (2) 下载并安装APKTool; (3) 打开Windows命令窗口;
APKTool的所有操作均在Windows命令窗口中输入 “apktool”命令来查看。操作完成后,可以得到应用程序的 资源文件,smali文件和Manifest.xml文件。直接点击 Manifest.xml文件可以在浏览器中查看相关信息。
第8章 Android应用程序逆向分析
8.2.2 dex2jar dex2jar也是一款开源软件。它集成了Java库,可将原本
第ali反汇编得到smali文件,阅读反汇编出 的smali文件。
(2) 使用dex2jar生成jar文件,再使用jd-gui生成Java源代 码,阅读生成的Java源代码。
(3) 使用JEB、APK Studio等高级工具。
第8章 Android应用程序逆向分析
第8章 Android应用程序逆向分析
4.反编译APK获取Java源码并分析 将应用程序反编译成可读的Java源码,然后审查该代码, 了解应用程序的所有行为。在此过程中,分析源码审查开放 的端口、共享/传输的数据,以及Socket连接等是关键的考量。 根据8.2节介绍的方法,首先对APK文件进行解压(或修改后 缀解压),从中提取出classes.dex文件;使用dex2jar工具,将 classes.dex文件转换成jar文件,如图8-11所示;然后,使用 jd-gui分析这个classes.jar文件,如图8-12所示。
Android逆向分析工具与方法
1Android分析工具1.1分析工具经过试验,推荐的工具为:模拟器可以使用逍遥安卓;反编译,编译,smali代码注入,APK签名等等可以使用Android Killer;开发IDE可以使用Android Studio;一般的反编译和运行APK可以使用Android Killer + 逍遥安卓,注意连接逍遥安卓模拟器的方法是使用adb connect 127.0.0.1:21503,最好使用逍遥自带的adb工具。
1.APKtoola)直接编译和反编译APK文件;b)到smali语言级别;c)可以解析二进制的AndroidManifest.xml文件2.APKStudio图形界面的apktool;3.APK IDE小米出的apk反编译,打包集成工具,类似ApkStudio;集成了jd-gui,dex2jar等;4.android Killer集成了apktool,dex2jar, jd-gui等工具,同时支持搜索,类方法提取,代码插入等工具;同时支持动态连接android devices,自动编译,签名,安装,运行程序等操作。
易用性上,这几类工具的排名是:AndroidKiller> APK IDE >APKStudio>APKTool.5.JEB反编译工具,商业的,效果据说比开源的要好;6.Dex2jar可以直接把classes.dex转换成Jar包,内部是把Dalvik字节码转换成了Java字节码;7.enjarifygoogle自己出的工具,把dhttps:///google/enjarify/8.jad把某个.class文件转换成源码形式,本质是把Java字节码转换成java源码;9.jd-gui本质上和jad一样,但是是图形界面的,并且可以批量反编译整个Jar包文件;10.androguard包含了许多工具,可以对某个APK文件进行测绘,比如权限信息,函数调用图,指令级别的函数调用图,交互分析环境;11.IDEa)Eclipseb)AndroidStudioc)IDEA12.JDBa)JDK自带的调试JAVA程序的调试器,可以用来调试APK;13.IDA14.Mercury,现在改名叫Drozera)是一个渗透测试工具;15.Androguarda)一堆python脚本工具;b)有一个可以生成函数调用图;1.2分析平台系统1.2.1Santoku本质是一款Ubuntu Linux系统,上面集成了各种Android工具,包括开发,逆向,渗透测试,恶意代码分析等各个安全方向。
小肩膀安卓逆向--002-006
⼩肩膀安卓逆向--002-006002.什么是安卓逆向1. 如果数据包不是加密的,例如⽹页端爬取⾖瓣评分250,数据是可以伪造的,可以轻易构造http请求,就不需要逆向。
2. 如果数据包是加密的,例如某些app登录页⾯,你进⾏抓包,密码会进⾏加密,还会有⼀个加密的sign值,你⽆法构造数据包,⽆法进⾏爆破操作。
就需要逆向。
重点在于逆向加密的算法。
003.Windows注意事项1. 系统版本:讲师使⽤的是win10 专业版20H2,我们可以运⾏winver查看系统版本,不要使⽤任何的精简版系统。
2. 启⽤超级⽤户:启⽤Administrator3. 基本配置:左⾯右键->个性化->主题->桌⾯图标设置->此电脑此电脑->查看->⽂件扩展名windows更新->开发者选项->从任意源安装应⽤4. 计算机名不要有中⽂5. 路径不要有中⽂、空格、特殊符号004.Windows cmd 005.环境变量1. cmd的打开⽅式开始->右键->运⾏->cmdwin+r,输⼊cmd指定⽬录快捷打开cmd:在路径栏输⼊cmd2. cmd基本操作dirclscdcmd中运⾏⽂件(可以把⽂件拖⼊cmd)上下键选择之前输⼊过的命令tab补全右键复制/粘贴3. 相对路径和绝对路径4. 环境变量系统变量和⽤户变量环境变量的作⽤006.Windows terminal1. Windows Terminal安装与打开安装:微软商城、github打开:右键菜单、win+r 输⼊wt、路径栏输⼊wt设置默认shell、调整shell顺序、增加新的shell2. 主题配⾊主题颜⾊配置⽅法 json配置⽂件json⽂件位置:C:\Users\⽤户名\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\setting.json 主题配⾊⽹站:,复制后粘贴到配置⽂件的schemes中使⽤配⾊⽅案,在设置菜单中就可以选择3. 常⽤快捷键新选项卡:ctr+shift+d划分窗格:alt+shift+加号(上下划分)、ctr+shift+减号(左右划分)关闭窗格:ctr+shift+w调整窗格:alt+shift+⽅向键窗格切换:alt+⽅向键。
Android逆向工具篇—反编译工具的选择与使用
Android逆向⼯具篇—反编译⼯具的选择与使⽤作者 | 天天记⼩本⼦上的lilac 来源 | CSDN今天给⼤家介绍⼀下Android App 在Java层的逆向⼯具。
逆向⼯具的介绍在过去,当我们想要了解⼀个 app 内部运作细节时,往往先通过 ApkTool 反编译 APK,⽣成 smali 格式的反汇编代码[1],然后⼤佬和⽼⼿直接阅读 smali 代码,适当的进⾏修改、插桩、调试,经过⼀定的经验和猜想,理解程序的运⾏逻辑和加解密细节,⽐如如下的 smali 代码。
smail我们只要先这样,再那样,最后再这样,对对对,就这样,⼀个程序的加密就被破解出来了。
是不是迫不及待想来⼀次App的逆向之旅了?事实上,这种⽅式对⼩⽩实在不友好,有没有更加友好的⽅式呢?当然是有的,如果你百度或者 google 搜索逆向相关的教程和分享,很容易就会发现下⾯这三个⼯具。
在介绍⼯具之前,我们先补充⼀下APK结构的知识,我们以伊对这个社交 Apk 为例。
APK ⽂件其实是⼀种特殊的 zip 格式,我们可以直接⽤ 360 压缩或者别的压缩⼯具打开。
为了满⾜⾃⾝的功能和设计,⼏乎每⼀个都会在基础的⽂件结构上添加不少东西,但有六个部分是不变的,我们罗列和称述⼀下。
⽂件或⽬录作⽤META-INF/描述apk包信息的⽬录,主要存放了签名信息,配置信息,service注册信息res/存放apk资源⽂件的⽬录,⽐如图⽚、图标、字符串、样式、颜⾊assets/同样是存放apk资源⽂件的⽬录,但和res有差异,和我们关系不⼤resources.arsc资源索引,包含不同语⾔环境中res⽬录下所有资源的类型、名称与ID所对应的信息lib/存放so⽂件,越来越多的应⽤由C/C++编写核⼼代码,以SO⽂件的形式供上层JAVA代码调⽤,以保证安全性,这个⽬录是逆向解密关注的重点classes.dex(⼀个或数个)Android程序运⾏在Dalvik虚拟机上,⽽dex就是Dalvik虚拟机的可执⾏⽂件, 相当于Windows平台中的exe⽂件,通过反编译dex,可以获得apk源码(这个说法不很准确,但⽅便理解)AndroidManifest.xml清单⽂件,包含了App⼤量的的配置信息,⽐如包名、应⽤需要拥有的权限(打电话/录⾳/⽹络通信等等)、以及所有的界⾯和程序组件的信息,⽆法解压apk时直接打开,因为清单⽂件在apk打包过程中被编译成了⼆进制格式⽂件接下来我们介绍以下反编译⼯具,看⼀下反编译⼯具的作⽤⼯具作⽤ApkTool解析resources.arsc,AndroidManifest.xml等⽂件,反编译dex⽂件为smali源码Dex2jar将dex⽂件转化为jar⽂件Jd-gui反编译jar,查看java源码⽐如使⽤ Dex2jar+Jd-gui, 最终得到这样的结果。
Android程序反编译工具JEB
Android程序反编译⼯具JEB
⼀、下载并打开
JEB是⼀个付费的逆向⼯具,专业版售价⾼达1800美元,此分享仅供学习使⽤,切勿⽤于商业盈利。
下载并解压后,找到jeb_wincon.bat,双击这个批处理程序。
会依次出现⼀个命令⾏窗⼝和JEB程序窗⼝
不⽤在意那个“检查更新出错”,不影响正常使⽤。
⼆、简要介绍
JEB是⼀个功能强⼤的为安全专业⼈⼠设计的Android应⽤程序的反编译⼯具。
⽤于逆向⼯程或审计APK⽂件,可以提⾼效率,节约⼯程师的分析时间。
①可将Dalvik字节码反编译为Java源码,⽆须DEX-JAR转换⼯具
②JEB强⼤的⽤户界⾯使你可以检查交叉引⽤,重命名的⽅法、字段、类、代码和数据之间导航,以及做笔记和添加注释等
③可以检查解压缩的资源和资产、证书、字符串和常量等。
可以保存对JEB数据库⽂件的分析,通过JEB的修订历史记录机制跟踪进展。
④JEB⽀持Windows、Linux和macOS
⑤使⽤Java或Python语⾔,⽤户可以编写⾃⼰的脚本和插件来⾃动执⾏逆向⼯程流程。
⾼级⽤户可以编写完整的分析模块。
三、参考书籍
《Android⾼效进阶:从数据到AI》第9章静态分析Android引⽤。
科锐逆向笔记非常好的逆向学习材料 PPT课件
பைடு நூலகம்
归 并
debug
release
Fun2参数 不连续不能
2020/4/7
归并
6
2010_年4月_8日
Copy代码
在IDA中找到感兴趣的函数后,进入函数体内,将对应的汇编代码COPY 出来,放到汇编建的dll工程下,要注意分析清楚其调用方式以便做正确声明
函数申明 IWillCopyCode proc C Value1:DWORD 将代码COPY这里,修改crt_(c库函数) ret
IWillCopyCode endp
然后将函数名放.def文件中作导出申明
EXPORTS
IWillCopyCode
在VC工程中增加编译后的lib文件,声明函 数类型 extern “C” 调用方式 函数名称…
软件逆向分析
V0.1
整理科锐课程内容
说明:主要针对VC下的逆向分析 使用工具 VC、OD、IDA
2020/4/7
1
2010_年4月_8日
识别main函数
在函数开始的第一个3个push下面的call就是main函数, WinMain是4个push后面跟的call就是WinMain。
因为在main函数之前的函数没有3个和4个参数的,main函 数后面就是exit退出函数。
add esp,xx/ mov esp, xx
push 寄存器(少量空间)
pop ecx
说明:对于需要少量的内存空间则使用push申请,push后没有对 应的pop做恢复,则是申请空间;同样有pop的,前面没有push与 之配对,则是释放栈空间.
2020/4/7
8
逆向重打包 闪退思路
逆向重打包闪退思路逆向重打包(repacking)是一种将已经打包好的应用进行反向操作,以便对其进行修改和重新打包的技术。
而闪退则是指应用在运行过程中突然退出的情况。
当我们进行逆向重打包时,有时候会遇到应用闪退的问题,这会给我们的工作带来一定的困扰。
下面,我将分享一些思路和方法来应对逆向重打包闪退问题。
1. 查看日志:首先,我们需要查看应用的日志,以便了解具体的闪退原因。
在Android开发中,我们可以通过adb命令来获取应用的日志信息。
使用以下命令可以打印应用的日志到控制台:adb logcat这样我们就能实时查看应用的日志信息,从而获取更多关于闪退的详细信息,如异常堆栈、错误消息等。
根据日志信息,我们可以获取一些线索,帮助我们定位问题。
2. 分析日志:在查看日志的基础上,我们需要进行日志分析,以便找出导致闪退的具体原因。
首先,我们可以搜索关键字"Crash"或者"Exception"等,来定位相关的错误信息。
其次,我们可以根据错误堆栈日志,找出异常触发的具体位置。
对于Java应用,通常异常堆栈提示的是具体的类名、方法名以及行数。
通过分析堆栈信息,可以了解到哪个类的哪个方法中出现了异常。
从堆栈信息中,我们可以进一步分析异常的类型,并与代码进行对比,找出潜在的问题。
3. 检查资源文件:有时候,应用的闪退可能与资源文件有关。
例如,使用了一个不存在的资源ID或者引用了一个无效的资源。
这可能导致在应用启动时出现崩溃。
所以,我们需要检查应用中的资源文件,确保所有的资源文件的ID和引用都是有效的。
4. 检查权限:在重打包应用时,有时候会修改应用的权限配置。
如果某个权限被修改了,但是应用的代码或者其他组件中依赖了这个权限,就可能导致应用在运行时崩溃。
因此,我们需要检查权限配置,并与代码进行对比,确保权限的修改没有影响到应用的正常运行。
5. 运行环境问题:有时候,应用在特定的运行环境下可能会出现闪退问题。
教我兄弟学Android逆向09IDA动态破解登陆验证
教我兄弟学Android逆向09IDA动态破解登陆验证上⼀篇《》我带你熟悉了IDA⼯具的使⽤,并且⽤IDA爆破了so层的签名校验我给你布置的课后作业你也⽤上节课的⽅法做出来了看你上节课学习的不错那么这节课给你带来IDA动态调试so的教程。
你看着我激动地说⼤哥,本节课我已经期待很久了,终于来了!!我要认真听课!要么学!要么不学!学和不学之间没有中间值不学就放弃,学就要去认真的学! --致选择下⾯开始今天的教程:⾸先把⿊宝宝apk安装到⼿机上随便输⼊⼀个⽤户名和密码程序弹框“登陆失败” 于是在jeb中搜索登陆失败发现搜索不到于是猜想字符串可能是在so中于是开始分析:注:⿊宝宝apk可在附件下载。
⼀ JEB反编译APK 静态分析Java代码关于JEB的使⽤教程可以看番外《》1.jeb打开⿊宝宝.apk 打开AndroidManifest.xml查看程序⼊⼝这⾥ android:debuggable="true"表⽰此apk可以动态调试如果是false动态调试的时候需要改成true,否则不可被动态调试。
<ignore_js_op>2.找到MainActivity⼊⼝类并反编译成java代码通过静态分析java代码可知⽤户在输⼊⽤户名和密码后程序会调⽤Native⽅法check来校验⽤户名和密码是否正确。
<ignore_js_op><ignore_js_op>⼆ IDA静态分析找位置1.解压⿊宝宝软件找到lib\armeabi\libJniTest.so 并⽤IDA打开找到check函数并分析此函数,不会⽤IDA的请从前⾯课程开始学起<ignore_js_op><ignore_js_op>⼩结经过以上分析在输⼊⽤户名和密码后程序会调⽤libJniTest.so中的check⽅法校验⽤户名和密码是否正确如果正确check⽅法返回字符串登陆成功,否则返回字符串登录失败。
逆向工程核心原理读书笔记(1)
逆向⼯程核⼼原理读书笔记(1)
⼯具
OllyDbg免费的win32专业调试⼯具。
IDA Pro收费的专业调试⼯具,功能强⼤。
设置“⼤本营”的四种⽅法
(1)goto命令快捷键是ctrl+g,⽬前就会根据地址找来找去,应该还有其他⽤法。
(2)设置断点,快捷键F2.在觉得重要的点设置断点,下次可以直接CTRL+F9运⾏到断点⾃动停⽌。
(3)注释,快捷键是;必须是英⽂的分号。
(4)标签,快捷键是:也必须是英⽂的冒号。
快速查找代码的四种⽅法
(1)代码执⾏法
(2)字符串检索法;⿏标右键查找:所有字符串引⽤。
(3)API检索法⼀:在调⽤代码中设置断点。
(4)API检索法⼆:在API代码中设置断点。
修改字符串的两种⽅式
(1)直接修改字符串缓冲区。
有点事简单直观,缺点修改后的字符串不能⽐原字符串长。
(2)在其他内存区域建⽴字符串,并传递给引⽤函数。
优点是可以任意修改,缺点是传递过程设置⽐较复杂。
⼀些快捷键和汇编指令
ctrl+e编辑数据
space编辑汇编代码
call xxxx 调⽤xxxx处的函数
jmp xxxx 跳转到xxxx处
push xxxx 将xxxx保存到栈中
retn 跳转到栈中保存的地址。
梆梆加固(个人版)逆向初探(Android)
梆梆加固(个人版)逆向初探(Android)将简单的测试程序通过梆梆加固(个人)加壳后进行分析:1、静态分析:将加固后的APK用winrar解压,与原APK对比,发现AndroidManifest.xml和classes.dex文件被修改,并新增了一个assets文件夹。
图1为文件夹中的文件。
图1查看java文件,发现单列类Acall提供了所有的native函数入口。
跟踪程序发现调用顺序为r1->jniCheckRawDexAvailable->r2->jniGetRawDexAvailable->set2->at1->set4->set8。
用IDA直接打开库文件来查找函数,发现IDA直接崩溃。
转而动态调试。
2、动态分析:连接IDA调试,在加载第一个库文件libsecexe.so前,出现SIGCHLD信号。
直接选ok和yes(pass to app)即可。
或者更改选项,对SIGCHLD进行忽略处理。
加载库文件后,先找my_init()。
函数会拷贝libsecexe.so中部分数据到内存的其他部分。
代码将会在这段更新过的内存中运行,运行过后又会被修改掉。
在JNI_OnLoad上下断点,跟踪到函数UseJniBridge。
在跳转到该函数的时候,r1中存储了函数的首地址,r2中存储了函数名。
在r1处下断点并标注函数名。
JNI_OnLoad结束后,程序会按照静态分析得到的顺序调用函数。
进入r1函数,主体部分是将一些内存中的字符串进行解密并写入内存,并有部分内存修改的操作。
解密后的结果为库名和系统函数名称。
有close,__open,fread,fwrite……等等,下图为其中一部分。
图2图3图4注意到后面有写入dvmRawDexFileOpenArray和dvmDexFileOpenPartial这两个加工dex文件的函数。
因此尝试在函数dvmRawDexFileOpenArray开始处下断点。
逆向研发的技巧
逆向研发的技巧逆向研发是指将已有的软件、硬件或固件进行逆向分析,以了解其工作原理、解密密钥或修改功能。
以下是逆向研发的一些常用技巧:1. 静态分析:通过查看二进制文件的代码、结构和数据,以及使用反汇编器和调试器等工具,来理解软件的执行逻辑和数据流。
可以使用逆向工程工具和脚本来辅助分析。
2. 动态分析:通过运行软件,并使用监视工具、调试器和代码覆盖率工具等来观察其运行时行为,以获取更多信息。
可以使用模拟器和虚拟机来隔离和分析软件。
3. 扫描和分析网络流量:通过监控网络通信并对流量进行分析,可以了解软件与其他系统的交互,以及可能存在的漏洞和安全问题。
4. 反编译:将二进制文件转换为高级语言代码,以便更好地理解程序的功能和实现方式。
反编译工具可以将汇编语言代码转换为C、C++或其他高级语言代码。
5. 软件漏洞挖掘:通过分析软件的代码和输入验证过程,以发现可能的安全漏洞和潜在的攻击面。
可以使用模糊测试、符号执行和漏洞扫描工具等来辅助漏洞挖掘。
6. 代码重构和修改:通过分析软件的结构和功能,可以对代码进行修改和重构,以满足特定需求或改善性能。
使用源代码编辑器和调试器等工具可以实现这一点。
7. 反汇编和汇编:将机器码转换为汇编语言代码,以更深入地理解程序的运行方式和指令流程。
可以使用逆向工程工具和编译器来完成这项工作。
8. 嵌入式系统逆向:对于嵌入式软件和固件,需要了解芯片架构、通信协议和硬件接口等相关知识。
使用调试器和硬件调试工具可以更好地理解和分析嵌入式系统。
需要注意的是,逆向研发有时可能涉及法律和伦理问题,因此在进行逆向研发之前应该遵守相关法律法规,确保自己的行为合法合规。
逆向分析思路范文
逆向分析思路范文逆向分析是一种技术手段,其目的是通过分解和分析已有的软件、硬件、或者固件,来推导出其设计和实现过程中的关键信息。
逆向分析可以用于解码加密算法、破解软件的授权限制、恢复已损坏的程序代码等等。
在实际应用中,逆向分析通常被用于软件安全领域,以便发现和修补软件中的漏洞和错误。
下面将介绍逆向分析的基本思路和一些常用的工具和技术。
1.目标确定:首先要明确逆向分析的目标,例如分析一个未知的二进制文件、破解一个加密算法、还原一个被压缩或加密的文件等。
2. 选择合适的工具:根据目标的不同,采用不同的工具。
常用的逆向工具包括IDA Pro、OllyDbg、Ghidra、x64dbg等。
这些工具提供了反汇编、调试、内存分析等功能,可以帮助分析文件的结构和运行过程。
3. 反汇编:通过反汇编工具将目标程序转化成汇编代码,再通过对汇编代码的分析来理解程序的结构与逻辑。
关键是找到程序的入口点(Entry Point)和主要函数,以及它们之间的调用关系。
4.动态调试:使用调试工具对目标程序进行动态调试,可以单步执行程序,观察内存中数据的变化,修改寄存器的值等。
通过动态调试可以更深入地理解程序的执行过程。
5.数据流分析:跟踪程序中关键的数据流动情况,可以帮助理解程序的运行逻辑和算法。
通过查看函数参数、返回值、全局变量等,可以推断出程序的功能和操作。
6.逆向工程:根据逆向分析的结果,尝试还原程序的设计和实现过程。
这包括恢复程序的源代码或者设计文档、理解算法的原理等。
这个过程可能需要编写脚本或者小工具来辅助分析。
7.漏洞挖掘:逆向分析可以帮助发现软件中的漏洞和安全问题。
通过理解程序的运行机制和安全机制,可以检测出缓冲区溢出、代码注入等攻击面和安全弱点。
8.结果验证:逆向分析得到的结果需要进行验证,例如用测试用例验证假设的算法或数据与实际运行结果是否相符,或者通过其他手段验证分析结果的正确性。
9.文档记录:逆向分析是一项复杂的工作,需要详细记录整个分析过程、结果和结论。
武汉科锐逆向培训学习笔记
printf("%p\r\n",a+1); printf("%p\r\n",*(a+1)); printf("%p\r\n",*a+1); printf("%p\r\n",*(*a+1)); printf("%p\r\n",p); printf("%p\r\n",*p);
怎样用CL编译程序:
上图是CL和LINK的存放位置 新建一个a.c的程序,在cmd下,键入CL a.c /c,会生成c.obj文件,再用LINK命令 LINK a.obj生成能a.exe文件。 CL时可以生成a.i的中间文件 CL a.c /c/P 注意P要大写 可以用a.exe >a.txt将打印的东西输出到文本上。 变量是对地址的重命名。 一个编译器的好坏有三个标准:速度,体积,编译时间 小数的存储方式:浮点法和定点法。 bool和char占用空间都是1个字节。如果只定义一个变量,就存在内存对齐的问题, 其它三个字节都浪费掉。
地址的减法是要除以sizeof的。 函数外的指针要想改变,要传指针的指针 type a[m][n]; type *p =a[0]; a[i][j]*(p+i*n+j);
int a[2][3]={1, 2, 3, 4, 5, 6};
int *p = NULL;
p = &a[0][0];
printf("%p\r\n",a); (*a)[3]
可以用sizeof(ary)/sizeof(ary[0])来求一维数组中变量的个数 硬件设备就是抽象成文件 memcpy(拷贝到的地方,数据源,内存块) fflush(stdout) _flushall()清除缓存 a[6]={5,0,1,2,3,4},第一个元素可以记录数组的个数 ‘\xa’ = 10 ‘\xff’=255 #define getchar getc(stdin) strlwr转小写 strupr转大写 strcmp字符比较 stricmp字符不区分大小写比较 所有的全局变量都是静态变量 全局变量的默认值都是0 全局变量和静态变量的地址很近 寄存器变量register int n 只限于4个字节的变量 int char 指针 宏断行用\ #define for if(0);else for 带参宏要把参加括号 强内聚,低偶合
《Android应用安全防护和逆向分析》读书笔记思维导图PPT模板下载
工具篇
第15章
1
Android逆向
分析基础
第16章 反编 2
译神器 apktool和 Ja...
3 第17章 Hook
神器Xposed
4 第18章 脱壳
神器ZjDroid
5
第19章 Native层
Hook神器
Cy...
15.1 逆向工具
15.2 逆向基本知 识
15.3 打开系统调 试总开关
15.4 本章小结
16.1 逆向操作惯 例
16.2 反编译常见 的问题
16.3 分析 apktool的源码
16.4 解决常见问 题
16.6 Jadx源码 分析
16.5 apktool的 回编译源码分析
16.7 本章小结
17.1 安装教 1
程
2
17.2 环境搭 建
3 17.3 编写模
块功能
4 17.4 运行模
块
5 17.5 本章小
对本书的赞誉
基础篇
第1章 Android 中锁屏密码加密
算法...
第2章 Android 中NDK开发
第3章 Android 中开发与逆向常 用命...
第4章 so文件格 式解析
第6章 resource.arsc
文件格...
第5章 AndroidManifes
t....
第7章 dex文件 格式解析
8.1 混淆机 1
制
2
8.2 签名保 护
3 8.3 手动注
册native方 法
4 8.4 反调试
检测
5 8.5 本章小
结
9.1 辅助功 1
能权限
2
9.2 设备管 理权限
android逆向奇技淫巧六:x音关键加密字段算法逆向分析(一)
android逆向奇技淫巧六:x⾳关键加密字段算法逆向分析(⼀) 上⽂通过fiddler抓到了点赞的包,并通过对⽐不同包的差异确定了需要逆向4个关键字段的算法:X-Ladon、X-Gorgon、X-Tyhon、X-Argus;本⽂尝试逆向分析这些字段的实现算法! 既然要逆向分析字段的⽣算法,第⼀件事就是要找到算法的⽣成代码。
这⾥再重复⼀句真理: 逆向都是从数据开始的!于是满怀期待把这4个字符串放到android killer(jdax-gui逆向这种上百兆app时,⽤全局搜索⾮常耗内存,我16G的内存都不够⽤),结果⽆⼀例外都找不到!这不是应征了中国⼈的那句古话:此地⽆银三百两么!既然这些字段直接搜不到,那么就有这么及种可能: 字段本⾝被分成了好些段,⽐如X-Ladon被分成了X- La don等段,⽤完整的字符串搜不到;字段本⾝被加密了,使⽤的时候才动态解密,导致静态搜索查不到dex⽂件被加密或加壳导致静态搜索查不到X-Ladon是在so层⽣成的,所以java层静态找不到!在kali下⽤strings命令查找的结果不乐观,如下:啥都没有 换成X-试试:这次找到了⼀⼤堆,但是挨个⼈⾁搜查后发现还是没有我们想要的这4个字段,那么只剩⼀种可能了:这4个字段都被加密了! 关键字段直接找不到,只能“围魏救赵”,从⾮关键字段⼊⼝;GET头有很多字段,GET的url⾥⾯不也有很多字段么?其实这些字段都是为了从客户端给服务端传递信息,没有本质区别的!头的字段不好找,就从url下⼿呗!⽤url的“/aweme/v1/commit/item/digg/”下⼿,终于找到了(⽽且还只有2处,⾮常利于查找):smali代码看着不⽅便,这⾥继续换成jadx试试。
代码如下:很明显⽤了retrofit框架!package com.ss.android.ugc.aweme.feed.api;import androidx.core.util.Pair;import com.bytedance.covode.number.Covode;import com.google.b.h.a.q;import com.meituan.robust.ChangeQuickRedirect;import com.meituan.robust.PatchProxy;import com.meituan.robust.PatchProxyResult;import com.ss.android.b.a;import com.ss.android.ugc.aweme.feed.model.DeleteItemResp;import com.ss.android.ugc.aweme.feed.model.DiggItemResponse;import com.ss.android.ugc.aweme.services.RetrofitService;import retrofit2.http.GET;import retrofit2.http.Query;public final class FeedActionApi {/* renamed from: a reason: collision with root package name */public static ChangeQuickRedirect f167036a;/* renamed from: b reason: collision with root package name */public static final RetrofitApi f167037b = ((RetrofitApi) RetrofitService.createIRetrofitServicebyMonsterPlugin(false).createNewRetrofit(a.f123092f).create(RetrofitApi.class));public interface RetrofitApi {static {Covode.recordClassIndex(86951);}@GET("/aweme/v1/aweme/delete/")q<DeleteItemResp> deleteItem(@Query("aweme_id") String str);@GET("/aweme/v1/commit/item/digg/")q<DiggItemResponse> diggItem(@Query("aweme_id") String str, @Query("type") int i, @Query("channel_id") int i2, @Query("filter_warn") int i3);@GET("/aweme/v1/commit/item/digg/")q<DiggItemResponse> diggItem(@Query("aweme_id") String str, @Query("type") int i, @Query("channel_id") int i2, @Query("city") String str2, @Query("activity") int i3);@GET("/aweme/v1/commit/item/digg/")q<DiggItemResponse> diggItem(@Query("aweme_id") String str, @Query("origin_aweme_id") String str2, @Query("type") int i, @Query("channel_id") int i2, @Query("city") String str3, @Query("activity") int i3); }static {Covode.recordClassIndex(86950);}public static Pair<String, Integer> a(String str, int i, int i2, String str2) throws Exception {PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str, Integer.valueOf(i), Integer.valueOf(i2), str2}, null, f167036a, true, 244471);if (proxy.isSupported) {return (Pair) proxy.result;}f167037b.diggItem(str, i, i2, str2, 0).get();return Pair.create(str, Integer.valueOf(i));}} 从这⾥也看不出个啥!那就⽤obejction hook试试呗:结果没任何反应,说明根本没调⽤! 截⾄⽬前,静态分析能⽤的⼿段都⽤了,由于java层混淆地厉害,不太好分析这些类、⽅法和变量的功能;lib下⾯的so⽂件有113个,我也没时间精⼒挨个拖到IDA去分析,只剩⼀条路了:内存搜索和dump! 先⽤objection,查找某个字段,有结果: ⽤frida查看:意外发现了另⼀个关键的字符串; 现在问题⼜来了:此时如果在windows下⽤OD或CE调试PE⽂件,可以在这个内存地址下断点,⼀旦有代码读写这个内存地址⽴即断下来,⽤来定位关键的代码;andrdoi 端该怎么操作了?先试试GameGardiance!尝试后发现这⾥只能查找字符串地址,然后根据maps映射查看,发现这些地址都是通过malloc函数在栈上分配的,根本不再代码段(这⼜是⼀句正确的废话),⽆法定位到具体的so! X-Ladon也是:都是通过malloc在栈上分配的地址,⽆法定位到so⽂件! 换成最熟悉的CE:X-Ladon关键字段存放的位置很多,但是值得关注的不超过5个,如下: 本以为胜利就在眼前,想直接通过“find out what access this address”定位到关键代码,结果直接报错!what the fxxk............. 刚开始不知道为啥,后来查了很多资料,发现是hw⼿机即使root后,默认也没开启硬件断点,所以⽤gdb调试也没法下硬件断点: 好吧,ce没法下内存断点,继续试试ida:内存⾥⾯还算顺利,4个关键的字段都能找到,窃喜(先根据ce的地址找X-Ladon字段,结果在这个字段的附近居然同时出现了其他3个字段,真是得来全不费功夫啊)! 耐⼼点:每个字段都下个读写断点: 居然⼀个都没有断下来,怎么回事了?有可能是这些通过malloc分配的地址只⽤1次(尝试过⽤pixel,毕竟是Google的亲⼉⼦,root后默认是开启了硬件断点的。
逆向工作法第七章读书笔记
逆向工作法第七章读书笔记一、读书前的期待刚看到要读逆向工作法第七章的时候,心里就特别好奇。
这一章会讲些啥呢?是会有超级实用的工作技巧,还是会有那种让人脑洞大开的思维方式呢?就像打开一个神秘的宝盒,满心期待着里面的宝贝。
二、书中的惊喜发现1. 概念新理解这一章里有些概念特别有意思。
比如说它对某个概念的解释,完全打破了我之前的认知。
以前我觉得工作就得按部就班地顺着来,但是这里提到的逆向工作法,就像是在告诉我们,有时候倒着走说不定能更快到达目的地呢。
就像你要去一个地方,大家都从家门口出发,顺着路走,但是逆向工作法就像是从目的地开始找回家的路,可能会发现一些新的近道。
2. 实际案例启发书里还举了好多实际的案例。
有个公司在做项目的时候,按照常规方法怎么都解决不了问题。
但是当他们用逆向工作法的时候,就像是找到了一把神奇的钥匙。
他们从想要的最终结果出发,一步一步倒推需要做什么,结果不但解决了问题,还节省了好多时间和资源。
这就给我很大的启发,在我以后做事情的时候,尤其是遇到困难的时候,不妨也试试这种逆向的思维。
三、与自己的联系我就想到我在大学参加社团活动的时候。
当时我们要策划一个大型的活动,但是按照传统的策划方法,总是感觉很乱,而且预算也超支了。
要是当时我知道逆向工作法,从活动最完美的结束状态开始想,比如最后大家都满意地离开,然后倒推我们需要做什么准备,可能就不会那么手忙脚乱了。
而且我觉得这种方法在我未来找工作的时候可能也会很有用。
比如我想找一份理想的工作,那我就可以从理想工作的状态,比如我在这个岗位上能做到什么成就,然后倒推我现在需要学习什么技能,积累什么经验。
四、对未来的思考读完这一章,我感觉自己看待事情的眼光都有点不一样了。
我想在以后无论是学习新的知识,还是处理人际关系,都可以尝试用逆向的思维去思考。
说不定会有更多的惊喜发现呢。
就像打开了一扇新的大门,门后面有无限的可能在等着我。
我现在就特别想把这种思维方式分享给身边的同学,大家一起用新的视角去看待这个世界。
ctf逆向安卓篇
CTF逆向--安卓篇Androideasy使用APKToolBOX中的jadx打开该apk文件找到MainActivity查看主函数,如下所示packagecom.a.sample.androidtest; importandroid.content.Context;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.EditText;import android.widget.Toast; public class MainActivity extends AppCompatActivity { private EditText editText; private byte[] s = new byte[]{(byte) 113, (byte) 123, (byte) 118, (byte) 112, (byte) 108, (byte) 94, (byte) 99, (byte) 72, (byte) 38, (byte) 68, (byte) 72, (byte) 87, (byte) 89, (byte) 72, (byte) 36, (byte) 118, (byte) 100, (byte) 78, (byte) 72, (byte) 87, (byte) 121, (byte) 83, (byte) 101, (byte) 39, (byte) 62, (byte) 94, (byte) 62, (byte) 38, (byte) 107, (byte) 115, (byte) 106}; public boolean check() { byte[] chars = this.editText.getText().toString().getBytes(); if (chars.length != this.s.length) { returnfalse; } int i = 0; while (iif (this.s[i] != (chars[i] ^ 23)) { returnfalse; } i++; }return true; } protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView((int) yout.activity_main); final Context context = this; this.editText = (EditText) findViewById(R.id.edit_text);findViewById(R.id.button).setOnClickListener(new OnClickListener() { public void onClick(View v) { if (MainActivity.this.check()){ Toast.makeText(context, 'You got the flag!', 1).show(); } else{ Toast.makeText(context, 'Sorry your flag is wrong',1).show(); } } }); }} 查看onClick函数,其中调用了check函数,check函数中将用户输入的字符串与23进行异或,然后与数组s进行比较,判断其是否一致。
安卓逆向8-Frida-脱壳,使用引力播这个app
安卓逆向8-Frida-脱壳,使⽤引⼒播这个app ###使⽤frida脱壳安卓逆向,写代码的难度是⽐较⼩的,难度⼤,是因为要分析原理,⽐如frida脱壳,这个其实代码很简单,⼗⼏⾏代码就好了,但是要懂得原理才可以,###之前使⽤的⼯具脱壳的就是Xposed的⼀个⼯具组件,现在我们使⽤frida 来开发脱壳,毕竟作为开发,还是需要了解这个的,###脱壳要懂得原理,这个难度⽐较⼤,真正写代码是⾮常简单的,⼏⼗⾏代码就搞定了,###使⽤frida脱壳的原理,还是壳加载源app到内存之后,从内存中取出这个源app的代码,然后使⽤frida把这个保存到本地,就实现了脱壳了###frida脱壳使⽤到的apifunction_address = Module.findExportByName(libname, function);Interceptor.attach(address, func);Interceptor.attach(address,onEnter: function (args) {},onLeave: function (retval) {})File 模块写⽂件流程new File(filepath, mode)write(data)flush()close()file = new File("yuanrenxue.dex", "wb")//data 是字符串或者 arrayBuffer // readByteArray() 返回的arrayBufferfile.write(data)file.flush()file.close()//把内存⾥的值转成字符串Memory.readUtf8String()//把内存⾥的值转换成整型Memory.readInt()//以begin为起始位置,从内存中读length长度的数据出来返回ArrayBuffer类型Memory.readByteArray(begin, length)//把地址转换成NativePointer类型 frida⾥操作内存地址需要NativePointer类型ptr()JS api#把其它进制转换成10进制parseInt(num, radix)###复习app加固和脱壳的原理你只有知道了这个加固壳是怎么运⾏的你才知道在哪⼀步脱壳,###了解dex⽂件格式###本质还是需要需要懂这个dex⽂件的格式,⾥⾯做了什么,是怎么保存的,⾥⾯有⼀个重要的属性,就是dex的数据具体有多⼤字节,这就是⽂件的长度,所以我们操作内存的依据就是这个,我们读取内存⾥⾯的dex数据的时候,就是从32个字节往后,⼀直加dex的⽂件⼤⼩,这就是dex⽂件我们要读取的起始位置,###内存的概念,因为我们是从内存把dex⽂件拿出来,所以还是需要知道这个内存怎么回事⽐如⼀个4G的内存,可能是分成了1万份,每⼀份都是有⼀个id的,关于内存的概念,还是理解不深刻,我需要单独学习⼀下计算机基础的知识,###怎么确定hook的点,我们要知道dex加载的时候经过了很多的流程,我们怎么知道在哪⼀个流程去取内存呢?第⼀个⽅法,就是你对安卓原理很通,熟悉代码逻辑,但是这个很难,真正做安卓app开发的,也未必搞得清楚,因为他们只是调⽤相关的api,做应⽤层的开发,对底层可能也不太清楚第⼆个⽅法,我们通过查资料,了解dex加载的流程,我们就是这种⼈,可能dex加载要经过10个⽅法,我们每⼀个做hook,看哪⼀个⽅法之后可以把内存dump出来,经过测试是这个openmemory的⽅法之后,会把dex加载到内存,所以我们hook这个函数,这个⽅法在libart.so库这个⾥⾯我们可以使⽤ida⼯具,打开这个库,查看这个⽅法的导出⽅法名,然后就知道了我们要hook这个⽅法,怎么查看这个⽅法的导出⽅法名?打开ida,主要使⽤ida,不要⽤ida64,左边就是so⽂件⾥⾯的函数,右边就是具体的函数信息,搜索openMemory,然后再IDA view-A,使⽤F5,把这个汇编语⾔,转换成为c语⾔,下⾯⼀长串就是⽅法名,底部这⼀长串就是这个导出⽅法名,我们使⽤ida的⽬的,就是为了找到这个导出⽅法名,###怎么找到这个libart.solibart.so位置是在 /system/lib/libart.soadb pull /system/lib/libart.so ~/Desktop这个libart.so和某⼀个app没有关系,我们找到这个so库,是为了知道⾥⾯的openmemory⽅法名,这个openmemory⽅法就是把dex⽂件读取进⼊内存的,所以我们要hook这个⽅法,###案例,还是使⽤的引⼒播这个app,我使⽤的是mumu模拟器+引⼒播+frida,进⾏脱壳,⾸先第⼀步,把这个libart.so拿出来,adb pull /system/lib/libart.so ~/Desktop第⼆步:使⽤ida⼯具,获取到这个openmemory的⽅法名,_ZN3art7DexFile100penMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_100atDexFileEPS9_使⽤ida可以,还可以主要是要拿到安卓/system/lib/下的⼀个叫做libart.so,放到电脑然后在电脑端使⽤命令nm libart.so |grep OpenMemory来导出OpenMemory⾥⾯的名称第三步,开始写代码#######代码:import fridaimport syspackage = 'com.iCitySuzhou.suzhou001'def on_message(message, data):if message['type'] == 'send':print("[*]{0}".format(message['payload']))else:print(message)# a安卓七open_memory_7 = '_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_'open_memory_6 = '_ZN3art7DexFile100penMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_100atDexFileEPS9_'# 所以安卓6和安卓7的这个名字是⼀样的,# 安卓九open_memory_9 = '_ZN3art7DexFile10OpenMemoryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEjPNS_6MemMapEPS7_'# OpenMemory在libart.so中,在/data/lib/下 art是虚拟机# Hook OpenMemory 导出⽅法名# ⽤ nm libart.so |grep OpenMemory 查看导出导OpenMemory⽅法名# OpenMemroy的第⼀个参数是dex⽂件,在内存的起始位置# 根据dex⽂件格式,从起始位置开始第32个字节是该dex⽂件的⼤⼩# 知道dex起始位置和整个⽂件的⼤⼩,只是要把这段内存dump出来即可# 实⽤与安卓 6 7 8 9src = """var openMemory_address=Module.findExportByName('libart.so','_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_'); Interceptor.attach(openMemory_address,{onEnter: function(args){//dex⽂件的起始位置var dex_begin_address=args[1]//dex⽂件的前⼋个字节是magic字段//打印magic(会显⽰dex 035)三个字符可以验证是否未dex⽂件console.log('magic:'+Memory.readUtf8String(dex_begin_address))// 把地址转换成整型再加32//因为dex⽂件的第三⼗⼆个字节处存放的dex⽂件的⼤⼩var address=parseInt(dex_begin_address,16)+0x20//把address地址指向的内存值读出来,该值就是dex的⽂件⼤⼩//ptr(address)转换的原因是frida只接受NativePointer类型指针var dex_size=Memory.readInt(ptr(address))console.log('dex_size:'+dex_size)//frida写⽂件,把内存中的数据写到本地var timestamp=new Date().getTime();var file=new File('/data/data/%s/'+timestamp+'.dex','wb')//Memory.readByteArray(begin,length)//把内存的数据读出来,从begin开始,取length长度file.write(Memory.readByteArray(dex_begin_address,dex_size))file.flush()file.close()send('dex begin address:'+parseInt(dex_begin_address,16))send('dex file size:'+dex_size)},onLeave: function(retval){if (retval.toInt32()>0){}}});""" % (package)print('dex 导出⽬录为:/data/data/%s' % (package))deveice = frida.get_usb_device()pid = deveice.spawn([package])process = deveice.attach(pid)# 创建运⾏脚本script = process.create_script(src)# 输⼊打印,写死script.on('message', on_message)print('[*] Running CTF')# 写死script.load()# 重启程序deveice.resume(pid)# 写死sys.stdin.read()第四步,把app运⾏起来,然后运⾏我们的脱壳程序,ok,成功获得我们想要的dex⽂件,就是成功脱壳了,然后会有多个,我们使⽤jadx依次打开,其中查看是哪⼀个包含我们的代码###上⾯是代码操作步骤:1,要先把app运⾏起来,因为这个时候,就说明这个加固app的dex⽂件加载到了内存⾥⾯2,然后运⾏我们的脱壳程序,正常运⾏就是脱壳成功了3,在app对应的⽬录,看看,应该是⽣成了导出的dex⽂件,###难点,是找到hook的点,###你能开发出来这个脱壳程序,在爬⾍领域就是⽐较⽜逼的了,但是这个没有这么容易,⼤部分的app不是这么简单的,还做了混淆等其他的限制,没有办法单独使⽤frida就能脱壳出来,还需要其他的知识, ####。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、修改软件名称
在AndroidManifest.xml 文件<application 标签的android:label 属性中,该属性的值可以直接是一个字符串,或者是字符串资源引用,也可能是直接软件名称。
1、MT管理器arsc 文件中搜索这个ID 改这边的值就可以修改软件名了,另外你也可以直接在AndroidManifest.xml 把@7f0b001f 改成你想要的软件名,但这样软件名就被写死了,不会根据语言环境自动切换。
2、MT管理器arsc直接搜软件名称修改
3、xml文件android:label 属性修改
4、Androidkiller 搜软件名称替换要改成的
流程:
篡改APK名称: APP →AndroidKiller →反编译→工程搜索→输入APP名称→搜索→全部改为新APP名称→编译→模拟器→安装运行
二、修改图标
APP 的图标定义在AndroidManifest.xml 文件中,具体在application 标签的android:icon 属性中。
1、MT管理器:
可以看到这个apk 一共有5 个图标,其实这些图标都一样,只是分辨率不一样。
如果你要修改图标,提前准备好图片资源,把apk 中对应的文件替换掉就行了。
如果你觉得一次要准备5 个不同分辨率的图标进行替换的话不方便,你也可以只替换其中一个,然后在arsc 中把其它四个配置删掉,同时apk 中对应的图标也删掉。
例如你准备的图标的分辨率和apk 中hdpi 的图标分辨率最接近,那么你可以只替换hdpi 所对应路径的图标,然后把mdpi、xhdpi、xxhdpi、xxxhdpi 四个配置都删掉。
这样做完全没问题,即使你的分辨率是xxxhdpi,系统找不到最佳分辨率图标时就会去使用hdpi 的图标,顶多显示时图标比较不清晰。
2、Androidkiller
在META-INF 文件搜/icon.png(经验:图标一般都是png格式)
搜到后找到文件夹目录地址(一般在res文件夹里)(右键打开res文件目录),根据尺寸大小替换图标
技巧一:在META-INF文件夹中的“MANIFEST. MF”文件搜索
技巧二:搜索/icon. Png 而不是icon.
流程:
篡改APK图标:工程管理器→AndroidManifest. xml→
→“application”标签→“android: icon=@drawable/ icon→
“META- -INF"→MANIFEST.MF →搜索“/icon. png→替换图片
三、修改包名实现软件分身、共存
在AndroidManifest.xml 文件
找到<manifest标签packge 属性即为包名
任意修改:删减添加全部修改不能为汉字
(内容提供者,有的软件没有)搜索<provide标签修改android: authorities 属性的值,全部修改。
修改方式和修改packge 属性一样
流程:
修改包名:
工程管理器→“Androi dManifest. xml"→“manifest”标签→package属性的值-→修改→“编译”→回编译→模拟器→安装运行
修改内容提供者:
AndroidManifest. xml→搜索“<provider”→修改android:authorities”属性的值→编译→回编译→模拟器→安装运行
问题注意:
就是程序崩溃了,无法运行
总结一下,有哪几种情况会导致程序无法运行,以及它们对应的解决方案是什么。
★第一种就是只修改APK包名会引发内容提供者冲突,
解决方案就是修改配置文件中所有内容提供者标签
“<provider”里面的“android: authorities" 属性的值
★第二种应用分身的签名信息不同导致无法运行
解决方案是使用相同的签名工具对所有分身APP进行统一签名
★第三种是有些APK在内部使用了包名,只修改包名会导致程序
崩溃
解决方案是全局搜索应用程序包名,查看搜索结果,如果是字
符串就进行替换,将原有的字符串改为修改后的包名,否则不
进行替换。
四、去除广告
1:、单机
xml删网络权限:
最后一个不能删除:APP可能更新导致崩溃
2、去启动页
(1)xml改入口界面
Activity 的配置保存在apk 里面的AndroidManifest.xml 文件中,使用MT 反编译这个文件。
查找入口Activity 我们只需要搜索android.intent.action.MAIN 或者UNCHER 就能快速定位。
当前入口Activity 是WelcomeActivity,其中intent-filter 包裹着的那6 行代码的作用就是让这个Activity 成为入口并显示在桌面上,所以我们把它去掉。
要让MainActivity 成为入口,就给它加上刚刚那段intent-filter。
去掉末尾的/> 换成>,并加上</activity>,然后在它们中间插入intent-filter,最后如下。
注意:如果主入口有intent-filter,这样的,添加android.intent.action.MAIN 和UNCHER就可以。
其他不要删。
(看易锦第九期9)。