面试题丨android面试问题合集

1、项目里静态分析和基于xposed动态工具介绍一下,如果不使用xposed,怎么实现动态分析工具?

静态分析工具是指在不运行程序的情况下,通过对程序文件进行源代码分析,从而对程序的安全性、可靠性、性能等进行分析的工具。它可以识别出程序文件中的漏洞,但只能识别出程序文件中的静态漏洞,不能识别出程序在运行中可能出现的动态漏洞。比如apktool、androidkiller、jeb,GDA、smali、jadx等

xposed是一款可以为Android系统添加动态模块的框架,它可以在不改变应用程序的实际代码的情况下,在运行时为应用程序加载新的动态模块。Xposed可以用来实现动态分析工具,因为它可以挂载到程序的运行过程中,给程序添加动态模块,从而实现对程序运行情况的动态分析。

如果不使用xposed,怎么实现动态分析工具?

可以使用热更新技术(热更新就是动态下发代码,当用户打开app时,通过网络下载升级包来直接更新,不需要发布新版本到应用市场。升级包的体积比较小,下载速度快。),它可以在不重新安装应用程序的情况下,将新功能添加到应用程序中,从而实现动态分析。此外,还可以使用Java反射技术,将特定的分析逻辑添加到程序运行过程中,从而实现动态分析。

2、安卓上的加固,脱壳技术介绍一下?

加固技术:加固技术是指在应用程序中采取一系列措施,以防止恶意仿冒、非法修改和拆分程序,从而保护应用程序的安全性和完整性。

常见的加固技术有代码混淆、签名验证、数据加密和、Root权限控制等。

脱壳技术:脱壳技术是一种反编译技术,用于将已经加固过的安卓应用程序反编译为可读的源代码,以便分析和研究应用程序的内部结构和原理。通常,脱壳技术可以分为两大类:静态脱壳技术和动态脱壳技术。
静态脱壳技术是指在不执行应用程序的情况下,通过反汇编和反编译来分析应用程序的原始代码;
动态脱壳技术是指在应用程序执行过程中,通过跟踪应用程序的执行流程并分析其内部结构,来反汇编和反编译其原始代码。

3、如何从海量app找出一个二次打包的应用呢,有几种思路?(流量特征、代码相似度检测、UI节点遍历等)

1、流量特征:分析应用的流量特征,如流量源、目的地、数据大小等,是否存在异常的特征,可以判断是否是一个二次打包的应用。
2、代码相似度检测:检测代码的相似度,如果存在相同的代码段或者极高的代码相似度,则可以判断是一个二次打包的应用。
3、UI节点遍历:针对UI界面,进行遍历,查看UI界面中是否存在异常,如相同的界面或者极高的相似度,说明可能存在二次打包的应用。

4、xposed框架原理?

Xposed框架是改变Android应用的行为的一种方法,它使用一种叫做模块的软件,这些模块可以在Android设备上运行,从而改变应用程序的行为或外观。

Xposed框架的原理是通过修改系统的内存来实现的,它将在Android的每一次启动时被加载,并且会捕获正在运行的应用程序的方法调用,然后根据Xposed模块的设置来改变应用程序的行为。Xposed框架可以被用来改变Android系统的外观和行为,这种改变可以使用户获得更多的功能和更强大的体验。替换/system/bin/app_process,该路径的app_process被替换为Xposed的app_process,对需要hook的方法进行native注册,达到优先执行

5、app的漏洞了解吗?应用克隆漏洞呢,activity暴露攻击怎么利用,webview漏洞,其他漏洞等?

1、全局可读写漏洞、域控制不严格漏洞、密码明文存储漏洞、远程代码执行漏洞、Webview漏洞、Android应用本地拒绝服务漏洞等

2、应用克隆漏洞:应用克隆漏洞是指攻击者可以通过某种技术手段复制一个应用,并将其修改以获取不正当的权限、数据访问等。
3、Activity暴露攻击:Activity暴露攻击是指攻击者可以通过某种技术手段获取到Android应用中的隐藏Activity,从而获取不正当的权限、数据访问等。
4、WebView漏洞:WebView漏洞是指攻击者可以通过某种技术手段获取到Android应用中的WebView实例,从而获取不正当的权限、数据访问等。
5、其他漏洞:Android应用漏洞还包括资源泄露、无线网络漏洞、应用更新漏洞、数据存储漏洞、系统服务漏洞等。

6、如何hook动态加载的dex?

动态加载dex的hook技术可以通过替换dex文件中的class文件来实现。可以通过替换classloader的openDexFile方法来替换dex文件的class文件,然后在openDexFile方法中将替换后的dex文件加载到虚拟机中,这样就可以hook动态加载的dex文件了。

7、arm和x86汇编有什么区别?函数调用约定,函数传参和返回值

1.函数调用约定不同:ARM采用的是“空参数栈”方式,而x86采用的是“压栈”方式。

2.函数参数传递不同:ARM中函数参数通常是通过寄存器传递的,而x86中函数参数通常是通过堆栈传递的。

3.函数返回值的方式不同:ARM中函数返回值通常是通过寄存器传递的,而x86中函数返回值通常是通过堆栈传递的。

4.有的指令没有:ARM汇编没有x86汇编中的堆栈操作指令,但x86汇编没有ARM汇编中的多数数据处理指令。

5.有的指令有些不同:ARM汇编和x86汇编中,有些指令的操作码和功能有些不同。

8、栈溢出原理,格式化字符串漏洞,有哪几种保护手段,怎么绕过栈上canary保护,ROP攻击原理

1.栈溢出原理:栈溢出是指程序在运行过程中,向栈中压入的数据比栈所能容纳的要多,从而使原本存放在栈中的数据被溢出的数据覆盖,从而导致程序出现异常。当程序接收到一个恶意数据,会在栈中压入一定量的数据,如果这个数据量超过了栈容量,就会导致栈溢出,程序就会异常终止,可能导致系统崩溃。

2.格式化字符串漏洞:格式化字符串漏洞是指程序未正确检查用户输入的格式化字符串,从而被恶意的利用。当恶意的用户输入一个特殊的格式化字符串时,程序就会运行一些不受控制的操作,甚至可以导致系统崩溃。

3.保护手段:

–格式化字符串应该进行输入验证,可以使用正则表达式或者其他技术来验证用户输入是否符合要求;

–使用访问控制列表(ACL)来控制访问,保证只有可信任的用户才能访问系统;

–安装最新的安全补丁,及时更新系统,防止漏洞被利用。

4.绕过栈上canary保护:可以使用栈溢出技术,将canary的值覆盖为预期值。

5.ROP攻击原理:ROP(Return-oriented Programming)攻击是一种反向控制流技术,它利用程序中的许多存在的返回指令,从而构造出一个攻击序列,来改变程序的执行流程。ROP攻击可以绕过现有的防御技术,例如堆栈保护、代码签名等,来达到攻击的目的。

9、现在安卓平台上得几种加固方式(动态加载,类抽取,混淆,vmp),怎么脱壳,及各种技术细节android常见的加固和脱壳技术,vmp了解吗,如何让你设计虚拟机保护你怎么实现?vmp的优劣势?

1.动态加载:动态加载技术可以在运行时将可执行文件下载至内存,以防止可执行文件被复制、植入病毒等。它可以降低应用程序的运行速度,因为它需要下载可执行文件,但同时可以提升应用的安全性。

2.类抽取:这种技术可以将应用的类抽取出来,并且将它们放置到独立的存储空间中,以便在运行时可以从这些独立的存储空间中加载这些类。这种技术可以有效阻止分析者从类中反编译出应用的源代码。

3.混淆:混淆技术可以使反编译者无法识别实际的代码,因为代码被混淆了,所以分析者无法得知实际的代码意图。这种技术也可以防止病毒感染,因为病毒程序也无法识别混淆的代码。

4.VMP:VMP(Virtual Machine Protection)是一种特殊的加固技术,它可以将应用程序运行在虚拟机环境中,从而使得反编译者无法直接访问应用的源代码,以及降低反编译的成功率。

脱壳:脱壳技术主要包括反汇编技术、检测加固技术和破解加固技术。
反汇编技术可以用来分析加壳文件,检测加固技术可以用来检测是否加了壳;
破解加固技术则可以用来破解加壳文件,从而使文件可以被反编译或破解。

谈谈虚拟机保护?

虚拟机保护使用虚拟化技术来保护某一台物理机器上的操作系统和应用程序,从而提高安全性和可靠性。它使用多个虚拟机(VM)来隔离物理机器上的资源,从而避免在执行应用程序时出现安全漏洞和其他系统问题。

虚拟机保护的优势:

•虚拟机保护可以提高系统的安全性,减少恶意软件和攻击的可能性,因为整个系统可以被隔离在虚拟机中。

•虚拟机保护可以减少系统的维护成本,因为它可以更容易地实施更新,不必重新安装每个应用程序。

•虚拟机保护可以提供更好的可用性和可恢复性,因为可以更容易地迁移虚拟机,从而更快地恢复系统。

虚拟机保护的缺点:

•虚拟机保护可能会增加系统的复杂性,因为需要在虚拟机和物理机器之间管理复杂的资源。

•虚拟机保护可能会增加系统的成本,因为需要购买其他的硬件设备和软件。

•虚拟机保护可能会减缓系统的性能,因为需要在虚拟机和物理机器之间共享资源。

10、frida原理,xposed与frida有什么区别?

Frida是一款免费开源的跨平台监视、调试、改写应用程序的工具,它可以通过使用动态代码注入技术,在运行时向目标程序中注入自定义代码,从而实现对其行为的实时监控和修改。

Xposed是一个使用root权限的安卓框架,它是以模块的形式对系统或应用程序的核心组件进行替换,从而达到修改系统行为的目的。

Frida与Xposed的区别:

•Xposed是基于root权限的安卓框架,模块的形式对系统或应用程序的核心组件进行替换;而Frida是一款免费开源的跨平台监视、调试、改写应用程序的工具,通过使用动态代码注入技术,在运行时向目标程序中注入自定义代码,从而实现对其行为的实时监控和修改。

•Xposed需要root权限,而Frida可以在不需要root权限的情况下操作,所以Frida更加安全。

•Xposed只支持安卓系统,而Frida支持多种操作系统,包括安卓、iOS、Windows、macOS等。

11、Got表hook和inlinehook有什么区别?

Hook和Inline Hook是两种不同的钩子技术,用于拦截程序的运行。Hook技术通过将一个函数指针指向用户定义的函数,在该函数被调用时,它会被用户定义的函数取代。Inline Hook技术则是通过替换一段汇编指令来实现的,当汇编代码被执行时,它会被用户定义的汇编代码替换。由于Hook技术只是替换一个函数指针,所以它的实现相对简单,而Inline Hook技术则需要替换一段汇编代码,所以它的实现相对复杂。

12、selinux安全相关

SElinux(Security-Enhanced Linux)是一种基于Linux的安全机制,它提供了一种有效的方式来限制系统资源的访问,从而防止恶意攻击者对系统的破坏。SElinux是基于强制访问控制(MAC)的概念来实现安全性的,它允许系统管理员为每一个特定的程序、文件或用户指定访问资源的限制。在SElinux中,可以设置用户的角色,以及每一个角色所允许的行为。可以设置文件的安全上下文,指定该文件的访问权限.此外,SElinux还有一系列的安全策略,可以更好地保护系统免受网络攻击。

13、Android从按下开机键,启动流程是怎样的?

1.启动Bootloader:Bootloader是一种特殊的引导程序,它负责从固件(firmware)中启动操作系统。

2.加载内核:内核是Android操作系统的核心,它负责管理设备的资源,如处理器、内存、存储空间和其他硬件。

3.加载init进程:Init进程是Android系统的最初进程,用于启动和管理其他进程。

4.加载Zygote进程:Zygote进程是Android系统的核心,它负责加载应用程序的库,以及创建新的应用程序实例。

5.加载dalvik虚拟机:Dalvik虚拟机是Android系统中的虚拟机,它负责为应用程序提供运行环境,并且负责执行应用程序代码。

6.加载系统服务和应用程序:Android系统会加载一些系统服务和应用程序,这些服务和应用程序负责完成设备上的基本任务和功能。

7.启动桌面:当系统服务和应用程序加载完毕后,Android系统会启动桌面,这样用户就可以开始使用设备了。

14、做过app自动化测试工具没有,这些漏洞如果编写自动化测试框架有什么思路?

1.首先,要确定当前APP的漏洞,可以通过静态代码分析工具(如PMD,FindBugs,Checkstyle)来检查源代码,以及使用动态分析工具(如Flowdroid,MobSF,AppMon)来检查应用程序的逻辑行为。

2.然后,根据漏洞的类型和严重程度,分析APP的架构,搭建自动化测试框架,可以使用开源框架Appium,Robotium等来实现。

3.接下来,根据漏洞的类型,将相应的测试用例编写出来,构建自动化测试用例,以便脚本自动执行。

4.最后,使用测试框架和用例,实施自动化测试,并根据测试结果,确定漏洞的存在性及修复程度。

15、ida有个f5的功能,那么如何阻止破坏f5分析呢?(破坏堆栈,滥用noreturn函数)ida不能f5反编译的原因?

1.在程序中使用编译器特定的指令,如堆栈布局,来防止F5分析。

2.使用编译器特定的指令,如noreturn函数,来防止F5分析。

3.使用静态分析工具来检查反汇编代码,以确定它是否可能会被IDA反汇编。

4.为了防止IDA的反汇编,可以将可执行文件中的一些字节替换为非可执行字节,使得IDA无法识别它们。

16、列举几个花指令的代码片段?

1.让电机以每秒60圈的速度旋转:

SET_MOTOR_SPEED motor_id, 60

1.让电机以每秒100圈的速度旋转:

SET_MOTOR_SPEED motor_id, 100

1.让电机以每秒50圈的速度反向旋转:

SET_MOTOR_DIRECTION motor_id, REVERSE
SET_MOTOR_SPEED motor_id, 50

1.让电机停止运转:

SET_MOTOR_SPEED motor_id, 0

比如:

private static final char[] wJ = "0123456789abcdef".toCharArray();
    public static String imsi = "204046330839890";
    public static String p = "0";
    public static String keyword = "电话";
    public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";

17、android的init_array和jni_onload的时机问题,如何绕过init_array的反调试?

Android的init_arrayjni_onload是两种不同的反调试机制。init_array是在链接时就会被调用,而jni_onload则是在Android系统中进行调用。

要绕过init_array的反调试,可以采用以下两种方法:

1.使用不同的链接器:可以使用不同的链接器以便替换init_array,从而避免被反调试

2.修改程序代码:可以手动修改程序代码,将init_array改为jni_onload,从而避免被反调试。

18、xposed hook原理,xposed如何实现一个dalvik模式函数的hook的,frida如何实现native函数hook的?

1.Xposed Hook原理:
Xposed Hook原理是通过在Android系统中安装一个叫Xposed框架的模块,它会替换掉需要hook的应用的某些函数,从而实现对应用程序的hook。Xposed框架会在dex文件中插入一些代码,以实现hook的功能。

2.Xposed如何实现一个Dalvik模式函数的hook:
Xposed框架可以通过在被hook的函数的前部插入一些代码来实现对函数的hook,从而在函数调用之前

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极安御信安全研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值