Board logo

标题: 3ast破解教程--1 [打印本页]

作者: chowfaye    时间: 2008-9-29 10:03     标题: 3ast破解教程--1

自己做得语音教程,不是太好,还请见谅了。
以下是密码:
www.3ast.com.cn
希望大家多支持下我们的站。



                                                                    
                                                                     
                                                                           ★★★★★★★★★★★★★★★★★
                                                                                          破 解 系 列
                                                                                               3AST
                                                                                    WWW.3AST.COM.CN  
                                                              ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
                                          
                       
   【文章标题】: 破解前的准备
   【文章作者】: DoubleW
   【操作平台】: WinXP SP3
   【录制环境】:1280*800
   【作者声明】: 仅供技术交流……
   【本次要点】:破解工具的认识:PEID,OLLyDBG,IDA,ImportREC,Keymaker;
        壳的介绍;脱壳过程。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   【详细过程】

破解工具:


   PEID:
    PEID 是一款查壳软件,可以查出目前大部分的压缩壳,加密壳,可执行文件所使用的编译器等等,是破解所需的主要工具之一。

   OllyDBG:
    OllyDbg 也就是高手们常说的 OD 了,是一种具有可视化界面的 32 位汇编-分析调试器。现在国内一般用的是OllyICE,是OD的汉化版本。是破解所需的主要工具之一。

    附上OD常用的快捷键:

    Ctrl+F2 - 重启程序,即重新启动被调试程序。如果当前没有调试的程序,OllyDbg会运行历史列表[history list]中的第一个程序。程序重启后,将会删除所有内存断点和硬件断点。
    Alt+F2 - 关闭,即关闭被调试程序。如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。
    F7 - 单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。如果当前命令是是含有REP前缀,则只执行一次重复操作。
    Shift+F7 - 与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理
    Ctrl+F7 - 自动步入,在所有的函数调用中一条一条地执行命令(就像您按住F7键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。每次单步步入,OllyDbg都会更新所有的窗口。所以为了提高自动步入的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步入。
    F8 - 单步步过到下一条命令。如果当前命令是一个函数,则一次执行完这个函数(除非这个函数内部包含断点,或发生了异常)。如果当前命令是含有REP前缀,则会执行完重复操作,并停在下一条命令上。
    Shift+F8 - 与F8相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步过被调试程序指定的异常处理。
    Ctrl+F8 - 自动步过,一条一条的执行命令,但并不进入函数调用内部(就像您按住F8键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步过过程都会停止。每次单步步过,OllyDbg都会更新所有的窗口。所以为了提高自动步过的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步过。
    F9 - 让程序继续执行。
    Shift+F9 - 与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
    Ctrl+F9 - 执行直到返回,跟踪程序直到遇到返回,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条命令执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
    Alt+F9 - 执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
    Esc - 如果当前处于自动运行或跟踪状态,则停止自动运行或跟踪;如果CPU显示的是跟踪数据,则显示真实数据。
    回车键 - 将选中的命令添加到命令历史[command history]中,如果当前命令是一个跳转、函数或者是转换表的一个部分,则进入到目的地址。
    退格键 - 移除选中部分的自动分析信息。如果分析器将代码误识别为数据,这个快捷键就非常有用。
    F4 -执行到所选行,在首个选择的命令上设置一次性断点,然后继续执行调试程序,直到OllyDbg捕获到异常或者停止在该断点上。在程序执行到该命令之前,该一次性断点一直有效。如有必要,可在断点窗口[Breakpoints window]中删除它。
    Shift+F4 -设置记录断点(一种条件断点,当条件满足时一些表达式的值会记录下来)。
    Ctrl+F -开始命令搜索。
    Ctrl+A -分析当前模块的代码段。
    Ctrl+G -转到某地址。该命令将弹出输入地址或表达式的窗口。该命令不会修改 EIP。
    Ctrl+N - 打开当前模块的名称(标签)列表。
    空格[Space] - 修改命令。您可在显示对话框中以汇编语言修改实际指令或输入新指令,这些指令将替换实际代码,您也可以在想要修改的指令处双击鼠标。
    Ctrl+C -复制所选内容到剪贴板。复制时会简单地按列宽截断不可见内容,如果希望排除不需要的列,可把这些列的宽度调整到最小。



   IDA:
    IDA 是一款相当优秀的静态反汇编软件,也可以说是目前为止最强大的静态反汇编软件。
   
   ImportREC:
    ImportREC 是输入表重建工具,一般程序在脱壳之后输入表受到破坏,需要用这个工具来修复,也是破解所需的主要工具之一。

   Keymaker:
    Keymaker 就是大名鼎鼎的注册机编写器了。使用它可以在不用跟踪复杂算法的前提下写出程序的注册机。
   
   当然破解可能还需要很多的软件,像LoadPE,Peditor,Filemon,Regmon,W32dasm,C32Asm,WinHex,UEdit32……
   
   除了上面的软件之外,还有两个相当好用那个的东西,就是微软的 MSDN 帮助文档和 Delphi 的帮助文档,这对我们破解的帮助是无法估量的,当然也是提高我们编程能力的利器,希望大家没事的时候多看看。


脱壳简介:
     
   壳是一段专门用于压缩可执行文件体积或保护软件不被非法修改或反编译的代码。他们一般都是先于程序运行的,拿到控制权,然后完成他们保护软件的任务。

   壳按照其加壳的目的和作用可以分为两类,一类是压缩壳,一类是加密壳。
    压缩壳主要是为了减少PE文件的体积。这类壳像ASPACK,UPX,PECompact等等。
    加密壳主要是为了保护程序,使程序不能被轻易的反编译,跟踪及修改。加壳后程序体积大小不一定。这类壳像ASProctect,Armadillo,ExECryptor等等。
   
    现在,压缩壳与加密壳的界限已经不是那么的明显,一个壳可能既有压缩的功能,又有加密的功能。

    脱壳的方法主要有:单步跟踪法;内存镜像法;ESP定律法;异常处理法;SFX法等等。
    单步跟踪法是最麻烦,但也是最好用的方法。
    内存镜像法;ESP定律法;异常定位法;这三种比较简单。
    SFX法最简单,但不一定好用。

   下面我们通过两个实例来教大家来认识并掌握脱壳这门技术。

   首先要说明一下,在大家看以下教程前,已默认大家都有一定的汇编基础,如果大家对汇编不是很了解,推荐大家看两本书:清华大学出版社出版 王爽 《汇编语言》以及 电子工业出版社 《Intel汇编语言程序设计》,这两本书都很好。
   
   一个压缩壳,是经典的ASPack 2.12 -> Alexey Solodovnikov压缩壳。

   首先是ASPack的壳,先用PEID查壳,是ASPack 2.12 -> Alexey Solodovnikov的壳,我们用单步跟踪法来脱壳,因为这是最基本的方法,其他方法或多或少的都要依赖于它。用OD载入,OD 问我们是否分析,我们选择否,然后代码停留在以下位置:

01013001 >  60              pushad                //停在这。
01013002    E8 03000000     call    ASPack.0101300A        //F7过。
01013007  - E9 EB045D45     jmp     465E34F7
0101300C    55              push    ebp
0101300D    C3              retn
0101300E    E8 01000000     call    ASPack.01013014
01013013    EB 5D           jmp     short ASPack.01013072
01013015    BB EDFFFFFF     mov     ebx, -13
0101301A    03DD            add     ebx, ebp
0101301C    81EB 00300100   sub     ebx, 13000
01013022    83BD 22040000 0>cmp     dword ptr ss:[ebp+422], 0
01013029    899D 22040000   mov     ss:[ebp+422], ebx
0101302F    0F85 65030000   jnz     ASPack.0101339A
01013035    8D85 2E040000   lea     eax, ss:[ebp+42E]
0101303B    50              push    eax
0101303C    FF95 4D0F0000   call    near ss:[ebp+F4D]                ; USP10.74006600
01013042    8985 26040000   mov     ss:[ebp+426], eax
01013048    8BF8            mov     edi, eax
0101304A    8D5D 5E         lea     ebx, ss:[ebp+5E]
0101304D    53              push    ebx
0101304E    50              push    eax

   因为压缩壳以压缩为目的,所以,他给我们的陷阱不是太多,主要的技巧是让程序一直往前单步运行,直到OEP。
   (在OD中F8是单步运行,F7是单步跟入,F2是下断点,F4是运行到光标所在位置。这几个命令常用,希望你在看完本教程后,能够熟练的应用。)
   当载入程序后,有一些jmp的变形call,如果用 F8 单步的话,就会使程序运行,所以有些变形call我们要用 F7 过,判断的依据也很简单,像下面的:

01013001 >  60              pushad            
01013002    E8 03000000     call    ASPack.0101300A        //F7过,这里很明显是jmp的变形。
01013007  - E9 EB045D45     jmp     465E34F7
0101300C    55              push    ebp
0101300D    C3              retn
0101300E    E8 01000000     call    ASPack.01013014

   下面的情况我们用F4跳过

01013120      8BC8            mov     ecx, eax
01013122      83E9 06         sub     ecx, 6
01013125      8BB5 52010000   mov     esi, ss:[ebp+152]
0101312B      33DB            xor     ebx, ebx
0101312D      0BC9            or      ecx, ecx
0101312F      74 2E           je      short ASPack.0101315F
01013131      78 2C           js      short ASPack.0101315F
01013133      AC              lods    byte ptr ds:[esi]
01013134      3C E8           cmp     al, 0E8
01013136      74 0A           je      short ASPack.01013142
01013138      EB 00           jmp     short ASPack.0101313A
0101313A      3C E9           cmp     al, 0E9
0101313C      74 04           je      short ASPack.01013142
0101313E      43              inc     ebx
0101313F      49              dec     ecx
01013140    ^ EB EB           jmp     short ASPack.0101312D            ; 这里有一个往上的跳转,我们跳过。
01013142      8B06            mov     eax, ds:[esi]
01013144      EB 00           jmp     short ASPack.01013146
01013146      803E 06         cmp     byte ptr ds:[esi], 6
01013149    ^ 75 F3           jnz     short ASPack.0101313E            ; 同上面一样,用F4跳过。
0101314B      24 00           and     al, 0
0101314D      C1C0 18         rol     eax, 18
01013150      2BC3            sub     eax, ebx
01013152      8906            mov     ds:[esi], eax
01013154      83C3 05         add     ebx, 5
01013157      83C6 04         add     esi, 4
0101315A      83E9 05         sub     ecx, 5
0101315D    ^ EB CE           jmp     short ASPack.0101312D            ; 同上,F4跳过。


   以下就是程序的OEP了。
   有人可能会问,你怎么知道下面的就是OEP了?其实现在的程序大部分都是VC++,VB,DELPHI,汇编语言编写的,他们的OEP除都是有一些特有的特征的。像vc++程序在启动时一般都会调用GetModuleHandleA(W),GetStartupInfoA(W),GetCommandLineA(W),GetVersion等,我们都是可以通过这些标志特征来定位OEP的。当然,最重要的还是个人的感觉,壳脱的多了,自然就有哪些特别的感觉。

0100739D      6A 70           push    70                               ; 这里就是程序的原始入口点OEP了。在这里脱壳。
0100739F      68 98180001     push    ASPack.01001898
010073A4      E8 BF010000     call    ASPack.01007568
010073A9      33DB            xor     ebx, ebx
010073AB      53              push    ebx
010073AC      8B3D CC100001   mov     edi, ds:[10010CC]                ; kernel32.GetModuleHandleA                       //VC++启动部分的函数。
010073B2      FFD7            call    near edi                         ; ntdll.7C930208
010073B4      66:8138 4D5A    cmp     word ptr ds:[eax], 5A4D
010073B9      75 1F           jnz     short ASPack.010073DA
010073BB      8B48 3C         mov     ecx, ds:[eax+3C]
010073BE      03C8            add     ecx, eax

省略若干行……

010074DE      895D AC         mov     ss:[ebp-54], ebx
010074E1      8D45 80         lea     eax, ss:[ebp-80]
010074E4      50              push    eax
010074E5      FF15 D0100001   call    near ds:[10010D0]                ; kernel32.GetStartupInfoA         //VC++启动部分的函数。
010074EB      F645 AC 01      test    byte ptr ss:[ebp-54], 1
010074EF      74 11           je      short ASPack.01007502
010074F1      0FB745 B0       movzx   eax, word ptr ss:[ebp-50]

  我们查下壳,已经没有壳了,Microsoft Visual C++ 7.0 Method2 [调试],看下是否可以运行。
  可以运行。

   下面我们看下其他的方法:内存镜像法和ESP定律法。
   这两种方法比较简单。

   内存镜像法,首先是打开内存,可以用快捷键ALT+M,然后查找当前程序的资源段,即.rsrc段,然后F2下断,F9运行,在打开内存,代码段,即.text段,F2下断,F9运行,一般隔着OEP就不是很远了。
   
Memory map, 条目 26
地址=01000000
大小=00001000 (4096.)
属主=ASPack   01000000 (自身)
区段=
包含=PE 文件头
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 27
地址=01001000
大小=00008000 (32768.)
属主=ASPack   01000000
区段=.text
包含=代码
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 28
地址=01009000
大小=00002000 (8192.)
属主=ASPack   01000000
区段=.data
包含=数据
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 29
地址=0100B000
大小=00008000 (32768.)
属主=ASPack   01000000
区段=.rsrc
包含=资源
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 30
地址=01013000
大小=00008000 (32768.)
属主=ASPack   01000000
区段=.aspack
包含=SFX,输入表,重定位
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 31
地址=0101B000
大小=00001000 (4096.)
属主=ASPack   01000000
区段=.adata
类型=Imag 01001002
访问=R
初始访问=RWE


   ESP定律法,先说下原理:ESP定律的基本概念就是遵循堆栈平衡原理,被加了壳程序(主要是压缩壳),在运行之初一般是先用PUSHAD指令将寄存器的初始值压入栈中,保护寄存器的值,然后通过一个CALL(当然,这个CALL不是那些用来忽悠我们的CALL,而是正儿八经的CALL,他指向壳的代码)来调用 壳 这个子程序的代码,壳的子程序的作用其实就是用来解压被他压缩的源程序,也就是解压我们正在运行的程序的源代码,当壳释放完程序原本的指令代码后,它的工作也就做完了,但程序真正的入口点OEP出现之前一定要恢复寄存器的初始值,使各寄存器出栈,ESP指回PUSHAD之前的值,保持堆栈平衡,就像你编写汇编程序时,有call,必须要有一个ret返回一样。而我们要利用的就是这个,我们在程序要访问这些堆栈,从而恢复原来寄存器的值,准备跳向OEP时,让OD帮我们断下来,从而达到找到OEP 的目的。


下面是方法:
程序载入之后,F8单步,同时观察寄存器窗口,待ESP寄存器变红,在下面的命令处输入  hr *********
然后回车,运行程序……

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   【经验总结】
   
   主要是破解所需要的软件的介绍,在这里我们特别要注意OD的使用,特别是 OD 的常用的快捷键, 它可以提高我们的效率。
   然后是壳的认识,以及手动脱壳。

   如果还有什么不太明白的地方,可以到

   http://www.3ast.com.cn

   来找我,我们一起探讨。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   【作者声明】: 仅供技术交流,请勿用于非法目的!转载请注明出处,并保证文章的完整性!
作者: chowfaye    时间: 2008-9-29 10:11

教程我就不上传了,又需要的我传给他
作者: 柔肠寸断    时间: 2008-9-29 10:11

有动画不??
作者: chowfaye    时间: 2008-9-29 10:13

有,将近十兆不大方便,有需要的我可以用qq传给他
作者: chowfaye    时间: 2008-9-29 10:21

纳米盘:
http下载地址,粘贴到地址栏即可。
http://www.namipan.com/d/%E7%A0% ... 4acbce7a7c6f2559500
作者: Rapam    时间: 2008-9-29 10:47

有动画最好了,在电脑上看累眼睛。
学得再好。成近视了也没啥意思
作者: yixi886    时间: 2009-6-20 18:20

看帖回帖是美德啊,呵呵




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com/) Powered by Discuz! 7.2