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

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


  • 首页

  • 归档

  • 搜索

8086汇编语言之数据段和代码段以及栈段的理解

发表于 2020-11-01

数据段DS+偏移地址段BX

数据段可以通俗理解为数据容器指针

比如:

1
2
3
4
5
MOV AX 0220H
MOV DS AX
MOV BX 0
MOV AX [BX]
;我们发现 DS数据段一直都是在给不同地址的容器赋值

代码段CS+偏移地址段IP

代码段可以通俗理解为汇编代码指针

比如:

代码从 MOV AX 0220H 开始,那么代码段指向这行代码地址, 如果想要跳过这行代码的执行,那么进行代码段偏移

在通过debug模式配合-u指令查看汇编代码时,可以根据CS进行范围查看:

比如:

1
2
3
4
5
6
#以下模拟控制台输出
-r
AX=0000 BX=0000.....
DS=13DB ES=13DB SS=13EB CS=13EB IP=0000
-u 13eb:0
13BE:0000 B8FFFF MOV AX,FFFF

栈段SS+偏移地址段SP

栈段可以通俗理解为栈指针

什么是段

首先内存并没有分段,段的划分来自CPU,来自我们自己对内存的操作。由8086CPU

1
(段地址+偏移地址=“物理地址”)

的方式给出内存单元的物理地址,使得我们用分段的方式管理内存

可以将段通俗理解为小区的一栋楼,偏移地址为这栋楼的住户门牌号.比如五号楼101房,那么形象比喻:

1
五号楼---->段地址  101房---->偏移地址

为什么要这样划分?

直接使用一个物理地址岂不是更简单,何必拆分成段地址+物理地址?

这是由于8086cpu16位寄存器局限性造成的, 由于16位的寄存器最大只能存放0xFFFF 如果存放超过五位的地址比如0xFFFFA 则无法存放, 为了解决这个问题, cup设计者想出了 段地址*16+偏移地址的方法完美解决这个问题

物理地址=段地址*16+偏移地址

一个物理地址可以有四种写法, 比如0xFFFFA:

1
2
3
4
5
6
7
0xFFFFA=0xFFFF0*16+0x000A

0xFFFFA=0xFFF00*16+0x00FA

0xFFFFA=0xFF000*16+0x0FFA

0xFFFFA=0xF0000*16+0xFFFA

段的赋值

代码段CS 数据段DS 栈段SS 不能直接赋值, 必须通过通用寄存器中转赋值

偏移地址可以直接赋值

1
2
3
mov ax ,2000H
mov ss ,ax
mov sp ,10H

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

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

8086语言之申请栈空间的方法

发表于 2020-11-01

第一种

使用dw或者db直接申请

1
2
3
4
5
6
7
assume cs:cscode
cscode segment
dw 0,0,0,0,0,0,0,0 ;定义8个字型数据,在程序加载后,将取得8个字的内存空间,可当做栈空间使用
start:mov ax,cs
...
cscode ends
end start

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

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

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()

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

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

1…313233…48

乱码三千

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

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