HTTPDebuggerPro v10.0.0.0 记录
目录
HTTPDebuggerPro v10.0.0.0 记录
基本信息
PE32
Operation system: Windows (Vista) [I386, 32位, GUI]
Linker: Microsoft Linker (14.16.27031)
Compiler: Microsoft Visual C/C++ (19.16.27031) [LTCG/C++]
Language: C++
Tool: Microsoft Visual Studio (2017, 15.9)
Sign tool: Windows Authenticode (2.0) [PKCS #7]
Debug data: Records [codeview, vc_feature, pogo]
(Heur) Debug data: Contains [Absolute PDB path]
(Heur) Licensing: Contains [Strings]
Resource: ZIP [偏移 = 0x00794e58, 大小 = 0xa00a]
Format: ZIP (6.3) [Deflate]
Overlay: Binary [偏移 = 0x007bac00, 大小 = 0x20a8]
Certificate: WinAuth (2.0) [PKCS #7]
mfc程序
版本信息:
VS_VERSION_INFO.StringFileInfo.040904e4.CompanyName:HttpDebugger.com
VS_VERSION_INFO.StringFileInfo.040904e4.FileDescription:HTTP Debugger
VS_VERSION_INFO.StringFileInfo.040904e4.FileVersion:10.0.0.0
VS_VERSION_INFO.StringFileInfo.040904e4.InternalName:HTTPDebuggerUI.exe
VS_VERSION_INFO.StringFileInfo.040904e4.LegalCopyright:Copyright (C) 2026 HttpDebugger.com. All rights reserved.
VS_VERSION_INFO.StringFileInfo.040904e4.OriginalFilename:HTTPDebuggerUI.exe
VS_VERSION_INFO.StringFileInfo.040904e4.ProductName:HTTP Debugger
VS_VERSION_INFO.StringFileInfo.040904e4.ProductVersion:10.0.0.0
VS_VERSION_INFO.VarFileInfo.Translation:04e40409
licence key验证
licence key 存在多处校验;可通过字符串“Invalid Licence Key”定位
举例:
CHTTPDebuggerProApp::InitInstance_464A70中
get_sn_data_422610(&a1, (int)&savedregs);
if ( a1._Mysize )
{
s._Mysize = 0;
s._Myres = 0xF;
s.u._Buf[0] = 0;
LOBYTE(v97) = 0x10;
p_a1 = &a1;
if ( a1._Myres >= 0x10 )
p_a1 = (std_string *)a1.u._Ptr;
if ( !x_check_LicenceKey_421E50(p_a1, &s) )
sub_422760("Invalid Licence Key", (void *)Default);
网络注册、验证等内容未分析,可通过字符串“ https://www.httpdebugger.com ”定位,
get_sn_data_422610
std_string *__usercall get_sn_data_422610@<eax>(std_string *STR@<ecx>, int a2@<ebp>)
{
const CHAR *ver_422530; // eax
int reg_info_425830; // eax
int reg_info_425830_2; // edi
char *Ptr; // ecx
union std_string_union v11_2; // xmm0
char *v8; // ecx
std_string VER; // [esp-44h] [ebp-50h] BYREF
union std_string_union v11; // [esp-2Ch] [ebp-38h] BYREF
__int64 v12; // [esp-1Ch] [ebp-28h]
int *v13; // [esp-10h] [ebp-1Ch]
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; // [esp-Ch] [ebp-18h]
void *v15; // [esp-8h] [ebp-14h]
unsigned int v16; // [esp-4h] [ebp-10h]
int a2_2; // [esp+0h] [ebp-Ch]
int retaddr_2; // [esp+4h] [ebp-8h]
int v19; // [esp+8h] [ebp-4h] BYREF
int retaddr; // [esp+Ch] [ebp+0h]
a2_2 = a2;
retaddr_2 = retaddr;
v16 = 0xFFFFFFFF;
v15 = &loc_8FC640;
ExceptionList = NtCurrentTeb()->NtTib.ExceptionList;
v13 = &v19;
v12 = 0xF00000000i64;
v11._Buf[0] = 0;
v16 = 0;
ver_422530 = (const CHAR *)get_sn_by_ver_422530(&VER);
LOBYTE(v16) = 1;
if ( *((_DWORD *)ver_422530 + 5) >= 0x10u )
ver_422530 = *(const CHAR **)ver_422530;
reg_info_425830 = get_reg_info_425830((int)&v11, ver_422530, &v11);
LOBYTE(v16) = 0;
reg_info_425830_2 = reg_info_425830;
if ( VER._Myres >= 0x10 )
{
Ptr = VER.u._Ptr;
if ( VER._Myres + 1 >= 0x1000 )
{
Ptr = (char *)*((_DWORD *)VER.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(VER.u._Ptr - Ptr - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(Ptr);
}
STR->_Mysize = 0;
if ( reg_info_425830_2 )
{
v11_2 = v11;
STR->_Myres = 0;
STR->u = v11_2;
*(_QWORD *)&STR->_Mysize = v12;
}
else
{
STR->_Myres = 0xF;
STR->u._Buf[0] = 0;
std::string::assign(STR, (void *)Default, 0);
if ( HIDWORD(v12) >= 0x10 )
{
v8 = v11._Ptr;
if ( (unsigned int)(HIDWORD(v12) + 1) >= 0x1000 )
{
v8 = (char *)*((_DWORD *)v11._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(v11._Ptr - v8 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v8);
}
}
return STR;
}
get_sn_by_ver_422530
void *__thiscall get_sn_by_ver_422530(void *this)
{
void **FileVersion_435EB0; // eax
void *v3; // edx
_BYTE *v4; // ecx
size_t v5; // edx
std_string s; // [esp-18h] [ebp-58h] BYREF
void *v8; // [esp+14h] [ebp-2Ch]
void *Block; // [esp+18h] [ebp-28h] BYREF
unsigned int v10; // [esp+2Ch] [ebp-14h]
int v11; // [esp+3Ch] [ebp-4h]
v8 = this;
FileVersion_435EB0 = (void **)get_FileVersion_435EB0(&Block);
v3 = FileVersion_435EB0;
v11 = 0;
if ( (unsigned int)FileVersion_435EB0[5] >= 0x10 )
v3 = *FileVersion_435EB0;
s._Mysize = 0;
s._Myres = 0xF;
s.u._Buf[0] = 0;
std::string::assign(&s, v3, strlen((const char *)v3));
sub_422130(s);
if ( v10 < 0x10 )
return this;
v4 = Block;
v5 = v10 + 1;
if ( v10 + 1 >= 0x1000 )
{
v4 = (_BYTE *)*((_DWORD *)Block + 0xFFFFFFFF);
v5 = v10 + 0x24;
if ( (unsigned int)((_BYTE *)Block - v4 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
s._Myres = v5;
sub_6E8C86(v4);
return this;
}
get_FileVersion_435EB0
_DWORD *__thiscall get_FileVersion_435EB0(_DWORD *this)
{
DWORD FileVersionInfoSizeA; // eax
DWORD v3; // ebx
void *v4; // edi
unsigned int puLen[2]; // [esp+10h] [ebp-1024h] BYREF
DWORD dwHandle[2]; // [esp+18h] [ebp-101Ch] BYREF
LPVOID lpBuffer; // [esp+20h] [ebp-1014h] BYREF
CHAR Filename[4096]; // [esp+24h] [ebp-1010h] BYREF
int v10; // [esp+1030h] [ebp-4h]
lpBuffer = this;
puLen[1] = (unsigned int)this;
this[4] = 0;
this[5] = 0xF;
*(_BYTE *)this = 0;
v10 = 0;
dwHandle[1] = 1;
memset(Filename, 0, sizeof(Filename));
GetModuleFileNameA(hModule, Filename, 0x1000u);
PathRemoveFileSpecA(Filename);
PathAppendA(Filename, "HTTPDebuggerUI.exe");
FileVersionInfoSizeA = GetFileVersionInfoSizeA(Filename, dwHandle);
v3 = FileVersionInfoSizeA;
if ( !FileVersionInfoSizeA )
return this;
v4 = (void *)sub_5A0940(FileVersionInfoSizeA);
if ( GetFileVersionInfoA(Filename, dwHandle[0], v3, v4)
// 10.0.0.0
&& VerQueryValueA(v4, "\\StringFileInfo\\040904e4\\FileVersion", &lpBuffer, puLen) )
{
std::string::assign(this, lpBuffer, strlen((const char *)lpBuffer));
}
j_j___free_base(v4);
return this;
}
sub_422130
_DWORD *__cdecl sub_422130(std_string s)
{
DWORD v1; // ecx
_DWORD *v2; // esi
std_string *p_s; // edx
char *v4; // ecx
char *v5; // ecx
char *v6; // ecx
char *v7; // ecx
char *ptr; // eax
DWORD v9; // edi
DWORD Version; // eax
char *v11; // ecx
char *v12; // ecx
DWORD MaximumComponentLength; // [esp+Ch] [ebp-1134h] BYREF
DWORD FileSystemFlags; // [esp+10h] [ebp-1130h] BYREF
DWORD VolumeSerialNumber; // [esp+14h] [ebp-112Ch] BYREF
std_string s1; // [esp+18h] [ebp-1128h] BYREF
std_string v18; // [esp+30h] [ebp-1110h] BYREF
std_string s2; // [esp+48h] [ebp-10F8h] BYREF
char v20[4096]; // [esp+60h] [ebp-10E0h] BYREF
char VolumeNameBuffer[104]; // [esp+1060h] [ebp-E0h] BYREF
char FileSystemNameBuffer[104]; // [esp+10C8h] [ebp-78h] BYREF
int v23; // [esp+113Ch] [ebp-4h]
v2 = (_DWORD *)v1;
VolumeSerialNumber = v1;
v23 = 0;
p_s = &s;
s2._Mysize = 0;
if ( s._Myres >= 0x10 )
p_s = (std_string *)s.u._Ptr;
s2._Myres = 0xF;
s2.u._Buf[0] = 0;
std::string::assign(&s2, p_s, strlen(p_s->u._Buf));
LOBYTE(v23) = 1;
s1._Mysize = 0;
s1._Myres = 0xF;
s1.u._Buf[0] = 0;
std::string::assign(&s1, (void *)Default, 0);
LOBYTE(v23) = 2;
v18._Mysize = 0;
v18._Myres = 0xF;
v18.u._Buf[0] = 0;
std::string::assign(&v18, (void *)".", 1u);
LOBYTE(v23) = 3;
sub_407B90(&s2, (int)&v18, &s1);
LOBYTE(v23) = 2;
if ( v18._Myres >= 0x10 )
{
v4 = v18.u._Ptr;
if ( v18._Myres + 1 >= 0x1000 )
{
v4 = (char *)*((_DWORD *)v18.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(v18.u._Ptr - v4 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v4);
}
LOBYTE(v23) = 1;
if ( s1._Myres >= 0x10 )
{
v5 = s1.u._Ptr;
if ( s1._Myres + 1 >= 0x1000 )
{
v5 = (char *)*((_DWORD *)s1.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(s1.u._Ptr - v5 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v5);
}
v18._Mysize = 0;
v18._Myres = 0xF;
v18.u._Buf[0] = 0;
std::string::assign(&v18, (void *)Default, 0);
LOBYTE(v23) = 4;
s1._Mysize = 0;
s1._Myres = 0xF;
s1.u._Buf[0] = 0;
std::string::assign(&s1, ",", 1u);
LOBYTE(v23) = 5;
sub_407B90(&s2, (int)&s1, &v18);
LOBYTE(v23) = 4;
if ( s1._Myres >= 0x10 )
{
v6 = s1.u._Ptr;
if ( s1._Myres + 1 >= 0x1000 )
{
v6 = (char *)*((_DWORD *)s1.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(s1.u._Ptr - v6 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v6);
}
LOBYTE(v23) = 1;
if ( v18._Myres >= 0x10 )
{
v7 = v18.u._Ptr;
if ( v18._Myres + 1 >= 0x1000 )
{
v7 = (char *)*((_DWORD *)v18.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(v18.u._Ptr - v7 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v7);
}
ptr = (char *)&s2;
if ( s2._Myres >= 0x10 )
ptr = s2.u._Ptr;
LOBYTE(v9) = atol_0(ptr);
if ( GetVolumeInformationA(
"c:\\",
VolumeNameBuffer,
0x64u,
&VolumeSerialNumber,
&MaximumComponentLength,
&FileSystemFlags,
FileSystemNameBuffer,
0x64u) )
{
Version = VolumeSerialNumber;
}
else
{
Version = GetVersion();
}
// .text:0042240D not eax
// .text:0042240F shr eax, 1
// .text:00422411 add eax, 2E0h
// .text:00422416 xor eax, edi
// .text:00422418 xor eax, 590D4h
// VolSeiral^((~VER) >> 1) + 0x2E0) ^ 0x590D4
x_sprintf_4163E0(v20, "SN%d", v9 ^ ((~Version >> 1) - 0x20) ^ 0xD4);
v2[4] = 0;
v2[5] = 0xF;
*(_BYTE *)v2 = 0;
std::string::assign(v2, v20, strlen(v20));
if ( s2._Myres >= 0x10 )
{
v11 = s2.u._Ptr;
if ( s2._Myres + 1 >= 0x1000 )
{
v11 = (char *)*((_DWORD *)s2.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(s2.u._Ptr - v11 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v11);
}
s2._Mysize = 0;
s2._Myres = 0xF;
s2.u._Buf[0] = 0;
if ( s._Myres < 0x10 )
return v2;
v12 = s.u._Ptr;
if ( s._Myres + 1 >= 0x1000 )
{
v12 = (char *)*((_DWORD *)s.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(s.u._Ptr - v12 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v12);
return v2;
}
get_reg_info_425830
int __stdcall get_reg_info_425830(int a1, LPCSTR lpValueName, void *Data_1)
{
int v3; // esi
DWORD cbData; // [esp+Ch] [ebp-40Ch] BYREF
HKEY phkResult; // [esp+10h] [ebp-408h] BYREF
BYTE Data[1024]; // [esp+14h] [ebp-404h] BYREF
v3 = 0;
phkResult = 0;
if ( RegOpenKeyExA(hKey, "SOFTWARE\\MadeForNet\\HTTPDebuggerPro", 0, 0xF003Fu, &phkResult) )
return v3;
memset(Data, 0, sizeof(Data));
cbData = 0x400;
if ( !RegQueryValueExA(phkResult, lpValueName, 0, 0, Data, &cbData) )
{
std::string::assign(Data_1, Data, strlen((const char *)Data));
v3 = 1;
}
RegCloseKey(phkResult);
return v3;
}
x_check_LicenceKey_421E50(关键校验函数)
int __fastcall x_check_LicenceKey_421E50(void *sndata, std_string *s)
{
std_string *p_str; // eax
char *v5; // ecx
char *Ptr; // ecx
char v8[8]; // [esp+10h] [ebp-30h] BYREF
std_string str; // [esp+18h] [ebp-28h] BYREF
int v10; // [esp+3Ch] [ebp-4h]
std::string::assign(s, "Invalid Licence Key", 0x13u);
if ( !transform_421D20(v8, (const char *)sndata) || v8[0] != 0x7C )
return 0;
calc_sndata_421A50(&str, v8);
v10 = 0;
p_str = &str;
if ( str._Myres >= 0x10 )
p_str = (std_string *)str.u._Ptr;
if ( _stricmp(p_str->u._Buf, (const char *)sndata) )
{
if ( str._Myres < 0x10 )
return 0;
Ptr = str.u._Ptr;
if ( str._Myres + 1 >= 0x1000 )
{
Ptr = (char *)*((_DWORD *)str.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(str.u._Ptr - Ptr - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(Ptr);
return 0;
}
std::string::assign(s, sndata, strlen((const char *)sndata));
if ( str._Myres < 0x10 )
return 1;
v5 = str.u._Ptr;
if ( str._Myres + 1 >= 0x1000 )
{
v5 = (char *)*((_DWORD *)str.u._Ptr + 0xFFFFFFFF);
if ( (unsigned int)(str.u._Ptr - v5 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v5);
return 1;
}
transform_421D20
int __fastcall transform_421D20(_DWORD *a1, const char *a2)
{
char v4; // al
int i; // esi
int j; // esi
char *v7; // eax
unsigned int v8; // edx
char *v9; // ecx
char ArgList[4]; // [esp+14h] [ebp-2Ch] BYREF
char *Buffer[5]; // [esp+18h] [ebp-28h] BYREF
unsigned int v13; // [esp+2Ch] [ebp-14h]
int v14; // [esp+3Ch] [ebp-4h]
if ( strlen(a2) != 0x10 )
return 0;
Buffer[4] = 0;
v13 = 0xF;
LOBYTE(Buffer[0]) = v4;
v14 = 0;
for ( i = 0; i < 8; ++i )
str_add_410640(Buffer, a2[i]);
std::string::append((std::string *)Buffer, ",", 1u);
for ( j = 8; j < 0x10; ++j )
str_add_410640(Buffer, a2[j]);
*(_DWORD *)ArgList = 0;
v7 = (char *)Buffer;
if ( v13 >= 0x10 )
v7 = Buffer[0];
sub_416440(ArgList, v7, "%X,%X", (char)ArgList);
v8 = v13;
*a1 = *(_DWORD *)ArgList; // 复用
a1[1] = 0;
if ( v8 < 0x10 )
return 1;
v9 = Buffer[0];
if ( v8 + 1 >= 0x1000 )
{
v9 = (char *)*((_DWORD *)Buffer[0] + 0xFFFFFFFF);
if ( (unsigned int)(Buffer[0] - v9 - 4) > 0x1F )
_invalid_parameter_noinfo_noreturn();
}
sub_6E8C86(v9);
return 1;
}
calc_sndata_421A50
std_string *__fastcall calc_sndata_421A50(std_string *s, _BYTE *temp)
{
char v2; // al
std_string *str; // esi
int Src[4]; // [esp+4h] [ebp-18h] BYREF
int v6; // [esp+14h] [ebp-8h]
v2 = ~temp[3];
v6 = 0;
temp[1] = v2;
str = s;
temp[2] = *temp ^ temp[7];
LOBYTE(s) = temp[6] ^ 7;
temp[4] = temp[3] ^ ~temp[6];
temp[5] = (_BYTE)s;
*(_OWORD *)Src = 0i64;
x_sprintf_4163E0((size_t)s, Src, "%04X%04X", *(_DWORD *)temp);
str->_Mysize = 0;
str->_Myres = 0xF;
str->u._Buf[0] = 0;
std::string::assign(str, Src, strlen((const char *)Src));
return str;
}
py
AI生成,不会还有人手写代码吧,0.0
import random
import ctypes
from ctypes import wintypes
def get_system_volume_serial():
"""
获取系统盘(C:\)的卷序列号(Volume Serial Number)。
返回值:32 位无符号整数。
"""
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
# 函数原型
GetVolumeInformationA = kernel32.GetVolumeInformationA
GetVolumeInformationA.argtypes = [
wintypes.LPCSTR, # lpRootPathName
wintypes.LPSTR, # lpVolumeNameBuffer
wintypes.DWORD, # nVolumeNameSize
ctypes.POINTER(wintypes.DWORD), # lpVolumeSerialNumber
ctypes.POINTER(wintypes.DWORD), # lpMaximumComponentLength
ctypes.POINTER(wintypes.DWORD), # lpFileSystemFlags
wintypes.LPSTR, # lpFileSystemNameBuffer
wintypes.DWORD, # nFileSystemNameSize
]
root_path = b'C:\\'
vol_name_buf = ctypes.create_string_buffer(0x64) # 卷标缓冲区
fs_name_buf = ctypes.create_string_buffer(0x64) # 文件系统名称缓冲区
serial = wintypes.DWORD() # 卷序列号(输出)
max_comp = wintypes.DWORD() # 最大文件名长度(输出)
flags = wintypes.DWORD() # 文件系统标志(输出)
success = GetVolumeInformationA(
root_path,
vol_name_buf,
0x64,
ctypes.byref(serial),
ctypes.byref(max_comp),
ctypes.byref(flags),
fs_name_buf,
0x64,
)
if not success:
raise ctypes.WinError(ctypes.get_last_error())
return serial.value # 无符号整数
def transform_421D20(sndatastr:str):
if len(sndatastr)!=16:
raise ValueError("sndatastr len error")
part1 = sndatastr[:8]
part2 = sndatastr[8:16]
val1 = ctypes.c_uint32(int(part1, 16)).value
val2 = ctypes.c_uint32(int(part2, 16)).value
return val1.to_bytes(4,'little')+val2.to_bytes(4,'little')
def calc_sndata_421A50(temp: bytes) -> str:
if len(temp)!=8:
raise ValueError("len error!")
# 可变的 bytearray 副本,模拟对 temp 数组的修改
buf = bytearray(temp)
# 对应 C 代码中的位操作
buf[1] = (~buf[3]) & 0xFF # temp[1] = ~temp[3]
buf[2] = buf[0] ^ buf[7] # temp[2] = temp[0] ^ temp[7]
buf[4] = buf[3] ^ ((~buf[6]) & 0xFF) # temp[4] = temp[3] ^ ~temp[6]
buf[5] = buf[6] ^ 7 # temp[5] = temp[6] ^ 7
val1 = int.from_bytes(buf[:4], byteorder='little', signed=False)
val2 = int.from_bytes(buf[4:8], byteorder='little', signed=False)
return f"{val1:08X}{val2:08X}"
def generate_sndata():
"""生成一个满足所有校验的 16 字符十六进制 sndata"""
X3 = random.randint(0x00, 0xFF)
Y3 = random.randint(0x00, 0xFF)
Y2 = random.randint(0x00, 0xFF)
# 推导其他字节
X1 = (~X3) & 0xFF
X2 = 0x7C ^ Y3
Y1 = Y2 ^ 7
Y0 = X3 ^ 0xFF ^ Y2
# 组合整数
x = 0x7C | (X1 << 8) | (X2 << 16) | (X3 << 24)
y = Y0 | (Y1 << 8) | (Y2 << 16) | (Y3 << 24)
sndata = f"{x:08X}{y:08X}"
return sndata
def calc_sn(ver:int,serial:int):
return ( ((( (~serial & 0xFFFFFFFF) >> 1 ) + 0x2E0) & 0xFFFFFFFF ) ^ ver ^ 0x590D4 ) & 0xFFFFFFFF
def get_ver(version='10.0.0.0'):
s=version.replace('.','')
return int(s)
def test():
ver=get_ver()
serial=get_system_volume_serial()
sn=calc_sn(ver,serial)
print('[+]sn:',sn)
sndata_str=generate_sndata()
print('[+]sndata_str:',sndata_str)
data=transform_421D20(sndata_str)
print('[-]data:',data.hex().upper())
clac_sndata=calc_sndata_421A50(data)
print(f'[-]clac_sndata:{clac_sndata},check:{clac_sndata==sndata_str}\n')
print('You can copy the following content into a .reg file and then merge it into the registry.\n')
reg_data=rf'''Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\MadeForNet\HTTPDebuggerPro]
"SN{sn}"="{sndata_str}"
'''
print(reg_data)
pass
if __name__=='__main__':
test()
ps


浙公网安备 33010602011771号