Json压缩和格式化工具

使用Python编程语言和Tkinter库创建的GUI程序,用于对JSON数据进行压缩和格式化操作。程序提供了一个文本框用于输入JSON字符串,并提供了两个按钮,分别对JSON字符串进行压缩和格式化操作。压缩操作使用Python内置的json模块的dumps()函数,并设置分隔符为“,”和“:”,以减少输出字符串的长度。格式化操作同样使用Python内置的json模块的dumps()函数,并设置indent参数为4,使输出的字符串具有更好的可读性。

import json
import tkinter as tk

def json_compress(json_str):
    try:
        json_obj = json.loads(json_str)
    except Exception as e:
        print(e)
        return ""
    else:
        return json.dumps(json_obj, separators=(",", ":"))

def json_format(json_str):
    try:
        json_obj = json.loads(json_str)
    except Exception as e:
        print(e)
        return ""
    else:
        return json.dumps(json_obj, indent=4)

class GUI(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        master.title("JSON压缩和格式化工具")
        master.geometry("800x600")
        self.text = tk.Text(self)
        self.compress_button = tk.Button(
            self, text="压缩", command=self.compress)
        self.format_button = tk.Button(self, text="格式化", command=self.format)
        self.text.pack(fill=tk.BOTH, expand=True)
        self.compress_button.pack(side=tk.LEFT)
        self.format_button.pack(side=tk.RIGHT)

    def compress(self):
        json_str = self.text.get(1.0, tk.END)
        compressed_str = json_compress(json_str)
        self.text.delete(1.0, tk.END)
        self.text.insert(1.0, compressed_str)

    def format(self):
        json_str = self.text.get(1.0, tk.END)
        formatted_str = json_format(json_str)
        self.text.delete(1.0, tk.END)
        self.text.insert(1.0, formatted_str)

root = tk.Tk()
app = GUI(root)
app.pack(fill=tk.BOTH, expand=True)
root.mainloop()

在GUI类中,先调用了父类(tk.Frame)的构造函数初始化,然后创建了一个文本框对象和两个按钮对象,并分别通过pack()方法将它们添加到GUI窗口中。压缩和格式化操作通过调用json_compress()和json_format()两个函数实现,并在按钮回调函数中调用。当点击压缩或格式化按钮时,程序将获取文本框中的JSON字符串,并将其传递给相应的函数。函数将返回压缩或格式化后的JSON字符串,并更新文本框中的内容。

7.Ghidra还可以对数据,区段,函数进行管理,例如这里可以直接查看DOS头文件,不需要借助其他工具。

1.哪个工具简单好用就用哪个,目前对小菜鸟而言,还是IDA香,主要是用得久,知道的功能多,也熟悉。

  2.Ghidra作为开源工具,功能丰富,也有一定的优点,加载速度好像没用IDA快,可能是读取的内容太多了。

  3.至于为什么自己写了那样一段代码,还不是前天10进制转16进制用c没写出来,当时用java操作的,这次就当巩固C知识了。

伯克利包过滤器(Berkeley Packet Filter)是一个 Linux kernel 中用以对来自于链路层的数据包进行过滤的架构,其位于内核中的架构如下图所示:

相比起传统的数据包过滤器而言,BPF 在内核中实现了一个新的虚拟机设计,通过即时编译(Just-In-Time compilation)技术将 BPF 指令翻译为 BPF 虚拟机的字节码,可以高效地工作在基于寄存器结构的 CPU 上

Linux kernel 自 3.18 版本起提供了扩展伯克利包过滤器extended BPF,即 eBPF),其应用范围更广,能够被应用于更多的场景,原来的 BPF 被称为 classic BPF(cBPF),且目前基本上已经被废弃,Linux 会将 cBPF 字节码转化为 eBPF 字节码再执行

作为一个位于内核层面的虚拟机,eBPF 无疑为攻击者提供了一个相当大的新攻击面,因此也成为近几年内核利用中的“大热门”

一、eBPF 的运行过程

Linux 下 eBPF 的整体架构如下图所示:

  • 用户进程首先在用户空间编写相应的 BPF 字节码程序,传入内核
  • 内核通过 verifier 对字节码程序进行安全性检查,通过检查后便通过 JIT 编译运行,eBPF 程序主要分为如下类型:
    • kprobes :内核中的动态跟踪,可以跟踪至内核中的函数入口或返回点
    • uprobes :用户空间中的动态跟踪,与 kprobes 不同的是跟踪的函数位于用户程序中
    • tracepoints :内核中的静态跟踪
    • perf_events :定时采样与 PMC
  • 映射(map)作为用以保存数据的通用结构,可以在不同的 eBPF 程序之间或是用户进程与内核间共享数据
  • 二、eBPF verifier

    在 eBPF 字节码被传入到内核空间后,其首先需要经过 verifier 的安全检查,之后才能进行 JIT 编译,verifier 主要检查以下几点:

  • 没有回向边(back edge)、环路(loop)、不可达(unreachable)指令
  • 不能在指针之间进行比较,指针只能与标量进行加减(eBPF 中的标量值为不从指针派生的值),verifier 会追踪哪些寄存器包含指针、哪些寄存器包含标量值
  • 指针运算不能离开一个 map 的“安全”边界,这意味着程序不能访问预定义的 map 外的内存,verifier 通过追踪每个寄存器值的上界与下界
  • 不能将指针存储在 map 中或作为返回值,以避免将内核地址泄露到用户空间

猜你喜欢

转载自blog.csdn.net/qq_47301716/article/details/130997570