16进制字符串 转为 字节

16进制字符串 转为 字节


import binascii

# 16进制字符串 转为 字节
v1 = "4E2918885FD98109869D14E0231A0BF4"

"""
bs = bytearray() # []
for i in range(0, len(v1), 2):
    item_hex = v1[i:i + 2]
    item_int = int(item_hex, base=16)
    bs.append(item_int)
v3 = bytes(bs)
print(v3) # b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4'
"""

v3 = binascii.a2b_hex(v1)
print(v3)  # b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4'

l = [int(i) for i in v3]
print(l)  # [78, 41, 24, 136, 95, 217, 129, 9, 134, 157, 20, 224, 35, 26, 11, 244]

#################################################################################
l = [78, 41, 24, 136, 95, 217, 129, 9, 134, 157, 20, 224, 35, 26, 11, 244]
# 数组转换
print(bytearray(l))  # bytearray(b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4')
print(bytes(l))  # b'N)\x18\x88_\xd9\x81\t\x86\x9d\x14\xe0#\x1a\x0b\xf4'

l1 = [hex(i) for i in l]
print(l1)  # ['0x4e', '0x29', '0x18', '0x88', '0x5f', '0xd9', '0x81', '0x9', '0x86', '0x9d', '0x14', '0xe0', '0x23', '0x1a', '0xb', '0xf4']

print(binascii.b2a_hex(bytearray(l)))  # b'4e2918885fd98109869d14e0231a0bf4'


逆向时有一些字符串是通过字节数组来表示(UTF-8编码)

提醒:逆向时有一些字符串是通过字节数组来表示(UTF-8编码)

v1 = "武沛齐"
v2 = [230, 173, 166, 230, 178, 155, 233, 189, 144]

import java.util.Arrays;

public class Hello {

    public static void main(String[] args) {
        // 1.字节数组(转换为字符串) [字节,字节,字节]
        byte[] dataList = {97, 105, 100, 61, 50, 52, 54, 51, 56, 55, 53, 55, 49, 38, 97, 117, 116, 111, 95, 112, 108, 97, 121, 61, 48, 38, 99, 105, 100, 61, 50, 56, 57, 48, 48, 56, 52, 52, 49, 38, 100, 105, 100, 61, 75, 82, 69, 104, 69, 83, 77, 85, 74, 104, 56, 116, 70, 67, 69, 86, 97, 82, 86, 112, 69, 50, 116, 97, 80, 81, 107, 55, 87, 67, 104, 67, 74, 103, 38, 101, 112, 105, 100, 61, 48, 38, 102, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 48, 57, 51, 55, 38, 108, 118, 61, 48, 38, 109, 105, 100, 61, 48, 38, 112, 97, 114, 116, 61, 49, 38, 115, 105, 100, 61, 48, 38, 115, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 52, 51, 55, 50, 38, 115, 117, 98, 95, 116, 121, 112, 101, 61, 48, 38, 116, 121, 112, 101, 61, 51};
        
        String dataString = new String(dataList);
        System.out.println("字符串是:" + dataString);

        // 2.字符串->字节数组
        try {
            // Python中的  name.encode("gbk")
            String name = "武沛齐";
            byte[] v1 = name.getBytes("GBK");
            System.out.println(Arrays.toString(v1)); // [-50, -28, -59, -26, -58, -21]
            
            // Python中的  name.encode("utf-8")
            byte[] v2 = name.getBytes("UTF-8");
            System.out.println(Arrays.toString(v2)); // [-26, -83, -90, -26, -78, -101, -23, -67, -112]
        } catch (Exception e) {

        }
    }
}

image-20230322163051876

需求来了:某个app逆向,在Java代码中得到一个字节数组 [-50,-28,-59,-26,-58,-21],请通过Python代码将这个字节数组转换成字符串?

  • 在Java中的字节范围:-128127;Python中字节的范围:0255。

      Java  0  1   2  3  4 .. 127 -128 -127 -126    -3  -2  -1     
    Python  0  1   2  3  4 .. 127  128  129  130 ...253 254 255
    
      java, 有符号:-128~127
    python,无符号:0~255
    
    byte_list = [-50,-28,-59,-26,-58,-21]
    
  • 让数字转化弄成字节并拼接起来 bytearray

# Python脚本,方便你们以后使用。
byte_list = [-50, -28, -59, -26, -58, -21]

bs = bytearray()  # python字节数组
for item in byte_list:
    if item < 0:
        item = item + 256
    bs.append(item)

str_data = bs.decode('gbk')  # data = bytes(bs)
print(str_data)
data_list = [-26, -83, -90, -26, -78, -101, -23, -67, -112]

num_list = bytearray()
for i in data_list:
    if i < 0:
        i = i + 256
    num_list.append(i)

text = num_list.decode('utf-8')
print(text)
posted @ 2023-03-08 18:00  hanfe1  阅读(575)  评论(0编辑  收藏  举报