作者归档:zhiwei

Java中的字符串与编码

虽然Java内部存储字符串是用UTF-16格式, 但是你如果用getBytes()方法来获取对应的二进制数据,
会根据你操作系统平台的默认编码进行转换.
比如我用Debian GNU/Linux stretch, 默认编码是UTF-8
那么就会转成 UTF-8

        String test = "中国电信";
        byte[] result = test.getBytes();
E4 B8 AD E5 9B BD E7 94 B5 E4 BF A1 

getBytes()是可以传编码参数的,比如”UTF-16″

try {
    byte[] result = test.getBytes("UTF-16");
}catch(Exception e) {
}

那么会编码成 FE FF 4E 2D 56 FD 75 35 4F E1
默认加了Big-Endian的BOM(Byte Order Marker): FE FF
如果不想前面加BOM, 可以使用

byte[] result = Charset.forName("UTF-16BE").encode(test).array();

usim文件Network Parameters

文件标识符: 6FC4
更新频率: 高

当终端选择一个小区时, Network Parameter文件可以减少 FDD,TDD或者GSM运营商的搜索范围.
RF载波频率信息(RF carrier frequency information)存储在2个字节中. 从0.0MHz开始,
每增加200kHz, 16 bit的值增加1.
这里存储着确切的频道频率(channel frequencey), 独立于任何频段信息(band information)
终端将这里指出的频率同特定的频段(如GSM 900, GSM 1800)关联
这意味着,用200KHz的分辨率,可以覆盖从0到13.1GHz的范围.
这里指出的频率始终是终端接收机的载波频率.
本EF文件提供的最小存储容量为46个字节, 以TLV格式提供最少2个小区信息.
即 : 8个GSM相邻载波频率 和 8个 Intra / Inter频率

终端应忽略超出其能力的载波频率值,即FDD Only的终端,必须忽略GSM相关的频率信息。
当更新这个文件时,终端应该用终端中的当前值更新它。

这个文件的更新应从文件的开头开始。该终端不需要考虑先前存储的任何信息的结构,
即 FDD Only终端可以覆盖 另一个终端存储在这个文件中的GSM参数。

GSM小区信息构造的TLV对象包含了BCCH信道频率的信息,终端目前预留,标记为’80’。
构造的TLV对象还包含最多32个邻居BCCH载波频率的指示,标记为“81”。
为了存储一套完整的GSM网络参数,总共需要72个字节。终端应按照TS 44.018规定,将
从网络接收到相应的频率 转换BCCH信道信息, 然后存储在usim中

FDD小区信息构造的TLV对象包含内部频率的扰码信息
载波,标签’80’以及频率间扰码,标签’81’。频率内载波信息可能包含
多达32个扰码(m),而频间扰码的数量有限制(n1,n2,
N3)。可以指示的频率间的数量限制为三个,并且加扰码的总数量是三个
对于频率间隔被限制为32(n1 + n2 + n3 <= 32),即如果仅指示一个频率间载波,则它可以 包含多达32个扰码。如果指示两个或多个频率载波,则总共有32个扰码 可以提供。信息在频率间载波之间如何分配由终端决定。在 为了存储一组完整的FDD单元信息,总共需要146个字节。终端将转换 根据TS 25.101 [33]的规定,UARFCN信息从网络接收到相应的频率 然后将其存储在USIM中。 A0 20 80 02 1295 81 1C 125012531259125B125D125F126212661268126E1274127712972370 23722378237A237E2380 ---------- A0 2E 80 02 12A6 81 2A 12A312BC12BE12BF23BF23C023C123C223C323C523C623C823CA23CB23CC23CD23CE23CF23D023D7FFFF ---------- 居然由为全FFF的 ----- A0 2C 80 02 12B2 81 26 12B412B612BB12BC12BD12BE23C223C723C823C923CB23CD23CF23D023D123D323D523DB23DD A0 2C 80 02 12B2 81 26 12B412B612BB12BC12BD12BE23C223C723C823C923CB23CD23CF23D023D123D323D523DB23DDFFFFFFFF

用IDA Pro研究Android JNI参数传递

https://developer.android.com/ndk/samples/sample_hellojni.html

git clone https://github.com/googlesamples/android-ndk
cd android-ndk/hello-jni
./gradlew clean
./gradlew installArm8Debug

 JNI类型映射

Java 类型 本地类型 描述
boolean jboolean C/C++8位整型
byte jbyte C/C++带符号的8位整型
char jchar C/C++无符号的16位整型
short jshort C/C++带符号的16位整型
int jint C/C++带符号的32位整型
long jlong C/C++带符号的64位整型e
float jfloat C/C++32位浮点型
double jdouble C/C++64位浮点型
Object jobject 任何Java对象,或者没有对应java类型的对象
Class jclass Class对象
String jstring 字符串对象
Object[] jobjectArray 任何对象的数组
boolean[] jbooleanArray 布尔型数组
byte[] jbyteArray 比特型数组
char[] jcharArray 字符型数组
short[] jshortArray 短整型数组
int[] jintArray 整型数组
long[] jlongArray 长整型数组
float[] jfloatArray 浮点型数组
double[] jdoubleArray 双浮点型数组

JNI通过JNIEnv提供的操作Java数组的功能。它提供了两个函数:一个是操作java的简单型数组的,另一个是操作对象类型数组的。

因为速度的原因,简单类型的数组作为指向本地类型的指针暴露给本地代码。因此,它们能作为常规的数组存取。这个指针是指向实际的Java数组或者Java数组的拷贝的指针。另外,数组的布置保证匹配本地类型。

为了存取Java简单类型的数组,你就要要使用下面的GetXXXArrayElements函数,XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。

JNI数组存取函数

函数 Java 数组类型 本地类型
GetBooleanArrayElements jbooleanArray jboolean
GetByteArrayElements jbyteArray jbyte
GetCharArrayElements jcharArray jchar
GetShortArrayElements jshortArray jshort
GetIntArrayElements jintArray jint
GetLongArrayElements jlongArray jlong
GetFloatArrayElements jfloatArray jfloat
GetDoubleArrayElements jdoubleArray jdouble

当你对数组的存取完成后,要确保调用相应的ReleaseXXXArrayElements函数,参数是对应Java数组和GetXXXArrayElements返回的指针。如果必要的话,这个释放函数会复制你做的任何变化(这样它们就反射到java数组),然后释放所有相关的资源。

为了使用java对象的数组,你必须使用GetObjectArrayElement函数和SetObjectArrayElement函数,分别去get,set数组的元素。GetArrayLength函数会返回数组的长度。

Jni层接收到Java层传递过来的byte[]数组,一般有2个函数来获取它的值,一个 GetByteArrayRegion,另一个是 GetByteArrayElements ,前者是进行值拷贝,将Java端数组的数据拷贝到本地的数组中,后者是指针的形式,将本地的数组指针直接指向Java端的数组地址,其实本质上是JVM在堆上分配的这个数组对象上增加一个引用计数,保证垃圾回收的时候不要释放,从而交给本地的指针使用,使用完毕后指针一定要记得通过ReleaseByteArrayElements进行释放,否则会产生内存泄露。

 

sim卡select response

3GPP TS 11.11 version 8.14.0 Release 1999 / ETSI TS 100 977 V8.14.0 (2007-06)
第41页
Response parameters/data in case of an MF or DF
类似于USIM FCP的一个东西

MF/DF的定义

1-2     RFU 保留将来使用
3-4     在所选择的目录下的空闲空间
5-6     文件ID
7       文件类型:01=MF,02=DF
8-12     RFU
13       GSM特性(从14字节开始到结束)的长度
14       文件特性: 
          b1  b3  b4
           1   0   0   允许时钟停止, 无优先电平
           1   1   0   允许时钟停止, 高电平优先
           1   0   1   允许时钟停止, 低电平优先
           0   0   0   不允许时钟停止
           
        对于鉴权等耗时指令,  时钟是必须的,  b2=0, 时钟至少是 13/8 MHz,  b2=1时,至少 13/4 MHz

         b8 表示CHV是否启用
15       当前目录的DF个数(直接DF,不含二级DF)
16       当前目录的EF个数
17       密码个数(CHV, Unblock CHV, ADM等)
18       RFU
19       CHV1状态
20       Unblock CHV1状态
21       CHV2状态
22       Unlock CHV2状态
23       RFU
24-34    保留给管理目的

—————
在CardPeek中 https://github.com/L1L1/cardpeek/blob/master/dot_cardpeek_dir/scripts/gsm%20(beta).lua
定义为 answer to select 的东西
—————

1-2 RFU
3-4 文件大小
5-6 文件ID
7 文件类型: 04=EF
8 RFU
9 访问权限(0=ALW, 1=CHV1, 2=CHV2, 3=RFU, 4=ADM … E=ADM, F=NEVER
高半字节为READ,SEEK权限, 低半字节为UPDATE权限
10 访问权限, 高半字节为INCREASE, 低半字节保留
11 高半字节为REHABILITATE, 低半字节为 INVALIDATE
12 文件状态:01 有效
13 接下来的字段长度
14 文件结构: 00 =透明 01= 线性固定 02= RFU 03= 循环
15 记录长度 (如果为记录文件,单个记录的大小), 非记录文件,这个值为0

一加手机粗暴杀后台进程

在 /system/build.prop 中有限制

#Increase cached app limit
ro.sys.fw.bg_apps_limit=32

ro.sys.fw.bservice_enable=true
ro.sys.fw.bservice_limit=5
ro.sys.fw.bservice_age=5000

1. 最近的程序中, 对目标程序,点击加锁
无效, 还是会被杀掉
2. 设置->电池–>电池优化 , 对目标应用 选择 不优化
无效, 还是会被杀掉
3. 开发者选项, 关闭 Doze模式 (Doze模式可以减少电池消耗)
有效
4. 开发者选项 后台进程限制 (默认为标准限制)

一加5T备份EFS

ls -la /dev/block/platform/soc/1da4000.ufshc/by-name

modemst1 -> /dev/block/sdf1
modemst2 -> /dev/block/sdf2

dd if=/dev/block/sdf1 of=/sdcard/modemst1.bin bs=512
dd if=/dev/block/sdf2 of=/sdcard/modemst2.bin bs=512

小米4
/dev/block/platform/msm_sdcc.1/by-name
modemst1 -> /dev/block/mmcblk0p12
modemst2 -> /dev/block/mmcblk0p13
fsg -> /dev/block/mmcblk0p16

dd if=/dev/block/mmcblk0p12 of=/sdcard/modemst1.bin bs=512
dd if=/dev/block/mmcblk0p13 of=/sdcard/modemst2.bin bs=512
dd if=/dev/block/mmcblk0p16 of=/sdcard/fsg.bin bs=512

一加手机获取modem日志

在打电话界面输入 *#800# 唤起 com.oem.logkitsdservice 服务 (com.oem.oemlogkit)

点击 oneplus logkit,
然后点击 “删除历史Log”
拖到最下面, 点击”高级”
查看 “保存log类型”是否为 “kernel system main radio event”
返回, 点击”保存log”, 会提示你重启 (如果有问题, 就重启,否则取消)
点击”QXDM log抓取(内含modem,wifi, audio等各模块)”
设置 需要保存的log类型为” modem-通用”, 然后点击”打开device log”

等待一段时间,最好是10分钟以上
再次点击 “保存log”
再次进入”QXDM log抓取”, 选择”关闭device log”

进入文件管理器, 找到 oem_log 目录

跟OPPO几乎是一样的

USIM中发送短信相关的EF

EF_SMSS (SMS Status)

如果UST中的10号位 被设置, 这个文件必须存在.

字节1    上次使用的TP-MR (TP-Message-Reference),提交给短信息中心的 SMS-SUBMIT 或 SMS-COMMAND 的参考值
手机每发送1条短信, 就将这个值加1
字节2 短消息内存容量超过通知标志

62 FCP Tag
1B Len
82 02 41 21 文件描述符(41:工作EF,透明文件,共享文件 21 数据编码)

83 02 6F43 文件标识符

A5 专有信息标签
03
80 01 71 UICC特性:允许始终停止,无优先级,支持电压级别)

8A 01 05 生命周期: 激活
8B 03 6F0603 安全特性: 对应于6F06的第3条记录
80 02 0002 文件大小:
88 00 短文件标志符:不支持
===============================
62
16
82 02 41 21
83 02 6F 78
8A 01 05
8B 03 6F0605
80 02 0002
88 00
=======================
62
17
82 02 41 21
83 02 6F 07
8A 01 05
8B 03 6F0604
80 02 0009
88 01 38 短文件
=============
62
1E
82 05 42 21 0028 05
83 02 6F 42
8A 01 05
8B 03 6F06 03
80 02 00C8
88 00
================
62
1A
82 05 42 21 0028 01
83 02 6F B7
8A 01 05
8B 03 6F0601
80 02 0050
88 01 08
90 00
===============
62
19
82 05 42 21 002801
83 02 6F42
8A 01 05
8B 03 6F0601
80 02 0028
88 00
90 00
===========
62
1C
82 02 01 21
83 02 6F AD
—-A5 (专有信息标签) 03 80 (UICC特性) 01 30
8A 01 05
8B 03 6F 06 05
80 02 00 04
88 01 18

Debian X2Go安装配置

0. 添加key

apt-key adv --recv-keys --keyserver keys.gnupg.net E1F958385BFE2B6E

在Debian Stretch中, 只有客户端, 没有服务端

1. 添加源
/etc/apt/sources.list.d/x2go.list

deb http://packages.x2go.org/debian stretch extras main

2.安装 服务器端

apt-get update
apt-get install x2goserver x2goserver-xsession  x2godesktopsharing

3. 客户端

apt install  x2goclient

4.客户端快捷键
Ctrl + Alt + T 终止会话,断开连接
Ctrl + Alt + F 切换全屏
Ctrl + Alt + M 最小化/最大化
Ctrl + Alt + 箭头

x2godesktopsharing可以不用安装

MT7601U无线网卡Linux下自动连接

lsusb显示为  148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter

0. 安装 闭源 firmware 驱动

apt install firmware-misc-nonfree 

1. 修正一个 驱动的问题
dmesg里看到错误提示:
aborting authentication with by local choice (Reason: 3=DEAUTH_LEAVING)

ln -s /dev/null /etc/systemd/network/99-default.link

参考资料
https://unix.stackexchange.com/questions/386925/aborting-authentication-by-local-choice-reason-3-deauth-leaving-when-trying

2. 配置自动连接

添加配置文件 /etc/network/interfaces.d/wlan



auto wlan0
iface wlan0 inet static
address 192.168.1.51
netmask 255.255.255.0
gateway	192.168.1.1
dns-nameservers 1.2.4.8 114.114.114.114
#wireless-ssid ssid_name
#wireless-key  mypassword
wpa-essid ssid_name
wpa-psk	mypassword

不过好像 /etc/resolve.conf 没有创建