找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3070|回复: 5

[转贴]解密基础知识入门

[复制链接]
发表于 2006-10-14 22:01:51 | 显示全部楼层 |阅读模式
<font face="宋体">标 题: 解密基础知识入门 <br />作 者: kanxue<br />时 间: 2006-09-12,20:55 <br />链 接: http://bbs&#46;pediy&#46 ... ;amp;threadid=31840<br /><br />    看雪学院建站己第7个年头了,特别是看雪技术论坛汇集了众多密界一流好手,共原创了5000余篇文章!涵盖了加解密领域的许多方面,给大家研究加解密提供了大量研究资料。文章过多也带来一个负面效应,那就是新手来论坛后,学习时不知该看哪些文章。因此本帖将一些论坛优秀文章整理一个纲要,以帮助新手尽快入门。<br /><br /></font><font face="宋体"><b>  为了新手交流方便,现准备将『《加密与解密》』版块打造一个新手交流版块,不管你的问题多么初级,多么简单,都可在这版块交流。当然如果你有《加密与解密》这本书,也欢迎你与其他人交流一些学习心得;如果没书也没关系,你只要参考本帖也一定能入门的。<br /></b><br /><br /> 看雪技术论坛是一个纯技术论坛,我们欢迎你从技术角度阐述问题。我们的目标是让来这里的每一个人,成为计算机高手!这里不是提供注册码的场所!!不是嬉戏灌水的地方!!<br /><br /></font><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>在您发帖之前,请先做以下事情</strong></font></legend> <br />1&#46;如是您第一次发帖,请看  <a href="http://www&#46;pediy&#46;com/BBS/Questions&#46;htm" target="_blank"><font color="#0000cd">提问的智慧</font></a>和 <a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=769" target="_blank"><font color="#0000cd">论坛常见问题</font></a> ——这会提高你的帖子的回复率。<br />2&#46;先在本站提供资料里找答案,如<a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=20227" target="_blank"><font color="#00008b"><b>论坛精华集</b></font></a>,<a href="http://bbs&#46;pediy&#46;com/search&#46;php" target="_blank"><font color="#00008b"><b>论坛搜索</b></font></a>或<a href="http://www&#46;google&#46;com/custom?hl=zh-CN&inlang=zh-CN&ie=GB2312&oe=GB2312&newwindow=1&client=pub-1585618761901261&cof=FORID%3A1%3BGL%3A1%3BBGC%3AFFFFFF%3BT%3A%23000000%3BLC%3A%230000ff%3BVLC%3A%23663399%3BALC%3A%230000ff%3BGALT%3A%23008000%3BGFNT%3A%230000ff%3BGIMP%3A%230000ff%3BDIV%3A%23336699%3BLBGC%3A336699%3BAH%3Acenter%3B&domains=bbs&#46;pediy&#46;com%3Bwww&#46;pediy&#46;com&q=ollydbg&btnG=%CB%D1%CB%F7&sitesearch=www&#46;pediy&#46;com" target="_blank"><font color="#00008b"><b>本站资料库 </b></font><font color="#000000"> </font></a> ——或许就可以把问题解决,不必苦苦等待了。<br />3&#46;使用含义丰富,描述准确的标题。 <br />4&#46;请不要点将,也不要要求私下答复。<br />5&#46;问题解决后,加个简短说明,对你来说不过是几秒钟的时间,但这意味着这是你对帮助者的尊敬,以后再来提问,大家还是会乐意帮助你的。 </fieldset></div> <br />其他一些相关文章:<br /><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>资料</strong></font></legend> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50503&#46;htm" target="_blank"><font color="#00008b"><b>我对菜鸟成长的看法</b></font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/BBS5/pediy50388&#46;htm" target="_blank"><font color="#00008b"><b>学会利用搜索引擎</b></font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50598&#46;htm" target="_blank"><font color="#00008b"><b>关于什么高手和什么摆架子的问题</b></font></a> <br /></fieldset></div><p> <br /><b><font color="#00008b">注:文中所涉及的工具到这下载:<a href="http://www&#46;pediy&#46;com/tools&#46;htm">http://www&#46;pediy&#46;com/tools&#46;htm</a></font></b></p><p><strong><font color="#00008b"></font></strong><p /><p><font face="宋体"><strong>前言</strong> <br /><br />   很多人都想学习解密,这东西刚入门时会让人沉迷进去,可以饭不吃、觉不睡。出现这种现像,也许是解密满足了人们的猎奇心里吧。但掌握这方面技术,对自身的提高确实有好处。可以通过跟踪软件,提高自己的调试技能,并且能了解他人程序思路,使自己写出更好的程序。研究解密技术有助于掌握一些系统底层知识,系统底层知识绝对是构造起大型软件的坚实基础。许多程序发展,都经历了这一锻炼过程的。 而大多数人可能认为解密是一门高深的学问。造成这种原因是以前这方面的技术资料缺乏,从而将“解密”这一技能“神”化了。初学者一般不知从何下手,由于没方向,花费了大量时间和精力,走了不少弯路。这里就给对这方面感兴趣的读者指明一个方向。<br /><br />   讨论前,先了解一下计算机中的程序。高级语言编写的程序,会编译成机器语言在CPU中执行,如Visual C++等。由于机器语言与汇编语言是一一对应的,因此就可将机器语言转化成汇编语言,这个过程称之为反汇编。而汇编语言可能读性是比较好的,这样就可分析程序流程,解析其功能了,这个过程就是解密(俗称破解)。也就是说,解密的基础是建立在汇编语言级别上的,因此想涉足这一领域的朋友,汇编语言一定得学好。汇编语言是大学计算机的必修课,这方面的书籍品种很多,虽然大多书本是以DOS汇编为讲解平台,但对理解汇编指令功能是没影响的。<br /><br /><font color="#008080"><b>建议:在学汇编前,最好先掌握一门高级语言编程,推荐是C语言,这样再学汇编应容易些</b></font> <br /><br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/prg8086&#46;jpg" border="0" /> <br /><br />汇编教学资源:<br /></font></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>汇编资料</strong></font></legend> <br /> http://202&#46;116&#46;65&#46;193/Ncourse/hbyy/ <font color="#00008b"><b>中山大学汇编视频教学 </b></font> <br /> <a href="http://www&#46;pediy&#46;com/tutorial/chap2/Chap2-2&#46;htm" target="_blank"><font color="#00008b"><b>8088 汇编速查手册 </b></font><font color="#000000"> </font></a> <br /> <a href="http://www&#46;pediy&#46;com/tutorial/chap2/Chap2-3&#46;htm" target="_blank"><font color="#00008b"><b>8088 汇编跳转 </b></font><font color="#000000"> </font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/BBS5/pediy50552&#46;htm" target="_blank"><font color="#00008b"><b>商朝子的汇编语言教学 </b></font><font color="#000000"> </font></a> <br /> <a href="http://www&#46;pediy&#46;com/tutorial/chap2/Chap2-4&#46;htm" target="_blank"><font color="#00008b"><b>浮点指令 </b></font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50039&#46;htm" target="_blank"><font color="#00008b"><b>hume的浮点运算简介</b></font><font color="#000000"> </font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/BBS5/pediy50098&#46;htm" target="_blank"><font color="#00008b"><b>32位代码优化常识 </b></font><font color="#000000"> </font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/BBS6/pediy6095&#46;htm" target="_blank"><font color="#00008b"><b>汇编语言中&quot;[]&quot;的用法</b></font><font color="#000000"> </font></a> <br /> <a href="http://www&#46;pediy&#46;com/bbshtml/bbs6/pediy6066&#46;htm" target="_blank"><font color="#00008b"><b>test和cmp一个很基础的话题</b></font><font color="#000000"> </font></a> <br /></fieldset></div><p><br />中山大学的教程,学习时一天看一级,一级看2-3次为好,并随时做好笔记。一月下来就会有效果的。学完后可以到  <br />http://www&#46;315safe&# ... =134&amp;page=2再巩固下汇编。<br /><br />   等汇编学好了,此时一般的破解文章己能看懂了,但为了水平提高的更快些,建议再掌握Win32编程。Win32程序设计就是API方式的Windows编程,学习Windows API将使您更深入地了解Windows工作方式。此类书籍有Charles Petzold著的《Windows程序设计》(以VC来讲解)。另一本是罗云彬著的《Windows环境下32位汇编语言程序设计》,它以MASM汇编为讲解平台。<br /><br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/Petzold&#46;jpg" border="0" /> <br /><br /></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>Win32编程</strong></font></legend> <br /><a href="http://bbs&#46;pediy&#46;com/upload/bbs/Newbie/Windows32&#46;rar" target="_blank"><font color="#00008b"><b>《Windows程序设计》</b></font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=14164" target="_blank"><font color="#00008b"><b>介绍一些经典的网站和书籍 </b></font><font color="#000000"> </font></a> <br /></fieldset></div><p><br /><br />有了上面这些基础,你就能看懂论坛中的一些文章了,也能看懂《 加密与解密(第二版) 》这本书了。 <br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/jm2&#46;gif" border="0" /> <br /><br />   学习解密其实很累的,需花费大量的时间,而且经常会碰壁,三五天毫无进展是极为平常的事情。这时你可能有点想退却,其实你不要着急,只要你认真学习,成功就在眼前。没有人是生来就什么都会的,如果你有问题,就大胆的去问你周围的人。学解密的秘诀就是勤奋+执着!记住并能做到这两点,你会变得很优秀的。<br /><br />   等你解密入门后,建议再看看Matt Pietrek、Jeffrey Ritcher等大师的专著,这些书是每个程序员都应该阅读的:《Windows 95 System Programming Secrets》(中文译名《Windows 95 系統程式设计大奧秘》),《windows高级编程指南》,《Windows2000编程技术内幕》,《Win32系统编程—Windows 2000应用程序开发指南》等。这样,你就对系统底层有一定的了解了。到了这个水平后,就可朝软件加密这块发展了,例如编写自己的加壳软件等。<br /><br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/win95sys&#46;jpg" border="0" /> <img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/A03014332a&#46;jpg" border="0" /> <img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/undocument&#46;jpg" border="0" /> <br /><br />   软件的加密与解密是一个迷人的研究领域,它几乎可以与任意一种计算机技术紧密结合——密码学、程序设计语言、操作系统、数据结构。而由于这样或者那样的原因,对于这一领域的关注程度一直还处于低温状态。而这两本书相信会为更多对知识怀有渴望的朋友多开辟一条走向这个领域的道路,并且进而推动这个领域的不断发展。<br /></p><p /><hr /><p /><p><font face="宋体"><strong>第一课 逆向分析基础知识<br /><br />1&#46;1 调用约定</strong> <br /><br />   在分析汇编代码时总是要遇到无数的Call,对于这些Call,尽量要根据Call之前传递的参数和Call的返回值来判断Call的功能。传递参数的工作必须由函数调用者和函数本身来协调,计算机提供了一种被称为栈的数据结构来支持参数传递。<br /><br />   当参数个数多于一个时,按照什么顺序把参数压入堆栈。函数调用后,由谁来把堆栈恢复。在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:<br /><br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/call&#46;gif" border="0" /> <br /><br /><br />【例】按__stdcall约定调用函数test2(Par1, Par2)   <br /><br /><br />        push par2  ; 参数2<br />        push par1  ; 参数1<br />        call test2;<br />        {<br />             push ebp                    ; 保护现场原先的EBP指针<br />             mov  ebp, esp               ; 设置新的EBP指针,指向栈顶<br />             mov  eax, [ebp+0C]    ; 调用参数2<br />             mov  ebx, [ebp+08]          ; 调用参数1<br />             sub  esp, 8           ; 若函数要用局部变量,则要在堆栈中留出点空间<br />             …<br />             add  esp, 8                 ; 释放局部变量占用的堆栈<br />             pop  ebp                    ; 恢复现场的ebp指针<br />             ret  8                   ; 返回(相当于ret; add esp,8)<br />        }<br /><br /><br />其堆栈调用示意图:<br /><br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/faq/callesp&#46;gif" border="0" /> <br /><br /><br /><b>1&#46;2 局部变量</b> <br /><br />   在子程序内部说明的变量称为局部变量,局部变量的作用域是其所在的子程序。从汇编角度来看,局部变量就是一个临时堆栈缓存,用完释放。<br />例如这个实例:</font><a href="http://bbs&#46;pediy&#46;com/upload/bbs/faq/local&#46;zip" target="_blank"><font face="宋体" color="#00008b">附件:local&#46;zip</font></a><font face="宋体"> <br /><br />其反汇编代码如下(红体字为局部变量):<br /><br />00401000 &gt;/$  6A 04         push    4                                ; /Arg2 = 00000004<br />00401002  |&#46;  6A 03         push    3                                ; |Arg1 = 00000003<br />00401004  |&#46;  E8 16000000   call    0040101F                         ; Add&#46;0040101F<br />00401009  |&#46;  8BD8          mov     ebx, eax<br />0040100B  |&#46;  6A 00         push    0                                ; /ExitCode = 0<br />0040100D  &#46;  FF15 00204000 call    [&lt;&amp;KERNEL32&#46;ExitProcess&gt;]        ; ExitProcess<br /><br /><br />0040101F  /$  55            push    ebp                              ;  保护现场原先的EBP指针<br />00401020  |&#46;  8BEC          mov     ebp, esp                         ;  设置新的EBP指针,指向栈顶<br />00401022  |&#46;  83EC 04       sub     esp, 4                           ;  分配局部变量所有空间<br />00401025  |&#46;  8B45 0C       mov     eax, [ebp+C]                     ;  调用参数2<br />00401028  |&#46;  8B5D 08       mov     ebx, [ebp+8]                     ;  调用参数1<br />0040102B  |&#46;  895D FC       mov     <font color="#ff0000">[ebp-4]</font> , ebx                     ;  参数1放局部变量里<br />0040102E  |&#46;  0345 FC       add     eax,<font color="#ff0000">[ebp-4]</font>                     ;  参数2与局部变量相加<br />00401031  |&#46;  83C4 04       add     esp, 4                           ;  释放局部变量所有空间<br />00401034  |&#46;  5D            pop     ebp                              ;  恢复现场的ebp指针<br />00401035  &#46;  C2 0800       retn    8<br /><br /><br /><b>1&#46;3 返回值</b> <br /><br />   在调试程序时,不要见Call就跟进,在Call之前所做的所有PUSH动作以及对寄存器的操作都可能是在给函数传递参数,而函数的返回值一般都放在EAX里面,当然这个值可能是一个指针,指向一个数据结构。从汇编角度来看,主要有如下形式:<br /><br />1)通过寄存器返回函数值;<br />2)通过参数按引用方式返回函数值;<br />3)通过全局变量返回函数值;<br />4)通过处理器标志返回函数值;<br />      一般情况下,由retrun操作符返回的值放在EAX寄存器之中,如果结果超过这个寄存器的位容量,那么该结果的高32位会加载到EDX寄存器中。 如果返回一个含有几百个字节的结构或者一个近似大小的对象,编译器会在不告诉程序的情况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。<br /><br /><br /><b>1&#46;4 启动函数</b> <br /><br />   在编写Win32应用程序时,都必须在源码里实现一个WinMain函数。但Windows程序执行并不是从WinMain函数开始的,首先被执行的是启动函数相关代码,这段代码是编译器生成的。启动代码完成初始化进程,再调用WinMain。标准编译器通常包含启动代码在内的库文件源码,例如Visual C++中,启动代码存放在CRTSRCcrt0&#46;c文件中。<br />   所有的C/C++运行时启动函数的作用基本都是相同的:检索指向新进程的命令行指针,检索指向新进程的环境变量指针,全局变量初始化,内存堆栈初始化等。当所有的初始化操作完毕后,启动函数就调用应用程序的进入点函数。<br />   调用WinMain如下所示:<br />GetStartupInfo (&amp;StartupInfo);<br />Int nMainRetVal = WinMain(GetModuleHandle(NULL),NULL,pszCommandLineAnsi,( StartupInfo&#46;dwFlags&amp;STARTF_USESHOWWINDOW)?StartupInfo&#46;wShowWindow:SW__SHOWDEFAULT);<br />   当进入点返回时,启动函数便调用C运行库期的exit函数,将返回值(nMainRetVal)传递给它,进行一些必要处理,最后调用系统函数ExitProcess退出。 其他一些编译器,如Delphi、BorLand C++开发包中都有相应的启动代码。<br />      在绝大数情况下,我们对启动代码并不需要关心。 对于逆向分析人员来说,首要的任务是找到Winmain函数。 <br /><br />WinMain函数原型如下:<br />int WINAPI WinMain(<br />      HINSTANCE hInstance,     // 当前实例的句柄<br />      HINSTANCE hPrevInstance, // 前一个实例的句柄 <br />      LPSTR lpCmdLine,         // 命令行的指针 <br />      int nCmdShow             // 窗口的显示状态<br /> ); <br />    其中参数hInstance一般通过GetModuleHandleA函数进行获取的,这对识别WinMain函数有些帮助。另外,对WinMain的调用通常放在启动函数代码结尾部分,后面通常跟着诸如exit或XcptFilter之内的两、三个函数。例如下面这段代码:<br />&#46;text:004010DC                 push    eax             ; nShowCmd<br />&#46;text:004010DD                 push    [ebp+lpCmdLine] ; lpCmdLine<br />&#46;text:004010E0                 push    esi             ; hPrevInstance<br />&#46;text:004010E1                 push    esi             ; lpModuleName<br />&#46;text:004010E2                 call    ds:GetModuleHandleA<br />&#46;text:004010E8                 push    eax             ; hInstance<br />&#46;text:004010E9                 call    WinMain(x,x,x,x)<br />&#46;text:004010EE                 mov     [ebp+var_60], eax<br />&#46;text:004010F1                 push    eax             ; int<br />&#46;text:004010F2                 call    _exit<br /><br />   许多开发人员可以得到启动源代码的情况下对启动代码进行修改,这样,程序的执行可能不是从WinMain开始,而是从任何其他的函数开始。<br /><br /><b>1&#46;5 API函数</b> <br /><br />   现在很多讲Windows程序设计的书都是讲基于MFC库和OWL库的Windows设计,对Windows实现的细节都鲜有讨论,而调试程序都是和系统底层打交道,所以有必要掌握一些Win32 API函数的知识,这样我们可快捷地找出程序调用错在哪?是哪个参数出了问题。<br />   Windows程序模块包括KERNEL、USER和GDI,其中KERNEL完成内存管理、程序的装人与执行和任务调度等功能,它需要调用原MS―DOS中的文件管理、磁盘输入输出和程序执行等功能;USER是一个程序库,它用来对声音、时钟、鼠标器及键盘输入等操作进行管理;GDI是一功能十分丰富的子程序库,它提供了图形与文字输出、图象操作和窗口管理等各种与显示和打印有关的功能。上述KERNEL、USER和GDI模块中的库函数可被应用程序调用,也可被其他程序模块调用。把包含库函数的模块称为输出者(export)。你应明白为什么跟踪软件时经常在KERNEL32!&#46;text和USER32&#46;text等系统领空转的问题吧。<br /><br />   这里列出几个经常碰到的Win 32 API函数,它们都是存在Windows系统核心文件KERNEL32&#46;DLL中和视窗管理文件USER32&#46;DLL中。<br />Windows函数是区分字符集的:A表示ANSI,W表示Wide,即Unicode (Wide character-set),前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。Windows的所有与字符有关的函数都提供两种方式的版本。尽管你编程时使用GetWindowText,但实际上编译程序会根据设置自动调用GetWindowTextA或GetWindowTextW。函数的最后一个字母告诉我们函数是使用单字节还是双字节字符串。<br /><br />1、 Hmemcpy函数<br />void hmemcpy(hpvDest, hpvSource, cbCopy) <br />void _huge* hpvDest; // 目的数据地址 <br />const void _huge* hpvSource; // 源数据地址 <br />long cbCopy; // 数据大小 (Bytes) <br />这个函数在KERNEL32&#46;DLL中,它很常用,俗称万能断点,但一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。但的确它是很有用的!有意思的是它执行的操作很简单,只是将内存中的一块数据拷贝到另一个地方。<br />注意:此函数只在Windows 9x系统上有效,在Win NT/2K系统上相关的函数是memcpy,但在Win NT/2K上不同于Windows 9x上,很少再调用memcpy来处理数据了,用此函数设断基本上什么也拦不住。<br /><br />2、 GetWindowText函数<br />此函数在USER32&#46;DLL用户模块中,它的作用是复制指定窗口中的字符到缓冲区。函数原型:<br />int GetWindowText(<br />HWND hWnd//欲获取文字的那个窗口的句柄 <br />LPTSTR lpString //预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入 <br />int nMaxCount//lpString缓冲区的长度<br />);<br />16位:GetWindowText<br />32位:GetWindowTextA,GetWindowTextW<br /><br />3、 GetDlgItemText<br />此函数在USER32&#46;DLL用户模块中,它的作用是返回对话框中某一个窗口的标题或文字。函数原型:<br />UINT GetDlgItemText(<br />HWND hDlg, // 对话框句柄<br />int nIDDlgItem, //控制标识符<br />LPTSTR lpString, / 预定义的一个字符缓冲区<br />int nMaxCount// 字符缓冲区的长度<br />);<br />16位:GetDlgItemText<br />32位:GetDlgItemTextA,GetDlgItemTextW<br /><br />4、 MessageBox函数<br />此函数是在USER32&#46;DLL用户模块中,它的作用创建、显示和操作信息框。函数原型:<br />int MessageBox(<br />HWND hWnd, //窗口句柄<br />LPCTSTR lpText, // 信息框中文字的地址<br />LPCTSTR lpCaption, // 信息框标题地址<br />UINT uType // 信息框类型<br />);<br />16位:MessageBox<br />32位:MessageBoxA,MessageBoxW<br /><br />学习API函数最好的资料就是《Windows程序设计》这本书,下面列出其他一些参考资料:<br /></font></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>API函数资料</strong></font></legend> <br /><a href="http://spiff&#46;tripnet&#46;se/~iczelion/files/win32api&#46;zip" target="_blank"><font color="#00008b"><b>Win32 API reference(推荐)</b></font><font color="#000000"> </font></a> <br /><a href="http://www&#46;pediy&#46;com/document/API32&#46;CHM" target="_blank"><font color="#00008b"><b>Windows API 函数手册(774个Win32函数,中文) </b></font><font color="#000000"> </font></a> <br /><a href="http://www&#46;pediy&#46;com/tutorial/chap5/Chap5-1&#46;htm" target="_blank"><font color="#00008b"><b>常见断点列表 </b></font><font color="#000000"> </font></a> <br /></fieldset></div><p /><hr /><p /><p><font face="宋体"><strong>第三课 动态分析技术<br /><br /></strong>   所谓动态分析是利用调试器,如OllyDBG一步一步地单步执行软件。常见的调试器有SoftICE,OllyDBG(简称OD)等。SoftICE是一款经典的调试工具,运行在Ring0级,可以调试驱动。但平时调试的程序都是Ring3级,因此推荐大家用OllyDBG,这款工具上手容易,功能十分强大,现在论坛上的文章基本都是用OllyDBG来讲解的。 <br /><br /><b>3&#46;1 OllyDBG调试器</b><br /><img src="http://bbs&#46;pediy&#46;com/upload/2006/20/image/ollydbg&#46;gif" border="0" /> <br /><br /></font></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>OllyDBG工具下载</strong></font></legend> <br /><a href="http://www&#46;pediy&#46;com/tools/Debuggers/ollydbg/OllyICE&#46;rar" target="_blank"><font color="#00008b"><b>点击此处下载OD </b></font><font color="#000000"> </font></a> <br /></fieldset></div><p><br /><br /></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>CCDebuger的OllyDBG入门教学</strong></font></legend> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=21284" target="_blank"><font color="#00008b"><b>OllyDBG 入门系列(一)-认识OllyDBG</b></font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=21308" target="_blank"><font color="#00008b"><b>OllyDBG 入门系列(二)-字串参考</b></font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=21330" target="_blank"><font color="#00008b"><b>OllyDBG 入门系列(三)-函数参考</b></font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=21378" target="_blank"><font color="#00008b"><b>OllyDBG 入门系列(四)-内存断点</b></font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=21532" target="_blank"><font color="#00008b"><b>OllyDBG 入门系列(五)-消息断点及 RUN 跟踪</b></font></a> <br /></fieldset></div><p><br /><br /></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>名词解释</strong></font></legend> <br />1&#46;所谓领空,实际上是指:在某一时刻,CPU 的 CS:IP(EIP) 所指向的某一段代码的所有者所在的区域。<br /><br /></fieldset></div><p><br /><br /><b>3&#46;2 Olldbg常见问题</b><br /><br />Q: OD中如何运行到光标所在处?<br />A: 将光标移到目标位置,按F4&#46;<br /><br />Q: 如何用OD修改可执行程序?<br />A:直接在反汇编代码区更改,这时可以使用汇编代码更改,然后选中修改后的汇编代码,右击--&gt;复制到可执行文件--&gt;保存文件&#46;<br /><br />Q:OD为什么删除了断点,重新加载的时候,这些断点都会重新出现<br />A:设置ollydbg&#46;ini,将配制文件里改成如下:Backup UDD files=1 <br /><br />Q:如何还原到OD到分析前的状态?<br />A:右键 分析/从模块中删除扫描<br /><br />Q:什么是UDD?<br />A:OllyDbg 把所有程序或模块相关的信息保存至单独的文件中,并在模块重新加载时继续使用。这些信息包括了标签、注释、断点、监视、分析数据、条件等等<br /><br />Q:OD的数据窗口显示一个下划线,是什么意思?<br />A:重定位加下划线[Underline fixups],几乎所有的DLL和一部分程序都包含重定位,这样就可以在内存中的不同基地址加载模块了。当该项开启时,CPU反汇编窗口或CPU数据窗口中的重定位地址都将添加下划线。(xing_xsz)<br /><br />Q:如果已经知道某一CALL的具体作用,能否把后面所有相同的CALL都改成函数名形式?<br />A:比如 CALL 110000    此中已经知道110000是一个核心计算<br />则如下操作,让光标停在CALL 110000 这个语句上,按回车键<br />会跳到110000的地址上去显示,之后让光标停在110000上,按<br />shift 和; (分号) 其实就是完成一个冒号)的动作,输入<br />名称,这回所有的调用110000处,都会显示CALL  你刚才输入的<br />名称了&#46;(nig回答)<br /><br />Q:用OD调试一些加壳程序,如Themida等,可能你会发现下断后(包括硬件断点),程序跑到断点时,OD会出现假死现像。<br />A:打开OD配置文件ollydbg&#46;ini,你会发现:Restore windows= 123346  //这个Restore windows可能会是一个很大的值<br />   现在只需要将Restore windows=0,重新用OD调试程序,假死问题就消失了。  (kanxue)<br /><br /></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>OllyDBG技巧汇集</strong></font></legend> <br /><a href="http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50401&#46;htm" target="_blank"><font color="#00008b"><b>OllyDBG的命令行解释</b></font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?threadid=16494" target="_blank"><font color="#00008b"><b>OllyDBG里SHIFT+F4条件断点用法篇</b></font></a> <br /><a href="http://www&#46;pediy&#46;com/bbshtml/BBS5/pediy50412&#46;htm" target="_blank"><font color="#00008b"><b>OllyDbg实用技巧六则 </b></font></a> <br /><a href="http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50407&#46;htm" target="_blank"><font color="#00008b"><b>OllyDBG的教学-Run trace</b></font></a> <br /></fieldset></div><p><br /><b>3&#46;3 Olldbg脚本教学</b><br /><br />这部分有点难度,新手可以跳过,等水平提高后回头再学习。<br /></p><div style="MARGIN: 10px 20px 20px"><fieldset><legend><font face="宋体"><strong>OD脚本教学</strong></font></legend> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=26029" target="_blank"><font color="#00008b"><b>认识ODbgScript</b></font><font color="#000000"> </font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=26053" target="_blank"><font color="#00008b"><b>ODbgScript的命令</b></font><font color="#000000"> </font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=26130" target="_blank"><font color="#00008b"><b>ODbgScript的脚本命令(2)</b></font><font color="#000000"> </font></a> <br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=29572" target="_blank"><font color="#00008b"><b>ODbgScript的 注意事项和使用技巧</b></font><font color="#000000"> </font></a> <br /><br /><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?threadid=3781" target="_blank"><font color="#00008b"><b>OllyScript v0&#46;92中文帮助文档</b></font><font color="#000000"> </font></a> <br /><a href="http://www&#46;pediy&#46;com/bbshtml/bbs6/pediy6698&#46;htm" target="_blank"><font color="#00008b"><b>也谈写OllyScript脚本之Career和心声</b></font><font color="#000000"> </font></a> <br /></fieldset></div><hr /><font face="宋体"><strong>第四课 静态分析技术<br /><br /></strong>   所谓静态分析即从反汇编出来的程序清单上分析,从提示信息入手进行分析。目前,大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解。 常用的静态分析工具有W32DASM、C32Asm和IDA Pro等。<br /><br /><b>4&#46;1 认识PE格式</b><br /><br />   在Win32平台上(包括Windows 95/98/ME/NT/2000/XP/2003/CE),可执行文件是PE(Portable Executable)格式。PE文件使用的是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。文件的内容被分割为不同的区块(Section,又称区段、节等),块中包含代码或数据。<br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/unpackfaq/pe&#46;gif" border="0" /> <br /><br />   刚接触这块的朋友只需要简单了解一下PE格式,更具体的PE格式请参考</font><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=20366" target="_blank"><font face="宋体" color="#00008b"><b>脱壳基础知识入门(2006年版) </b></font></a><br /><br /><font face="宋体">   PE相关名词解释如下:<br />1.入口点(Entry Point)<br />   程序在执行时的第一行代码的地址应该就是这个值。<br /><br />2.文件偏移地址(File Offset)<br />   PE文件在磁盘上储存时,各数据的地址称文件偏移地址(File Offset)。用十六进制工具(例如Hex Workshop、WinHex等)打开文件显示的地址就是文件偏移地址。<br /><br />3.虚拟地址(Virtual Address,VA)<br />   由于Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。与实地址模式下的分段地址类似,虚拟地址也可写成&quot;段:偏移量&quot;的形式,这里的段是指段选择器。<br /><br />4.基地址(ImageBase)<br />   文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 9x中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。<br /><br />5.相对虚拟地址<br />相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。即:相对虚拟地址(RVA)=虚拟地址(VA)-基址(ImageBase)。<br /><br /><b>4&#46;2 虚拟地址和偏移量转换</b><br /><br />  在OllyDBG,IDA和W32Dasm下显示的地址值是虚拟地址(Virual Address,VA)。而十六进制工具里,如:Hiew、Hex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 。<br /><br />  其转换原理是因为PE文件在磁盘上的数据结构与在内存中的结构是一致的,如下图:<br /><img src="http://bbs&#46;pediy&#46;com/upload/2005/4/image/rva-va&#46;gif" border="0" /> <br />具体见:</font><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=18022" target="_blank"><font face="宋体" color="#000000">http://bbs&#46;pediy&#46 ... #46;;threadid=18022</font></a><font face="宋体"> <br /><br />  在实际操作时,使用 LordPE等工具很容易进行File offset与VA的转换。LordPE打开目标文件,点击FLC按钮,打开如下图的对话框,填入相应地址,点击DO按钮即可转换:<br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/Newbie/offset&#46;gif" border="0" /> <br /><br /><b>4&#46;3 文件类型分析</b><br /><br /> 文件分析是静态分析程序的第一步,通过相关工具显示欲调试文件的信息,如它是用什么语言写的,是否加壳等。常用的文件分析工具有</font><a href="http://www&#46;pediy&#46;com/tools/unpacker&#46;htm" target="_blank"><font face="宋体" color="#00008b">EID</font></a><font face="宋体">,</font><a href="http://www&#46;pediy&#46;com/tools/unpacker&#46;htm" target="_blank"><font face="宋体" color="#00008b">FileInfo</font></a><font face="宋体">等。有关壳的相关知识等入门后,再参考相关教学,如 </font><a href="http://bbs&#46;pediy&#46;com/showthread&#46;php?s=&threadid=20366" target="_blank"><font face="宋体"><font color="#00008b"><b>脱壳基础知识入门(2006年版) </b></font><font color="#000000"> </font></font></a><font face="宋体"> 。如果查到文件有壳,此时静态分析是没意义的,但可以用OD动态调试,分析程序算法。<br /><br />1&#46EiD<br /><br />   PEiD的GUI界面操作非常方便直观。它的原理是利用查特征串搜索来完成识别工作的。各种开发语言都有固定的启动代码部分,利用这点就可识别出是何种语言编编译的。同样,不同的壳也有其特征码,利用这点就可识别是被何种壳所加密。下面PEiD识别出这个软件是用Asprotect 1&#46;2x加的壳。<br /><img src="http://bbs&#46;pediy&#46;com/upload/bbs/unpackfaq/peid&#46;gif" border="0" /> <br /><br />2&#46;FileInfo<br /><br />FileInfo(简称Fi)另一款不错的文件检测工具。<br /></font><a href="http://www&#46;pediy&#46;com/tutorial/chap4/Chap4-1&#46;htm" target="_blank"><font face="宋体"><font color="#00008b"><b>FI的具体用法 </b></font><font color="#000000"> </font></font></a><font face="宋体"> <br /><br /><br /><br /><b>4&#46;4 W32Dasm简介</b><br /><br /> </font><a href="http://www&#46;pediy&#46;com/tutorial/chap4/Chap4-2&#46;htm" target="_blank"><font face="宋体"><font color="#00008b"><b>W32Dasm简介 </b></font><font color="#000000"> </font></font></a><font face="宋体"> <br /><br /><br /><b>4&#46;5 IDA pro操作</b><br /><br /> </font><a href="http://www&#46;pediy&#46;com/practise/IDA&#46;htm" target="_blank"><font face="宋体"><font color="#00008b"><b>IDA简易教程</b></font><font color="#000000"> </font></font></a><br /><font face="宋体"> </font><a href="http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50528&#46;htm" target="_blank"><font face="宋体"><font color="#00008b"><b>IDA里的中文字串</b></font><font color="#000000"> </font></font></a><br /></p><hr />
回复

使用道具 举报

 楼主| 发表于 2006-10-14 22:02:24 | 显示全部楼层
<font face=\"宋体\"><strong>第五课 常见保护的攻击</strong> <br /><br /><br /><b>5&#46;1 序列号方式</b> <br /><br />  软件验证序列号的过程,其实就是验证用户名和序列号之间的数学映射关系。这个映射关系是由软件的设计者制定的,所以各个软件生成序列号的算法是不同的。这是最常见的一种保护方式。<br /><br /></font><div style=\"MARGIN: 10px 20px 20px\"><fieldset><legend><font face=\"宋体\"><strong>序列号方式</strong></font></legend> <br /> <a href=\"http://www&#46;pediy&#46;com/tutorial/chap6/Chap6-1-1&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>序列号方式</b></font><font color=\"#000000\"> </font></a> <br /> <a href=\"http://www&#46;pediy&#46;com/bbshtml/bbs5/pediy50555&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>商朝子教学--破解原理 </b></font><font color=\"#000000\"> </font></a> <br /> <a href=\"http://www&#46;pediy&#46;com/bbshtml/BBS6/pediy6894&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>crack新手进化篇(新手级)</b></font><font color=\"#000000\"> </font></a> <br /><br /> <a href=\"http://www&#46;pediy&#46;com/bbshtml/BBS6/pediy6504&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>RoBa教菜鸟写注册机入门篇</b></font><font color=\"#000000\"> </font></a> <br /> <a href=\"http://www&#46;pediy&#46;com/bbshtml/BBS6/pediy6575&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>RoBa教菜鸟写注册机中级篇</b></font><font color=\"#000000\"> </font></a> <br /> <a href=\"http://www&#46;pediy&#46;com/bbshtml/BBS6/pediy6627&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>RoBa教菜鸟写注册机高级篇</b></font><font color=\"#000000\"> </font></a> <br /></fieldset></div> <br /><br /><b>5&#46;2 警告(NAG)窗口</b> <br />   Nag的本义是烦人的意思。Nag窗口是软件设计者用来不时提醒用户购买正式版本的窗口。<br /><br /><div style=\"MARGIN: 10px 20px 20px\"><fieldset><legend><font face=\"宋体\"><strong>NAG窗口</strong></font></legend> <br /> <a href=\"http://www&#46;pediy&#46;com/tutorial/chap6/Chap6-1-2&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>警告(NAG)窗口</b></font><font color=\"#000000\"> </font></a> <br /></fieldset></div> <br /><br /><b>5&#46;3 时间限制</b> <br />   这类保护的软件一般都有时间段的限制,例如试用30天等。当过了共享软件的试用期后,就不予运行。只有向软件作者付费注册之后才能得到一个无时间限制的注册版本。<br /><br /><div style=\"MARGIN: 10px 20px 20px\"><fieldset><legend><font face=\"宋体\"><strong>时间限制</strong></font></legend> <br /> <a href=\"http://www&#46;pediy&#46;com/tutorial/chap6/Chap6-1-3&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>时间限制</b></font><font color=\"#000000\"> </font></a> <br /></fieldset></div> <br /><br /><br /><b>5&#46;4 Key File保护 </b> <br />   KeyFile(注册文件)是一种利用文件注册软件的保护方式。<br /><br /><div style=\"MARGIN: 10px 20px 20px\"><fieldset><legend><font face=\"宋体\"><strong>Key File保护 </strong></font></legend> <br /> <a href=\"http://www&#46;pediy&#46;com/tutorial/chap6/Chap6-1-4&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>Key File保护</b></font><font color=\"#000000\"> </font></a> <br /></fieldset></div> <br /><br /><br /><b>5&#46;5 功能限制的程序  </b> <br />   这种程序一般是DEMO版或菜单中部分选项是灰色。有些DEMO版本的部分功能里面根本就没有。而有些程序功能全有,只要注册后就正常了。<br /><br /><div style=\"MARGIN: 10px 20px 20px\"><fieldset><legend><font face=\"宋体\"><strong>功能限制的程序  </strong></font></legend> <br /> <a href=\"http://www&#46;pediy&#46;com/tutorial/chap6/Chap6-1-5&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>功能限制的程序</b></font><font color=\"#000000\"> </font></a> <br /></fieldset></div> <br /><br /><br /><b>5&#46;6 CD-check  </b> <br />   最简单也最常见的光盘保护就是程序在启动时判断光驱中的光盘上是否存在特定的文件,如果不存在则认为用户没有正版光盘,拒绝运行。在程序运行的过程当中一般不再检查光盘的存在与否。<br /><br /><div style=\"MARGIN: 10px 20px 20px\"><fieldset><legend><font face=\"宋体\"><strong>CD-check </strong></font></legend> <br /> <a href=\"http://www&#46;pediy&#46;com/tutorial/chap6/Chap6-1-6&#46;htm\" target=\"_blank\"><font color=\"#00008b\"><b>CD-check</b></font><font color=\"#000000\"> </font></a> <br /></fieldset></div> <br /><br /><b>5&#46;7 重启验证</b> <br /><br /><br /><b>5&#46;8 网络验证</b><br />
回复

使用道具 举报

发表于 2006-10-19 14:47:11 | 显示全部楼层
fgfgf
回复

使用道具 举报

发表于 2006-12-12 22:13:17 | 显示全部楼层
这是非常好的学习破解的教程
回复

使用道具 举报

发表于 2007-3-9 09:35:08 | 显示全部楼层
看不懂,支持
回复

使用道具 举报

发表于 2007-3-23 10:18:34 | 显示全部楼层
非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|腾飞在线 ( 冀ICP备05002530号 )

GMT+8, 2026-2-13 14:18 , Processed in 0.060407 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表