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

image-20260425100501047

posted @ 2026-04-25 10:53  DirWangK  阅读(156)  评论(0)    收藏  举报