• 标 题:SMC技术在破解WINDOWS优化大师3.2A中的运用。 (8千字)
  • 作 者:gfh[CCG]
  • 时 间:2001-1-20 0:33:23
  • 链 接:http://bbs.pediy.com

SMC技术在破解WINDOWS优化大师3.2A中的运用

[声明]

    我写文章的目的是为了交流技术,希望大家在转载时能保持文章的完整性。
     

   
[前言]
 
      这是本人在看雪论坛是发表的第一篇破解教程,写的不好,请多原谅!
      其实,这是我在破解WINDOWS优化大师3.2A时用到的技术,当时我并不知
      道已经用ANTI-ASPACK0.2可以脱掉它,我用FI也查不到它的壳,所以我
      只有手工脱壳。这个软件被脱壳后是很好破解的。所在我在这里只谈论如
      何写SMC指令,没谈到如何破解它。

PART A:分析第一层压缩。
PART B:分析第二层压缩。
PART C:写SMC指令。 
       
======================================< PART A >============================================   
1.分析第一层压缩以及关鍵性的跳转。
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.分析第二层压缩以及关鍵性的跳转。
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                    ;这个值正是主程序的入口,
                                                          ;也是我们脱壳的关鍵。                     
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日