乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

java和smali语言互转流程图

发表于 2020-11-01

baksmali和smali.jar工具下载

https://bitbucket.org/JesusFreke/smali/downloads/

点此下载

.class转dex指令

1
dx.bat --dex --output=./aa.dex Test.class

dex转smali指令

1
java -jar baksmali-2.4.0.jar d test.dex

smali转dex指令

1
java -jar smali-2.4.0.jar a smali文件或目录 -o 输出目录/xxx.dex

dex转class指令

1
d2j-dex2jar.bat xxx.dex

class转java

  1. 直接使用jad-gui或者jadx
  2. 使用javap -p xxx.class查看

另外

  1. 如果你嫌麻烦 可以直接使用dex2jar内部的工具 里面进行了相应的封装

  2. android studio自带的.class转smali就非常好用,如图:

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Code Spring Boot Project With Kotlin by Android Studio

发表于 2020-10-30

Step 1

Modify build.gradle

  1. In Module Dir : apply plugin: ‘kotlin’ and add kotlin dependencies
1
2
3
4
5
6
7
8
9
10
11
apply plugin: 'org.springframework.boot'
apply plugin: 'java'
apply plugin: 'kotlin'//notice


dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
compile 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-web:2.3.4.RELEASE'
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72"//notice
}
  1. Project Dir : add kotlin classpath
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"//notice
}
}

allprojects {
repositories {
google()
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

Step 2

  1. Code with kotlin

    tip: if you use pure kotlin, you may code in kotlin dir replace java

Step 3

Done!

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于十六进制和二进制左移位右移位的问题

发表于 2020-10-30

Step 1

先聊十进制

以10举例:(满10进一位)

  • 10往左移一位变成100, 可以理解为是10乘以10得来的,100=10x10
  • 10往右移一位变成1, 可以理解为是10除以10得来的,1=10/10

那么十六进制

以2F0举例:(满16进一位)

  • 2F0往左移一位变成2F00, 可以理解为是2F0乘以16得来的
  • 2F0往右移一位变成2F, 可以理解为是2F0除以16得来的

二进制同理

以1010举例:(满2进一位)

  • 1010往左移一位变成10100, 可以理解为是1010乘以2得来的,20=10x2(需要换算成十进制进行计算)
  • 1010往右移一位变成101, 可以理解为是1010除以2得来的,5=10/2

总结

  • 向左移位低位进位补0,向右移位低位去0
  • 十进制满10进位,十六进制满16进位,八进制满8进位,二进制满2进位
  • 二进制每四位分割对应一个16进制,每三位分割对应一个八进制

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Create Spring Boot Project With Android Studio

发表于 2020-10-30

Step 1

Modify build.gradle

  1. Module Dir
1
2
3
4
5
6
7
8
9
apply plugin: 'org.springframework.boot'
apply plugin: 'java'


dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
compile 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-web:2.3.4.RELEASE'
}
  1. Project Dir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
}

allprojects {
repositories {
google()
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

Step 2

  1. Rename Res dir And create application.properties
  2. delete useless files

Step 3

  1. Create Boot Point Class DemoApplication.java

  2. Create Control

  3. Boot And Test

  4. Package Jar

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

python中的base64加密解密

发表于 2020-10-29

介绍

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

python中的base64

将url编码成base64

1
2
3
4
5
6
7
# 想将字符串转编码成base64,要先将字符串转换成二进制数据
url = "https://www.cnblogs.com/songzhixue/"
bytes_url = url.encode("utf-8")
str_url = base64.b64encode(bytes_url) # 被编码的参数必须是二进制数据
print(str_url)

b'aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8='

解码base64

1
2
3
4
5
6
7
# 将base64解码成字符串
import base64
url = "aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8="
str_url = base64.b64decode(url).decode("utf-8")
print(str_url)

'https://www.cnblogs.com/songzhixue/'

总结

  • python中base64不论是编码还是解码,返回值都为字节数组
  • 解码解的是字符串, 编码编的是字节数组

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Python进行DES 加密和解密 解决和java结果不一致的问题

发表于 2020-10-29

Python DES CBC 加密解密代码示范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import binascii
from pyDes import des, CBC, PAD_PKCS5


def des_encrypt(s):
"""
DES 加密
:param s: 原始字符串
:return: 加密后字符串,16进制
"""
secret_key = '20171117'
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
en = k.encrypt(s, padmode=PAD_PKCS5)
return binascii.b2a_hex(en)


def des_descrypt(s):
"""
DES 解密
:param s: 加密后的字符串,16进制
:return: 解密后的字符串
"""
secret_key = '20171117'
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
return de


str_en = des_encrypt('zx')
print(str_en)
str_de = des_descrypt(str_en)
print(str_de)

执行以上 Python 代码,得到以下输出:

1
2
1dbbd4e9246ebffa
zx

Java DES CBC 加密解密代码示范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;


public class Main {

public static void main(String[] args) {
String content = "zx";
String key = "20171117";

System.out.println("加密前:" + content);
byte[] encrypted = DES_CBC_Encrypt(content.getBytes(), key.getBytes());
System.out.println("加密后:" + byteToHexString(encrypted));

byte[] decrypted = DES_CBC_Decrypt(encrypted, key.getBytes());
System.out.println("解密后:" + new String(decrypted));
}

public static byte[] DES_CBC_Encrypt(byte[] content, byte[] keyBytes) {
try {
DESKeySpec keySpec = new DESKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(keySpec.getKey()));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:" + e.toString());
}
return null;
}

private static byte[] DES_CBC_Decrypt(byte[] content, byte[] keyBytes) {
try {
DESKeySpec keySpec = new DESKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(keyBytes));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:" + e.toString());
}
return null;
}

private static String byteToHexString(byte[] bytes) {
StringBuffer sb = new StringBuffer(bytes.length);
String sTemp;
for (int i = 0; i < bytes.length; i++) {
sTemp = Integer.toHexString(0xFF & bytes[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
}

执行以上 Java 代码,输出:

1
2
3
加密前:zx
加密后:1DBBD4E9246EBFFA
解密后:zx

注意事项

python中还有一个库Crypto 也是用于加密的, 但是加密的结果和java不一致, 这是个坑, 以下是Crypto加密的代码, 用于对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from Crypto.Cipher import DES
import binascii
import base64

# data->被加密的字符串 key->密钥 同样传入字符串
def des_decode(data, key):
b_data = base64.b64decode(data)
iv = key.encode()
cipher = DES.new(key.encode(), iv,DES.MODE_CBC)
decrypted = cipher.decrypt(b_data)
decrypted.rstrip(b' ')
return decrypted.decode() # 解密完成后将加密时添加的多余字符'\0'删除




# data->被加密的字符串 key->密钥 同样传入字符串
def aes_encrypt(data, key):
# DES CBC模式 需向量iv
iv = key.encode()
cipher = DES.new(key.encode(),iv, DES.MODE_CBC)
# 字符串转字节数组
b_data = data.encode()
# ------ 按照16位对其 不足的补空格 ----
block_size = DES.block_size
count = len(b_data)
# text不是16的倍数那就补足为16的倍数
add_count = block_size - (count % block_size)
s_plaintext = data + (' ' * add_count)
# ------ 按照16位对其 不足的补空格 ----

b_plaintext = s_plaintext.encode()
encrypted = cipher.encrypt(b_plaintext) # des加密

return base64.b64encode(encrypted).decode()

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

python字符串str和字节数组相互转化

发表于 2020-10-29

字符串转字节数组

1
2
3
4
5
6
7
s = "Hello, world!"   # str object 

#一共有三种方式 任选其一
print('str --> bytes')
print(bytes(s, encoding="utf8"))
print(str.encode(s)) # 默认 encoding="utf-8"
print(s.encode()) # 默认 encoding="utf-8"

字节数组转字符串

1
2
3
4
5
6
7
b = b"Hello, world!"  # bytes object  

#一共有三种方式 任选其一
print('\nbytes --> str')
print(str(b, encoding="utf-8"))
print(bytes.decode(b)) # 默认 encoding="utf-8"
print(b.decode()) # 默认 encoding="utf-8"

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Python DES EBC 加密解密代码示范

发表于 2020-10-29

Python DES EBC 加密解密代码示范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from pyDes import des, ECB, PAD_PKCS5


def des_encrypt(s):
"""
DES 加密
:param s: 原始字符串
:return: 加密后字符串,16进制
"""
secret_key = 'ucserver'.encode()

k = des(secret_key, ECB, pad=None, padmode=PAD_PKCS5)
en = k.encrypt(s.encode(), padmode=PAD_PKCS5)
# return binascii.b2a_hex(en)
return base64.b64encode(en).decode()


def des_descrypt(s):
"""
DES 解密
:param s: 加密后的字符串,16进制
:return: 解密后的字符串
"""
secret_key = 'ucserver'.encode()

k = des(secret_key, ECB, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(base64.b64decode(s), padmode=PAD_PKCS5)
return de.decode()

注意事项

python中还有一个库Crypto 也是用于加密的, 但是加密的结果和java不一致, 这是个坑, 以下是Crypto加密的代码, 用于对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from Crypto.Cipher import DES
import binascii
import base64

# data->被加密的字符串 key->密钥 同样传入字符串
def des_decode(data, key):
b_data = base64.b64decode(data)
cipher = DES.new(key.encode(), DES.MODE_ECB)
decrypted = cipher.decrypt(b_data)
decrypted.rstrip(b' ')
return decrypted.decode() # 解密完成后将加密时添加的多余字符'\0'删除




# data->被加密的字符串 key->密钥 同样传入字符串
def aes_encrypt(data, key):
# DES ECB模式 无需向量iv
cipher = DES.new(key.encode(), DES.MODE_ECB)
# 字符串转字节数组
b_data = data.encode()
# ------ 按照16位对其 不足的补空格 ----
block_size = DES.block_size
count = len(b_data)
# text不是16的倍数那就补足为16的倍数
add_count = block_size - (count % block_size)
s_plaintext = data + (' ' * add_count)
# ------ 按照16位对其 不足的补空格 ----

b_plaintext = s_plaintext.encode()
encrypted = cipher.encrypt(b_plaintext) # des加密

return base64.b64encode(encrypted).decode()

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

android NDK编译涉及的cpu架构种类

发表于 2020-10-28

在使用NDK编译过程中发现针对不同的CPU架构,部分支持编译调试,部分不支持调试,故记录下来,以防忘记

在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构。

目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。

CPU架构 ABI
ARMv5 armeabi 32位,从2010年
ARMv7 armeabi-v7a 32位,从2010年
x86 x86 32位,从2011年
MIPS mips 32位,从2012年
ARMv8 arm64-v8a 64位,从2014年
MIPS64 mips64 64位,从2014年
x86_64 x86_64 64位,从2014年

相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。例如指明某个具体的CPU架构

1
APP_ABI := arm64-v8a

或者直接生成所有的版本

1
APP_ABI := all

注意:根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。

或者明确写明支持的CPU架构

1
APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64

建议采用该方法

注意:由于目前版本支持的问题,采用Eclipse+NDK+Windows集成方式开发,对应编译生成对应CPU架构的so文件是没有问题的。但是不一定可以执行调试工作,启动NDK调试模式时将会提示无法识别对应的ABI。

注意:

(1)、目前模拟器只有x86_64的没有arm64-v8a的;

(2)、在用真机测试armv8-a时,最好先通过adb shell, cat /proc/cpuinfo ,来查看下真机是否是支持armv8-a;

(3)、arm32和arm64有些配置参数不能共存,如-msoft-float仅在arm32位下支持,在arm64位下是不支持的.

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Termux:Android 上的一款终端神器

发表于 2020-10-28

Termux 是一款基于 Android 平台的开源 Linux 终端模拟器,使用 pkg(apt) 进行软件包的管理。最重要的是,它无需 root 权限,因此,绝大多数 Android 都可以运行。

目前来说,它能做一些简单的 Linux 任务:

  • 享受 Bash 和 Zsh
  • 使用 Vim 编辑文件
  • 通过 SSH 访问服务器
  • 使用 GCC 和 Clang 编译代码
  • 使用 Git 检查项目
  • 运行 MySQL,Redis 等服务器
  • …

使用方法

因为 Termux 是一款 Linux 终端模拟器,因此,在命令的使用方面和 Linux 是一致的。在这里,我将介绍一些针对 Termux 工具的一些使用方法。

初次使用的准备工作

业内已经有了一种共识,在涉及包管理方面,尽量都会将官方源替换成国内镜像源,Termux 也不例外。初次进入 Termux 后,我们可以使用 TUNA 的 Termux 镜像:

1
$ sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux stable main@' $PREFIX/etc/apt/sources.list # 更换源文件$ pkg up # 更新源文件$ pkg udpate -y && pkge upgrade # 更新系统及软件

替换为国内镜像后,接下来,需要开启 Termux 的存储权限:

1
$ termux-setup-storage

执行命令之后,会弹出权限确认窗口,选择「始终允许」即可。

权限确认

pkg 使用命令速记

  • pkg search 搜索包
  • pkg install 安装包
  • pkg uninstall 卸载包
  • pkg update 更新源
  • pkg upgrade 升级软件包
  • pkg shoe 显示某个包的详细信息

长按屏幕

如果需要对 Termux 中的内容进行复制以及粘贴内容至 Termux,可以通过长按屏幕实现。

额外按键视图

可以看到,在正常的键盘上方,还有一盘额外的功能键,分别是:ESC 键,Tab 键,CTRL 键,ALT 键,- 符号,向下以及向上功能键。有了这一行额外视图,可以更加方便地实现 Android 键盘上没有,而电脑键盘上有的功能。

音量+组合

因为 Android 键盘没有电脑键盘上的一些功能按键,此时,我们可以通过按住音量键+,再输入键盘某个字母数字键,可以达到一些功能键的作用。

  • 音量+ Q:显示/隐藏额外按键视图
  • 音量+数字键:Fx(电脑键盘上的数字功能键)
  • 音量+L:|(管道字符)
  • 音量+H:~(波浪字符)
  • 音量+U:_(下划线字符)
  • 音量+P:上一页
  • 音量+N:下一页

一些简单的应用

HTTP Server

有些时候,我们需要将 Android 上的某些文件发送到其他设备(例如笔记本,分享)。以往的解决方案一般是用微信或者 QQ 来作为中转站,现在,可以利用 Termux 搭建一个简单的文件服务器来实现。

1
$ pkg install python -y # 需要使用 Python$ ifconfig wlan0 # 查看 Android 在局域网中的 IP 地址(我的为 192.168.2.104)$ python -m http.serverServing HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)...

命令成功运行之后,可以看到输出信息中包含了端口地址(我这里是 8000)。此时,用另外一台处于相同局域网(例如 Wi-Fi)的设备在浏览器地址输入 192.168.2.104:8000 即可访问文件服务器了。

看起来像黑客

一提到命令行,怎能少得了那些酷炫的字符如降雨一般,这看起来就很黑客。我们可以通过安装 pkg install cmartix 来实现这种效果。

参考文章

Learn Termux

Termux 高级终端安装使用配置教程

Termux 入门教程:架设手机 Server 下载文件

本文转自:https://sspai.com/post/56031

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…343536…51

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

507 日志
145 标签
RSS
© 2026 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%