......
0055647F TfxhmMethodTable dw 6
00556481 dw 16h
00556483 dd offset Tfxhm@suiButton2Click ;退出按键
00556487 aSuibutton2click db 0Fh,'suiButton2Click'
00556497 dw 10h
00556499 dd offset Tfxhm@FormClose ;关闭窗口
0055649D aFormclose_0 db 9,'FormClose'
005564A7 dw 11h
005564A9 dd offset Tfxhm@FormCreate ;建立窗口
005564AD aFormcreate_0 db 0Ah
005564AD db 'FormCreate'
005564B8 dw 16h
005564BA dd offset Tfxhm@suiButton1Click ;注册按键
005564BE aSuibutton1cli ck db 0Fh,'suiButton1Click'
005564CE dw 0Fh
005564D0 dd offset Tfxhm@get_text ;suiButton1Click 调用的校验注册申请码
;和注册码并注册的子过程
005564D4 aGet_text db 8,'get_text'
005564DD dw 0Fh
005564DF dd offset Tfxhm@FormShow ;显示窗口
005564E3 aFormshow_0 db 8,'FormShow'
005564EC Tfxhm db 5,'Tfxhm' ;类名
005564F2 word_5564F2 dw 5
005564F4 dd offset TsuiForm@VMT@Prt ;父辈 TsuiForm 的 VMT 表指针地址
......
procedure TForm1.Button2Click(Sender: TObject);
var
Str: String;
begin
Str := Edit1.Text;
asm
PushA
Xor Edx, Edx
Mov Esi, Str
Mov Ecx, 7
@1:
Mov Al, [Esi + Edx]
Xchg Al, [Esi + Edx + 3]
Xchg Al, [Esi + Edx]
Dec Ecx
Add Edx, 4
Cmp Ecx, 0
Jnz @1
Mov Al, [Esi + Edx + 1]
Xchg Al, [Esi + Edx + 2]
Xchg Al, [Esi + Edx + 1]
PopA
end;
Edit2.Text := Str;
end;
Tfxhm@get_text
......
......
0055CF7E mov eax, ds:AppIDAndName_CryHex@Prt ;注册申请号加姓氏和1FH 异或得到的结果
0055CF83 mov eax, [eax]
0055CF85 call sub_4FED88 ;EncodeFunction1
0055CF8A lea eax, [ebp+var_94] ;这里断下获取计算23-27位的三个字符
0055CF8A ;按照 moon帮主的给出的算法可以获得
0055CF90 pus eax
0055CF91 lea edx, [ebp+var_98]
0055CF97 mov eax, ds:Serial_CryHex@Prt ;注册号和 1FH 异或得到的结果
0055CF9C mov eax, [eax]
0055CF9E call CycleConversionStr ;经过 1FH 异或,即还原
0055CFA3 mov eax, [ebp+var_98]
0055CFA9 mov ecx, 5
0055CFAE mov edx, 17h
0055CFB3 call LStrCopy ;取第 23~27位
0055CFB8 mov eax, [ebp+var_94]
0055CFBE lea edx, [ebp+var_90]
0055CFC4 call sub_4F0048 ;进行计算得到三个字符,如果和上面计算得到的三个字符相同,则过
0055CFC9 mov edx, [ebp+var_90]
0055CFCF mov eax, [ebp+var_C]
0055CFD2 call LStrCmp ;关键比较,比较两种方式和数据计算得到的三个字符
0055CFD7 jnz loc_55D157
0055CFDD lea eax, [ebp+var_A0]
0055CFE3 push eax
0055CFE4 lea edx, [ebp+var_A4]
0055CFEA mov eax, ds:Serial_CryHex@Prt
0055CFEF mov eax, [eax]
0055CFF1 call CycleConversionStr
0055CFF6 mov eax, [ebp+var_A4]
0055CFFC mov ecx, 5
0055D001 mov edx, 17h ;取注册号23~27
0055D006 call LStrCopy
0055D00B mov eax, [ebp+var_A0]
0055D011 lea edx, [ebp+var_9C]
0055D017 call sub_4F0048
0055D01C mov edx, [ebp+var_9C]
0055D022 mov eax, [ebp+var_C]
0055D025 call LStrCmp ;关键比较,比较两种方式和数据计算得到的三个字符,和前面相同
0055D02A jnz loc_55D0EA
0055D030 lea eax, [ebp+var_A8]
0055D036 push eax
0055D037 lea edx, [ebp+var_AC]
0055D03D mov eax, ds:Serial_CryHex@Prt
0055D042 mov eax, [eax]
0055D044 call CycleConversionStr
0055D049 mov eax, [ebp+var_AC]
0055D04F mov ecx, 3
0055D054 mov edx, 1Dh ;取注册号 29~31 位
0055D059 call LStrCopy
0055D05E mov eax, [ebp+var_A8]
0055D064 call 31decimalToHex ;对29~31位注册码进行31进制到十六进制的转换
0055D069 mov ebx, eax
0055D06B lea eax, [ebp+var_B0]
0055D071 push eax
0055D072 lea edx, [ebp+var_B4]
0055D078 mov eax, ds:Serial_CryHex@Prt ;取注册号(经过1FH异或处理)
0055D07D mov eax, [eax]
0055D07F call CycleConversionStr ;经过相同的过程还原
0055D084 mov eax, [ebp+var_B4]
0055D08A mov ecx, 1Ch
0055D08F mov edx, 1 ;取注册号 1~28 位
0055D094 call LStrCopy
0055D099 mov eax, [ebp+var_B0]
0055D09F call SumSerial_1to28 ;做 1~28 位累加(中间还有判断是否大于27000,见moon帮主的解释)
0055D0A4 cmp ebx, eax ;关键比较,将前面进制转换得到的数和累加和比较,在这里下断点
0055D0A6 jnz loc_55D157 ;因为注册码没有完成,为了能够继续,暂时将这句 Nop 掉
0055D0AC mov eax, offset a111_2 ; "111"
0055D0B1 call CheckSerial_17to22 ;这里是获取 17~22 位注册码的入口
0055D0B6 mov [ebp+var_1], al
0055D0B9 cmp [ebp+var_1], 0
0055D0BD jz short loc_55D0CC
0055D0BF lea eax, [ebp+var_C]
0055D0C2 mov edx, offset a111_2 ;"111"
0055D0C7 call LStrLAsg
0055D0CC
0055D0CC loc_55D0CC:
0055D0CC cmp [ebp+var_1], 0
0055D0D0 jz loc_55D157
0055D0D6 mov eax, [ebp+var_C]
0055D0D9 mov edx, offset a111_2 ;"111"
0055D0DE call LStrCmp
0055D0E3 jnz short loc_55D0EA
0055D0E5 call CheckSerial_1to16 ;这里是获取 1~16 位注册码的入口
procedure TForm1.Button1Click(Sender: TObject);
const
Str = '0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX';
var
X1, X2: Integer;
x, y, z: Char;
a, b, c, d, e: string;
Pin: string;
begin
Pin := Edit1.Text;
x := Pin[1];
y := Pin[2];
z := Pin[3];
x1 := (Byte(x) shr 3) and $1F;
a := Copy(Str, x1 + 1, 1);
x1 := ((Byte(x) shl 2) and $1C) or ((Byte(y) shr 4) and $03);
b := Copy(Str, x1 + 1, 1);
x1 := Byte(y) and $0F;
c := Copy(Str, x1 + 1, 1);
x1 := ((Byte(y) shr 3) and $18) + ((Byte(z) shr 5) and $07);
d := Copy(Str, x1 + 1, 1);
x1 := (Byte(z) and $1F);
e := Copy(Str, x1 + 1, 1);
Edit2.Text := a + b + c + d + e;
end;
0055D0A6 jnz loc_55D157 ;因为注册码没有完成,为了能够继续,暂时将这句 Nop 掉
0055D0AC mov eax, offset a111_2 ;"111"
0055D0B1 call CheckSerial_17to22 ;这里是获取 17~22 位注册码的入口
跟进 0055D0B1 call CheckSerial_17to22
......
...... 省略
0050C705 mov edx, [ebp+var_20]
0050C708 mov eax, [ebp+var_1C]
0050C70B call DES_EncryStr ;在这里进行 DES 的 EncryStr 加密运算,运算结果再经过
0050C70B ;另一过程处理,这个子过程我们后面还要用到
0050C710 mov edx, [ebp+var_60] ;moon 文中提到在这个位置获取 17~22 位注册码,可能
0050C710 ;是帮主写文章时粗心了,正确的位置应该在下面删除第5位
0050C710 ;相同字母后才取结果。
0050C713 lea eax, [ebp+var_20]
0050C716 call LStrLAsg
0050C71B lea ecx, [ebp+var_64]
0050C71E mov eax, [ebp+var_20]
0050C721 mov dl, [eax+5] ;取出 EncryStr 运算结果的字符串的第 5 位
0050C724 mov eax, [ebp+var_20]
0050C727 call DelChr ;将 EncryStr 运算结果中凡是和第5位相同的字母删除
0050C72C mov edx, [ebp+var_64]
0050C72F lea eax, [ebp+var_20] ;这里下断点,从Edx中取前6位,即我们要的第 17-22 位
......
......省略
0055D0E5 call CheckSerial_1to16 ;这里是获取 1~16 位注册码的入口
跟进 call CheckSerial_1to16
......
......省略
00508EEB lea edx, [ebp+var_18]
00508EEE mov eax, ds:AppIDAndName_CryHex@Prt
00508EF3 mov eax, [eax]
00508EF5 call ConversionHex10To16
00508EFA lea eax, [ebp+var_18]
00508EFD lea edx, [ebp+var_8]
00508F00 call ConversionHexAndFNameToStr
00508F05 lea eax, [ebp+var_20]
00508F08 push eax
00508F09 lea edx, [ebp+var_24]
00508F0C mov eax, ds:Serial_CryHex@Prt
00508F11 mov eax, [eax]
00508F13 call CycleConversionStr
00508F18 mov eax, [ebp+var_24]
00508F1B mov ecx, 10h
00508F20 mov edx, 1 ;取注册号 1~16 位
00508F25 call LStrCopy
00508F2A mov eax, [ebp+var_20]
00508F2D lea ecx, [ebp+var_1C]
00508F30 mov edx, [ebp+var_8]
00508F33 call DES_DecryStr ;这是 DES 的逆运算,我们再跟进
00508F38 mov eax, [ebp+var_1C]
00508F3B lea edx, [ebp+var_18]
00508F3E call ConversionHex10To16
00508F43 lea eax, [ebp+var_18]
00508F46 push eax
00508F47 lea edx, [ebp+var_38]
00508F4A mov eax, ds:AppIDAndName_CryHex@Prt
00508F4F mov eax, [eax]
00508F51 call sub_4FBA70
00508F56 mov eax, [ebp+var_38]
00508F59 lea edx, [ebp+var_34] ;这里是我们要下断点的地方
......
...... 省略
跟进 call DES_DecryStr
......
......省略
004F788E lea edx, [ebp+var_C]
004F7891 mov eax, [ebp+var_4]
004F7894 call sub_4E97BC
004F7899 mov ecx, ebx
004F789B mov edx, [ebp+var_8]
004F789E mov eax, [ebp+var_C]
004F78A1 call DecryStr ;DES 逆运算
004F78A6 xor eax, eax ;这里是 moon 帮主提出下断点处,还有一些其他相应的做法
;请看 moon 原文。
......
......省略
EBP-38 0012F910 00F303D0 ASCII "5FF51115"
EBP-34 0012F914 00000000
EBP-30 0012F918 00000000
EBP-2C 0012F91C 00000000
EBP-28 0012F920 00000000
EBP-24 0012F924 00F30038 ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"
EBP-20 0012F928 00F29F5C ASCII "123456789ABCDEFG"
EBP-1C 0012F92C 00F3009C
EBP-18 0012F930 C338FAD3
EBP-14 0012F934 DD5CB3D0
EBP-10 0012F938 D5D42656
EBP-C 0012F93C A2BB6C94
EBP-8 0012F940 00F2FFF8 ASCII "M9BJBBRIDE88TNP4"
EBP-4 0012F944 00000000
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)