【文章标题】: SENSE4加密锁浅析之实战篇
【文章作者】: yaoyuan[CCG]
【下载地址】: 自己搜索下载
【保护方式】: SENSE4加密锁
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
我们将以某国产软件的模块验证程序Products.exe为例来分析具体加密过程及处理方法。
感谢fogot和Cnbragon提供脱壳及部分代码支持,没有他们的帮助,也没有下面这文章了。
这个程序ASPR加壳,为了调试时方便保存断点,脱掉外壳。
OD载入,运行Aspr2.XX_IATfixer_v2.2s.osc,在OEP处dump,用ImportREC处理IAT,手动补上GetProcAddress修复后再干
掉CRC的SDK,程序可以正常运行了,因为不是脱壳的文章,具体这过程不再详述。
载入脱壳后的程序,这个程序用的是静态方式链接,找不到模块名称,先用bp CreateFileA断下打开设备,当看到USB设
备路径时,已成功断到打开设备,返回到入锁参数压栈时,在代码上下可以找到所有关于设备的函数调用。在所有关于
设备的函数调用下断。
S4的软件锁,我们因为可以重写C51,所以只用关心要访问的目录,文件名及pin码。
CreateFileA断下打开设备,直到edx中出现设备路径:
004E5FBC 5C 5C 3F 5C 75 73 62 23 76 69 64 5F 30 34 37 31 \\?\usb#vid_0471
004E5FCC 26 70 69 64 5F 34 38 35 64 23 35 26 63 32 61 39 &pid_485d#5&c2a9
004E5FDC 39 36 34 26 30 26 32 23 7B 31 37 31 36 33 38 66 964&0&2#{171638f
004E5FEC 37 2D 31 65 61 64 2D 34 38 37 33 2D 62 61 39 38 7-1ead-4873-ba98
004E5FFC 2D 63 39 36 36 61 62 63 66 30 31 34 32 7D -c966abcf0142}
这个程序没有用到目录操作,所有程序均在根目录\。
这里是我们找到的S4VerifyPin
004935E0 <> 55 push ebp
004935E1 8BEC mov ebp,esp
004935E3 51 push ecx
004935E4 53 push ebx
004935E5 56 push esi
004935E6 57 push edi
004935E7 8B7D 0C mov edi,dword ptr ss:[ebp+C]
004935EA 8B45 08 mov eax,dword ptr ss:[ebp+8]
004935ED 8B75 14 mov esi,dword ptr ss:[ebp+14]
004935F0 8BD8 mov ebx,eax
004935F2 C645 FF 00 mov byte ptr ss:[ebp-1],0
004935F6 85FF test edi,edi
004935F8 75 0A jnz short Products.00493604
004935FA B8 02000000 mov eax,2
004935FF E9 D8000000 jmp Products.004936DC
00493604 50 push eax
00493605 E8 2EEFFFFF call Products.00492538
0049360A 59 pop ecx
0049360B 85C0 test eax,eax
0049360D 75 0A jnz short Products.00493619
0049360F B8 02000000 mov eax,2
00493614 E9 C3000000 jmp Products.004936DC
00493619 81FE A1000000 cmp esi,0A1
0049361F 75 10 jnz short Products.00493631
00493621 837D 10 08 cmp dword ptr ss:[ebp+10],8
00493625 74 2C je short Products.00493653
00493627 B8 02000000 mov eax,2
0049362C E9 AB000000 jmp Products.004936DC
00493631 81FE A2000000 cmp esi,0A2
00493637 75 10 jnz short Products.00493649
00493639 837D 10 18 cmp dword ptr ss:[ebp+10],18
0049363D 74 14 je short Products.00493653
0049363F B8 02000000 mov eax,2
00493644 E9 93000000 jmp Products.004936DC
00493649 B8 02000000 mov eax,2
0049364E E9 89000000 jmp Products.004936DC
00493653 8D55 FF lea edx,dword ptr ss:[ebp-1]
00493656 52 push edx
00493657 53 push ebx
00493658 E8 C3CCFFFF call Products.00490320
0049365D 83C4 08 add esp,8
00493660 85C0 test eax,eax
00493662 75 78 jnz short Products.004936DC
00493664 807D FF 02 cmp byte ptr ss:[ebp-1],2
00493668 75 07 jnz short Products.00493671
0049366A B8 20000000 mov eax,20
0049366F EB 6B jmp short Products.004936DC
00493671 807D FF 00 cmp byte ptr ss:[ebp-1],0
00493675 75 0D jnz short Products.00493684
00493677 56 push esi
00493678 57 push edi
00493679 53 push ebx
0049367A E8 55D5FFFF call Products.00490BD4
0049367F 83C4 0C add esp,0C
00493682 EB 58 jmp short Products.004936DC
00493684 807D FF 01 cmp byte ptr ss:[ebp-1],1
00493688 75 52 jnz short Products.004936DC
0049368A 6A 00 push 0
0049368C 6A 00 push 0
0049368E 53 push ebx
0049368F E8 B0D4FFFF call Products.00490B44
00493694 83C4 0C add esp,0C
00493697 85C0 test eax,eax
00493699 75 41 jnz short Products.004936DC
0049369B 56 push esi
0049369C 57 push edi
0049369D 53 push ebx
0049369E E8 31D5FFFF call Products.00490BD4
004936A3 83C4 0C add esp,0C
004936A6 85C0 test eax,eax
004936A8 75 32 jnz short Products.004936DC
004936AA 6A 01 push 1
004936AC 68 BAC34D00 push Products.004DC3BA
004936B1 53 push ebx
004936B2 E8 8DD4FFFF call Products.00490B44
004936B7 83C4 0C add esp,0C
004936BA 85C0 test eax,eax
004936BC 75 1E jnz short Products.004936DC
004936BE 81FE A2000000 cmp esi,0A2
004936C4 75 16 jnz short Products.004936DC
004936C6 56 push esi
004936C7 57 push edi
004936C8 53 push ebx
004936C9 E8 06D5FFFF call Products.00490BD4
004936CE 83C4 0C add esp,0C
004936D1 85C0 test eax,eax
004936D3 74 07 je short Products.004936DC
004936D5 EB 05 jmp short Products.004936DC
004936D7 B8 02000000 mov eax,2
004936DC 5F pop edi
004936DD 5E pop esi
004936DE 5B pop ebx
004936DF 59 pop ecx
004936E0 5D pop ebp
004936E1 C2 1000 retn 10
这里是S4ExecuteEx
00494314 <> 55 push ebp
00494315 8BEC mov ebp,esp
00494317 83C4 F8 add esp,-8
0049431A 33D2 xor edx,edx
0049431C 53 push ebx
0049431D 56 push esi
0049431E 57 push edi
0049431F 8B75 10 mov esi,dword ptr ss:[ebp+10]
00494322 8B45 08 mov eax,dword ptr ss:[ebp+8]
00494325 8B7D 0C mov edi,dword ptr ss:[ebp+C]
00494328 8BD8 mov ebx,eax
0049432A C645 FD 00 mov byte ptr ss:[ebp-3],0
0049432E 8955 F8 mov dword ptr ss:[ebp-8],edx
00494331 83FE 01 cmp esi,1
00494334 74 0E je short Products.00494344
00494336 85F6 test esi,esi
00494338 74 0A je short Products.00494344
0049433A B8 02000000 mov eax,2
0049433F E9 8F010000 jmp Products.004944D3
00494344 85FF test edi,edi
00494346 75 0A jnz short Products.00494352
00494348 B8 02000000 mov eax,2
0049434D E9 81010000 jmp Products.004944D3
00494352 50 push eax
00494353 E8 E0E1FFFF call Products.00492538
00494358 59 pop ecx
00494359 85C0 test eax,eax
0049435B 75 0A jnz short Products.00494367
0049435D B8 02000000 mov eax,2
00494362 E9 6C010000 jmp Products.004944D3
00494367 817D 18 FA00000>cmp dword ptr ss:[ebp+18],0FA
0049436E 77 0E ja short Products.0049437E
00494370 83FE 01 cmp esi,1
00494373 75 13 jnz short Products.00494388
00494375 817D 18 F800000>cmp dword ptr ss:[ebp+18],0F8
0049437C 76 0A jbe short Products.00494388
0049437E B8 02000000 mov eax,2
00494383 E9 4B010000 jmp Products.004944D3
00494388 57 push edi
00494389 E8 FEA6FFFF call <jmp.&msvcrt.strlen>
0049438E 59 pop ecx
0049438F 83F8 04 cmp eax,4
00494392 75 0F jnz short Products.004943A3
00494394 6A 5C push 5C
00494396 57 push edi
00494397 E8 E0A6FFFF call <jmp.&msvcrt.strchr>
0049439C 83C4 08 add esp,8
0049439F 85C0 test eax,eax
004943A1 74 0A je short Products.004943AD
004943A3 B8 02000000 mov eax,2
004943A8 E9 26010000 jmp Products.004944D3
004943AD 8D55 FD lea edx,dword ptr ss:[ebp-3]
004943B0 52 push edx
004943B1 53 push ebx
004943B2 E8 69BFFFFF call Products.00490320
004943B7 83C4 08 add esp,8
004943BA 85C0 test eax,eax
004943BC 0F85 11010000 jnz Products.004944D3
004943C2 807D FD 02 cmp byte ptr ss:[ebp-3],2
004943C6 75 0A jnz short Products.004943D2
004943C8 B8 20000000 mov eax,20
004943CD E9 01010000 jmp Products.004944D3
004943D2 807D FD 01 cmp byte ptr ss:[ebp-3],1
004943D6 75 0F jnz short Products.004943E7
004943D8 83FE 01 cmp esi,1
004943DB 75 0A jnz short Products.004943E7
004943DD B8 20000000 mov eax,20
004943E2 E9 EC000000 jmp Products.004944D3
004943E7 807D FD 01 cmp byte ptr ss:[ebp-3],1
004943EB 75 2D jnz short Products.0049441A
004943ED 6A 00 push 0
004943EF 6A 00 push 0
004943F1 53 push ebx
004943F2 E8 4DC7FFFF call Products.00490B44
004943F7 83C4 0C add esp,0C
004943FA 85C0 test eax,eax
004943FC 0F85 D1000000 jnz Products.004944D3
00494402 6A 01 push 1
00494404 68 25C94D00 push Products.004DC925
00494409 53 push ebx
0049440A E8 35C7FFFF call Products.00490B44
0049440F 83C4 0C add esp,0C
00494412 85C0 test eax,eax
00494414 0F85 B9000000 jnz Products.004944D3
0049441A 6A 04 push 4
0049441C 57 push edi
0049441D 8D55 FE lea edx,dword ptr ss:[ebp-2]
00494420 52 push edx
00494421 E8 5EE0FFFF call Products.00492484
00494426 83C4 0C add esp,0C
00494429 40 inc eax
0049442A 75 0A jnz short Products.00494436
0049442C B8 02000000 mov eax,2
00494431 E9 9D000000 jmp Products.004944D3
00494436 8D55 FE lea edx,dword ptr ss:[ebp-2]
00494439 52 push edx
0049443A 53 push ebx
0049443B E8 4CD2FFFF call Products.0049168C
00494440 83C4 08 add esp,8
00494443 85C0 test eax,eax
00494445 0F85 88000000 jnz Products.004944D3
0049444B 85F6 test esi,esi
0049444D 75 35 jnz short Products.00494484
0049444F 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
00494452 51 push ecx
00494453 8B45 20 mov eax,dword ptr ss:[ebp+20]
00494456 50 push eax
00494457 8B55 1C mov edx,dword ptr ss:[ebp+1C]
0049445A 52 push edx
0049445B 8D55 FE lea edx,dword ptr ss:[ebp-2]
0049445E 8B4D 18 mov ecx,dword ptr ss:[ebp+18]
00494461 51 push ecx
00494462 8B45 14 mov eax,dword ptr ss:[ebp+14]
00494465 50 push eax
00494466 52 push edx
00494467 53 push ebx
00494468 E8 93D3FFFF call Products.00491800
0049446D 83C4 1C add esp,1C
00494470 85C0 test eax,eax
00494472 75 5F jnz short Products.004944D3
00494474 837D 24 00 cmp dword ptr ss:[ebp+24],0
00494478 74 59 je short Products.004944D3
0049447A 8B4D 24 mov ecx,dword ptr ss:[ebp+24]
0049447D 8B55 F8 mov edx,dword ptr ss:[ebp-8]
00494480 8911 mov dword ptr ds:[ecx],edx
00494482 EB 4F jmp short Products.004944D3
00494484 83FE 01 cmp esi,1
00494487 75 4A jnz short Products.004944D3
00494489 817B 04 0003020>cmp dword ptr ds:[ebx+4],20300
00494490 73 07 jnb short Products.00494499
00494492 B8 02000000 mov eax,2
00494497 EB 3A jmp short Products.004944D3
00494499 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
0049449C 51 push ecx
0049449D 8B45 20 mov eax,dword ptr ss:[ebp+20]
004944A0 50 push eax
004944A1 8B55 1C mov edx,dword ptr ss:[ebp+1C]
004944A4 52 push edx
004944A5 8D55 FE lea edx,dword ptr ss:[ebp-2]
004944A8 8B4D 18 mov ecx,dword ptr ss:[ebp+18]
004944AB 51 push ecx
004944AC 8B45 14 mov eax,dword ptr ss:[ebp+14]
004944AF 50 push eax
004944B0 52 push edx
004944B1 53 push ebx
004944B2 E8 21D2FFFF call Products.004916D8
004944B7 83C4 1C add esp,1C
004944BA 85C0 test eax,eax
004944BC 75 15 jnz short Products.004944D3
004944BE 837D 24 00 cmp dword ptr ss:[ebp+24],0
004944C2 74 0F je short Products.004944D3
004944C4 8B4D 24 mov ecx,dword ptr ss:[ebp+24]
004944C7 8B55 F8 mov edx,dword ptr ss:[ebp-8]
004944CA 8911 mov dword ptr ds:[ecx],edx
004944CC EB 05 jmp short Products.004944D3
004944CE B8 02000000 mov eax,2
004944D3 5F pop edi
004944D4 5E pop esi
004944D5 5B pop ebx
004944D6 59 pop ecx
004944D7 59 pop ecx
004944D8 5D pop ebp
004944D9 C2 2000 retn 20
校验pin码后,锁内程序开始被执行,我们分析锁内最难一个程序0801,执行到S4ExecuteEx时,esi指向0801,
ESP情况如下:
0012F88C 83 E2 4A 00 50 BA E9 00 24 06 E8 00 00 00 00 00 ?J.P洪.$?....
0012F89C 40 D5 16 00 0E 00 00 00 DC 04 E8 00 F4 00 00 00 @?....???..
0012F8AC F0 F8 12 00 BC DA 4A 00 2E F9 12 00 2C BA E9 00 瘌.稼J..?.,洪.
可以看到入锁数据为0e长,首址16d540,出锁数据长度0f4,首址0e804dc
看看入锁数据是什么:
0016D540 3D E3 6F 4E A6 FD D5 76 7E 7F 76 76 76 96 =泔N?睁~vvv?
执行完毕后出锁数据如下:
00E804DC F3 AA A2 A5 8D 6F E5 AC 5A BA BB B2 B2 B2 BB BB 螵??瀣Z夯膊不
00E804EC BB BB F5 F4 F4 F4 F4 F4 F4 F4 F5 F5 F4 F4 F4 0B 换豸趑趑趑貂趑?
00E804FC F4 F4 F4 0B F4 F4 F4 F4 F4 0A 09 09 08 08 08 F7 趑?趑趑?..
00E8050C 08 08 08 F7 08 08 08 08 08 08 0E 0E 0F 0F 0F F0 ?
00E8051C 0F 0F 0F F0 0F 0F 0F 0F 0F 0C 00 00 01 01 01 FE ?...
00E8052C 01 01 01 FE 01 01 01 01 01 08 07 07 06 06 06 F9 ?
00E8053C 06 06 06 F9 06 06 06 06 06 0A 19 19 18 18 18 E7 ?.
00E8054C 18 18 18 E7 18 18 18 18 18 08 1F 1F 1E 1E 1E E1 ?
00E8055C 1E 1E 1E E1 1E 1E 1E 1E 1E 0A 3A 3A 3B 3B 3B C4 ?.::;;;
00E8056C 3B 3B 3B C4 3B 3B 3B 3B 3B 16 27 27 26 26 26 D9 ;;;?;;;;''&&&
00E8057C 26 26 26 D9 26 26 26 26 26 08 3B 3B 3A 3A 3A C5 &&&?&&&&;;:::
00E8058C 3A 3A 3A C5 3A 3A 3A 3A 3A 0A 3C 3C 3D 3D 3D C2 :::?::::.<<===
00E8059C 3D 3D 3D C2 3D 3D 3D 3D 3D 0E 4D 4D 4C 4C 4C B3 ===?====MMLLL
00E805AC 4C 4C 4C B3 4C 4C 4C 4C 4C 0C 48 48 49 49 49 B6 LLL程LLLL.HHIII
00E805BC 49 49 49 B6 49 49 49 49 49 08 00 00 00 00 00 00 III渡IIII......
00E805CC 00 00 00 00 ....
数据好象完全没有什么关系?从0e个字节扩展到了0f4个字节,猜测出锁数据一定有加密,在数据下内存断点,
寻找解码过程,确实程序有解码:
0049DE7C 53 push ebx
0049DE7D 56 push esi
0049DE7E 57 push edi
0049DE7F 83C4 F0 add esp,-10
0049DE82 891424 mov dword ptr ss:[esp],edx
0049DE85 8BF8 mov edi,eax
0049DE87 BB 5C024E00 mov ebx,Products.004E025C
0049DE8C 8D7424 04 lea esi,dword ptr ss:[esp+4]
0049DE90 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0049DE94 8BD6 mov edx,esi
0049DE96 8B0424 mov eax,dword ptr ss:[esp]
0049DE99 E8 92FEFFFF call Products.0049DD30
0049DE9E 8D5424 08 lea edx,dword ptr ss:[esp+8]
0049DEA2 8BC6 mov eax,esi
0049DEA4 E8 D7FEFFFF call Products.0049DD80
0049DEA9 897C24 0C mov dword ptr ss:[esp+C],edi
0049DEAD BA 08000000 mov edx,8
0049DEB2 8B4424 08 mov eax,dword ptr ss:[esp+8]
0049DEB6 C1E8 04 shr eax,4
0049DEB9 8B4C24 08 mov ecx,dword ptr ss:[esp+8]
0049DEBD C1E1 1C shl ecx,1C
0049DEC0 0BC1 or eax,ecx
0049DEC2 8B4C24 0C mov ecx,dword ptr ss:[esp+C]
0049DEC6 3301 xor eax,dword ptr ds:[ecx]
0049DEC8 834424 0C 04 add dword ptr ss:[esp+C],4
0049DECD 8BC8 mov ecx,eax
0049DECF 83E1 3F and ecx,3F
0049DED2 8B8C8B 00060000 mov ecx,dword ptr ds:[ebx+ecx*4+600]
0049DED9 310E xor dword ptr ds:[esi],ecx ; 00200002
0049DEDB 8BC8 mov ecx,eax
0049DEDD C1E9 08 shr ecx,8
0049DEE0 83E1 3F and ecx,3F
0049DEE3 8B8C8B 00040000 mov ecx,dword ptr ds:[ebx+ecx*4+400]
0049DEEA 310E xor dword ptr ds:[esi],ecx ; 02000000
0049DEEC 8BC8 mov ecx,eax
0049DEEE C1E9 10 shr ecx,10
0049DEF1 83E1 3F and ecx,3F
0049DEF4 8B8C8B 00020000 mov ecx,dword ptr ds:[ebx+ecx*4+200]
0049DEFB 310E xor dword ptr ds:[esi],ecx ; 08020000
0049DEFD C1E8 18 shr eax,18
0049DF00 83E0 3F and eax,3F
0049DF03 8B0483 mov eax,dword ptr ds:[ebx+eax*4]
0049DF06 3106 xor dword ptr ds:[esi],eax ; 08020000
0049DF08 8B4424 0C mov eax,dword ptr ss:[esp+C]
0049DF0C 8B00 mov eax,dword ptr ds:[eax]
0049DF0E 334424 08 xor eax,dword ptr ss:[esp+8]
0049DF12 834424 0C 04 add dword ptr ss:[esp+C],4
0049DF17 8BC8 mov ecx,eax
0049DF19 83E1 3F and ecx,3F
0049DF1C 8B8C8B 00070000 mov ecx,dword ptr ds:[ebx+ecx*4+700]
0049DF23 310E xor dword ptr ds:[esi],ecx ; 10000000
0049DF25 8BC8 mov ecx,eax
0049DF27 C1E9 08 shr ecx,8
0049DF2A 83E1 3F and ecx,3F
0049DF2D 8B8C8B 00050000 mov ecx,dword ptr ds:[ebx+ecx*4+500]
0049DF34 310E xor dword ptr ds:[esi],ecx ; 00400000
0049DF36 8BC8 mov ecx,eax
0049DF38 C1E9 10 shr ecx,10
0049DF3B 83E1 3F and ecx,3F
0049DF3E 8B8C8B 00030000 mov ecx,dword ptr ds:[ebx+ecx*4+300] ; 00000001
0049DF45 310E xor dword ptr ds:[esi],ecx
0049DF47 C1E8 18 shr eax,18
0049DF4A 83E0 3F and eax,3F
0049DF4D 8B8483 00010000 mov eax,dword ptr ds:[ebx+eax*4+100]
0049DF54 3106 xor dword ptr ds:[esi],eax ; 00000001
0049DF56 8B06 mov eax,dword ptr ds:[esi]
0049DF58 C1E8 04 shr eax,4
0049DF5B 8B0E mov ecx,dword ptr ds:[esi]
0049DF5D C1E1 1C shl ecx,1C
0049DF60 0BC1 or eax,ecx
0049DF62 8B4C24 0C mov ecx,dword ptr ss:[esp+C]
0049DF66 3301 xor eax,dword ptr ds:[ecx]
0049DF68 834424 0C 04 add dword ptr ss:[esp+C],4
0049DF6D 8BC8 mov ecx,eax
0049DF6F 83E1 3F and ecx,3F
0049DF72 8B8C8B 00060000 mov ecx,dword ptr ds:[ebx+ecx*4+600]
0049DF79 314C24 08 xor dword ptr ss:[esp+8],ecx ; 00200800
0049DF7D 8BC8 mov ecx,eax
0049DF7F C1E9 08 shr ecx,8
0049DF82 83E1 3F and ecx,3F
0049DF85 8B8C8B 00040000 mov ecx,dword ptr ds:[ebx+ecx*4+400]
0049DF8C 314C24 08 xor dword ptr ss:[esp+8],ecx ; 42080000
0049DF90 8BC8 mov ecx,eax
0049DF92 C1E9 10 shr ecx,10
0049DF95 83E1 3F and ecx,3F
0049DF98 8B8C8B 00020000 mov ecx,dword ptr ds:[ebx+ecx*4+200]
0049DF9F 314C24 08 xor dword ptr ss:[esp+8],ecx
0049DFA3 C1E8 18 shr eax,18
0049DFA6 83E0 3F and eax,3F
0049DFA9 8B0483 mov eax,dword ptr ds:[ebx+eax*4]
0049DFAC 314424 08 xor dword ptr ss:[esp+8],eax
0049DFB0 8B4424 0C mov eax,dword ptr ss:[esp+C]
0049DFB4 8B00 mov eax,dword ptr ds:[eax]
0049DFB6 3306 xor eax,dword ptr ds:[esi]
0049DFB8 834424 0C 04 add dword ptr ss:[esp+C],4
0049DFBD 8BC8 mov ecx,eax
0049DFBF 83E1 3F and ecx,3F
0049DFC2 8B8C8B 00070000 mov ecx,dword ptr ds:[ebx+ecx*4+700]
0049DFC9 314C24 08 xor dword ptr ss:[esp+8],ecx
0049DFCD 8BC8 mov ecx,eax
0049DFCF C1E9 08 shr ecx,8
0049DFD2 83E1 3F and ecx,3F
0049DFD5 8B8C8B 00050000 mov ecx,dword ptr ds:[ebx+ecx*4+500]
0049DFDC 314C24 08 xor dword ptr ss:[esp+8],ecx
0049DFE0 8BC8 mov ecx,eax
0049DFE2 C1E9 10 shr ecx,10
0049DFE5 83E1 3F and ecx,3F
0049DFE8 8B8C8B 00030000 mov ecx,dword ptr ds:[ebx+ecx*4+300]
0049DFEF 314C24 08 xor dword ptr ss:[esp+8],ecx
0049DFF3 C1E8 18 shr eax,18
0049DFF6 83E0 3F and eax,3F
0049DFF9 8B8483 00010000 mov eax,dword ptr ds:[ebx+eax*4+100]
0049E000 314424 08 xor dword ptr ss:[esp+8],eax
0049E004 4A dec edx
0049E005 ^ 0F85 A7FEFFFF jnz Products.0049DEB2
0049E00B 8D5424 08 lea edx,dword ptr ss:[esp+8]
0049E00F 8BC6 mov eax,esi
0049E011 E8 E6FDFFFF call Products.0049DDFC
0049E016 8B0C24 mov ecx,dword ptr ss:[esp]
0049E019 8B5424 08 mov edx,dword ptr ss:[esp+8]
0049E01D 8B06 mov eax,dword ptr ds:[esi]
0049E01F E8 38FDFFFF call Products.0049DD5C
0049E024 83C4 10 add esp,10
0049E027 5F pop edi
0049E028 5E pop esi
0049E029 5B pop ebx
0049E02A C3 retn
看着眼熟吧,这不就是大名鼎鼎的DES,源程序是delphi的,整理成源代码如下:
procedure DES_Func(Data: PIntArray; Key: PInteger); register;
var
L,R,X,Y,I: LongWord;
begin
L := SwapInteger(Data[0]);
R := SwapInteger(Data[1]);
X := (L shr 4 xor R) and $0F0F0F0F; R := R xor X; L := L xor X shl 4;
X := (L shr 16 xor R) and $0000FFFF; R := R xor X; L := L xor X shl 16;
X := (R shr 2 xor L) and $33333333; L := L xor X; R := R xor X shl 2;
X := (R shr 8 xor L) and $00FF00FF; L := L xor X; R := R xor X shl 8;
R := R shl 1 or R shr 31;
X := (L xor R) and $AAAAAAAA;
R := R xor X;
L := L xor X;
L := L shl 1 or L shr 31;
for I := 0 to 7 do
begin
X := (R shl 28 or R shr 4) xor Key^; Inc(Key);
Y := R xor Key^; Inc(Key);
L := L xor (DES_Data[0, X and $3F] or DES_Data[1, X shr 8 and $3F] or
DES_Data[2, X shr 16 and $3F] or DES_Data[3, X shr 24 and $3F] or
DES_Data[4, Y and $3F] or DES_Data[5, Y shr 8 and $3F] or
DES_Data[6, Y shr 16 and $3F] or DES_Data[7, Y shr 24 and $3F]);
X := (L shl 28 or L shr 4) xor Key^; Inc(Key);
Y := L xor Key^; Inc(Key);
R := R xor (DES_Data[0, X and $3F] or DES_Data[1, X shr 8 and $3F] or
DES_Data[2, X shr 16 and $3F] or DES_Data[3, X shr 24 and $3F] or
DES_Data[4, Y and $3F] or DES_Data[5, Y shr 8 and $3F] or
DES_Data[6, Y shr 16 and $3F] or DES_Data[7, Y shr 24 and $3F]);
end;
R := R shl 31 or R shr 1;
X := (L xor R) and $AAAAAAAA;
R := R xor X;
L := L xor X;
L := L shl 31 or L shr 1;
X := (L shr 8 xor R) and $00FF00FF; R := R xor X; L := L xor X shl 8;
X := (L shr 2 xor R) and $33333333; R := R xor X; L := L xor X shl 2;
X := (R shr 16 xor L) and $0000FFFF; L := L xor X; R := R xor X shl 16;
X := (R shr 4 xor L) and $0F0F0F0F; L := L xor X; R := R xor X shl 4;
Data[0] := SwapInteger(R);
Data[1] := SwapInteger(L);
end;
前8个字节DES解码,后面的字节逐字节xor完成解码:
0016D540 01 06 00 01 1B 24 00 35 3F 3E 37 D7 D7 37 09 00 .$.5?>7鬃7..
0016D550 00 00 4E 01 00 00 00 00 00 00 01 00 01 00 00 FF ..N.........?
0016D560 FF 00 00 FF FF 00 00 00 00 FE 03 00 01 00 00 FF ?.?....?...?
0016D570 FF 00 00 FF FF 00 00 00 00 00 06 00 01 00 00 FF ?.?........?
0016D580 FF 00 00 FF FF 00 00 00 00 03 0C 00 01 00 00 FF ?.?........?
0016D590 FF 00 00 FF FF 00 00 00 00 09 0F 00 01 00 00 FF ?.?........?
0016D5A0 FF 00 00 FF FF 00 00 00 00 0C 13 00 01 00 00 FF ?.?........?
0016D5B0 FF 00 00 FF FF 00 00 00 00 10 17 00 01 00 00 FF ?.?.......?
0016D5C0 FF 00 00 FF FF 00 00 00 00 14 30 00 01 00 00 FF ?.?....0...?
0016D5D0 FF 00 00 FF FF 00 00 00 00 2D 31 00 01 00 00 FF ?.?....-1...?
0016D5E0 FF 00 00 FF FF 00 00 00 00 2E 33 00 01 00 00 FF ?.?.....3...?
0016D5F0 FF 00 00 FF FF 00 00 00 00 30 36 00 01 00 00 FF ?.?....06...?
0016D600 FF 00 00 FF FF 00 00 00 00 33 43 00 01 00 00 FF ?.?....3C...?
0016D610 FF 00 00 FF FF 00 00 00 00 40 44 00 01 00 00 FF ?.?....@D...?
0016D620 FF 00 00 FF FF 00 00 00 00 41 00 00 00 00 00 00 ?.?....A......
0016D630 00 00 00 00 ....
现在看上去出锁数据有点意思了,正好对应着注册了的模块代码比如1-01、1-03,可是出锁数据
和入锁数据有什么关系呢?
感觉入锁数据也是经过了加密的,从头再来跟踪入锁数据:原来是这样的:
0049E6AC 53 push ebx
0049E6AD 56 push esi
0049E6AE 83C4 F4 add esp,-0C
0049E6B1 8BF0 mov esi,eax
0049E6B3 8D4424 0A lea eax,dword ptr ss:[esp+A]
0049E6B7 50 push eax
0049E6B8 8D4C24 0D lea ecx,dword ptr ss:[esp+D]
0049E6BC 8D5424 0C lea edx,dword ptr ss:[esp+C]
0049E6C0 8BC6 mov eax,esi
0049E6C2 E8 05010000 call Products.0049E7CC
0049E6C7 8B46 04 mov eax,dword ptr ds:[esi+4]
0049E6CA 894424 04 mov dword ptr ss:[esp+4],eax
0049E6CE 8B5C24 04 mov ebx,dword ptr ss:[esp+4]
0049E6D2 C603 01 mov byte ptr ds:[ebx],1
0049E6D5 8BC6 mov eax,esi
0049E6D7 8B10 mov edx,dword ptr ds:[eax]
0049E6D9 FF12 call dword ptr ds:[edx]
0049E6DB 2C 08 sub al,8
0049E6DD 8843 01 mov byte ptr ds:[ebx+1],al
0049E6E0 C643 02 00 mov byte ptr ds:[ebx+2],0
0049E6E4 8A4424 08 mov al,byte ptr ss:[esp+8]
0049E6E8 8843 03 mov byte ptr ds:[ebx+3],al
0049E6EB 8A4424 09 mov al,byte ptr ss:[esp+9]
0049E6EF 8843 04 mov byte ptr ds:[ebx+4],al
0049E6F2 8A4424 0A mov al,byte ptr ss:[esp+A]
0049E6F6 8843 05 mov byte ptr ds:[ebx+5],al
0049E6F9 C643 06 00 mov byte ptr ds:[ebx+6],0
0049E6FD C643 07 00 mov byte ptr ds:[ebx+7],0
0049E701 8BC6 mov eax,esi
0049E703 8B10 mov edx,dword ptr ds:[eax]
0049E705 FF12 call dword ptr ds:[edx]
0049E707 8BC8 mov ecx,eax
0049E709 8B56 04 mov edx,dword ptr ds:[esi+4]
0049E70C 8BC6 mov eax,esi
0049E70E E8 69FEFFFF call Products.0049E57C
0049E713 8B5424 04 mov edx,dword ptr ss:[esp+4]
0049E717 8842 07 mov byte ptr ds:[edx+7],al
0049E71A 8B4424 04 mov eax,dword ptr ss:[esp+4]
0049E71E 83C0 08 add eax,8
0049E721 890424 mov dword ptr ss:[esp],eax
0049E724 8B4424 04 mov eax,dword ptr ss:[esp+4]
0049E728 8A50 03 mov dl,byte ptr ds:[eax+3]
0049E72B 52 push edx
0049E72C 8A50 04 mov dl,byte ptr ds:[eax+4]
0049E72F 52 push edx
0049E730 33C9 xor ecx,ecx
0049E732 8A48 01 mov cl,byte ptr ds:[eax+1]
0049E735 8B5424 08 mov edx,dword ptr ss:[esp+8]
0049E739 8BC6 mov eax,esi
0049E73B E8 20000000 call Products.0049E760
这里完成入锁数据初始化:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D
01 00 01 00 00 24 01 09 E0
以上为固定字节,01为入锁长度0e-8=6,QueryPerformanceCounter返回值低32位设为Count
(Count*8088405+1)*FF 结果高位在DX 为04位
((Count*8088405+1)*8088405+1)*FF 结果高位在DX 为05位
这里原来在取随机数,累S我了。
07位:各位累加和。
0B 0C在不同次数读狗时数据不同:
分别为:第一次读狗:00 00
第二次读狗:00 E0
第三次读狗:C0 01
.....
这是第三次读狗原始入锁数据:
0016D540 01 06 00 01 90 AD 00 14 24 01 09 C0 01 E0 .?.$.???
加密入锁数据:(前8个字节DES加密,后面逐字节xor)
0016D540 77 6F 6D 4E 6D 6A 31 73 B4 B5 BC 7C 7D 9D womNmj1s吹键}??
出锁数据:
0016D540 BB 6E 9F 91 0E FB C8 B9 90 70 C8 C8 CA CA CA 35 活???p热适?
0016D550 CA CA CA 35 CA CA CA CA CA 7C B3 B3 B1 B1 B1 4E 适?适适庶吵北蔽
0016D560 B1 B1 B1 4E B1 B1 B1 B1 B1 7C A4 A4 A6 A6 A6 59 北蔽北北秉いΖ?
0016D570 A6 A6 A6 59 A6 A6 A6 A6 A6 70 AB AB A9 A9 A9 56 Ζ?ΖΖ??┅┲
0016D580 A9 A9 A9 56 A9 A9 A9 A9 A9 70 69 68 6A 6A 6A 95 ┅┲┅┅?ihjjj
0016D590 6A 6A 6A 95 6A 6A 6A 6A 6A 72 68 69 6B 6B 6B 94 jjj?jjjjrhikkk
0016D5A0 6B 6B 6B 94 6B 6B 6B 6B 6B 72 69 68 6A 6A 6A 95 kkk?kkkkrihjjj
0016D5B0 6A 6A 6A 95 6A 6A 6A 6A 6A 70 6C 6D 6F 6F 6F 90 jjj?jjjjplmooo
0016D5C0 6F 6F 6F 90 6F 6F 6F 6F 6F 74 69 68 6A 6A 6A 95 ooo?ooootihjjj
0016D5D0 6A 6A 6A 95 6A 6A 6A 6A 6A 76 2D 2C 2E 2E 2E D1 jjj?jjjjv-,...
0016D5E0 2E 2E 2E D1 2E 2E 2E 2E 2E 74 6A 68 6A 6A 6A 95 ...?....tjhjjj
0016D5F0 6A 6A 6A 95 6A 6A 6A 6A 6A 74 42 40 42 42 42 BD jjj?jjjjtB@BBB
0016D600 42 42 42 BD 42 42 42 42 42 74 43 41 43 43 43 BC BBB铰BBBBtCACCC
0016D610 43 43 43 BC 43 43 43 43 43 74 4C 4E 4C 4C 4C B3 CCC济CCCCtLNLLL
0016D620 4C 4C 4C B3 4C 4C 4C 4C 4C 74 00 00 00 00 00 00 LLL程LLLLt......
0016D630 00 00 00 00 ....
解码出锁数据:(前8个字节DES解密,从0e字节开始后面逐字节xor)
0016D540 01 E2 00 01 90 AD 00 14 24 01 09 A0 02 E0 00 FF ??.$.???
0016D550 FF 00 00 FF FF 00 00 00 00 B6 CF 00 02 00 00 FF ?.?....断...?
0016D560 FF 00 00 FF FF 00 00 00 00 CD D8 00 02 00 00 FF ?.?....拓...?
0016D570 FF 00 00 FF FF 00 00 00 00 D6 DB 00 02 00 00 FF ?.?....舟...?
0016D580 FF 00 00 FF FF 00 00 00 00 D9 19 01 02 00 00 FF ?.?....?..?
0016D590 FF 00 00 FF FF 00 00 00 00 18 1A 01 02 00 00 FF ?.?......?
0016D5A0 FF 00 00 FF FF 00 00 00 00 19 1B 01 02 00 00 FF ?.?......?
0016D5B0 FF 00 00 FF FF 00 00 00 00 1A 1C 01 02 00 00 FF ?.?......?
0016D5C0 FF 00 00 FF FF 00 00 00 00 1B 1D 01 02 00 00 FF ?.?......?
0016D5D0 FF 00 00 FF FF 00 00 00 00 1C 5B 01 02 00 00 FF ?.?....[..?
0016D5E0 FF 00 00 FF FF 00 00 00 00 5A 1E 02 02 00 00 FF ?.?....Z..?
0016D5F0 FF 00 00 FF FF 00 00 00 00 1E 36 02 02 00 00 FF ?.?....6..?
0016D600 FF 00 00 FF FF 00 00 00 00 36 37 02 02 00 00 FF ?.?....67..?
0016D610 FF 00 00 FF FF 00 00 00 00 37 38 02 02 00 00 FF ?.?....78..?
0016D620 FF 00 00 FF FF 00 00 00 00 38 00 00 00 00 00 00 ?.?....8......
0016D630 00 00 00 00 ....
原来出锁数据后e0位是从狗中读出的数据!每次读e0字节,至读完为止。至此数据分析完毕,将锁内数据全部记录,出锁数据还有一些简单的变换比如01字节,比较简单,不再详述了,现在我们有了关键的pin,执行ID,DES的key,算法也分析完成,下面的任务就是写出C51再回写入狗了,这是个简单的coding,就不再赘述了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年01月29日 13:05:16
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)