Scapy và ASN.1
Scapy cung cấp một cách dễ dàng mã hóa hoặc giải mã ASN.1 và cũng chương trình những bộ mã hóa / giải mã. Nó là khá nhiều lỏng lẻo hơn so với những gì một cú pháp ASN.1 phải được, và nó loại bỏ qua những hạn chế. Nó sẽ không thay thế không phải một cú pháp ASN.1 cũng không phải là trình biên dịch ASN.1. Trên thực tế, nó đã được viết để có thể mã hóa và giải mã ASN.1 bị hỏng. Nó có thể xử lý hỏng chuỗi mã hóa và cũng có thể tạo ra những người.
ASN.1 engine
Lưu ý: rất nhiều các định nghĩa lớp trình bày ở đây sử dụng metaclasses. Nếu bạn không nhìn chính xác vào mã nguồn và bạn chỉ dựa vào ảnh chụp của tôi, bạn có thể nghĩ rằng đôi khi chúng thể hiện một loại vi diệu. `` Scapy cơ ASN.1 cung cấp các lớp học để liên kết các đối tượng và các thẻ của họ. Họ kế thừa từ các ASN1_Class. Người đầu tiên là ASN1_Class_UNIVERSAL, trong đó cung cấp thẻ cho hầu hết các đối tượng Universal. Mỗi bối cảnh mới (SNMP, X509) sẽ kế thừa từ nó và thêm các đối tượng riêng của mình.
Tất cả các đối tượng ASN.1 được đại diện bởi các trường hợp Python đơn giản mà hành động như nutshells cho các giá trị nguyên. Logic đơn giản là xử lý bởi ASN1_Object mà họ thừa hưởng từ. Do đó họ là khá đơn giản:
Những trường hợp có thể được lắp ráp để tạo ra một cây ASN.1:
ASN.1 engine
Lưu ý: rất nhiều các định nghĩa lớp trình bày ở đây sử dụng metaclasses. Nếu bạn không nhìn chính xác vào mã nguồn và bạn chỉ dựa vào ảnh chụp của tôi, bạn có thể nghĩ rằng đôi khi chúng thể hiện một loại vi diệu. `` Scapy cơ ASN.1 cung cấp các lớp học để liên kết các đối tượng và các thẻ của họ. Họ kế thừa từ các ASN1_Class. Người đầu tiên là ASN1_Class_UNIVERSAL, trong đó cung cấp thẻ cho hầu hết các đối tượng Universal. Mỗi bối cảnh mới (SNMP, X509) sẽ kế thừa từ nó và thêm các đối tượng riêng của mình.
class ASN1_Class_UNIVERSAL(ASN1_Class): name = "UNIVERSAL" # [...] BOOLEAN = 1 INTEGER = 2 BIT_STRING = 3 # [...] class ASN1_Class_SNMP(ASN1_Class_UNIVERSAL): name="SNMP" PDU_GET = 0xa0 PDU_NEXT = 0xa1 PDU_RESPONSE = 0xa2 class ASN1_Class_X509(ASN1_Class_UNIVERSAL): name="X509" CONT0 = 0xa0 CONT1 = 0xa1 # [...]
Tất cả các đối tượng ASN.1 được đại diện bởi các trường hợp Python đơn giản mà hành động như nutshells cho các giá trị nguyên. Logic đơn giản là xử lý bởi ASN1_Object mà họ thừa hưởng từ. Do đó họ là khá đơn giản:
class ASN1_INTEGER(ASN1_Object): tag = ASN1_Class_UNIVERSAL.INTEGER class ASN1_STRING(ASN1_Object): tag = ASN1_Class_UNIVERSAL.STRING class ASN1_BIT_STRING(ASN1_STRING): tag = ASN1_Class_UNIVERSAL.BIT_STRING
Những trường hợp có thể được lắp ráp để tạo ra một cây ASN.1:
>>> x=ASN1_SEQUENCE([ASN1_INTEGER(7),ASN1_STRING("egg"),ASN1_SEQUENCE([ASN1_BOOLEAN(False)])]) >>> x <ASN1_SEQUENCE[[<ASN1_INTEGER[7]>, <ASN1_STRING['egg']>, <ASN1_SEQUENCE[[<ASN1_BOOLEAN[False]>]]>]]> >>> x.show() # ASN1_SEQUENCE: <ASN1_INTEGER[7]> <ASN1_STRING['egg']> # ASN1_SEQUENCE: <ASN1_BOOLEAN[False]>
Comments
Post a Comment