FlashSnap 1.0的簡單脫殼與演算法探析

看雪資料發表於2015-11-15

FlashSnap 1.0的簡單脫殼與演算法探析
破解作者:
        yzez[DFCG][BCG][FCG]
破解物件:
    FlashSnap 1.0
軟體介紹:
   FlashSnap 1.0 

軟體大小:414KB
軟體語言:英文
軟體類別:國外軟體/共享版/影像捕捉
執行環境:Win9x/Me/NT/2000/XP
加入時間:2003-11-29 9:05:57 

     目前絕大多數的動畫網站都以 Flash 格式釋出網站上的動畫,因而 Flash 成為動畫愛好人士最常
收集到的動畫格式。不過雖然 Flash 是動畫格式,但有時候精采的部分是在其中的某幾個場景。如果你
想永久儲存動畫中美麗的瞬間場面,只要有了 FlashSnap 就能辦到。
下載地址:
         http://www.onlinedown.net/soft/23365.htm
破解工具:
     PE-SCAN、Ollydbg1.09、ImportREC 
破解目的:
    不為破解而破解,只為技術而破解,有失誤之處,請高手們指正。
破解過程:
一、簡單脫殼
    用PEID竟然查不出是什麼殼,用:PE-SCAN查殼是:aspack 1.07b的殼,這個殼用工具輕鬆脫殼,下面
的脫殼過程,是我想自己用手脫,不過這個殼實在太簡單,高手不屑一顧,我等菜鳥就試一下吧!老樣子,
用OD載入程式,看下面:
004170C5 >  90              NOP*******************************載入程式後我們停在這裡!F8往下!
004170C6    90              NOP
004170C7    90              NOP
004170C8    75 00           JNZ     SHORT FlashSna.004170CA
004170CA  - E9 31AF0600     JMP     FlashSna.00482000*********按F7進!

00482000    60              PUSHAD****************************F7跟進後我們停在這裡!
00482001    E8 00000000     CALL    FlashSna.00482006*********F8帶過!
00482006    5D              POP     EBP                              
00482007    81ED 3ED94300   SUB     EBP, FlashSna.0043D93E
0048200D    B8 38D94300     MOV     EAX, FlashSna.0043D938
00482012    03C5            ADD     EAXEBP
00482014    2B85 0BDE4300   SUB     EAXDWORD PTR SS:[EBP+43DE0B]
0048201A    8985 17DE4300   MOV     DWORD PTR SS:[EBP+43DE17], EAX
00482020    80BD 01DE4300 0>CMP     BYTE PTR SS:[EBP+43DE01], 0
00482027    75 15           JNZ     SHORT FlashSna.0048203E*********不跳!
00482029    FE85 01DE4300   INC     BYTE PTR SS:[EBP+43DE01]
0048202F    E8 1D000000     CALL    FlashSna.00482051***************F8帶過!
00482034    E8 79020000     CALL    FlashSna.004822B2***************F8帶過!
00482039    E8 12030000     CALL    FlashSna.00482350***************F8帶過!
0048203E    8B85 03DE4300   MOV     EAXDWORD PTR SS:[EBP+43DE03]
00482044    0385 17DE4300   ADD     EAXDWORD PTR SS:[EBP+43DE17]
0048204A    894424 1C       MOV     DWORD PTR SS:[ESP+1C], EAX
0048204E    61              POPAD***********************************這是福地呀!
0048204F    FFE0            JMP     EAX*****************************跳向入口!EAX的值:004029CC就是OEP!F8進!
00482051    80BD 29E04300 0>CMP     BYTE PTR SS:[EBP+43E029], 0

004029CC    68 4C2D4000     PUSH    FlashSna.00402D4C***************在這裡,DUMP程式出來!
004029D1    E8 EEFFFFFF     CALL    FlashSna.004029C4                ; JMP to msvbvm50.ThunRTMain
004029D6    0000            ADD     BYTE PTR DS:[EAX], AL
004029D8    0000            ADD     BYTE PTR DS:[EAX], AL
004029DA    0000            ADD     BYTE PTR DS:[EAX], AL
004029DC    3000            XOR     BYTE PTR DS:[EAX], AL
004029DE    0000            ADD     BYTE PTR DS:[EAX], AL
004029E0    58              POP     EAX                              ; kernel32.77E5EB69
004029E1    0000            ADD     BYTE PTR DS:[EAX], AL
004029E3    0040 00         ADD     BYTE PTR DS:[EAX], AL
004029E6    0000            ADD     BYTE PTR DS:[EAX], AL
004029E8    C112 07         RCL     DWORD PTR DS:[EDX], 7
   用ImportREC修正OEP的值,試執行程式,程式正常執行!脫殼完成。
二、演算法探析。
   程式是用VB編寫的,用OD載入脫殼後的程式,下斷:rtcMidCharVar,F9執行程式,彈出註冊框後輸入
註冊資訊:Serial Number:234567765432;Your full name:yzez;Your company:[DFCG][BCG][FCG],點註冊,
程式被斷在下面:
7406306E >  PUSH    EBP*************************點註冊確定後我們斷在這裡!
7406306F    MOV     EBPESP
74063071    SUB     ESP, 10
74063074    CMP     DWORD PTR DS:[7412F064], 0
7406307B    PUSH    ESI
7406307C    PUSH    EDI
7406307D    JNZ     msvbvm50.7409D80F
74063083    MOV     ESIDWORD PTR DS:[7412F06C]
74063089    ADD     ESI, 50
7406308C    PUSH    ESI
7406308D    PUSH    DWORD PTR SS:[EBP+C]
74063090    CALL    msvbvm50.7402B82C**********取出試驗碼的前4位:2345送入EAX!
74063095    CMP     EAX, -1********************比較EAX的值是不是-1
74063098    JE      msvbvm50.7409D836*********相等就跳!
7406309E    PUSH    DWORD PTR SS:[EBP+14]
740630A1    PUSH    DWORD PTR SS:[EBP+10]
************************************省略一部分程式碼!****************************
740630CC    MOV     ESPEBP
740630CE    POP     EBP                              ; unpack_.00442D8F
740630CF    RETN    10************************返回指令!

00442D8F   MOV     EAXDWORD PTR SS:[EBP-20]**返回到這裡!
00442D92   MOV     DWORD PTR SS:[EBP-120], EAX****EAX的值是1,儲存,即取出試驗碼的第一位!
00442D98   CMP     DWORD PTR SS:[EBP-120], 100
********************************省略一部分程式碼!*****************************
00442E2D   PUSH    EAX
00442E2E   CALL    <JMP.&msvbvm50.rtcAnsiValueBstr>
00442E33   MOVSX   EAXAX******************第一位試驗碼的值:2,取其ASCII碼值:32擴充套件到EAX
00442E36   MOV     ECXDWORD PTR SS:[EBP-20]**取出的試驗碼的位數1,把位數送入ECX
00442E39   IMUL    ECXECX, 2*****************相乘!ECX=ECX*2=2
00442E3C   JO      unpack_.004431F3************溢位轉移!
00442E42   ADD     ECX, 6**********************ECX=ECX+6=8
00442E45   JO      unpack_.004431F3
00442E4B   IMUL    EAXECX********************EAX=ECX*ECX=32*8=190
00442E4E   JO      unpack_.004431F3
00442E54   MOV     ECXDWORD PTR SS:[EBP-20]**位數1移入ECX
00442E57   IMUL    ECXECX, 8*****************ECX=ECX*8=8
00442E5A   JO      unpack_.004431F3
00442E60   XOR     EAXECX********************EAX=EAC XOR ECX=190 XOR 8=198
00442E62   MOV     DWORD PTR SS:[EBP-9C], EAX**儲存EAX的值!
00442E68   MOV     DWORD PTR SS:[EBP-A4], 3
************************************省略一部分程式碼!**********************
00442EC7   PUSH    EAX
00442EC8   CALL    <JMP.&msvbvm50.__vbaStrVarMove>**把上面運算的值198轉化成十進位制值:408,放EAX
00442ECD   MOV     EDXEAX*************************408再移入EDX中
00442ECF   LEA     ECXDWORD PTR SS:[EBP-94]
00442ED5   CALL    <JMP.&msvbvm50.__vbaStrMove>
00442EDA   MOV     EDXEAX
**********************************省略一部分程式碼!************************************
00442F42   CALL    <JMP.&msvbvm50.__vbaGenerateBoun>
00442F47   MOV     DWORD PTR SS:[EBP-144], EAX
00442F4D   PUSH    DWORD PTR SS:[EBP-24]**************上一次運算的結果入棧!
00442F50   MOV     EAXDWORD PTR SS:[EBP-120]
00442F56   MOV     ECXDWORD PTR SS:[EBP-80]
00442F59   PUSH    DWORD PTR DS:[ECX+EAX*4]
00442F5C   CALL    <JMP.&msvbvm50.__vbaStrCat>********把運算的結果聯結起來:408494616710
00442F61   .  8985 64FFFFFF MOV     DWORD PTR SS:[EBP-9C], EAX
00442F67   .  C785 5CFFFFFF>MOV     DWORD PTR SS:[EBP-A4], 8
00442F71   .  8D85 5CFFFFFF LEA     EAXDWORD PTR SS:[EBP-A4]
00442F77   .  50            PUSH    EAX
00442F78   .  8D85 4CFFFFFF LEA     EAXDWORD PTR SS:[EBP-B4]
00442F7E   .  50            PUSH    EAX
00442F7F   .  E8 9AF7FBFF   CALL    <JMP.&msvbvm50.rtcTrimVar>
00442F84   .  8D85 4CFFFFFF LEA     EAXDWORD PTR SS:[EBP-B4]
00442F8A   .  50            PUSH    EAX
00442F8B   .  E8 DCF7FBFF   CALL    <JMP.&msvbvm50.__vbaStrVarMove>
00442F90   .  8BD0          MOV     EDXEAX
00442F92   .  8D4D DC       LEA     ECXDWORD PTR SS:[EBP-24]
00442F95   .  E8 4EF7FBFF   CALL    <JMP.&msvbvm50.__vbaStrMove>
00442F9A   .  8D85 4CFFFFFF LEA     EAXDWORD PTR SS:[EBP-B4]
00442FA0   .  50            PUSH    EAX
00442FA1   .  8D85 5CFFFFFF LEA     EAXDWORD PTR SS:[EBP-A4]
00442FA7   .  50            PUSH    EAX
00442FA8   .  6A 02         PUSH    2
00442FAA   .  E8 FDF6FBFF   CALL    <JMP.&msvbvm50.__vbaFreeVarList>
00442FAF   .  83C4 0C       ADD     ESP, 0C
00442FB2   .  8B45 E0       MOV     EAXDWORD PTR SS:[EBP-20]
00442FB5   .  40            INC     EAX
00442FB6   .  0F80 37020000 JO      unpack_.004431F3
00442FBC   MOV     DWORD PTR SS:[EBP-20], EAX
00442FBF   JMP     unpack_.00442D1D*************************跳回!迴圈,直到取出的4位試驗碼計算完畢!
00442FC4   PUSH    DWORD PTR SS:[EBP-24]
00442FC7   CALL    <JMP.&msvbvm50.__vbaLenBstr>
00442FCC   CMP     EAX, 4***********************************EAX的值是上述運算的結果的位數:C(即12)位!
00442FCF   JLE     unpack_.00443075*************************小於等於就跳!
00442FD5   PUSH    DWORD PTR SS:[EBP-24]********************計算的值408494616710入棧!
00442FD8   CALL    <JMP.&msvbvm50.__vbaLenBstr>
00442FDD   SUB     EAX, 5***********************************位數C再減去5,EAX=C-5=7
00442FE0   JO      unpack_.004431F3
00442FE6   MOV     DWORD PTR SS:[EBP-9C], EAX***************把運算的結果:7儲存!
00442FEC   MOV     DWORD PTR SS:[EBP-A4], 3
00442FF6   LEA     EAXDWORD PTR SS:[EBP-A4]
00442FFC   PUSH    EAX
00442FFD   PUSH    4
00442FFF   PUSH    DWORD PTR SS:[EBP-24]********************計算的值408494616710入棧!
00443002   CALL    <JMP.&msvbvm50.rtcMidCharBstr>***********此CALL對上述結果再計算,計算是這樣:把前3位去掉,
*************************************************再反後兩位去掉,得到中間的7位值是:4946167!
00443007   MOV     EDXEAX**********************把這個值移入EDX中!
00443009   LEA     ECXDWORD PTR SS:[EBP-70]
0044300C   CALL    <JMP.&msvbvm50.__vbaStrMove>
00443011   LEA     ECXDWORD PTR SS:[EBP-A4]
00443017   CALL    <JMP.&msvbvm50.__vbaFreeVar>
0044301C   PUSH    DWORD PTR SS:[EBP-5C]*********把試驗碼的前4位:2345入棧!
0044301F   PUSH    DWORD PTR SS:[EBP-70]*********上述結果:4946167入棧!
00443022   CALL    <JMP.&msvbvm50.__vbaStrCat>***把兩個值連起來:23454946167,放EAX
00443027   MOV     EDXEAX**********************把這個值移入EDX
00443029   LEA     ECXDWORD PTR SS:[EBP-90]
0044302F   CALL    <JMP.&msvbvm50.__vbaStrMove>
00443034   PUSH    EAX
00443035   MOV     EAXDWORD PTR SS:[EBP+8]*****23454946167入EAX
00443038   PUSH    DWORD PTR DS:[EAX]************試驗碼:234567765432入棧!             
0044303A   PUSH    0
0044303C   CALL    <JMP.&msvbvm50.__vbaStrComp>**比較試驗碼:234567765432與23454946167
00443041   NEG     AX****************************不相等賦AX的值為FFFF
00443044   SBB     EAXEAX
00443046   NEG     EAX
00443048   NEG     EAX
0044304A   MOV     WORD PTR SS:[EBP-120], AX
00443051   LEA     ECXDWORD PTR SS:[EBP-90]
00443057   CALL    <JMP.&msvbvm50.__vbaFreeStr>
0044305C   MOVSX   EAXWORD PTR SS:[EBP-120]
00443063   TEST    EAXEAX*********************測試EAX的值是否是0
00443065   JE      SHORT unpack_.0044306E*******相等就跳,一跳就成功!
00443067   AND     WORD PTR SS:[EBP-3C], 0
0044306C   JMP     SHORT unpack_.00443073

   演算法小結:
   這個軟體的註冊演算法有點怪,沒有用使用者名稱或者使用者單位計算註冊碼,而是用試驗碼的前4位經過計算
後得到後7位註冊碼,再把前4位試驗碼和後7位得到的註冊碼聯接起來就是軟體的註冊碼!
其計算過程是這樣:
   取前4位試驗碼,設取出的試驗碼的位數是X,取出的試驗碼的ASCII碼值是Y,則
   (X*2+6)*Y^(X*8),再把它轉化成十進位制值,聯接起來得到一組12位的新值,這個新值去掉前3位,再去掉
後兩位,得到中間的7位數值,它的前面再加上前4位試驗碼就是註冊碼!
   一組可用的註冊碼:
   Serial Number:23454946167
   Your full name:yzez
   Your company:[DFCG][BCG][FCG]

相關文章