自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 安卓签名基础

在之前的文章关于Hook相关知识的学习一中,我们提到过安卓应用的打包流程:由图可以看到,在最后通过apkbuilder 打包生成apk文件后,需要对apk文件进行签名,然后再对apk进行对齐处理后才能进行发布。本章就来学习安卓签名相关的知识。Android签名概念及意义Android签名本质上就是对apk进行加密的过程,类似于我们之前学习的 HTTPS 通信,在安装apk时也得确保apk来源的真实性,以及 apk 没有被第三方篡改。此外,一个apk可以为另一个使用相同证书签名的apk公开自己的功能

2021-07-01 10:01:43 1058

原创 安卓开发之NDK开发基础(一)

暑期实习找到了A的安全开发,提前学习下NDK开发的简单流程。项目创建新建一个Empty Activity:右键点击 app/src/ 下的 main 目录,然后New > Directory,为目录输入一个名称(例如 cpp)并点击 OK:右键点击刚刚创建的cpp目录,然后 New > C/C++ Source File,输入一个名称,例如 test-ndk:然后右键点击选中 app ,然后选择 New > File,输入CMakeLists.txt 作为文件名并点击 OK

2021-05-26 23:16:49 2794 5

原创 网络流量分析与Android逆向小结

本章对之前的网络流量分析与Android逆向做个小结。网络流量分析原理解析分析原理前之前先了解中间人攻击的概念:在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信。攻击机以自己的证书替代服务器发给客户端的证书。通常,客户端不会验证该证书,直接接受该证书,从而建立起和攻击机的安全连接。这样,客户端发送的数据,都会被攻击机获取和解密。这里主要分析应用层抓包,应用层Https抓包原理有了Charles/burpsuite置于中间之后,本来C/S架构的通信过程会分裂为两个独立的通信过程,app本来

2021-03-03 21:53:23 963 1

原创 安卓开发之性能优化

本篇来学习《Android开发艺术探索》中的最后一章性能优化部分。安卓作为移动设备,内存和CPU资源都有限,应用程序不可能无限制的使用内存和CPU资源,过多的使用内存资源会导致OOM,而过多的使用CPU资源则可能会造成ANR。因此性能优化显得十分重要。1.布局优化核心思想:减少布局文件的层级,这样安卓绘制时的工作量就会减少,程序的性能也会提高。具体方法包括:多嵌套情况下可使用RelativeLayout减少嵌套。布局层级相同的情况下使用LinearLayout,它比RelativeLayo

2021-02-08 20:33:15 656

原创 Java链表基础

这次来学习下单链表的一些常见操作,链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。创建链表public class test { public static void main(String[] args) { int[] arr = {5,2,7,4,9,3,1}; SingleLinkedList singleLinkedList = new SingleLinkedList(); for(int i=0;i

2020-12-29 21:03:50 463 1

原创 Java二叉树基础

在前篇文章Java集合框架中我们介绍了排序二叉树、平衡二叉树以及红黑树的概念以及常见的增删操作步骤,这次就学习一下二叉树中常见的一些遍历、翻转等算法,之后刷题时如果遇见相关的题型再做补充。创建这里以排序二叉树为例:public class test { public static void main(String[] args) { int[] arr = {5,3,2,0,4,7,1,9,8}; BinarySortTree binarySortTree = ne

2020-12-27 20:19:48 207

原创 Java排序算法

这次学习下Java中几种经典的排序算法,参考十大经典排序算法最强总结(含JAVA代码实现),大致分为比较排序与非比较排序两种。比较排序在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。冒泡排序:重复地走访过要排序的数列,一次比较两个元素,并将这两个元素按顺序排列,不断重复地进行直到没有再需要交换即排序完成。 代码如下: public class test { public static void main(String[

2020-12-25 17:07:04 183

原创 Java之泛型基础

这里简单学习一下Java中的泛型与容器,不涉及原理知识。泛型顾名思义,就是指广泛的类型,通过一个Demo来理解一下:public class Pair<T>{ T one; T two; public Pair(T first,T second) { this.one = first; this.two = second; } public T getone() { return one; } public T gett

2020-12-24 16:30:06 167 1

原创 安卓开发之设计模式

这次来学习一下安卓开发中几种常见的设计模式,主要参考AndroidCot。安卓开发中的设计模式大致上可分为如下几类:所谓设计模式其实更像是在编写代码时的经验总结,使用这些模式规范能让我们的程序更健壮稳定、容易扩展。此外在编写面向对象程序时,我们也需要遵循以下6个原则:原则描述单一职责原则一个类只负责一个功能领域中的相应职责开闭原则对象应该对于扩展是开放的,但是对于修改是封闭的里氏替换原则所有引用基类的地方必须能透明地使用其子类的对象依赖倒置原则主要是实现

2020-12-20 23:36:55 1091

原创 Java集合框架

这次来学习下Java中几种常见的集合框架,参考《Java编程的逻辑》。HashMapHashMap中Map是指接口的意思,实现Map接口有多种方式,HashMap实现的方式利用了Hash。因此首先来看下Map接口的概念:Map接口Map有键和值的概念,一个键映射到一个值,Map按照键存储和访问值,键不能重复,即一个键只会存储一份,给同一个键重复设值会覆盖原来的值。Map接口的定义为:public interface Map<K,V> { V put(K key, V value

2020-12-15 21:02:33 286

原创 Java线程与锁优化

这次来学习下Java中线程的相关知识,也是之后学习Java并发机制的基础。前面在学习Handler机制以及JVM之内存管理与分配机制时均简要介绍过线程,那么首先来复习下从这两篇文章中我们了解到的线程的相关知识,有利于我们之后的学习。在Handler机制学习中,我们介绍了进程和线程之间的区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位;进程都有独立的代码和数据空间,线程组之间只能共享资源,每个线程都有自己独立的运行栈和程序计数器(PC)。还介绍了多线程的概念,通过将CPU的时间片按照

2020-12-09 17:21:45 242 1

原创 Java反射与类加载机制

前面在学习Xposed Hook的时候经常会用到反射与类加载器,这次就学习下Java中的反射与类加载机制。1. Java反射我们知道Java中的对象有编译类型和运行类型(例如多态),举个例子:Object obj = new java.util.Date();编译类型为Object,运行类型(即obj对象真实的类型)其实为java.util.Date,那么如果想要根据obj对象调用Date类中的一个方法例如toLocaleString,应该怎么做?我们首先想到的可能就是多态中常见的使用方法-强.

2020-11-20 10:18:40 396 3

原创 JVM之内存管理与分配机制

这次来学习一下Java虚拟机(JVM)的内存管理机制,参考书籍为《深入理解Java虚拟机》。上一节说到Java代码执行时的链接阶段是虚拟机执行Java命令解析执行.class文件,这个过程中就会涉及到内存的管理与分配,虽然JVM有自动内存管理机制,不再需要为每一个new操作写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题。然而一旦出现内存泄漏和溢出方面的问题,如果不清楚JVM内存的内存管理机制,那么将很难排查与解决问题。1. JVM运行时数据区划分链接是在运行时动态执行的,.clas

2020-11-02 15:11:47 333 1

原创 Java函数调用基本原理

最近由于论文的原因在做深度学习的一些东西,很长时间没有接触安卓开发和Java的知识,过年又面临找工作,忙里偷闲决定每周花点时间学习学习开发,今天就来复习一下Java函数调用????????????????基本原理????????????????????????????????????????????????,参考书籍为《Java编程的逻辑》。????????????????????????????????????????????????我们知道CPU有一个PC,指向下一条要执行的指令的地址,要么顺序执行

2020-10-28 22:47:47 948

原创 ML之集成方法

集成方法(ensemble method)通过组合多个基分类器(base classifier)来完成学习任务,基分类器一般采用的是弱可学习(weakly learnable)分类器,通过集成方法,组合成一个强可学习(strongly learnable)分类器,简单理解来说就是“三个臭皮匠顶过一个诸葛亮”。所谓弱可学习,是指学习的正确率仅略优于随机猜测的多项式学习算法;强可学习指正确率较高的多项式学习算法。集成学习的泛化能力一般比单一的基分类器要好,这是因为大部分基分类器都分类错误的概率远低于单一基分类器

2020-09-19 21:53:17 484

原创 ML之决策树

最近由于文档需求,开始接触了一些机器学习的东西,这里简要记录下学习的过程,目的是简单了解下决策树、随机森林、朴素贝叶斯、聚类这几个分类器的使用。参考书籍为《机器学习实战》,学习之前首先了解下机器学习的分类,主要分为以下几类:监督学习:必须确定目标变量的值,以便机器学习算法可以发现特征和目标变量之间的关系,包括两种任务类型:分类-将实例数据划分到合适的类别中;回归-主要用于预测数值型数据,样本集由训练数据和测试数据两部分构成,前者用于训练,后者用于验证测试训练样本 = 特征(feature) + 目标

2020-09-10 14:35:52 677

原创 安卓开发之RxJava入门

RxJava是一个异步框架,功能和之前说的EventBus是类似的,不同的是,EventBus仅是作为一种事件传递工具,事件发送后是不能做任何的数据改变,如果要改变,又要重新post一次,并且使用了EventBus的类都不能进行混淆;而RxJava里面几乎可以做任何事情,当建立起订阅关系时,可以用操作符做任何处理(比如转换数据,更改数据等),并且随着程序逻辑变得越来越复杂,RxJava依然能够保持逻辑简洁性。RxJava也可以和其他的一些第三方库例如Retrofit结合使用,处理效率更高,类似的还有RxBu

2020-09-08 00:14:21 471

原创 安卓开发之EventBus使用

学完GreenDao之后再来学习下EventBus的使用,EventBus 是一个Android事件发布/订阅框架,它利用发布/订阅者者模式来对项目进行解耦,可以利用很少的代码,来实现多组件间通信/Android的组件间通信。之前我们学习过一些传统的事件传递方式例如Handler、BroadcastReceiver等,相比之下EventBus代码简洁,使用简单,并将事件发布和订阅充分解耦。BroadcastReceiver常用于那些要与Android系统打交道的事件例如网络、电量的变化等;在Broadca

2020-09-06 17:43:19 2011

原创 安卓开发之GreenDao使用

最近接触了一些开源的项目,项目中数据存储大多选用GreenDao框架,因此这次就来学习GreenDao的使用。GreenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,让操作数据库时更简单、更方便。GreenDao对外提供的核心类有:DaoMaster:DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类。它具有静态方法来创建表或将他们删除。其内部类OpenHelper和DevOpenHelper是在SQLite数据

2020-09-06 13:32:09 718

原创 安卓开发之IPC机制详解

IPC(Inter-Process Communication),意为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。前面在学习Handler机制时提到过线程与进程的概念,在安卓中一个进程可以简单理解为一个程序或应用,而线程是CPU调度的最小单元,一个进程可以包含多个线程,也可以只有一个线程即主(UI)线程。1. 多进程模式既然是跨进程通信,必然要在多进程模式下进行。使用多进程的情况分为两种:由于某些原因,应用自身需要采用多进程模式来实现。可能原因有:应用中某些模块因特殊原因要运行在

2020-08-12 22:13:24 806

原创 安卓开发之View滑动与滑动冲突

在View工作流程中自定义View的一些注意事项里面,我们提到过要避免View的滑动冲突,那么这次就来看下View的滑动与滑动冲突。安卓中我们常见的下拉刷新等操作的基础就是滑动,有些时候由于Android手机屏幕比较小,为了给用户呈现更多的内容,也会需要使用滑动来隐藏或显示一些内容。View 滑动View的滑动本质上来说是移动 View,也就是改变其当前所处的位置。它的原理与动画效果的实现非常相似,都是通过不断地改变坐标来实现这一效果。 所以要实现View的滑动,就必须监听用户触摸的事件,并根据事件传入

2020-08-07 23:33:26 452

原创 安卓开发之View工作原理

前面已经介绍了View的事件分发以及处理机制,这次来学习下View的工作流程,学习之前要先了解一些基础知识。View位置参数我们知道安卓中坐标系是以屏幕的左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向。View坐标系也是这样,内部关系如下图所示:其中**getLeft()、getTop()、getRight()、 getBottom()**分别对应View的四个属性:left、top、right、bottom,分别代表相对于View父容器的左上角的横坐标(left)、左上角的纵坐标(top

2020-08-06 17:19:05 493

原创 安卓开发之Jetpack初探(Java与Kotlin)

在学习View的中间插个小插曲,这里学习一下Jetpack的基本用法。参考书籍为**《Andorid第一行代码》**。Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助程序员遵循最佳做法、摆脱编写样板代码的工作并简化复杂任务,以便将精力集中放在所需的代码上。详细的介绍可以去看Android developer。在Android developer的介绍中也可以看到,Jetpack主要由基础、架构、行为、界面构成,我们这里主要学习架构的基础知识。Jetpack中的许多架构

2020-08-02 15:16:11 4054 1

原创 安卓开发之事件分发机制

在上一篇文章安卓开发之事件处理机制中提到了安卓中事件被激发后需要被分发然后处理,前篇文章提到了基于监听和基于回调两种事件处理方式,这次就来学习下事件分发机制以及与事件处理的关系。在学习之前先看一些View的基础知识,之后在系统学习。...

2020-07-23 18:14:12 459

原创 安卓开发之事件处理机制

从这节开始慢慢接触自定义View的相关知识,包括View的事件体系以及View的工作原理等等。这次主要来学习一下安卓的事件处理机制,作为学习自定义View的前奏,能对之后理解自定义View有所帮助。所谓的事件包括系统事件和用户事件,用户事件就是指用户发出的可被识别的操作,例如用户按下按钮、点击屏幕等,系统事件则是由系统激发,例如定时器等等。事件被激发后需要被分发然后处理,这里我们先不用考虑事件的分发机制是怎样的,Android中支持两种事件处理机制:基于监听的事件处理机制和基于回调的事件处理机制。参考菜

2020-07-16 16:49:59 1097

原创 安卓开发之Canvas学习

前面在学习Animation中的ValueAnimator高级用法时,用到了Canvas,这次就系统的学习一下Canvas。Canvas的作用涉及到View的绘制,要想在View中绘制出相应的图像,就必须在Canvas上进行绘制,它就像是一个画板,然后可以使用Paint(画笔)在上面绘制或者用Path(路径)来绘制多个点,Paint会进行一些颜色等之类的初始化,如上图在学习Animation时所示。通常需要继承View并重写其onDraw方法来完成绘制。由上图可以看到,onDraw方法的参数就是一个C

2020-07-15 14:11:45 2360

原创 安卓开发之Drawable学习

前面已经学习了Android绘图与动画中的一些基础知识,这次来学习下安卓中提供的 Drawable

2020-07-13 16:04:49 892

原创 安卓开发之Material Design实战

Material Design是由谷歌的设计工程师们基于传统优秀的设计原则发明的一套全新的界面设计语言,包含了视觉、运动、互动效果等特性。这次来学习一下Material Design的相关知识,参考书籍为《第一行代码》。Toolbar...

2020-07-11 16:28:49 831

原创 安卓开发之Animation学习(帧、补间、属性动画)

Demo参考https://www.runoob.com/w3cnote/android-tutorial-animation.html。Android中的动画分为三大类,逐帧动画(Frame)以及补间动画(View动画),以及Android 3.0以后引入的属性动画 (Property)。帧动画帧动画就是简单的由N张静态图片收集起来,然后通过依次显示这些图片,形成动画的。实现帧动画一般有两种方式:使用AnimationDrawable 先编写好Drawable,再调用的start()以及stop

2020-07-08 15:20:36 645

原创 安卓网络编程学习之HTTP(S)

这里学习使用的API为Android原生API:HttpUrlConnection。我们平常使用中更多的是使用第三方框架例如OKHttp,Volley等,但是像Volley也是封装了访问网络的一些操作,底层用的还是HttpUrlConnection,而OkHttp和HttpUrlConnection则使用socket实现了网络连接,只是OkHttp比HttpUrlConnection来说功能更强大。当然这里先不说其他的第三方框架如何,先使用原生API进行学习。先看下...

2020-07-02 13:06:41 694

原创 安卓开发网络编程学习之Socket

我们在做app网络流量分析的第一步就是先抓取流量数据包,抓包一般又分为以下两种情形:应用层抓包:Http(s)协议抓包,常用抓包工具有Charles、Burpsuite、Wireshark。会话层抓包:Socket端口通信抓包,用Socket实现TCP/UDP通信。常用抓包工具有Wireshark。也就是app通信可以走Http(s)或者Socket,这里主要学习Socket通信,也分为两种方式:基于TCP和基于UDP的Socket通信。在学习Socket通信之前先复习一下计网中的一些概念。OS

2020-06-28 22:06:23 582

原创 安卓开发之AsyncTask异步任务学习及apk下载安装示例

紧接着上篇文章的Handler机制,AsyncTask是一个轻量级的用于处理异步任务的类,内部封装了Handler与线程池。Hanlder我们都知道,线程池的解释是这样的:由于线程是一种受限的系统资源,即线程不可无限制的产生,并且线程的创建和销毁都有相应的开销。为了避免频繁创建和销毁线程所带来的系统开销,就采用了线程池,池中会缓存一定数量的线程,进而达到效果。由上述解释来看,AsyncTask比Handler更为简洁高效。当然,Handler与AsyncTask都只适用于简单的异步操作,平常使用中更

2020-06-26 20:39:41 420

原创 安卓开发之Handler机制学习

我们知道Android为了线程安全,并不允许我们在UI线程外直接更新UI(多线程并发操作更新很可能导致安全问题),不能在UI线程中执行耗时操作(UI线程超过5s没有响应用于请求会导致ANR),也不能在UI线程中执行网络操作(很可能耗时)。因此我们想要实现UI界面更新可以通过Handler来通知UI组件更新,也可以直接使用runOnUiThread()来更新,同时,Android官方也提供了AsyncTask这个封装好的轻量级异步任务类。因此,这次主要来学习下这几种方式。当然,平常使用中更多的肯定会用一些成熟

2020-06-25 11:40:06 871

原创 安卓开发之Bitmap(位图)基础学习

在Android中,不管简单的还是复杂的控件或布局都直接或间接的继承自View。简单来说,AppUI界面上的每一个组件都是使用View和ViewGroup对象的层次结构构成的,如下图所示:View是绘制在屏幕上的用户能与之交互的一个对象。而ViewGroup则是一个用于存放其他View(和ViewGroup)对象的布局容。...

2020-06-23 09:09:55 646

原创 安卓开发之广播接收器

恶意软件检测中常常会看到应用的广播接收器在接收到屏幕锁定的广播后再进行一些恶意操作,这里广播(Broadcast)就指的是一种应用程序之间传输信息的机制,广播接收器(BroadcastReceiver)则是对前者的响应。广播也类似于计算机网络中的广播地址,同一局域网下的所有主机都会收到广播数据包。安卓的BroadcastReceiver主要分为两种标准广播和有序广播。标准广播普通广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之、间没有先后顺

2020-06-20 16:03:27 1192

原创 安卓开发之内容提供器

在恶意软件静态代码分析时,常常会看见的恶意操作就是窃取用户通讯录信息,这个恶意操作是通过内容提供器来实现的,并且底层是通过进程间通信实现的,这次就系统学习一下四大组件之一的内容提供器。前面所说的文件存储都只能用于当前的应用程序,不能实现应用间程序共享,而有的时候我们想要获取通讯录信息或者短信内容的话,就得实现程序间的数据共享,android中数据共享是通过内容提供者实现的。内容提供器有两种写法,一是使用现有的内容提供器来读取或操作应用程序中的数据,例如恶意软件中的读取联系人的恶意操作,另一种是创建自己的

2020-06-19 19:05:15 474

原创 安卓开发之数据存储学习

安卓原生的数据存储方式主要有三个:1是文件存储;2是SharedPreferences存储,在安卓软件分析中经常会看到里面明文存储着用户名与密码;3是SQLite数据库存储分别存储的位置在/data/data/包名/File、/data/data/包名/SharedPeference、/data/data/包名/SQLite。文件存储...

2020-06-19 10:25:19 509

原创 安卓逆向之oppo应用商店协议sign加密字段分析

实验室最近想要分析下oppo软件商店的sign协议写爬虫,记录下分析的流程,比较简单。应用商店的搜索、详情页以及类别请求用的sign的构成与加密方式都相同:反编译搜索关键字段:可以看到最后的加密方法为HashUtil.md5Hex,那么参数肯定是加密前的明文了,对md5Hex进行hook:得到加密前的明文:Sign字段构成:标黄部分为固定值,绿色部分为GET请求Header中ocs字段,为设备信息不同设备不一样,蓝色部分为Header中t字段,固定部分。红色部分为Header中id字段,设备

2020-06-17 17:30:57 3279 3

原创 安卓开发之Service进阶学习

与Activity一样,Service也有自己的生命周期:由上图可以看到service有两种启动方式,分别为startService与bindService两种方式,

2020-06-17 15:04:31 536

原创 安卓开发之序列化知识学习

当应用需要通过Intent和Binder传输类对象时就必须完成对象的序列化操作,所谓的序列化就是将这个对象转换为可传输或者可存储的状态,这样序列化后的对象或可以在网络上进行传输,或可以保存到本地。序列化操作有两种方法:Serializable与Parcelable,要传递的类需要继承这两个接口,本质上都可以完成序列化操作,前者是java自带的,将一个完整的对象进行转换,后者是Android自带的,将一个完整的对象进行分解然后分别转换。反序列化就相当于序列化的逆过程,将序列化后的对象“恢复出来”。首先看

2020-06-13 17:07:31 311

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除