000000014043B84 | mov qword ptr ss:[rsp+0x10],rbx |
000000014043B84 | mov qword ptr ss:[rsp+0x18],rbp |
000000014043B84 | push rsi |
000000014043B84 | push rdi |
000000014043B84 | push r12 |
000000014043B84 | push r14 |
000000014043B85 | push r15 |
000000014043B85 | sub rsp,0x70 |
000000014043B85 | mov rax,qword ptr ds:[0x140FF1FF8] | rax:EntryPoint
000000014043B85 | xor rax,rsp | rax:EntryPoint
000000014043B86 | mov qword ptr ss:[rsp+0x60],rax | rax:EntryPoint
000000014043B86 | mov dword ptr ss:[rsp+0x30],r8d | a3=0x4f4c
000000014043B86 | mov dword ptr ss:[rsp+0x2C],edx | a2 11
000000014043B86 | mov rsi,rcx |
000000014043B87 | xor ebp,ebp | v4=0 初始化局部变量
000000014043B87 | mov dword ptr ss:[rsp+0x20],ebp | 初始化配对索引
000000014043B87 | mov qword ptr ds:[rcx+0x80],rbp | a1 + 128
000000014043B87 | mov dword ptr ds:[rcx+0x68],ebp | a1 + 104
000000014043B88 | cmp qword ptr ds:[rcx+0x28],rbp |
000000014043B88 | je 010editor.14043BBA8 |
000000014043B88 | cmp qword ptr ds:[rcx+0x40],rbp |
000000014043B88 | je 010editor.14043BBA8 | 检查用户名和注册码是否都存在
000000014043B89 | lea rdx,qword ptr ss:[rsp+0x50] | rdx:EntryPoint
000000014043B89 | call 010editor.14000E1DD | decode_formatted_hex_id 序列号转换
000000014043B89 | lea rbx,qword ptr ds:[<sub_140E1A5C0>] | 0000000140E1A5C0:&"999" 黑名单用户名
000000014043B8A | lea rdi,qword ptr ds:[0x140E1A5D0] |
000000014043B8A | nop dword ptr ds:[rax],eax |
000000014043B8B | mov rdx,qword ptr ds:[rbx] | rdx:EntryPoint
000000014043B8B | lea rcx,qword ptr ds:[rsi+0x18] | 0x00000133F51AA700
000000014043B8B | call qword ptr ds:[<public: bool __cdecl QString: | 用户名比较 999与AnyOne
000000014043B8B | test al,al | al==0 用户名!=999
000000014043B8B | jne 010editor.14043BBA1 | al=1跳到注册码值正确
000000014043B8C | add rbx,0x8 |
000000014043B8C | cmp rbx,rdi |
000000014043B8C | jl 010editor.14043B8B0 |
000000014043B8C | cmp qword ptr ds:[rsi+0x28],0x1 | 1
000000014043B8D | jle 010editor.14043B98F |
000000014043B8D | lea rdi,qword ptr ds:[0x140E1A5D1] | v6 sint 3此处同样也是比较用户名,比较签名两个字符 43 ('c') 4F('0') 57 D6 30 E3 CA B9 AC AB A1 ('j') C4 ('u') 4A 55 59 2A 35 E2 C4 65 AC D3 A4 CB
000000014043B8E | lea r14,qword ptr ds:[0x140E1A5E9] | co 与ju sint 5
000000014043B8E | nop word ptr ds:[rax+rax],ax |
000000014043B8F | movzx edx,byte ptr ds:[rdi-0x1] | 遍历黑名单数组,每个12
000000014043B8F | lea rcx,qword ptr ss:[rsp+0x24] | b7 01 v32
000000014043B8F | call qword ptr ds:[<public: __cdecl QChar::QChar( | 取出c
000000014043B8F | movzx ebx,word ptr ds:[rax] | c
000000014043B90 | xor edx,edx |
000000014043B90 | lea rcx,qword ptr ds:[rsi+0x18] | unchar ch
000000014043B90 | call qword ptr ds:[<public: class QChar & __cdecl |
000000014043B90 | lea rdx,qword ptr ss:[rsp+0x26] | rdx:EntryPoint
000000014043B91 | mov rcx,rax | rax:EntryPoint
000000014043B91 | call qword ptr ds:[<public: class QChar __cdecl Q | 转换成大写用户名第一个字符
000000014043B91 | cmp word ptr ds:[rax],bx | rax:EntryPoint
000000014043B91 | jne 010editor.14043B982 |
000000014043B92 | movzx edx,byte ptr ds:[rdi] |
000000014043B92 | lea rcx,qword ptr ss:[rsp+0x28] |
000000014043B92 | call qword ptr ds:[<public: __cdecl QChar::QChar( |
000000014043B92 | movzx ebx,word ptr ds:[rax] | rax:EntryPoint
000000014043B93 | mov edx,0x1 |
000000014043B93 | lea rcx,qword ptr ds:[rsi+0x18] |
000000014043B93 | call qword ptr ds:[<public: class QChar & __cdecl |
000000014043B94 | lea rdx,qword ptr ss:[rsp+0x2A] | rdx:EntryPoint
000000014043B94 | mov rcx,rax | rax:EntryPoint
000000014043B94 | call qword ptr ds:[<public: class QChar __cdecl Q |
000000014043B94 | cmp word ptr ds:[rax],bx | rax:EntryPoint
000000014043B95 | jne 010editor.14043B982 |
000000014043B95 | mov r8d,ebp |
000000014043B95 | mov rax,rbp | rax:EntryPoint
000000014043B95 | lea rdx,qword ptr ds:[rdi+0xA] | rdx:EntryPoint
000000014043B95 | nop |
000000014043B96 | movzx ecx,byte ptr ds:[rdx] | rdx:EntryPoint
000000014043B96 | cmp byte ptr ss:[rsp+rax+0x50],cl |
000000014043B96 | jne 010editor.14043B978 |
000000014043B96 | inc r8d |
000000014043B96 | inc rax | rax:EntryPoint
000000014043B96 | dec rdx | rdx:EntryPoint
000000014043B97 | cmp rax,0xA | rax:EntryPoint, 0A:'\n'
000000014043B97 | jl 010editor.14043B960 |
000000014043B97 | cmp r8d,0xA | 0A:'\n'
000000014043B97 | je 010editor.14043BBA1 |
000000014043B98 | add rdi,0xC |
000000014043B98 | cmp rdi,r14 |
000000014043B98 | jl 010editor.14043B8F0 |
000000014043B98 | movzx edx,byte ptr ss:[rsp+0x57] | v46 字节7,密钥第八个
000000014043B99 | movzx r12d,byte ptr ss:[rsp+0x55] | v44 字节5 第6个
000000014043B99 | movzx r9d,byte ptr ss:[rsp+0x52] | v41 字节2 第3个
000000014043B9A | movzx eax,byte ptr ss:[rsp+0x51] | v40 字节1 第2个
000000014043B9A | movzx ebx,byte ptr ss:[rsp+0x50] | v39 字节0 第一个
000000014043B9A | movzx edi,byte ptr ss:[rsp+0x53] | dil(EDI 低 8 位) 字节3 第四个
000000014043B9A | cmp dil,0x9C |
000000014043B9B | jne 010editor.14043BA16 | swith 0xfc跳转
000000014043B9B | movzx ecx,bl | bl=v44,零扩展为32位存入ECX(ECX=0x000000[V44])
000000014043B9B | xor cl,byte ptr ss:[rsp+0x56] | cl是ECX低8位(即v44),和rsp+0x56(v41=rsp+0x52)异或 → cl = v44 ^ v41
000000014043B9B | xor al,dl | al=v46,dl=v40 → al = v46 ^ v40(高8位原始值)
000000014043B9B | movzx ebx,al | 把al(v46^v40)零扩展为32位存入EBX(EBX=0x000000[V46^V40])
000000014043B9C | mov eax,0x100 | EAX=0x100(十进制256,等价于2^8)
000000014043B9C | imul ebx,eax | EBX = EBX * EAX = (v46^v40) * 0x100 → 等价于 (v46^v40) << 8
000000014043B9C | movzx eax,r9b | r9b存储的是之前计算的v44^v41(cl的值),零扩展存入EAX
000000014043B9C | xor al,r12b | 校准:确保al=v44^v41
000000014043B9D | movzx edx,al | 把al(v44^v41)零扩展到EDX(EDX=0x000000[V44^V41])
000000014043B9D | add bx,dx | bx=EBX低16位(即(v46^v40)<<8),dx=EDX低16位(即v44^v41)→ bx = 高8位 + 低8位 = v20
000000014043B9D | call 010editor.14000AD3F | xor_add_transform
000000014043B9D | movzx eax,al |
000000014043B9D | mov dword ptr ds:[rsi+0x6C],eax | 计算版本号
000000014043B9E | movzx ecx,bx |
000000014043B9E | call 010editor.140008C33 | validate_and_map_id
000000014043B9E | movzx eax,ax |
000000014043B9E | mov dword ptr ds:[rsi+0x70],eax | 验证产品ID
000000014043B9E | mov ecx,dword ptr ds:[rsi+0x6C] |
000000014043B9F | test ecx,ecx |
000000014043B9F | je 010editor.14043BBA1 |
000000014043B9F | dec eax |
000000014043B9F | cmp eax,0x3E7 |
000000014043BA0 | ja 010editor.14043BBA1 | 验证条件检查版本号必须非零:v22 != 0产品ID必须在1-1000范围内:v21 >= 1 && v21 <= 1000(0x3E7 = 999)
000000014043BA0 | mov r14d,ebp |
000000014043BA0 | cmp ecx,0x2 |
000000014043BA0 | cmovb r14d,ecx | 设置哈希参数
000000014043BA1 | jmp 010editor.14043BABD |
000000014043BA1 | cmp dil,0xFC | 比较0x fc
000000014043BA1 | jne 010editor.14043BA3C |
000000014043BA1 | mov r14d,0xFF |
000000014043BA2 | mov dword ptr ds:[rsi+0x6C],r14d |
000000014043BA2 | mov dword ptr ds:[rsi+0x70],0x1 |
000000014043BA2 | mov dword ptr ds:[rsi+0x80],0x1 |
000000014043BA3 | jmp 010editor.14043BABD |
000000014043BA3 | cmp dil,0xAC | 比较0xac
000000014043BA4 | jne 010editor.14043BBA1 |
000000014043BA4 | mov dword ptr ds:[rsi+0x6C],0x2 | 将2写入结构体的偏移108处(类型标记)
000000014043BA4 | xor al,dl | 计算 v14 ^ v17(字节7^字节1)
000000014043BA4 | movzx ecx,al |
000000014043BA5 | mov eax,0x100 | 左移8位
000000014043BA5 | imul ecx,eax |
000000014043BA5 | movzx eax,r9b |
000000014043BA5 | xor al,r12b | 计算 v15 ^ v16(字节5^字节2)
000000014043BA6 | movzx edx,al |
000000014043BA6 | add cx,dx | 计算16位产品id 两部分组合成16位数
000000014043BA6 | call 010editor.140008C33 | 计算该类型的 16 位 “产品核心 ID”
000000014043BA6 | movzx eax,ax |
000000014043BA6 | mov dword ptr ds:[rsi+0x70],eax | 映射后的 ID 存入结构体a1+112字段
000000014043BA7 | dec eax |
000000014043BA7 | cmp eax,0x1387 | 验证映射后的 ID 是否在 “完整许可证有效范围” 内(比 0x9C 分支的 1~1000 范围大,对应 “更完整的注册码” 属性)
000000014043BA7 | ja 010editor.14043BBA1 |
000000014043BA7 | movzx ecx,byte ptr ss:[rsp+0x54] | 加载v43(字节4
000000014043BA8 | movzx eax,byte ptr ss:[rsp+0x58] | 加载v47(字节8
000000014043BA8 | xor ecx,eax |
000000014043BA8 | shl ecx,0x8 | ecx = (v43 ^ v47) << 8
000000014043BA8 | movzx edx,byte ptr ss:[rsp+0x59] | 加载v48(字节9)
000000014043BA9 | xor edx,r12d | edx = v48 ^ r12d(r12d存放v15/字节5)
000000014043BA9 | shl edx,0x10 | edx = (v48 ^ v15) << 16
000000014043BA9 | add ecx,edx | ecx = ((v47 ^ v43) << 8) + ((v15 ^ v48) << 16)
000000014043BA9 | mov edx,ebx | ebx存放v18(字节0)
000000014043BA9 | movzx eax,byte ptr ss:[rsp+0x56] | 加载v45(字节6)
000000014043BAA | xor edx,eax | edx = v18 ^ v45
000000014043BAA | add ecx,edx |
000000014043BAA | mov edx,0x5B8C27 | 第二个固定参数:026706047(八进制)
000000014043BAA | call 010editor.14000B0C3 |
000000014043BAB | mov dword ptr ss:[rsp+0x20],eax |
000000014043BAB | mov dword ptr ds:[rsi+0x84],eax | 存储到结构体的偏移84h处
000000014043BAB | mov r14d,eax | 进入26分支
000000014043BAB | lea rdx,qword ptr ss:[rsp+0x38] | 目标地址,用于存储QByteArray
000000014043BAC | lea rcx,qword ptr ds:[rsi+0x18] | 用户名
000000014043BAC | call qword ptr ds:[<public: class QByteArray __cd | 序列号转UTF-8
000000014043BAC | nop |
000000014043BAC | mov ebx,dword ptr ds:[rsi+0x70] | 获取产品id
000000014043BAD | cmp dil,0xFC | 比较v19(类型)与0xFC
000000014043BAD | setne bpl | 如果v19!=0xFC,则bpl=1,否则bpl=0
000000014043BAD | lea rcx,qword ptr ss:[rsp+0x38] |
000000014043BAD | call qword ptr ds:[<public: char * __cdecl QByteA | rax指向用户名UTF-8字节数据
000000014043BAE | mov r9d,ebx | 第4个参数:产品ID
000000014043BAE | mov r8d,r14d | 第3个参数:v23(对于0xAC类型是配对索引)
000000014043BAE | mov edx,ebp | 第2个参数:标志位(bpl)
000000014043BAE | mov rcx,rax | 第1个参数:用户名数据指针
000000014043BAE | call 010editor.14000C97D | compute_custom_hash
000000014043BAF | mov edx,eax | 保存哈希值到edx
000000014043BAF | cmp byte ptr ss:[rsp+0x54],al | 比较v43(字节4)与哈希最低字节
000000014043BAF | jne 010editor.14043BB8D | 不匹配则跳转到失败处理(返回0xE7)
000000014043BAF | mov ecx,eax |
000000014043BB0 | shr ecx,0x8 | 右移8位,获取第二字节
000000014043BB0 | cmp r12b,cl | 比较v15(字节5)与哈希第二字节
000000014043BB0 | jne 010editor.14043BB8D |
000000014043BB0 | mov ecx,eax |
000000014043BB0 | shr ecx,0x10 | 右移16位,获取第三字节
000000014043BB1 | cmp byte ptr ss:[rsp+0x56],cl | 比较v45(字节6)与哈希第三字节
000000014043BB1 | jne 010editor.14043BB8D |
000000014043BB1 | mov ecx,eax |
000000014043BB1 | shr ecx,0x18 | 右移24位,获取第四字节
000000014043BB1 | cmp byte ptr ss:[rsp+0x57],cl | 比较v46(字节7)与哈希最高字节
000000014043BB2 | jne 010editor.14043BB8D | 计算hash匹配
000000014043BB2 | cmp dil,0x9C |
000000014043BB2 | jne 010editor.14043BB40 |
000000014043BB2 | mov eax,dword ptr ss:[rsp+0x2C] |
000000014043BB2 | cmp eax,dword ptr ds:[rsi+0x6C] |
000000014043BB3 | jbe 010editor.14043BB39 |
000000014043BB3 | mov ebx,0x4E | 4E:'N'
000000014043BB3 | jmp 010editor.14043BB92 |
000000014043BB3 | mov ebx,0x2D | 2D:'-'
000000014043BB3 | jmp 010editor.14043BB92 |
000000014043BB4 | cmp dil,0xFC |
000000014043BB4 | jne 010editor.14043BB72 |
000000014043BB4 | movzx ecx,byte ptr ss:[rsp+0x52] |
000000014043BB4 | shl ecx,0x10 |
000000014043BB4 | movzx eax,byte ptr ss:[rsp+0x51] |
000000014043BB5 | shl eax,0x8 |
000000014043BB5 | add ecx,eax |
000000014043BB5 | movzx eax,byte ptr ss:[rsp+0x50] |
000000014043BB5 | add ecx,eax |
000000014043BB5 | call 010editor.14000B0C3 |
000000014043BB6 | test eax,eax |
000000014043BB6 | je 010editor.14043BB8D |
000000014043BB6 | mov dword ptr ds:[rsi+0x68],eax |
000000014043BB6 | mov ebx,0x93 |
000000014043BB7 | jmp 010editor.14043BB92 |
000000014043BB7 | cmp dil,0xAC |
000000014043BB7 | jne 010editor.14043BB8D |
000000014043BB7 | mov eax,dword ptr ss:[rsp+0x20] |
000000014043BB7 | test eax,eax |
000000014043BB7 | je 010editor.14043BB8D |
000000014043BB8 | cmp dword ptr ss:[rsp+0x30],eax |
000000014043BB8 | jbe 010editor.14043BB39 |
000000014043BB8 | mov ebx,0x4E | 4E:'N'
000000014043BB8 | jmp 010editor.14043BB92 |
000000014043BB8 | mov ebx,0xE7 |
000000014043BB9 | lea rcx,qword ptr ss:[rsp+0x38] |
000000014043BB9 | call qword ptr ds:[<public: __cdecl QByteArray::~ |
000000014043BB9 | mov eax,ebx |
000000014043BB9 | jmp 010editor.14043BBAD |
000000014043BBA | mov eax,0xE7 | 赋值0xe7
000000014043BBA | jmp 010editor.14043BBAD |
000000014043BBA | mov eax,0x93 |
000000014043BBA | mov rcx,qword ptr ss:[rsp+0x60] |
000000014043BBB | xor rcx,rsp |
000000014043BBB | call 010editor.1400074A5 | security_check_cookie
000000014043BBB | lea r11,qword ptr ss:[rsp+0x70] |
000000014043BBB | mov rbx,qword ptr ds:[r11+0x38] |
000000014043BBC | mov rbp,qword ptr ds:[r11+0x40] |
000000014043BBC | mov rsp,r11 |
000000014043BBC | pop r15 |
000000014043BBC | pop r14 |
000000014043BBC | pop r12 |
000000014043BBD | pop rdi |
000000014043BBD | pop rsi |
000000014043BBD | ret |