查看單個文章
舊 2006-02-13, 12:50 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 流星網路電視V1.9.2.0的註冊(續:DES篇)

流星網路電視V1.9.2.0的註冊(續ES篇)

上次跟蹤了流星網路電視的註冊程序,再貼上DES的跟蹤筆記,跟大家共同學習一下,這是個標準的Delphi的DES源碼:

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

加密和解密是同一個CALL,即下面的CALL unpacked.00476B38,通過使用參數決定是加密還是解密:

00476DD0 |> /8B55 F8 /MOV EDX,DWORD PTR SS:[EBP-8] ; 取64位的密鑰
00476DD3 |. |8A141A |MOV DL,BYTE PTR DS:[EDX+EBX]
00476DD6 |. |8810 |MOV BYTE PTR DS:[EAX],DL ; 轉存密鑰
00476DD8 |. |43 |INC EBX
00476DD9 |. |40 |INC EAX
00476DDA |. |83FB 08 |CMP EBX,8
00476DDD |.^\75 F1 \JNZ SHORT unpacked.00476DD0 ; 分8輪取完,取完跳出循環
00476DDF |. 6A 0F PUSH 0F ; /Arg1 = 0000000F
00476DE1 |. B9 0C8C5C00 MOV ECX,unpacked.005C8C0C ; |
00476DE6 |. 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24] ; |
00476DE9 |. BA 07000000 MOV EDX,7 ; |
00476DEE |. E8 EDFAFFFF CALL unpacked.004768E0 ; \產生16個子密鑰KO、K1、……K15

………………(省略64位訊息分組的程式碼)
00476E3C |. 50 |PUSH EAX ; /Arg2
00476E3D |. 6A 07 |PUSH 7 ; |Arg1 = 00000007
00476E3F |. 8D55 EC |LEA EDX,DWORD PTR SS:[EBP-14] ; |
00476E42 |. B9 07000000 |MOV ECX,7 ; |
00476E47 |. 33C0 |XOR EAX,EAX ; |AL=0表示加密,AL=1表示解密
00476E49 |. E8 EAFCFFFF |CALL unpacked.00476B38 ; \對分組得到的64位訊息加密,跟進

訊息分組,即將很長的待加密訊息分成64位一組,有多少組,看訊息長度決定,然後分別對每一組加密,最後把每一組加密後的結果連接起來,就得到了最後的結果。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

進入CALL unpacked.00476B38,看看DES的關鍵程式碼(輸入64位,輸出64位):

00476B38 /$ 55 PUSH EBP
00476B39 |. 8BEC MOV EBP,ESP
00476B3B |. 83C4 E8 ADD ESP,-18
00476B3E |. 53 PUSH EBX
00476B3F |. 56 PUSH ESI
00476B40 |. 57 PUSH EDI
00476B41 |. 8BD9 MOV EBX,ECX
00476B43 |. 85DB TEST EBX,EBX
00476B45 |. 78 0A JS SHORT unpacked.00476B51
00476B47 |. C1EB 02 SHR EBX,2
00476B4A |> 8B349A /MOV ESI,DWORD PTR DS:[EDX+EBX*4]
00476B4D |. 4B |DEC EBX
00476B4E |. 56 |PUSH ESI
00476B4F |.^ 79 F9 \JNS SHORT unpacked.00476B4A
00476B51 |> 8BD4 MOV EDX,ESP
00476B53 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
00476B56 |. 8BD8 MOV EBX,EAX
00476B58 |. C745 F8 0800000>MOV DWORD PTR SS:[EBP-8],8
00476B5F |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00476B62 |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
00476B65 |> 8A10 /MOV DL,BYTE PTR DS:[EAX]
00476B67 |. 8811 |MOV BYTE PTR DS:[ECX],DL
00476B69 |. 41 |INC ECX
00476B6A |. 40 |INC EAX
00476B6B |. FF4D F8 |DEC DWORD PTR SS:[EBP-8]
00476B6E |.^ 75 F5 \JNZ SHORT unpacked.00476B65
00476B70 |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00476B73 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00476B76 |. E8 81F9FFFF CALL unpacked.004764FC ; 初始換位
00476B7B |. 84DB TEST BL,BL
00476B7D |. 0F85 B5000000 JNZ unpacked.00476C38 ; 如不跳,下面是加密程式碼,如果跳,則跳向解密程式碼
00476B83 |. C745 F8 1000000>MOV DWORD PTR SS:[EBP-8],10
00476B8A |. C745 EC 0C8C5C0>MOV DWORD PTR SS:[EBP-14],unpacked.>
00476B91 |> B8 04000000 /MOV EAX,4
00476B96 |. 8B55 0C |MOV EDX,DWORD PTR SS:[EBP+C]
00476B99 |. 8D75 F4 |LEA ESI,DWORD PTR SS:[EBP-C] ; 下面開始對消息進行分組,把64位的消息分為L和R
00476B9C |> 8A0A |/MOV CL,BYTE PTR DS:[EDX] ; 取L(i)
00476B9E |. 880E ||MOV BYTE PTR DS:[ESI],CL ; 儲存L(i)出去
00476BA0 |. 46 ||INC ESI
00476BA1 |. 42 ||INC EDX
00476BA2 |. 48 ||DEC EAX
00476BA3 |.^ 75 F7 |\JNZ SHORT unpacked.00476B9C ; 取四個字元,即32位
00476BA5 |. B8 04000000 |MOV EAX,4
00476BAA |. 8B55 0C |MOV EDX,DWORD PTR SS:[EBP+C]
00476BAD |. 83C2 04 |ADD EDX,4
00476BB0 |> 8A0A |/MOV CL,BYTE PTR DS:[EDX] ; 取R(i)
00476BB2 |. 884A FC ||MOV BYTE PTR DS:[EDX-4],CL ; 儲存R(i),L(i+1)=R(i),這個循環起到了交換位置的作用
00476BB5 |. 42 ||INC EDX
00476BB6 |. 48 ||DEC EAX
00476BB7 |.^ 75 F7 |\JNZ SHORT unpacked.00476BB0 ; 取4個字元,即32位
00476BB9 |. 6A 05 |PUSH 5 ; /Arg3 = 00000005
00476BBB |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10] ; |
00476BBE |. 50 |PUSH EAX ; |Arg2
00476BBF |. 6A 03 |PUSH 3 ; |Arg1 = 00000003
00476BC1 |. 8B45 EC |MOV EAX,DWORD PTR SS:[EBP-14] ; |
00476BC4 |. 8BC8 |MOV ECX,EAX ; |
00476BC6 |. 8B45 0C |MOV EAX,DWORD PTR SS:[EBP+C] ; |
00476BC9 |. 8B55 08 |MOV EDX,DWORD PTR SS:[EBP+8] ; |
00476BCC |. E8 3FFEFFFF |CALL unpacked.00476A10 ; \F(Ri,Ki)
00476BD1 |. B8 04000000 |MOV EAX,4
00476BD6 |. 8D55 F4 |LEA EDX,DWORD PTR SS:[EBP-C]
00476BD9 |. 8D75 F0 |LEA ESI,DWORD PTR SS:[EBP-10]
00476BDC |. 8B4D 0C |MOV ECX,DWORD PTR SS:[EBP+C]
00476BDF |. 83C1 04 |ADD ECX,4
00476BE2 |> 8A1A |/MOV BL,BYTE PTR DS:[EDX] ; 取L(i)
00476BE4 |. 321E ||XOR BL,BYTE PTR DS:[ESI] ; L(i) ^ F(Ri,Ki)
00476BE6 |. 8819 ||MOV BYTE PTR DS:[ECX],BL ; 結果賦給R(i),即R(i+1)=L(i) ^ F(Ri,Ki)
00476BE8 |. 41 ||INC ECX
00476BE9 |. 46 ||INC ESI
00476BEA |. 42 ||INC EDX
00476BEB |. 48 ||DEC EAX
00476BEC |.^ 75 F4 |\JNZ SHORT unpacked.00476BE2 ; 循環四個字元,即32位
00476BEE |. 8345 EC 06 |ADD DWORD PTR SS:[EBP-14],6
00476BF2 |. FF4D F8 |DEC DWORD PTR SS:[EBP-8]
00476BF5 |.^ 75 9A \JNZ SHORT unpacked.00476B91 ; 一共要經過16輪循環,由原先的L0、R0轉變成了L16、R16
00476BF7 |. B8 04000000 MOV EAX,4
00476BFC |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00476BFF |. 83C2 04 ADD EDX,4
00476C02 |. 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
00476C05 |> 8A1A /MOV BL,BYTE PTR DS:[EDX] ; 取R16
00476C07 |. 8819 |MOV BYTE PTR DS:[ECX],BL ; 轉存R16
00476C09 |. 41 |INC ECX
00476C0A |. 42 |INC EDX
00476C0B |. 48 |DEC EAX
00476C0C |.^ 75 F7 \JNZ SHORT unpacked.00476C05 ; 取四個字元,32位,這個循環把R16儲存出去
00476C0E |. B8 04000000 MOV EAX,4
00476C13 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00476C16 |> 8A0A /MOV CL,BYTE PTR DS:[EDX] ; 取L16
00476C18 |. 884A 04 |MOV BYTE PTR DS:[EDX+4],CL ; R16=L16
00476C1B |. 42 |INC EDX
00476C1C |. 48 |DEC EAX
00476C1D |.^ 75 F7 \JNZ SHORT unpacked.00476C16 ; 一共取代4字元32位,這個循環用L16覆蓋R16
00476C1F |. B8 04000000 MOV EAX,4
00476C24 |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
00476C27 |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
00476C2A |> 8A1A /MOV BL,BYTE PTR DS:[EDX] ; 取儲存出去的R16
00476C2C |. 8819 |MOV BYTE PTR DS:[ECX],BL ; L16=R16,即用儲存出去的R16覆蓋L16
00476C2E |. 41 |INC ECX
00476C2F |. 42 |INC EDX
00476C30 |. 48 |DEC EAX
00476C31 |.^ 75 F7 \JNZ SHORT unpacked.00476C2A ; 一共取代4字元32位,上面三個小循環等於由交換了一下L16和R16
00476C33 |. E9 BB000000 JMP unpacked.00476CF3 ; 跳向逆初始換位
00476C38 |> 80FB 01 CMP BL,1
00476C3B |. 0F85 B2000000 JNZ unpacked.00476CF3
00476C41 |. C745 F8 F0FFFFF>MOV DWORD PTR SS:[EBP-8],-10
00476C48 |. BB 668C5C00 MOV EBX,unpacked.005C8C66
00476C4D |> B8 04000000 /MOV EAX,4
00476C52 |. 8B55 0C |MOV EDX,DWORD PTR SS:[EBP+C]
00476C55 |. 8D75 F4 |LEA ESI,DWORD PTR SS:[EBP-C] ; 下面開始對消息進行分組,把64位的消息分為L0和R0
00476C58 |> 8A0A |/MOV CL,BYTE PTR DS:[EDX] ; 取L(i)
00476C5A |. 880E ||MOV BYTE PTR DS:[ESI],CL ; 儲存L(i)出去
00476C5C |. 46 ||INC ESI
00476C5D |. 42 ||INC EDX
00476C5E |. 48 ||DEC EAX
00476C5F |.^ 75 F7 |\JNZ SHORT unpacked.00476C58 ; 取四個字元,即32位
00476C61 |. B8 04000000 |MOV EAX,4
00476C66 |. 8B55 0C |MOV EDX,DWORD PTR SS:[EBP+C]
00476C69 |. 83C2 04 |ADD EDX,4
00476C6C |> 8A0A |/MOV CL,BYTE PTR DS:[EDX] ; 取R(i)
00476C6E |. 884A FC ||MOV BYTE PTR DS:[EDX-4],CL ; 儲存R(i),L(i+1)=R(i),這個循環起到了交換位置的作用
00476C71 |. 42 ||INC EDX
00476C72 |. 48 ||DEC EAX
00476C73 |.^ 75 F7 |\JNZ SHORT unpacked.00476C6C ; 取四個字元,即32位
00476C75 |. 6A 05 |PUSH 5 ; /Arg3 = 00000005
00476C77 |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10] ; |
00476C7A |. 50 |PUSH EAX ; |Arg2
00476C7B |. 6A 03 |PUSH 3 ; |Arg1 = 00000003
00476C7D |. 8BCB |MOV ECX,EBX ; |
00476C7F |. 8B45 0C |MOV EAX,DWORD PTR SS:[EBP+C] ; |
00476C82 |. 8B55 08 |MOV EDX,DWORD PTR SS:[EBP+8] ; |
00476C85 |. E8 86FDFFFF |CALL unpacked.00476A10 ; \F( Ri,K(15-i) )
00476C8A |. B8 04000000 |MOV EAX,4
00476C8F |. 8D55 F4 |LEA EDX,DWORD PTR SS:[EBP-C]
00476C92 |. 8D75 F0 |LEA ESI,DWORD PTR SS:[EBP-10]
00476C95 |. 8B4D 0C |MOV ECX,DWORD PTR SS:[EBP+C]
00476C98 |. 83C1 04 |ADD ECX,4
00476C9B |. 894D E8 |MOV DWORD PTR SS:[EBP-18],ECX
00476C9E |> 8A0A |/MOV CL,BYTE PTR DS:[EDX] ; 取經過了F( Ri,K(15-i) )的結果
00476CA0 |. 320E ||XOR CL,BYTE PTR DS:[ESI] ; L(i) ^ F( Ri,K(15-i) )
00476CA2 |. 8B7D E8 ||MOV EDI,DWORD PTR SS:[EBP-18] ; 結果賦給R(i),即R(i+1)=L(i) ^ F(Ri,Ki)
00476CA5 |. 880F ||MOV BYTE PTR DS:[EDI],CL
00476CA7 |. FF45 E8 ||INC DWORD PTR SS:[EBP-18]
00476CAA |. 46 ||INC ESI
00476CAB |. 42 ||INC EDX
00476CAC |. 48 ||DEC EAX
00476CAD |.^ 75 EF |\JNZ SHORT unpacked.00476C9E ; 循環四個字元,即32位
00476CAF |. 83EB 06 |SUB EBX,6
00476CB2 |. FF45 F8 |INC DWORD PTR SS:[EBP-8]
00476CB5 |.^ 75 96 \JNZ SHORT unpacked.00476C4D ; 一共要經過16輪循環,由原先的L0、R0轉變成了L16、R16
00476CB7 |. B8 04000000 MOV EAX,4
00476CBC |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00476CBF |. 83C2 04 ADD EDX,4
00476CC2 |. 8D5D F4 LEA EBX,DWORD PTR SS:[EBP-C]
00476CC5 |> 8A0A /MOV CL,BYTE PTR DS:[EDX] ; 取R16
00476CC7 |. 880B |MOV BYTE PTR DS:[EBX],CL ; 轉存R16
00476CC9 |. 43 |INC EBX
00476CCA |. 42 |INC EDX
00476CCB |. 48 |DEC EAX
00476CCC |.^ 75 F7 \JNZ SHORT unpacked.00476CC5 ; 取四個字元,32位,這個循環把R16儲存出去
00476CCE |. B8 04000000 MOV EAX,4
00476CD3 |. 8B5D 0C MOV EBX,DWORD PTR SS:[EBP+C]
00476CD6 |> 8A13 /MOV DL,BYTE PTR DS:[EBX] ; 取L16
00476CD8 |. 8853 04 |MOV BYTE PTR DS:[EBX+4],DL ; R16=L16
00476CDB |. 43 |INC EBX
00476CDC |. 48 |DEC EAX
00476CDD |.^ 75 F7 \JNZ SHORT unpacked.00476CD6 ; 一共取代4字元32位,這個循環用L16覆蓋R16
00476CDF |. B8 04000000 MOV EAX,4
00476CE4 |. 8D5D F4 LEA EBX,DWORD PTR SS:[EBP-C]
00476CE7 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00476CEA |> 8A0B /MOV CL,BYTE PTR DS:[EBX] ; 取儲存出去的R16
00476CEC |. 880A |MOV BYTE PTR DS:[EDX],CL ; L16=R16,即用儲存出去的R16覆蓋L16
00476CEE |. 42 |INC EDX
00476CEF |. 43 |INC EBX
00476CF0 |. 48 |DEC EAX
00476CF1 |.^ 75 F7 \JNZ SHORT unpacked.00476CEA ; 一共取代4字元32位,上面三個小循環等於由交換了一下L16和R16
00476CF3 |> 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00476CF6 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00476CF9 |. E8 82F8FFFF CALL unpacked.00476580 ; 逆初始換位
00476CFE |. 8B7D DC MOV EDI,DWORD PTR SS:[EBP-24]
00476D01 |. 8B75 E0 MOV ESI,DWORD PTR SS:[EBP-20]
00476D04 |. 8B5D E4 MOV EBX,DWORD PTR SS:[EBP-1C]
00476D07 |. 8BE5 MOV ESP,EBP
00476D09 |. 5D POP EBP
00476D0A \. C2 0800 RETN 8

小結:

可見加密程式碼和解密程式碼幾乎一樣,不同的是16個48位的子密鑰使用的順序不同。

我們主要看加密程序:

待加密64位訊息--->『初始變換』-->『16輪循環處理』-->『逆初始變換』-->輸出64位結果

『初始變換』表:輸入64位,輸出64位(資料處理的第一步)

58 50 42 34 26 18 10 02 60 52 44 36 28 20 12 04
62 54 46 38 30 22 14 06 64 56 48 40 32 24 16 08
57 49 41 33 25 17 09 01 59 51 43 35 27 19 11 03
61 53 45 37 29 21 13 05 63 55 47 39 31 23 15 07

『16輪循環處理』(資料處理的中間一步):

64位訊息分為32的L0和32位的R0

For(i=0;i<16;i++){
Temp=Ri;
R(i+1)=Li ^ F(Ri,Ki);
L(i+1)=Temp;
}

經過16輪得到L16,R16,再交換一下L16,R16輸處64位訊息

『逆初始變換』表:輸入64位,輸出64位(資料處理的最後一步)

40 08 48 16 56 24 64 32 39 07 47 15 55 23 63 31
38 06 46 14 54 22 62 30 37 05 45 13 53 21 61 29
36 04 44 12 52 20 60 28 35 03 43 11 51 19 59 27
34 02 42 10 50 18 58 26 33 01 41 09 49 17 57 25

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

跟進F(Ri,Ki)函數,程序如下:

00476A10 /$ 55 PUSH EBP
00476A11 |. 8BEC MOV EBP,ESP
00476A13 |. 83C4 EC ADD ESP,-14
00476A16 |. 53 PUSH EBX
00476A17 |. 56 PUSH ESI
00476A18 |. 8B5D 10 MOV EBX,DWORD PTR SS:[EBP+10]
00476A1B |. 85DB TEST EBX,EBX
00476A1D |. 78 0A JS SHORT unpacked.00476A29
00476A1F |. C1EB 02 SHR EBX,2
00476A22 |> 8B3499 /MOV ESI,DWORD PTR DS:[ECX+EBX*4>
00476A25 |. 4B |DEC EBX
00476A26 |. 56 |PUSH ESI
00476A27 |.^ 79 F9 \JNS SHORT unpacked.00476A22
00476A29 |> 8BCC MOV ECX,ESP
00476A2B |. 8BDA MOV EBX,EDX
00476A2D |. 85DB TEST EBX,EBX
00476A2F |. 78 0A JS SHORT unpacked.00476A3B
00476A31 |. C1EB 02 SHR EBX,2
00476A34 |> 8B3498 /MOV ESI,DWORD PTR DS:[EAX+EBX*4>
00476A37 |. 4B |DEC EBX
00476A38 |. 56 |PUSH ESI
00476A39 |.^ 79 F9 \JNS SHORT unpacked.00476A34
00476A3B |> 8BC4 MOV EAX,ESP
00476A3D |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00476A40 |. 6A 05 PUSH 5 ; /Arg1 = 00000005
00476A42 |. 8D4D F6 LEA ECX,DWORD PTR SS:[EBP-A] ; |
00476A45 |. E8 BAFBFFFF CALL unpacked.00476604 ; \擴大換位將32位訊息變為48位
00476A4A |. BB 06000000 MOV EBX,6
00476A4F |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00476A52 |. 8D55 F6 LEA EDX,DWORD PTR SS:[EBP-A]
00476A55 |> 8A08 /MOV CL,BYTE PTR DS:[EAX]
00476A57 |. 300A |XOR BYTE PTR DS:[EDX],CL ; 48位訊息與48位密鑰異或
00476A59 |. 42 |INC EDX
00476A5A |. 40 |INC EAX
00476A5B |. 4B |DEC EBX
00476A5C |.^ 75 F7 \JNZ SHORT unpacked.00476A55 ; 六輪循環完成異或
00476A5E |. 8A45 F6 MOV AL,BYTE PTR SS:[EBP-A] ; 下面開始將48位訊息分成8個6位訊息
00476A61 |. 33D2 XOR EDX,EDX
00476A63 |. 8AD0 MOV DL,AL
00476A65 |. C1EA 02 SHR EDX,2 ; 得到第一個6位資料
00476A68 |. 8855 EE MOV BYTE PTR SS:[EBP-12],DL ; 儲存
00476A6B |. 24 03 AND AL,3
00476A6D |. C1E0 04 SHL EAX,4
00476A70 |. 8A55 F7 MOV DL,BYTE PTR SS:[EBP-9]
00476A73 |. 33C9 XOR ECX,ECX
00476A75 |. 8ACA MOV CL,DL
00476A77 |. C1E9 04 SHR ECX,4
00476A7A |. 0AC1 OR AL,CL ; 得到第二個6位資料
00476A7C |. 8845 EF MOV BYTE PTR SS:[EBP-11],AL ; 儲存
00476A7F |. 80E2 0F AND DL,0F
00476A82 |. C1E2 02 SHL EDX,2
00476A85 |. 8A45 F8 MOV AL,BYTE PTR SS:[EBP-8]
00476A88 |. 33C9 XOR ECX,ECX
00476A8A |. 8AC8 MOV CL,AL
00476A8C |. C1E9 06 SHR ECX,6
00476A8F |. 0AD1 OR DL,CL ; 得到第三個6位資料
00476A91 |. 8855 F0 MOV BYTE PTR SS:[EBP-10],DL ; 儲存
00476A94 |. 24 3F AND AL,3F ; 得到第四個6位資料
00476A96 |. 8845 F1 MOV BYTE PTR SS:[EBP-F],AL ; 儲存
00476A99 |. 8A45 F9 MOV AL,BYTE PTR SS:[EBP-7]
00476A9C |. 33D2 XOR EDX,EDX
00476A9E |. 8AD0 MOV DL,AL
00476AA0 |. C1EA 02 SHR EDX,2 ; 得到第五個6位資料
00476AA3 |. 8855 F2 MOV BYTE PTR SS:[EBP-E],DL ; 儲存
00476AA6 |. 24 03 AND AL,3
00476AA8 |. C1E0 04 SHL EAX,4
00476AAB |. 33D2 XOR EDX,EDX
00476AAD |. 8A55 FA MOV DL,BYTE PTR SS:[EBP-6]
00476AB0 |. C1EA 04 SHR EDX,4
00476AB3 |. 0AC2 OR AL,DL ; 得到第六個6位資料
00476AB5 |. 8845 F3 MOV BYTE PTR SS:[EBP-D],AL ; 儲存
00476AB8 |. 8A45 FA MOV AL,BYTE PTR SS:[EBP-6]
00476ABB |. 24 0F AND AL,0F
00476ABD |. C1E0 02 SHL EAX,2
00476AC0 |. 33D2 XOR EDX,EDX
00476AC2 |. 8A55 FB MOV DL,BYTE PTR SS:[EBP-5]
00476AC5 |. C1EA 06 SHR EDX,6
00476AC8 |. 0AC2 OR AL,DL ; 得到第七個6位資料
00476ACA |. 8845 F4 MOV BYTE PTR SS:[EBP-C],AL ; 儲存
00476ACD |. 8A45 FB MOV AL,BYTE PTR SS:[EBP-5]
00476AD0 |. 24 3F AND AL,3F ; 得到第八個6位資料
00476AD2 |. 8845 F5 MOV BYTE PTR SS:[EBP-B],AL ; 儲存
00476AD5 |. 33DB XOR EBX,EBX
00476AD7 |. 8D75 EE LEA ESI,DWORD PTR SS:[EBP-12]
00476ADA |> 8BC3 /MOV EAX,EBX
00476ADC |. 8A16 |MOV DL,BYTE PTR DS:[ESI] ; 取其中一個六位資料
00476ADE |. E8 31FCFFFF |CALL unpacked.00476714 ; 到8個SBOX相應的盒子中取4位的資料
00476AE3 |. 8806 |MOV BYTE PTR DS:[ESI],AL ; 儲存
00476AE5 |. 43 |INC EBX
00476AE6 |. 46 |INC ESI
00476AE7 |. 83FB 08 |CMP EBX,8
00476AEA |.^ 75 EE \JNZ SHORT unpacked.00476ADA ; 循環八輪
00476AEC |. BB 04000000 MOV EBX,4
00476AF1 |. 8D45 EE LEA EAX,DWORD PTR SS:[EBP-12] ; 取出資料儲存的位址
00476AF4 |. 8D55 F6 LEA EDX,DWORD PTR SS:[EBP-A]
00476AF7 |> 8A08 /MOV CL,BYTE PTR DS:[EAX]
00476AF9 |. C1E1 04 |SHL ECX,4
00476AFC |. 0A48 01 |OR CL,BYTE PTR DS:[EAX+1] ; 兩個4位資料合併成一個8位資料
00476AFF |. 880A |MOV BYTE PTR DS:[EDX],CL ; 儲存
00476B01 |. 42 |INC EDX
00476B02 |. 83C0 02 |ADD EAX,2
00476B05 |. 4B |DEC EBX
00476B06 |.^ 75 EF \JNZ SHORT unpacked.00476AF7 ; 四論循環,得到32位資料
00476B08 |. 8D45 F6 LEA EAX,DWORD PTR SS:[EBP-A]
00476B0B |. BA 05000000 MOV EDX,5
00476B10 |. E8 7FFBFFFF CALL unpacked.00476694 ; 根據單純換位表進行32位資料調整
00476B15 |. BB 04000000 MOV EBX,4
00476B1A |. 8D45 F6 LEA EAX,DWORD PTR SS:[EBP-A]
00476B1D |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00476B20 |> 8A08 /MOV CL,BYTE PTR DS:[EAX]
00476B22 |. 880A |MOV BYTE PTR DS:[EDX],CL ; 儲存結果
00476B24 |. 42 |INC EDX
00476B25 |. 40 |INC EAX
00476B26 |. 4B |DEC EBX
00476B27 |.^ 75 F7 \JNZ SHORT unpacked.00476B20 ; 四輪循環
00476B29 |. 8B75 E4 MOV ESI,DWORD PTR SS:[EBP-1C]
00476B2C |. 8B5D E8 MOV EBX,DWORD PTR SS:[EBP-18]
00476B2F |. 8BE5 MOV ESP,EBP
00476B31 |. 5D POP EBP
00476B32 \. C2 0C00 RETN 0C

小結:

選項函數F(Ri,Ki),輸入32位,輸出32位,它的大致程序:

『資料膨脹』輸入32位,輸出48位:

32 01 02 03 04 05 04 05 06 07 08 09 08 09 10 11
12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21
22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 31

『資料切割』輸入48位,輸出8個6位

將48位資料,先跟48位子密鑰異或,然後切割成8個六位輸據

『查SBOX表』輸入8個6位,輸出8個4位

SBOX[8,64]是個二維陣列,裡面存放了固定的4位資料,用六位資料的第1位和第6位組成i,第2、3、4、5位組成j,然後取SBOX[i,j],將取出的8個4位資料組成32位資料。

SBOX資料太多,這裡就不貼出來了。可以在論壇Crack Tutorial中找到。

『單純換位』輸入32位,輸出32位

得到的32位資料,經單純換位,既不膨脹,也不收縮,得到32位輸出

單純換位表:

16 07 20 21 29 12 28 17 01 15 23 26 05 18 31 10
02 08 24 14 32 27 03 09 19 13 30 06 22 11 04 25

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

子密鑰的產生程序:輸入64位密鑰,輸出16個48位子密鑰

跟進CALL unpacked.004768E0:

004768E0 /$ 55 PUSH EBP
004768E1 |. 8BEC MOV EBP,ESP
004768E3 |. 83C4 E4 ADD ESP,-1C
004768E6 |. 53 PUSH EBX
004768E7 |. 56 PUSH ESI
004768E8 |. 57 PUSH EDI
004768E9 |. 8BDA MOV EBX,EDX
004768EB |. 85DB TEST EBX,EBX
004768ED |. 78 0A JS SHORT unpacked.004768F9
004768EF |. C1EB 02 SHR EBX,2
004768F2 |> 8B3498 /MOV ESI,DWORD PTR DS:[EAX+EBX*4>
004768F5 |. 4B |DEC EBX
004768F6 |. 56 |PUSH ESI
004768F7 |.^ 79 F9 \JNS SHORT unpacked.004768F2
004768F9 |> 8BC4 MOV EAX,ESP
004768FB |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
004768FE |. 8D75 F5 LEA ESI,DWORD PTR SS:[EBP-B]
00476901 |. 6A 06 PUSH 6 ; /Arg1 = 00000006
00476903 |. 8BCE MOV ECX,ESI ; |
00476905 |. E8 46FEFFFF CALL unpacked.00476750 ; \資料收縮A,將64位密鑰收縮位56位
0047690A |. 8A06 MOV AL,BYTE PTR DS:[ESI] ; 下面開始將56位分為兩個28位C0和D0
0047690C |. 33D2 XOR EDX,EDX
0047690E |. 8AD0 MOV DL,AL
00476910 |. C1EA 04 SHR EDX,4
00476913 |. 8855 F1 MOV BYTE PTR SS:[EBP-F],DL ; 儲存
00476916 |. C1E0 04 SHL EAX,4
00476919 |. 8A56 01 MOV DL,BYTE PTR DS:[ESI+1]
0047691C |. 33C9 XOR ECX,ECX
0047691E |. 8ACA MOV CL,DL
00476920 |. C1E9 04 SHR ECX,4
00476923 |. 0AC1 OR AL,CL
00476925 |. 8845 F2 MOV BYTE PTR SS:[EBP-E],AL ; 儲存
00476928 |. C1E2 04 SHL EDX,4
0047692B |. 8A46 02 MOV AL,BYTE PTR DS:[ESI+2]
0047692E |. 33C9 XOR ECX,ECX
00476930 |. 8AC8 MOV CL,AL
00476932 |. C1E9 04 SHR ECX,4
00476935 |. 0AD1 OR DL,CL
00476937 |. 8855 F3 MOV BYTE PTR SS:[EBP-D],DL ; 儲存
0047693A |. C1E0 04 SHL EAX,4
0047693D |. 8A56 03 MOV DL,BYTE PTR DS:[ESI+3]
00476940 |. 33C9 XOR ECX,ECX
00476942 |. 8ACA MOV CL,DL
00476944 |. C1E9 04 SHR ECX,4
00476947 |. 0AC1 OR AL,CL
00476949 |. 8845 F4 MOV BYTE PTR SS:[EBP-C],AL ; 儲存,上面的四個儲存,儲存了左28位C0
0047694C |. 80E2 0F AND DL,0F
0047694F |. 8855 ED MOV BYTE PTR SS:[EBP-13],DL ; 儲存
00476952 |. 8A46 04 MOV AL,BYTE PTR DS:[ESI+4]
00476955 |. 8845 EE MOV BYTE PTR SS:[EBP-12],AL ; 儲存
00476958 |. 8A46 05 MOV AL,BYTE PTR DS:[ESI+5]
0047695B |. 8845 EF MOV BYTE PTR SS:[EBP-11],AL ; 儲存
0047695E |. 8A46 06 MOV AL,BYTE PTR DS:[ESI+6]
00476961 |. 8845 F0 MOV BYTE PTR SS:[EBP-10],AL ; 儲存,上面的四個儲存,儲存了右28位D0
00476964 |. BF 10000000 MOV EDI,10
00476969 |. BB 40055C00 MOV EBX,OFFSET <unpacked.移位表> ; 取移位表位址
0047696E |. 8B75 FC MOV ESI,DWORD PTR SS:[EBP-4] ; 下面註釋中,i取1∼16
00476971 |> 8D45 F1 /LEA EAX,DWORD PTR SS:[EBP-F] ; 左28位C(i-1)
00476974 |. 8A0B |MOV CL,BYTE PTR DS:[EBX] ; 取移位表資料
00476976 |. BA 03000000 |MOV EDX,3
0047697B |. E8 00FFFFFF |CALL unpacked.00476880 ; C(i-1)左移後產生Ci
00476980 |. 8D45 ED |LEA EAX,DWORD PTR SS:[EBP-13] ; 右28位D(i-1)
00476983 |. 8A0B |MOV CL,BYTE PTR DS:[EBX] ; 取移位表資料
00476985 |. BA 03000000 |MOV EDX,3
0047698A |. E8 F1FEFFFF |CALL unpacked.00476880 ; D(i-1)移位產生Di
0047698F |. 8A55 F1 |MOV DL,BYTE PTR SS:[EBP-F]
00476992 |. C1E2 04 |SHL EDX,4
00476995 |. 8A45 F2 |MOV AL,BYTE PTR SS:[EBP-E]
00476998 |. 33C9 |XOR ECX,ECX
0047699A |. 8AC8 |MOV CL,AL
0047699C |. C1E9 04 |SHR ECX,4
0047699F |. 0AD1 |OR DL,CL
004769A1 |. 8855 E6 |MOV BYTE PTR SS:[EBP-1A],DL ; 儲存
004769A4 |. C1E0 04 |SHL EAX,4
004769A7 |. 33D2 |XOR EDX,EDX
004769A9 |. 8A55 F3 |MOV DL,BYTE PTR SS:[EBP-D]
004769AC |. C1EA 04 |SHR EDX,4
004769AF |. 0AC2 |OR AL,DL
004769B1 |. 8845 E7 |MOV BYTE PTR SS:[EBP-19],AL ; 儲存
004769B4 |. 8A55 F3 |MOV DL,BYTE PTR SS:[EBP-D]
004769B7 |. C1E2 04 |SHL EDX,4
004769BA |. 8A45 F4 |MOV AL,BYTE PTR SS:[EBP-C]
004769BD |. 33C9 |XOR ECX,ECX
004769BF |. 8AC8 |MOV CL,AL
004769C1 |. C1E9 04 |SHR ECX,4
004769C4 |. 0AD1 |OR DL,CL
004769C6 |. 8855 E8 |MOV BYTE PTR SS:[EBP-18],DL ; 儲存
004769C9 |. C1E0 04 |SHL EAX,4
004769CC |. 0A45 ED |OR AL,BYTE PTR SS:[EBP-13]
004769CF |. 8845 E9 |MOV BYTE PTR SS:[EBP-17],AL ; 儲存
004769D2 |. 8A45 EE |MOV AL,BYTE PTR SS:[EBP-12]
004769D5 |. 8845 EA |MOV BYTE PTR SS:[EBP-16],AL ; 儲存
004769D8 |. 8A45 EF |MOV AL,BYTE PTR SS:[EBP-11]
004769DB |. 8845 EB |MOV BYTE PTR SS:[EBP-15],AL ; 儲存
004769DE |. 8A45 F0 |MOV AL,BYTE PTR SS:[EBP-10]
004769E1 |. 8845 EC |MOV BYTE PTR SS:[EBP-14],AL ; 儲存,上面7個儲存,將Ci和Di合併成56位資料
004769E4 |. 6A 05 |PUSH 5 ; /Arg1 = 00000005
004769E6 |. 8BCE |MOV ECX,ESI ; |
004769E8 |. 8D45 E6 |LEA EAX,DWORD PTR SS:[EBP-1A] ; |
004769EB |. BA 06000000 |MOV EDX,6 ; |
004769F0 |. E8 F3FDFFFF |CALL unpacked.004767E8 ; \縮位變換B,將56位數決變換成48位的Ki
004769F5 |. 83C6 06 |ADD ESI,6
004769F8 |. 43 |INC EBX
004769F9 |. 4F |DEC EDI
004769FA |.^ 0F85 71FFFFFF \JNZ unpacked.00476971 ; 循環16輪,產生16個子密鑰
00476A00 |. 8B7D D8 MOV EDI,DWORD PTR SS:[EBP-28]
00476A03 |. 8B75 DC MOV ESI,DWORD PTR SS:[EBP-24]
00476A06 |. 8B5D E0 MOV EBX,DWORD PTR SS:[EBP-20]
00476A09 |. 8BE5 MOV ESP,EBP
00476A0B |. 5D POP EBP
00476A0C \. C2 0400 RETN 4

小結:

『縮位變換A』輸入64位密鑰,輸出56位資料

57 49 41 33 25 17 09
01 58 50 42 34 26 18
10 02 59 51 43 35 27
19 11 03 60 52 44 36
63 55 47 39 31 23 15
07 62 54 46 38 30 22
14 06 61 53 45 37 29
21 13 05 28 20 12 04

56位資料分為兩個28位,進入16輪循環

移位表:1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1

『縮位變換B』輸入56位,輸出48位Ki

14 17 11 24 01 05
03 28 15 06 21 10
23 19 12 04 26 08
16 07 27 20 13 02
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
----------------------------------------------------------------------------------------------
【破解聲明】 我是一隻小菜鳥,偶得一點心得,願與大家分享

【版權聲明】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次