SMC技術在破解WINDOWS優化大師3.2A中的運用。 (8千字)

看雪資料發表於2001-01-20

SMC技術在破解WINDOWS優化大師3.2A中的運用

[宣告]

    我寫文章的目的是為了交流技術,希望大家在轉載時能保持文章的完整性。
     

   
[前言]
 
      這是本人在看雪論壇是發表的第一篇破解教程,寫的不好,請多原諒!
      其實,這是我在破解WINDOWS優化大師3.2A時用到的技術,當時我並不知
      道已經用ANTI-ASPACK0.2可以脫掉它,我用FI也查不到它的殼,所以我
      只有手工脫殼。這個軟體被脫殼後是很好破解的。所在我在這裡只談論如
      何寫SMC指令,沒談到如何破解它。

PART A:分析第一層壓縮。
PART B:分析第二層壓縮。
PART C:寫SMC指令。 
       
======================================< PART A >============================================   
1.分析第一層壓縮以及關I性的跳轉。
2.確定要修改的指令。     
                       
下面的這段指令要注意一下。
     
0167:0058053B  A3271A11A9          MOV      [A9111A27],EAX                   
0167:00580540  91                  XCHG      EAX,ECX                         
0167:00580541  B0E7                MOV      AL,E7                             
0167:00580543  6742                INC      EDX                               
0167:00580545  FF6641              JMP      [ESI+41]                         
0167:00580548  102A                ADC      [EDX],CH                         
0167:0058054A  DE33                FIDIV    WORD PTR [EBX]                   
0167:0058054C  27                  DAA                                         
0167:0058054D  EA056970ED6F80      JMP      806F:ED706905                     
0167:00580554  EE                  OUT      DX,AL                             
0167:00580555  47                  INC      EDI                               
0167:00580556  E9E0FEFFFF          JMP      0058043B ;這裡我們要處理一下,改成JMP 584005
                                                      ;為何要改成584005呢?請參照<PART C>     
0167:0058055B  338CA456D9D422      XOR      ECX,[ESP+22D4D956]               
0167:00580562  2C3F                SUB      AL,3F                           
0167:00580564  1F                  POP      DS 

我們先來看一下在[58043B]裡到底是什麼指令。以下是[58042A--58043C]的指令片段:

0167:0058042A  FF9504404400        CALL      [EBP+00444004]                   
0167:00580430  8B2C24              MOV      EBP,[ESP]                         
0167:00580433  81ED3C394400        SUB      EBP,0044393C                     
0167:00580439  C3                  RET                                         
0167:0058043A  00E9                ADD      CL,CH  ;當程式執行到[580556]時,
                                                    ;這裡將變成JMP 580007                   
0167:0058043C  C7FBFFFF0000        MOV      EBX,0000FFFF                     
                         
經過跟蹤,我發現[58043A]的指令會被前面的JMP 58043B截成JMP 580007,這裡可算是花指令技術了。
那[580007]裡又是什麼指令呢?跟進去瞧瞧。

0167:00580005  0000                ADD      [EAX],AL                         
0167:00580007  E824040000          CALL      00580430 ;F8進入,到這裡程式就快要解完第一層壓縮了。                       
0167:0058000C  EB00                JMP      0058000E                         
0167:0058000E  BB30394400          MOV      EBX,00443930                     
0167:00580013  03DD                ADD      EBX,EBP                           
0167:00580015  2B9DD03F4400        SUB      EBX,[EBP+00443FD0]               
0167:0058001B  83BDFC49440000      CMP      DWORD PTR [EBP+004449FC],00       
0167:00580022  899DFC494400        MOV      [EBP+004449FC],EBX               
0167:00580028  0F8566030000        JNZ      00580394       

進入CALL 580430後,我們將來到這裡。
0167:00580430  8B2C24              MOV      EBP,[ESP]                         
0167:00580433  81ED3C394400        SUB      EBP,0044393C                     
0167:00580439  C3                  RET                ;這裡是第一層殼的出口。         

======================================< PART B >============================================ 
1.分析第二層壓縮以及關I性的跳轉。
2.尋找主程式的入口地址。

0167:00580394  8B85AD394400        MOV      EAX,[EBP+004439AD]               
0167:0058039A  50                  PUSH      EAX                             
0167:0058039B  0385FC494400        ADD      EAX,[EBP+004449FC]               
0167:005803A1  59                  POP      ECX                               
0167:005803A2  0BC9                OR        ECX,ECX                           
0167:005803A4  8985E63C4400        MOV      [EBP+00443CE6],EAX               
0167:005803AA  61                  POPAD                                       
0167:005803AB  7508                JNZ      005803B5                         
0167:005803AD  B801000000          MOV      EAX,00000001                     
0167:005803B2  C20C00              RET      000C                             
0167:005803B5  6800000000          PUSH      00000000    ;這裡是第二層的出口,
                                                          ;程式執行到這裡的PUSH後會有一個值,                     
0167:005803BA  C3                  RET                    ;這個值正是主程式的入口,
                                                          ;也是我們脫殼的關I。                     
0167:005803BB  8B85004A4400        MOV      EAX,[EBP+00444A00]               
0167:005803C1  8D8D2A4A4400        LEA      ECX,[EBP+00444A2A]               
0167:005803C7  51                  PUSH      ECX                 

好了,ASPACK已經完會被解壓了。我們可以在這裡手工脫殼,脫殼後生成的檔案可以被W32DASM反彙編。

======================================< PART C >============================================
我們已經徹底搞清楚了ASPACK的解壓過程,下面就要想辦法寫SMC指令了。我們可以用TOPO在程式前加上
150個90或00,以供我們寫指令時用。我的思路是這樣的:首先我們要在第一層壓縮結束指令生成後的某
個地址寫入JMP XXXXX,XXXXX是SMC指令相應部分所在的地址(注:因為有兩層壓縮,所以我的SMC指令要
分成好幾個部分。)然後要在第二層壓縮結束指令生成後的某個地址也寫入JMP XXXXX,最後根據情況用
RET或JMP回到主程式的入口地址。(其實中間還有些細節,我會在後面的指令中一一分析的。)

[580000]是我們用TOPO加入空間後的新地址,我們要在這裡寫入SMC指令。

0167:00584000  JMP      00580000                      ;[580000]是ASPACK的入口地址,先讓它
                                                        ;執行,過會再改。
0167:00584005  MOV      DWORD PTR [00580439],003BDDE9 ;在第一層壓縮結尾
0167:0058400F  MOV      BYTE PTR [0058043D],00        ;處寫入JMP 0058401B       
0167:00584016  JMP      00580007                         
0167:0058401B  MOV      DWORD PTR [005803BA],003C88E9 ;在第二層壓縮結尾
0167:00584025  MOV      BYTE PTR [005803BE],00        ;處寫入JMP 00584047   
0167:0058402C  MOV      WORD PTR [005803BF],9090         
0167:00584035  MOV      DWORD PTR [00580439],C7E900C3 ;這裡是還原第一層壓 結尾處的指令,因   
0167:0058403F  MOV      BYTE PTR [0058043D],FB        ;為;在第二層解壓縮時要用到這些程式碼,
0167:00584046  RET                                    ;若不還原就會當機。   

0167:00584047  MOV      WORD PTR [004F84BB],01B0      ;下面的指令就是向完成解壓後的主程式裡   
0167:00584050  MOV      BYTE PTR [004F84BD],EB        ;寫破解程式碼,寫完後用RET退出第二層壓縮。   
0167:00584057  MOV      WORD PTR [004F84EF],01B0      ;繼續執行主程式。
0167:00584060  MOV      BYTE PTR [004F84F1],EB           
0167:00584067  MOV      BYTE PTR [004F85FF],EB           
0167:0058406E  MOV      WORD PTR [0050435A],00B0         
0167:00584077  MOV      BYTE PTR [0050435C],EB           
0167:0058407E  RET                                   

[後記]

    我脫殼不太好,記得我以前脫SafeCln3.02時老是出錯,在WIN98第二版上脫的檔案在第一版上不能用,
    我懷疑是IMPORT表定位有錯。哪位大哥脫殼比較好,教教小弟吧。我的QQ:17525661
   
               
        祝各位在新的一年裡身體健康! 工作順利! 萬事如意!

                                                                                                            gfh[CCG]
                                            2001年1月19日

相關文章