首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何最有效地区分“正确”解码的字符串和解码为十六进制值的字符串?

如何最有效地区分“正确”解码的字符串和解码为十六进制值的字符串?
EN

Stack Overflow用户
提问于 2022-09-13 02:00:10
回答 1查看 35关注 0票数 0

在网络安全中,我们通常使用strings二进制文件来提取内存转储中的任何明文字符串数据。我试着用Python来做同样的事情。

代码语言:javascript
运行
复制
from struct import unpack

find_str = "King"
strings = []
for stream in data.streams:
    if type(stream.data) == bytes:
        
        # Not a particular readable solution, but orders of magnitude faster than
        # alternatives: https://stackoverflow.com/a/57543519/9400421
        unpacked = list(unpack(f'{len(stream.data)}c', stream.data))
        string = ''
        null = b'\x00'
        for byte in unpacked:
            try:
                # ultimately need to track multiple strings arrays for each 
                # popular encoding scheme to catch diverse string encodings.
                decoded = byte.decode('ASCII')
                print(byte, '=>', decoded)
                if byte == null:
                    print(byte, '=>', 'null')
                    if string != '':
                        strings.append(string)
                    string = ''
                else:
                    string += decoded
            except:
                print("couldn't decode:", byte)
                if string != '':
                    strings.append(string)
                string = ''
print(strings)

输出:. , '*', '\x7f', '\x10', '\x10', '\x04', '\x01', '\x12+', '\x7f', '*', '\x7f', '@', '\x10', '\x02', '\x01', '\x10\x13+', '\x7f', '\x0c', '\x01',

我的问题是,这输出了大量的解码值,这些值显然不是普通字符--它们被解码为十六进制字符串。

我的第一个问题是:为什么这些十六进制字符串不解码为普通字符,但不触发我的catch语句?我认为任何通过解码方法“干净”地解码为字符的东西都会被我的代码过滤掉。

我的第二个问题是:如何丢弃“垃圾”字符/从“干净”解码字符中过滤它们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-13 06:15:32

解决方案归结为这一点,即将字节解码为字符串,并且只保留可打印的字符。

代码语言:javascript
运行
复制
>>> data = b"A \x04 test \x12 string\x00\x00\x00."
>>> ''.join([x for x in data.decode('ascii') if x.isprintable()])
'A  test  string.'

看起来您的代码可以简化为:

代码语言:javascript
运行
复制
stream_strings = []
for stream in data.streams:
    if type(stream.data) == bytes:
        result = ''.join([x for x in stream.data.decode('ascii') if x.isprintable()])
        stream_strings.append(result)
print(stream_strings)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73696814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档