Android NDK 项目报错
背景在学习 ART-TI 的过程中发现了GitHub 有一个项目
但是把项目拉下来以后发现会有报错
解决
确认报错原因
从报错中很容易得出是 NDK 的配置问题
NDK not configured.
配置 NDK(官网配置教程)
12# local.propertiesndk.dir=/Users/fool/Library/Android/sdk/ndk/18.1.5063045
新的问题
Invalid revision: 3.22.1-g37088a8
查了下是 cmake 不兼容的问题。
配置了一下 cmake 版本
12# local.propertiescmake.dir=/Users/fool/Library/Android/sdk/cmake/3.6.4111459
配置成功
CONFIGURE SUCCESSFUL in 1s
总结下NDK 工厂需要配置
SDK
cmake
NDK
frida基础配置
Frida 环境搭建背景
最近工作中需要逆向对比,调研学习中发现了 Frida 这么一个不错的框架
基础条件设备:root 手机
配置安装 pip 依赖1pip install frida-tools
安装 frida-serverrelease
选择合适的版本(Frida 可以对Android/IOS/Mac/Window/Linux进行逆向分析)
记得选择 frida-server
push到手机
本文主要是进行 Android 逆向环境搭建
如果是其他平台,请在指定的平台允许 server 脚本
Unzip
1tar -xvf frida-server-XX.xz
Push
1adb push frida-server /data/local/tmp/frida-server
设置权限
1chmod 777 /data/local/tmp/frida-server
执行 frida-server1/data/local/tmp/frida-server &
完成
环境搭建完成
数据库多表查询
多表查询连接
既然是多表查询不可避免就会用到多个表的数据。
From连接多表
如下连接了AB两个表
123select ......from A, Bwhere A.XX = B.XX
自连接
内连接 inner join
外连接
left join
1234select ......from Aleft join Bon XXXX
right join
1234select ......from Aright join Bon XXXXX
full join
1234select .....from Afull join Bon XXXXXX
嵌套子查询
及查询过程中内嵌一个查询
in
如果A的过滤条件需要用到另外一张表的数据。
123456select *from Awhere XX in ( select XX from B where condition)
exists
上方in等价,个人觉得适用于多过滤条件的情况
123456789select *from Awhere exists ( select * fro ...
ASM基础使用
ASMCore ApiClassVisitor123456789101112131415visit[visitSource][visitModule][visitNestHost][visitOuterClass](visitAnnotation|visitTypeAnnotation|visitAttribute)*(visitNestMember|[*visitPermittedSubclass]|visitInnerClass|visitRecordComponent|visitField|visitMethod)*visitEnd
visit
标记ClassVisitor开始
12345678override fun visit( version: Int, // 字节码版本号 access: Int, // 访问修饰符 name: String, // 类名称 signature: String?, // 泛型签名 superName: String, // 父类 interfaces: Array<out String& ...
常见的Unicode编码
基础概念编码
编码是计算机最为常见的一部分,他所解决的是计算机”不认识”人所使用的自然语言的问题。
解决的思路也很简单,我们利用了计算机只认01 2进制的特点,既然计算机认识数字,那么我们就给所有的字符排一个号,类似于:
a : 97
A : 65
……
这样计算机就知道每个字符是什么了
Unicode编码
Unicode一般指统一码。 统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
其实在Unicode之前经历过很多的编码,这里就默认大噶都有所了解啦~
ASCII、GB2312、BIG5、GBK
啥没听说?看看再来学呗~
Unicode是一种编码集,也就是前面所说的字符到数值的映射。
Map<Integer,Charactor>
Map<Charactor,Integer>
Unicode码点
即Unicode编码所对应的数值
关于Unicode编码范围
目前Unicode最大的码点为0x10FFFF
编码实现
Unicode只是一套规范,这套规范里面给出了, ...
从CPU的视角看函数调用
从CPU的视角看函数调用
函数调用这我熟啊——不就是将栈帧压入栈内吗
我还知道递归层次过多会导致StackOverflow呢,看吧举一反三多聪明!
那你知道最底层是如何实现函数调用的吗?整个函数调用的过程?
前言
如果想了解操作系统函数调用过程,我们从编程语言的角度上是很难看出什么端倪的,因为这一过程已经被封装地太死了
唯一的突破口既是汇编代码
接下来将使用一些调试工具对一段C语言函数调用对底层函数调用过程进行分析。
环境
WSL:
WSL 版本: 1.2.5.0内核版本: 5.15.90.1WSLg 版本: 1.0.51MSRDC 版本: 1.2.3770Direct3D 版本: 1.608.2-61064218DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hypWindows 版本: 10.0.22621.1702
OS Release
PRETTY_NAME=”Debian GNU/Linux 11 (bullseye)”NAME=”Debian GNU ...
Windows常见的编码问题
编码什么是编码”编码的诞生是带有一定场景和目的性的“
所谓场景既是需要用数字来表达信息的时候,很容易想到计算机,计算机只认01,恰好与之吻合。
目的就更好理解了,编码的出现就是为了解决01环境下无法表达信息的情况。
什么是编码问题直观的例子就是“鸡同鸭讲”
“鸡叫”是一种编码,“🦆叫”又是一种编码,他们属于不同的物种,语言不同即编码不兼容,就会出现双非都听不懂对方在说什么的情况。
(我不是什么小黑子,我只是单纯觉得这张图片好看)
放在实际情况来看,编码异常也就是,编码方和解码方采用不同的方式进行操作,导致双方得到的结果错误的情况,典型的如:
比如我编码采用GBK,解码采用UTF-8,就会出现如下问题:
Windows平台的编码问题就主流操作系统来看,Mac和Linux采用了UTF-8的编码,而Window却默认采用了GBK的编码。
而GBK对于UTF-8的中文解码是存在不兼容的。所以很容易出现乱码的情况。
如何解决Windows的编码问题一般发生编码异常的高发段(对于程序员)有如下:
源文件编码
编译器编码
终端编码
源文件编码容易理解,也就是代码的编码方式(代码本质就是纯文 ...
Java反射真的很耗时吗?
Reflection
自我学习Java起,带领我学习Java的学长都是会提醒我们——Java反射很耗时。
所以是真的很耗时吗?
不妨来测试一下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172package com.example.reflect;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Test { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, Inter ...
记一次Java类型强转
背景
在刷一道Leetcode题
剑指 Offer 19. 正则表达式匹配
对照了答案,使用了DP对此题进行求解,由于没有完全抄题解的,所以有部分内容不完全一致。
但是就逻辑上和题解完全一致。可就是无法通过OJ
源代码
官方题解
1234567891011121314151617181920212223242526272829303132333435class Solution { public boolean isMatch(String s, String p) { int m = s.length(); int n = p.length(); boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; for(int i = 0;i <= m; i++) { for(int j = 1;j <= n; j++) { if(p.c ...
Glide Request构建
Glide Request
Glide在加载图片的第一步既是初始化Glide实例
接着就会获取RequestManager,然后初始化一个RequestBuilder构建一个Request,
本文会对于Glide的RequestBuilder实例化过程做解析
begin
Glide的创建是在Glide.with内部进行的,通过with以后就能得到一个RequestManager的实例化对象
1Glide.with(this)
RequestManager
关于RequestManager公开的api如下
request hook
addDefaultRequestListener
为所有由该RequestManager构建的Request添加监听。
applyDefaultRequestOptions
对Request进行默认配置
加载任务
as
进行RequestBuilder的实例化
1234public <ResourceType> RequestBuilder<ResourceType> as( @Non ...