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嗲?Z?
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 ?玄<觖?划貊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 +??? ??缱m
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?邴塞.
这个就是用户名加密用到的表。
用户名扩展:
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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!