xx个人办公与客户管理系统T30.03

国产软件,如果不合适请删除。
程序用了很多加密算法,TEA,RSA,RC5/6。跟踪相当沉闷,但成功的喜悦也倍增。
呈现在你面前的流程是反复跟踪了n次后整理的,因为很多地方是慢慢跟出来的,然后补充修改。
代码贴长了点,TEA与RC5/6比较少见,贴上汇编代码以供参考。
确认码的验证算法与window优化大师的某个版本几乎一样。

ASPack 2.12 -> Alexey Solodovnikov
Borland Delphi 6.0 - 7.0

用户名:cyto
注册码:87654321-1234
用户数:1用户

1.注册确认后无提示,注册次数过多提示退出程序。
地址=0073DA84 反汇编=mov edx,dumped.0073DC3C 文本字符串=注册码多次错误即将退出系统
0073DA77     8378 0C 04       cmp dword ptr ds:[eax+C],4 ; 注册次数超过4次就退出
0073DA7B     75 26            jnz short dumped.0073DAA3
0073DA7D     6A 10            push 10
0073DA7F     B9 34DC7300      mov ecx,dumped.0073DC34
0073DA84     BA 3CDC7300      mov edx,dumped.0073DC3C     ; 注册码多次错误,退出系统

对注册码的要求:
0073DB03     E8 4CD9D1FF      call dumped.0045B454               ; 取第1组注册码
0073DB08     8B45 EC          mov eax,dword ptr ss:[ebp-14]
0073DB0B     8D55 F0          lea edx,dword ptr ss:[ebp-10]
0073DB0E     E8 4DC4CCFF      call dumped.00409F60
0073DB13     8B45 F0          mov eax,dword ptr ss:[ebp-10]
0073DB16     E8 FD74CCFF      call dumped.00405018               ; 第一组注册码长度
0073DB1B     83F8 08          cmp eax,8
0073DB1E     75 53            jnz short dumped.0073DB73

0073DB29     E8 26D9D1FF      call dumped.0045B454               ; 取第2组注册码
0073DB2E     8B45 E4          mov eax,dword ptr ss:[ebp-1C]
0073DB31     8D55 E8          lea edx,dword ptr ss:[ebp-18]
0073DB34     E8 27C4CCFF      call dumped.00409F60
0073DB39     8B45 E8          mov eax,dword ptr ss:[ebp-18]
0073DB3C     E8 D774CCFF      call dumped.00405018               ; 第2组注册码的长度
0073DB41     83F8 04          cmp eax,4
0073DB44     75 2D            jnz short dumped.0073DB73

2.程序没再动作,然后F9运行后,提示输入确认码。
地址=0073CE1E 反汇编=mov edx,dumped.0073D164 文本字符串=确认码多次错误即将退出系统
0073CE11     8378 0C 05       cmp dword ptr ds:[eax+C],5  ; 确认码只能输入5次
0073CE15     75 26            jnz short dumped.0073CE3D
0073CE17     6A 10            push 10
0073CE19     B9 5CD17300      mov ecx,dumped.0073D15C
0073CE1E     BA 64D17300      mov edx,dumped.0073D164      ; 确认码多次错误即将退出系统

然后判断用户名是否大于4位:
0073CE98     E8 B7E5D1FF      call dumped.0045B454               ; 取用户名
0073CE9D     8B45 EC          mov eax,dword ptr ss:[ebp-14]
0073CEA0     E8 7381CCFF      call dumped.00405018
0073CEA5     83F8 04          cmp eax,4
0073CEA8     7D 22            jge short dumped.0073CECC

取确认码,初步处理:
0073CEE6     E8 69E5D1FF     call dumped.0045B454                ; 取第1组确认码
0073CEEB     8D45 E8         lea eax,dword ptr ss:[ebp-18]
0073CEEE     50              push eax
0073CEEF     8D55 E4         lea edx,dword ptr ss:[ebp-1C]
0073CEF2     8B45 FC         mov eax,dword ptr ss:[ebp-4]
0073CEF5     8B80 4C030000   mov eax,dword ptr ds:[eax+34C]
0073CEFB     E8 54E5D1FF     call dumped.0045B454                ; 取第2组确认码
0073CF00     8B55 E4         mov edx,dword ptr ss:[ebp-1C]       ; 第2组确认码
0073CF03     58              pop eax                             ; 第1组确认码地址
0073CF04     E8 1781CCFF     call dumped.00405020                ; 连接
0073CF09     8B55 E8         mov edx,dword ptr ss:[ebp-18]
0073CF0C     A1 28AC7B00     mov eax,dword ptr ds:[7BAC28]
0073CF11     8B00            mov eax,dword ptr ds:[eax]
0073CF13     E8 A8E90600     call dumped.007AB8C0                ; 转换
0073CF18     8945 F4         mov dword ptr ss:[ebp-C],eax        ; 保存
...
0073CF27     E8 28E5D1FF     call dumped.0045B454
0073CF2C     8D45 E0         lea eax,dword ptr ss:[ebp-20]
0073CF2F     50              push eax
0073CF30     8D55 DC         lea edx,dword ptr ss:[ebp-24]
0073CF33     8B45 FC         mov eax,dword ptr ss:[ebp-4]
0073CF36     8B80 54030000   mov eax,dword ptr ds:[eax+354]
0073CF3C     E8 13E5D1FF     call dumped.0045B454
0073CF41     8B55 DC         mov edx,dword ptr ss:[ebp-24]
0073CF44     58              pop eax
0073CF45     E8 D680CCFF     call dumped.00405020                ; 连接第3组&第4组确认码
0073CF4A     8B55 E0         mov edx,dword ptr ss:[ebp-20]
0073CF4D     A1 28AC7B00     mov eax,dword ptr ds:[7BAC28]
0073CF52     8B00            mov eax,dword ptr ds:[eax]
0073CF54     E8 67E90600     call dumped.007AB8C0                ; 转换
0073CF59     8945 F8         mov dword ptr ss:[ebp-8],eax        ; 保存

如果确认码为:8765-4321-1234-5678
0012F5C4  21 43 65 87 78 56 34 12  !Ce噚V4

接下来一溜的检查各组确认码是不是4位。

3.然后来到计算比较确认码的地方:
0073D068     E8 7BE60600     call dumped.007AB6E8                ; 估计是计算中心了
0073D06D     85C0            test eax,eax
0073D06F     75 0E           jnz short dumped.0073D07F           ; 关键比较之一

3.1计算用户名:
扩展用户名长度,取前8个字符:
007AB745     BA B8B87A00     mov edx,dumped.007AB8B8           ; ASCII "1234567"
007AB74A     E8 D198C5FF     call dumped.00405020              ; 连接到用户名后面
堆栈 ss:[0012F558]=01630DC0, (ASCII "cyto1234567")

007AB769     E8 2E9CC5FF     call dumped.0040539C                ; 取8位
eax=01630DC0, (ASCII "cyto1234")

加密扩展后的用户名得到比较值之一:
007AB79B     E8 E0FEFFFF       call dumped.007AB680

cryptosearcher查得:TEA,定位在:
007BA194  B9 79 37 9E 15 DC 17 3F  箉7???

对扩展后的用户名(8个字符)下断或者007BA194下硬件访问断点:
007AB687     BA 20000000       mov edx,20                             ; 循环次数
007AB68C     8B0424            mov eax,dword ptr ss:[esp]
007AB68F     8B00              mov eax,dword ptr ds:[eax]
007AB691     8B1C24            mov ebx,dword ptr ss:[esp]
007AB694     8B5B 04           mov ebx,dword ptr ds:[ebx+4]
007AB697     33F6              xor esi,esi
007AB699     4A                dec edx
007AB69A     0335 94A17B00     add esi,dword ptr ds:[7BA194]          ; 黄金分割点,TEA特征
007AB6A0     8BFB              mov edi,ebx                            ; 断在此
007AB6A2     C1E7 04           shl edi,4                              ; edi=1234
007AB6A5     03C7              add eax,edi                            ; eax=cyto
007AB6A7     8B39              mov edi,dword ptr ds:[ecx]             ; 字符串第1字(4个字节)
007AB6A9     33FB              xor edi,ebx
007AB6AB     03C7              add eax,edi
007AB6AD     8BFB              mov edi,ebx
007AB6AF     C1EF 05           shr edi,5
007AB6B2     33FE              xor edi,esi
007AB6B4     03C7              add eax,edi
007AB6B6     0341 04           add eax,dword ptr ds:[ecx+4]           ; 字符串第2字
007AB6B9     8BF8              mov edi,eax
007AB6BB     C1E7 04           shl edi,4
007AB6BE     03DF              add ebx,edi
007AB6C0     8B79 08           mov edi,dword ptr ds:[ecx+8]           ; 字符串第3字
007AB6C3     33F8              xor edi,eax
007AB6C5     03DF              add ebx,edi
007AB6C7     8BF8              mov edi,eax
007AB6C9     C1EF 05           shr edi,5
007AB6CC     33FE              xor edi,esi
007AB6CE     03DF              add ebx,edi
007AB6D0     0359 0C           add ebx,dword ptr ds:[ecx+C]           ; 字符串第4字
007AB6D3     85D2              test edx,edx
007AB6D5   ^ 77 C2             ja short dumped.007AB699
007AB6D7     8B1424            mov edx,dword ptr ss:[esp]
007AB6DA     8902              mov dword ptr ds:[edx],eax             ; 2E5EFFAE
007AB6DC     8B0424            mov eax,dword ptr ss:[esp]
007AB6DF     8958 04           mov dword ptr ds:[eax+4],ebx           ; A0EF26F5

待加密字符串:
0012F510   01610D10    ASCII "cyto1234"                 
// 取“用户名+12345678”的前8位

TEA的key:
0012F518   0162E42C    ASCII "tn,oacrmpim 824 helpu!"  
0162E42C  74 6E 2C 6F 61 63 72 6D  tn,oacrm
0162E434  70 69 6D 20 38 32 34 20  pim 824
0162E43C  68 65 6C 70 75 21 00 00  helpu!..
// 内置的字符串,取前128bit,即16字节。

总共32轮加密,得到加密值:2E5EFFAE(这个后面比较用到)&A0EF26F5(这个好像没用)
0012F540  AE FF 5E 2E F5 26 EF A0                          ?^.?颻茔b

3.2计算确认码并与用户名计算值比较:
转移确认码
0012F54C  21 43 65 87 78 56 34 12  !Ce噚V4

RSA加密确认码:
007AB7CF     8B45 EC         mov eax,dword ptr ss:[ebp-14]       ; QRM,前1,2组
007AB7D2     33D2            xor edx,edx
007AB7D4     52              push edx
007AB7D5     50              push eax
007AB7D6     FF35 9CA17B00   push dword ptr ds:[7BA19C]
007AB7DC     FF35 98A17B00   push dword ptr ds:[7BA198]          ; E=3F17DC15
007AB7E2     FF35 A4A17B00   push dword ptr ds:[7BA1A4]
007AB7E8     FF35 A0A17B00   push dword ptr ds:[7BA1A0]          ; N=758F0581
007AB7EE     8B45 FC         mov eax,dword ptr ss:[ebp-4]
007AB7F1     E8 C6FDFFFF     call dumped.007AB5BC                ; RSA加密
007AB7F6     83E8 02         sub eax,2                           ; 加密值1-2
007AB7F9     8945 D8         mov dword ptr ss:[ebp-28],eax       ; 保存

007AB7FC     8B45 F0         mov eax,dword ptr ss:[ebp-10]       ; QRM,第3,4组
007AB7FF     33D2            xor edx,edx
007AB801     52              push edx
007AB802     50              push eax
007AB803     FF35 9CA17B00   push dword ptr ds:[7BA19C]
007AB809     FF35 98A17B00   push dword ptr ds:[7BA198]          ; E=3F17DC15
007AB80F     FF35 A4A17B00   push dword ptr ds:[7BA1A4]
007AB815     FF35 A0A17B00   push dword ptr ds:[7BA1A0]          ; N=758F0581
007AB81B     8B45 FC         mov eax,dword ptr ss:[ebp-4]
007AB81E     E8 99FDFFFF     call dumped.007AB5BC                ; RSA加密 
007AB823     83E8 02         sub eax,2                           ; 加密值2-2
007AB826     8945 DC         mov dword ptr ss:[ebp-24],eax

这样确认码都加密完毕,值:
0012F538  B1 0D CF 36 CD 4C 99 54  ??蚅橳

然后对确认码加密值的再计算并比较:
007AB829     C165 D8 02      shl dword ptr ss:[ebp-28],2         ; eax=eax×4
007AB82D     8D4D D8         lea ecx,dword ptr ss:[ebp-28]       ; eax
007AB830     8B01            mov eax,dword ptr ds:[ecx]          ; eax
007AB832     8B51 04         mov edx,dword ptr ds:[ecx+4]        ; edx
007AB835     0FACD0 02       shrd eax,edx,2                      ; eax=eax,edx,2
007AB839     C1EA 02         shr edx,2                           ; edx=edx/4
007AB83C     8901            mov dword ptr ds:[ecx],eax          ; 保存
007AB83E     8951 04         mov dword ptr ds:[ecx+4],edx        ; 保存
007AB841     8B45 D8         mov eax,dword ptr ss:[ebp-28]
007AB844     3B45 E0         cmp eax,dword ptr ss:[ebp-20]       ; eax与2E5EFFAE比较
007AB847     74 04           je short dumped.007AB84D
007AB849     33DB            xor ebx,ebx
007AB84B     EB 11           jmp short dumped.007AB85E
007AB84D     66:8B45 DC      mov ax,word ptr ss:[ebp-24]         ; edx的低4位
007AB851     66:25 FFFF      and ax,0FFFF
007AB855     8B55 F4         mov edx,dword ptr ss:[ebp-C]
007AB858     66:8902         mov word ptr ds:[edx],ax            ; 保存

计算参数:0012F538  B1 0D CF 36 CD 4C 99 54  ??蚅橳
就是2组RSA加密值-2,即:eax=36CF0DB1,edx=54994CCD
计算:
eax×4;shrd eax,edx,2;edx/4
值又分别保存回原地址,然后取出eax,如果等于2E5EFFAE就过第1关。
然后保存edx的低4位作为返回再比较的参数。

解释一下shrd eax,edx,2:
联合移位,edx值不变,eax右移2位(2进制形式右移2位),高位由0补齐32位,edx的低2位赋值给eax的高2位,比如:
eax=00000000000000000000010100010010=512
edx=00000000000000000000000000000011=3
移位后:
eax=11000000000000000000000101000100=C0000144

修改007AB847处的跳转,使相等,然后返回到关键比较之一:
0073D06F     75 0E           jnz short dumped.0073D07F           ; 关键比较之一
往下又来到第2次比较:
0073D094     0FB745 F2       movzx eax,word ptr ss:[ebp-E]       ; edx的低4位
0073D098     3BD8            cmp ebx,eax                         ; 与ebx比较,用户数对应不同的ebx
0073D09A     74 0E           je short dumped.0073D0AA            ; 第2个关键跳转
如果又过了这关,那么就完成确认码的验证,接下来就对注册码的验证了。
用户数为1,3,5,10,10以上,ebx分别为1,3,5,A,0。

4.反推确认码:与用户名有关
如果输入的用户名为:cyto,那么TEA加密后得到比较值为:2E5EFFAE

确认码的计算过程如下:
取得4×4的确认码,比如:8765-4321-1234-5678
然后2组2组连接得到:87654321,12345678
然后分别进行RSA加密,E=3F17DC15;N=758F0581    
得到的加密值分别-2作为下一步运算的参数,假设为eax,edx
eax×4;shrd eax,edx,2;edx/4
如果eax=2E5EFFAE,edx的低4位=0001(1用户数为0001,如果3用户为0003,5用户数为0005,10用户数为000A,10用户数以上为0000),确认码验证完毕。

最后的值:
eax=2E5EFFAE=00101110010111101111111110101110
edx=xxxx0001(edx前面4位随意填上)

edx逆运算:
edx×4=xxxx0004=xxxxxxxxxxxxxxxx0000000000000100
逆联合移位:
eax=10111001011110111111111010111000=B97BFEB8(eax最后2个是随意补上)
edx=xxxxxxxxxxxxxxxx0000000000000100=xxxx0004
eax逆运算:
eax/4=2E5EFFAE

这样得到了初始运算的eax&edx。
eax=2E5EFFAE
edx=xxxx0004

各加2就=RSA加密后的值,即:2E5EFFB0,xxxx0006(12F80006)
E=3F17DC15;N=758F0581;D=3B47BD
解密后得到确认码:33FAE15A;1D0D46F0
这里有个小插曲,试过解密88880006,解密得到:5ECD0496,但是5ECD0496加密后却不是88880006,而是12F8FA85,所以修改xxxx0006为:12F80006,这下加解密不会出错了,而且12F80006-2/4=4BE0001,后4位0001,符合要求。

这样得到了1用户数的确认码,即:33FA-E15A-1D0D-46F0(用户名=cyto)
10用户数以上的确认码:33FA-E15A-5081-0123(用户名=cyto)

5.验证注册码:
0073D0DD     E8 9E000000     call dumped.0073D180
进这个call又来到第一次下断判断注册码的地方来。
取出第1组注册码,比较是不是8位长度,取出第2组注册码,比较长度是不是4位。

5.1计算用户名得到注册码:
0073D30B     8B55 C4           mov edx,dword ptr ss:[ebp-3C]      ; 用户名
0073D30E     A1 28AC7B00       mov eax,dword ptr ds:[7BAC28]
0073D313     8B00              mov eax,dword ptr ds:[eax]
0073D315     8BCF              mov ecx,edi
0073D317     E8 CC7D0600       call dumped.007A50E8                ; 计算用户名
0073D31C     8B45 C8           mov eax,dword ptr ss:[ebp-38]       ; (ASCII "ZHHMLBMMNZLH")

进call:
RC5/RC6初始化:
007AB1F2     E8 4DD4FDFF       call dumped.00788644
由cryptosearcher.exe查到算法为RC5/RC6,定位在:
007B9F44  63 51 E1 B7 1C CB 18 56 D5 44 50 F4 8E BE 87 92  cQ岱?V誅P魩緡

HR 007B9F44,拷贝一次:
0012F380  63 51 E1 B7 1C CB 18 56 D5 44 50 F4 8E BE 87 92  cQ岱?V誅P魩緡
0012F390  47 38 BF 30 00 B2 F6 CE B9 2B 2E 6D 72 A5 65 0B  G8?.馋喂+.mr
0012F3A0  2B 1F 9D A9 E4 98 D4 47 9D 12 0C E6 56 8C 43 84  +潻錁訥?.鎂孋
0012F3B0  0F 06 7B 22 C8 7F B2 C0 81 F9 E9 5E 3A 73 21 FD  {"?怖侚閊:s!
0012F3C0  F3 EC 58 9B AC 66 90 39 65 E0 C7 D7 1E 5A FF 75  箪X洭f?e嗲?Zu
0012F3D0  D7 D3 36 14 90 4D 6E B2 49 C7 A5 50 02 41 DD EE  子6怣n睮钎PA蓊
0012F3E0  BB BA 14 8D 74 34 4C 2B 2D AE 83 C9 E6 27 BB 67  缓峵4L+-畠涉'籫
0012F3F0  9F A1 F2 05 58 1B 2A A4 11 95 61 42 CA 0E 99 E0  煛?X*?昦B?權
0012F400  83 88 D0 7E 3C 02 08 1D F5 7B 3F BB AE F5 76 59  儓衺<?#123;?划鮲Y
0012F410  67 6F AE F7 20 E9 E5 95 D9 62 1D 34 92 DC 54 D2  go 殄曎b4捾T
0012F420  4B 56 8C 70 04 D0 C3 0E BD 49 FB AC 76 C3 32 4B  KV宲忻絀v?K

然后经过3×B0次循环,数据彻底的更换了3次,HR 0012F380:
00788746     8B45 FC           mov eax,dword ptr ss:[ebp-4]
00788749     8B44B8 20         mov eax,dword ptr ds:[eax+edi*4+20]
0078874D     03C3              add eax,ebx
0078874F     03C6              add eax,esi
00788751     BA 03000000       mov edx,3
00788756     E8 59FEFFFF       call dumped.007885B4
0078875B     8BD8              mov ebx,eax
0078875D     8B45 FC           mov eax,dword ptr ss:[ebp-4]
00788760     895CB8 20         mov dword ptr ds:[eax+edi*4+20],ebx
00788764     8D141E            lea edx,dword ptr ds:[esi+ebx]
00788767     8B45 F4           mov eax,dword ptr ss:[ebp-C]
0078876A     8B8485 ECFEFFFF   mov eax,dword ptr ss:[ebp+eax*4-114]
00788771     03C3              add eax,ebx
00788773     03C6              add eax,esi
00788775     E8 3AFEFFFF       call dumped.007885B4
0078877A     8BF0              mov esi,eax
0078877C     8B45 F4           mov eax,dword ptr ss:[ebp-C]
0078877F     89B485 ECFEFFFF   mov dword ptr ss:[ebp+eax*4-114],esi
00788786     8D47 01           lea eax,dword ptr ds:[edi+1]
00788789     B9 2C000000       mov ecx,2C
0078878E     99                cdq
0078878F     F7F9              idiv ecx
00788791     8BFA              mov edi,edx
00788793     8B45 F4           mov eax,dword ptr ss:[ebp-C]
00788796     40                inc eax
00788797     99                cdq
00788798     F77D F0           idiv dword ptr ss:[ebp-10]
0078879B     8955 F4           mov dword ptr ss:[ebp-C],edx
0078879E     FF4D EC           dec dword ptr ss:[ebp-14]
007887A1   ^ 75 A3             jnz short dumped.00788746

初始化后的数据:
0012F380  A7 53 C5 67 73 B4 72 8A 86 16 C8 F6 1B 02 4C 75  舋s磖妴撒Lu
0012F390  E0 25 66 58 4C E1 4F 64 D5 A1 BD E4 79 DD 51 39  ?fXL酧d铡戒y軶9
0012F3A0  49 A4 FF 41 8E F7 21 C9 97 E0 FE 5B CC 9B 2E EF  I?A庽!蓷帼[虥.
0012F3B0  FF 1A 83 02 A0 1D B2 1F D3 ED 85 88 BD 0A 5A FF  ???禹厛?Z
0012F3C0  B9 D1 3F 7D 46 65 FB A2 9F 24 9D DD 59 02 CA 15  寡?}Fe?澼Y?
0012F3D0  21 52 A2 DD 53 63 F9 38 4B 96 BB E1 D7 8B 31 3F  !R⑤Sc?K柣嶙??
0012F3E0  2B EF 34 8A 67 FD 22 20 88 1D FF A7 E7 57 14 6D  +?奼? ?хWm
0012F3F0  D1 A1 62 AE DF 32 6D 44 76 81 BD B0 7A 14 40 A7  选b2mDv伣皕@
0012F400  4F 7F AF 74 8A 65 A3 A1 E1 2E 52 D9 5E 65 93 08  O痶奺!?R賌e?
0012F410  73 58 9D 69 F7 29 9A 37 9F 2E 05 9E F9 EB BD 40  sX漣???烓虢@
0012F420  AF 1A 59 5C E9 35 88 CD 5A 9B 91 DA 7B C8 7B 00  ?Y\?埻Z洃?#123;?#123;.

这个就是用户名加密用到的表。

用户名扩展:
007AB17C     8D85 20FFFFFF     lea eax,dword ptr ss:[ebp-E0]          ; 用户名
007AB182     BA 50B57A00       mov edx,dumped.007AB550                ; ASCII "                "
007AB187     E8 949EC5FF       call dumped.00405020
007AB18C     8B85 20FFFFFF     mov eax,dword ptr ss:[ebp-E0]          ; 扩展后的值

也就是添上20(空格):
0162DB40  63 79 74 6F 20 20 20 20  cyto
0162DB48  20 20 20 20 20 20 20 20

判断加解密:
007AB47E     837D FC 00        cmp dword ptr ss:[ebp-4],0               ; 判断加密或解密?
007AB482     75 1F             jnz short dumped.007AB4A3
007AB484     8B45 F4           mov eax,dword ptr ss:[ebp-C]
007AB487     8B40 04           mov eax,dword ptr ds:[eax+4]
007AB48A     8BD3              mov edx,ebx
007AB48C     4A                dec edx
007AB48D     C1E2 04           shl edx,4
007AB490     03C2              add eax,edx
007AB492     8BC8              mov ecx,eax
007AB494     8BD0              mov edx,eax
007AB496     8D85 24FFFFFF     lea eax,dword ptr ss:[ebp-DC]
007AB49C     E8 2BD6FDFF       call dumped.00788ACC                     ; 加密
007AB4A1     EB 1D             jmp short dumped.007AB4C0
007AB4A3     8B45 F4           mov eax,dword ptr ss:[ebp-C]
007AB4A6     8B40 04           mov eax,dword ptr ds:[eax+4]
007AB4A9     8BD3              mov edx,ebx
007AB4AB     4A                dec edx
007AB4AC     C1E2 04           shl edx,4
007AB4AF     03C2              add eax,edx
007AB4B1     8BC8              mov ecx,eax
007AB4B3     8BD0              mov edx,eax
007AB4B5     8D85 24FFFFFF     lea eax,dword ptr ss:[ebp-DC]
007AB4BB     E8 3CD6FDFF       call dumped.00788AFC                     ; 解密
007AB4C0     43                inc ebx
007AB4C1     4E                dec esi
007AB4C2   ^ 75 BA             jnz short dumped.007AB47E

两段几乎一摸一样的代码,跟DES一样?

RC5/RC6加密:
扩展的用户名与内置的字符串XOR:
007885EF     33F6              xor esi,esi
007885F1     8A1C30            mov bl,byte ptr ds:[eax+esi]             ; 顺取用户名
007885F4     321C32            xor bl,byte ptr ds:[edx+esi]             ; 内置字符串
007885F7     8B7D FC           mov edi,dword ptr ss:[ebp-4]
007885FA     881C37            mov byte ptr ds:[edi+esi],bl             ; 保存回原地址
007885FD     46                inc esi
007885FE     49                dec ecx
007885FF   ^ 75 F0             jnz short dumped.007885F1

内置字符串为:
0012F370  15 22 30 40 50 26 75 81  "0@P&u
0012F378  99 AA BB CC DD EE FF 00  櫔惶蓊.

得到值:
001C2220  76 5B 44 2F 70 06 55 A1  v[D/pU
001C2228  B9 8A 9B EC FD CE DF 20  箠涭?

然后分4组转移:
00788821     E8 7EA2C7FF       call dumped.00402AA4
00788836     E8 69A2C7FF       call dumped.00402AA4
00788849     E8 56A2C7FF       call dumped.00402AA4
0078885C     E8 43A2C7FF       call dumped.00402AA4

0012F308  76 5B 44 2F 70 06 55 A1  v[D/pU       // 第A组;第B组
0012F310  B9 8A 9B EC FD CE DF 20  箠涭?        // 第C组;第D组

加密:
00788861     8B47 20           mov eax,dword ptr ds:[edi+20]         ; 表的第1个字(4字节)
00788864     014424 08         add dword ptr ss:[esp+8],eax            
00788868     8B47 24           mov eax,dword ptr ds:[edi+24]         ; 表的第2个字(4字节)
0078886B     014424 10         add dword ptr ss:[esp+10],eax           
0078886F     BE 01000000       mov esi,1

00788874     8B4424 08         mov eax,dword ptr ss:[esp+8]
00788878     03C0              add eax,eax
0078887A     40                inc eax
0078887B     F76C24 08         imul dword ptr ss:[esp+8]
0078887F     BA 05000000       mov edx,5
00788884     E8 2BFDFFFF       call dumped.007885B4
00788889     8BD8              mov ebx,eax
0078888B     8B4424 10         mov eax,dword ptr ss:[esp+10]
0078888F     03C0              add eax,eax
00788891     40                inc eax
00788892     F76C24 10         imul dword ptr ss:[esp+10]
00788896     BA 05000000       mov edx,5
0078889B     E8 14FDFFFF       call dumped.007885B4
007888A0     8BE8              mov ebp,eax
007888A2     8B4424 04         mov eax,dword ptr ss:[esp+4]
007888A6     33C3              xor eax,ebx
007888A8     8BD5              mov edx,ebp
007888AA     E8 05FDFFFF       call dumped.007885B4
007888AF     8BD6              mov edx,esi
007888B1     03D2              add edx,edx
007888B3     034497 20         add eax,dword ptr ds:[edi+edx*4+20]   ; 表的第n个字(4字节)    
007888B7     894424 04         mov dword ptr ss:[esp+4],eax
007888BB     8B4424 0C         mov eax,dword ptr ss:[esp+C]
007888BF     33C5              xor eax,ebp
007888C1     8BD3              mov edx,ebx
007888C3     E8 ECFCFFFF       call dumped.007885B4
007888C8     8BD6              mov edx,esi
007888CA     03D2              add edx,edx
007888CC     034497 24         add eax,dword ptr ds:[edi+edx*4+24]   ; 表的第n+1个字(4字节)
007888D0     894424 0C         mov dword ptr ss:[esp+C],eax
007888D4     8B5C24 04         mov ebx,dword ptr ss:[esp+4]
007888D8     8B4424 08         mov eax,dword ptr ss:[esp+8]
007888DC     894424 04         mov dword ptr ss:[esp+4],eax
007888E0     8B4424 0C         mov eax,dword ptr ss:[esp+C]
007888E4     894424 08         mov dword ptr ss:[esp+8],eax
007888E8     8B4424 10         mov eax,dword ptr ss:[esp+10]
007888EC     894424 0C         mov dword ptr ss:[esp+C],eax
007888F0     895C24 10         mov dword ptr ss:[esp+10],ebx
007888F4     46                inc esi
007888F5     83FE 15           cmp esi,15
007888F8   ^ 0F85 76FFFFFF     jnz dumped.00788874

007888FE     8B87 C8000000     mov eax,dword ptr ds:[edi+C8]         ; 表的倒数第2个字(4字节) 
00788904     014424 04         add dword ptr ss:[esp+4],eax
00788908     8B87 CC000000     mov eax,dword ptr ds:[edi+CC]         ; 表的最后1个字(4字节)
0078890E     014424 0C         add dword ptr ss:[esp+C],eax

待加密的数据:
0012F308  76 5B 44 2F 70 06 55 A1  v[D/pU       // 第A组;第B组
0012F310  B9 8A 9B EC FD CE DF 20  箠涭?        // 第C组;第D组

加密表的数据就是RC初始化后的数据。

得到加密值:
0012F308  A6 ED E4 88 F8 96 59 10 E9 F3 97 C0 0A 1D E8 56  鋱鴸Y轶椑.鑆

RC5/RC6解密:
解密刚好与加密反过来,先进行核心的运算,取表的内容是从后往前取的,然后进行XOR,得到解密值。
修改007AB18C处扩展后的数据,使其为A6 ED E4 88 F8 96 59 10 E9 F3 97 C0 0A 1D E8 56(cyto的加密值),经过解密后:
074C6008  63 79 74 6F 20 20 20 20 20 20 20 20 20 20 20 20  cyto
呵呵,试验通过。

将用户名加密值转换成十进制:
007A5158     BE 01000000     mov esi,1
007A515D     8B45 F4         mov eax,dword ptr ss:[ebp-C]
007A5160     8A5C30 FF       mov bl,byte ptr ds:[eax+esi-1]      ; 015E3C18,内置字符串?
007A5164     8D55 EC         lea edx,dword ptr ss:[ebp-14]
007A5167     33C0            xor eax,eax
007A5169     8AC3            mov al,bl
007A516B     E8 F852C6FF     call dumped.0040A468                ; 转换成十进制
007A5170     8B55 EC         mov edx,dword ptr ss:[ebp-14]
007A5173     8D45 F0         lea eax,dword ptr ss:[ebp-10]
007A5176     E8 A5FEC5FF     call dumped.00405020
007A517B     46              inc esi
007A517C     4F              dec edi                             ; 20次
007A517D   ^ 75 DE           jnz short dumped.007A515D
007A517F     8B4D 08         mov ecx,dword ptr ss:[ebp+8]
007A5182     8B55 F0         mov edx,dword ptr ss:[ebp-10]       ; 值

字符串:
A6 ED E4 88 F8 96 59 10 E9 F3 97 C0 0A 1D E8 56

十进制形式:
015F40F8  31 36 36 32 33 37 32 32 38 31 33 36 32 34 38 31  1662372281362481
015F4108  35 30 38 39 31 36 32 33 33 32 34 33 31 35 31 31  5089162332431511
015F4118  39 32 31 30 32 39 32 33 32 38 36 33 32 33 32 33  9210292328632323
015F4128  32 33 32 00                                      232.

顺取十进制值查表:
007AB0BF     BB 01000000     mov ebx,1
007AB0C4     8D45 F4         lea eax,dword ptr ss:[ebp-C]
007AB0C7     8B55 FC         mov edx,dword ptr ss:[ebp-4]
007AB0CA     8A541A FF       mov dl,byte ptr ds:[edx+ebx-1]      ; 顺取十进制
007AB0CE     E8 6D9EC5FF     call dumped.00404F40
007AB0D3     8B45 F4         mov eax,dword ptr ss:[ebp-C]        ; 存放位置
007AB0D6     E8 2DF4C5FF     call dumped.0040A508                ; -30=eax
007AB0DB     E8 30FFFFFF     call dumped.007AB010                ; 查表
  007AB010     83F8 09           cmp eax,9
  007AB013     77 5E             ja short dumped.007AB073
  007AB015     FF2485 1CB07A00   jmp dword ptr ds:[eax*4+7AB01C]
  ...
007AB0E0     8BD0            mov edx,eax                         ; AL
007AB0E2     8D45 F8         lea eax,dword ptr ss:[ebp-8]
007AB0E5     E8 569EC5FF     call dumped.00404F40
007AB0EA     8B55 F8         mov edx,dword ptr ss:[ebp-8]
007AB0ED     8BC6            mov eax,esi
007AB0EF     E8 2C9FC5FF     call dumped.00405020                ; 连接
007AB0F4     43              inc ebx
007AB0F5     83FB 0D         cmp ebx,0D
007AB0F8   ^ 75 CA           jnz short dumped.007AB0C4

顺取十进制,-30,根据值查表,循环次数14次。
0-9对应:
0==A; 1==Z; 2==M; 3==L; 4==K; 5==G; 6==H; 7==B; 8==N; 9==W

得到查表值:ZHHMLBMMNZLH

5.2注册码比较:
0073D356     8B55 B4         mov edx,dword ptr ss:[ebp-4C]       ; 第2组注册码
0073D359     58              pop eax                             ; 第1组注册码地址
0073D35A     E8 C17CCCFF     call dumped.00405020                ; 连接
0073D35F     8B55 BC         mov edx,dword ptr ss:[ebp-44]       ; (ASCII "876543211234")
0073D362     58              pop eax                             ; ASCII "ZHHMLBMMNZLH"
0073D363     E8 F47DCCFF     call dumped.0040515C
0073D368     74 22           je short dumped.0073D38C
看来注册码要为:ZHHMLBMMNZLH。

6.写入注册表:
10用户数以上的确认码:33FA-E15A-5081-0123
用户名:cyto
注册码:ZHHMLBMM-NZLH

HKCU\Software\timenote\helpuoa\Reg  SUCCESS  "cyto"  
HKCU\Software\timenote\helpuoa\Code1  SUCCESS  "33FAE15A"  
HKCU\Software\timenote\helpuoa\Code2  SUCCESS  "50810123"  
HKCU\Software\timenote\helpuoa\Num  SUCCESS  0x0  

至此应该注册完成,不晓得有没有网上验证的。

7.流程概括:
初步要求:
程序先要求输入用户名+2组注册码,用户名长度大于等于4,第1组注册码长度=8,第2组注册码长度=4;符合要求后程序又要求输入确认码,4组,各4位;

确认码的要求:
对用户名的TEA加密:
用户名扩展,用户名+12345678,然后取8个字符即32bit;
key=ASCII "tn,oacrmpim 824 helpu!" 的前128bit。
32轮加密后得到1组4字节的值作为确认码计算值的比较值。

对确认码的计算:
确认码有4×4个字符,分成8个字符1组,RSA加密,E=3F17DC15;N=758F0581;
2组加密值再进行简单移位后,第1组的加密值=用户名的TEA加密值之一,第2组加密值的低2字节=选择注册的用户数。

得到注册码:
确认码验证通过后再计算用户名,RC5/6加密,加密值转换成十进制(1个字节1个字节的转换),顺取转换后的十进制,查表得到注册码。


2006.04.29