<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>雷克斯世界</title>
	<atom:link href="http://diablorex.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://diablorex.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Wed, 20 Apr 2011 15:53:57 +0000</lastBuildDate>
	<language>zh-tw</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='diablorex.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>雷克斯世界</title>
		<link>http://diablorex.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://diablorex.wordpress.com/osd.xml" title="雷克斯世界" />
	<atom:link rel='hub' href='http://diablorex.wordpress.com/?pushpress=hub'/>
		<item>
		<title>【原创】Themida的另类破解</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e3%80%90%e5%8e%9f%e5%88%9b%e3%80%91themida%e7%9a%84%e5%8f%a6%e7%b1%bb%e7%a0%b4%e8%a7%a3/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e3%80%90%e5%8e%9f%e5%88%9b%e3%80%91themida%e7%9a%84%e5%8f%a6%e7%b1%bb%e7%a0%b4%e8%a7%a3/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:53:52 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=57</guid>
		<description><![CDATA[标 题: 【原创】Themida的另类破解 作 者: wulje 时 间: 2008-09-06,08:43:33 链 接: http://bbs.pediy.com/showthread.php?t=72152 【文章标题】: Themida的另类破解 【下载地址】: 自己搜索下载 【作者声明】: 只是感兴趣，没有其他目的。失误之处敬请诸位大侠赐教! &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 【详细过程】 大家都知道Themida的强大保护功能，几乎无人能完整的破解它的VM中的handler（最新进展如何？）。我也试图跟踪过它的几个 handler，它为一个简单的入栈操作竟有长达数千行的垃圾代码和无穷的转跳，如果要把它168（？）个handler都清理出来，他一定会疯掉！或累死掉？我曾经下决心不碰Themida了，不知为什么鬼使神差的我又跟踪了几个Themida加密软件，竟然还有新的发现！ 附件提供的一个程序是用汇编写的PE信息小工具，用Themida1855加密，加密选择RISC-64 processor，全选加密可选项，并对部分API函数使用VM加密，入口虚拟系数选择15。应该说对该程序用了较强的加密措施。现在介绍用我的脚本，一步步对它破解(绝不暗中使用对原程序已知的信息)，居然还原了所有的代码，请看下面详细过程。 一、介绍一个万能脚本 1.下面的脚本适用于任何用Themida 1.8.5.5版加密的程序，操作十分简单。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; //本脚本适用于Thmida 1.8.5.5版本加密的任何程序 bphwc bc jmp Second //第一次运行后,将本行注释掉后保存一次(本)脚本 data: var mem var mem1 var temIAT var temESI var temAPI var APIstr var Addr_0 var Addr_1 var Addr_2 var [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=57&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>标 题: 【原创】Themida的另类破解<br />
作 者: wulje<br />
时 间: 2008-09-06,08:43:33<br />
链 接: http://bbs.pediy.com/showthread.php?t=72152</p>
<p>【文章标题】: Themida的另类破解<br />
【下载地址】: 自己搜索下载<br />
【作者声明】: 只是感兴趣，没有其他目的。失误之处敬请诸位大侠赐教!<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
【详细过程】<br />
      大家都知道Themida的强大保护功能，几乎无人能完整的破解它的VM中的handler（最新进展如何？）。我也试图跟踪过它的几个 handler，它为一个简单的入栈操作竟有长达数千行的垃圾代码和无穷的转跳，如果要把它168（？）个handler都清理出来，他一定会疯掉！或累死掉？我曾经下决心不碰Themida了，不知为什么鬼使神差的我又跟踪了几个Themida加密软件，竟然还有新的发现！<br />
      附件提供的一个程序是用汇编写的PE信息小工具，用Themida1855加密，加密选择RISC-64 processor，全选加密可选项，并对部分API函数使用VM加密，入口虚拟系数选择15。应该说对该程序用了较强的加密措施。现在介绍用我的脚本，一步步对它破解(绝不暗中使用对原程序已知的信息)，居然还原了所有的代码，请看下面详细过程。</p>
<p>      一、介绍一个万能脚本<br />
      1.下面的脚本适用于任何用Themida 1.8.5.5版加密的程序，操作十分简单。<br />
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
  //本脚本适用于Thmida 1.8.5.5版本加密的任何程序</p>
<p>    bphwc<br />
    bc<br />
    jmp Second     //第一次运行后,将本行注释掉后保存一次(本)脚本</p>
<p>  data:<br />
    var mem<br />
    var mem1<br />
    var temIAT<br />
    var temESI<br />
    var temAPI<br />
    var APIstr<br />
    var Addr_0<br />
    var Addr_1<br />
    var Addr_2<br />
    var Addr_3<br />
    var Addr_4<br />
    var Addr_5<br />
    var Rva<br />
  Init:<br />
    mov Rva,65b970       //用对话框中的值修改该值,并将第一行的jmp Second注释掉<br />
    mov Addr_0,Rva-997<br />
    mov Addr_1,Rva-809<br />
    mov Addr_2,Rva-ea<br />
    mov Addr_3,Rva-9d<br />
    mov Addr_4,Rva<br />
    mov Addr_5,Rva+74c</p>
<p>  start:<br />
    esto<br />
    esto<br />
    bphws Addr_0,』x』<br />
    esto<br />
    bphwc Addr_0<br />
    mov [Addr_0],0062e990  //废除监视断点的代码</p>
<p>    bp Addr_1<br />
    bp Addr_2<br />
    bp Addr_3<br />
    bp Addr_4<br />
    bp Addr_5    </p>
<p>  First:<br />
    run<br />
    cmp eip,Addr_1<br />
    jz  A1<br />
    cmp eip,Addr_2<br />
    jz  A2<br />
    cmp eip,Addr_3<br />
    jz  A3<br />
    cmp eip,Addr_4<br />
    jz  A4<br />
    cmp eip,Addr_5<br />
    jz  A5<br />
    jmp  First</p>
<p>  A1:<br />
    mov temAPI,eax     //eax 是API函数地址<br />
    gn temAPI         //显示函数名<br />
    log $RESULT<br />
    add APIstr,』  『<br />
    add APIstr,$RESULT_2  //恢复API函数名(INT表)<br />
    jmp First<br />
  A2:<br />
    mov temIAT,eax<br />
    cmp  edx,10000<br />
    ja  next<br />
    xor  edx,80000000<br />
    mov [eax],edx        //修复IAT表(写入序列号)<br />
    jmp First<br />
  next:<br />
    mov [eax],temAPI<br />
    jmp First</p>
<p>  A3:<br />
    mov mem1,eax          //eax是内存中呼叫API地址<br />
    mov temESI,[esi]      //获取转跳标记<br />
    jmp First</p>
<p>  A4:<br />
    cmp temESI,AAAAAAAA<br />
    jnz step3<br />
    mov [mem1],#FF25#      //修复代码中转跳地址<br />
    mov [mem1+2],temIAT<br />
    jmp First</p>
<p>  step3:<br />
    mov [mem1],#FF15#      //修复代码中呼叫地址<br />
    mov [mem1+2],temIAT<br />
    jmp First</p>
<p>  A5:<br />
    bc<br />
    pause</p>
<p>  Second:                //查找写IAT地址的一条指令<br />
    var memory<br />
    var tmp<br />
    var temp<br />
    var tmpbp<br />
    var Str</p>
<p>    gmi eip,CODEBASE<br />
          mov  memory,$RESULT<br />
    find memory,#0000000000000000000000000000000000000000000000#<br />
    mov tmp,$RESULT<br />
    bphws tmp,』w』<br />
          esto<br />
    esto<br />
    esto<br />
    bphwc tmp<br />
    sto<br />
          find memory,#909090909090909090909090909090909090#<br />
    mov temp,$RESULT+2<br />
    bphws temp,』w』<br />
    mov  tmpbp,eip<br />
    run<br />
    cmp  eip,tmpbp+2<br />
          jnz  next2<br />
          run<br />
    next2:<br />
    itoa eip<br />
    mov  Str,』请用下列数值：』<br />
          add  Str,$RESULT<br />
    add  Str,』 修改脚本中的Rva.』<br />
    bphwc<br />
       msg Str<br />
    pause                       //（脚本完）</p>
<p>      本脚本的使用方法是：用OD打开程序后，如果第一次加载本脚本，则会弹出一个对话框，用对话框中的数据修改脚本中的Rva值（第20行，且只有一处），并一定将第3行的jmp Second注释掉，一定将脚本保存一次！这时脚本就是该程序的专用脚本了。重新用OD加载程序后，可以无须任何更改，直接调用本脚本了！<br />
      第2次运行脚本，屏幕快速闪动，一会就出现了神奇的效果了。如果想应用于新的程序，则只须将注释掉的jmp Second恢复即可。<br />
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>      2.挖掉Themida的一只监视眼，蒙上它的另一只眼<br />
      本脚本的运行原理，请参考我原先的一篇文章《对Themida加密VC++程序的完美脱壳》，当时我初次接触Themida，那个脚本有很多不完善的地方，如不容易进行到底，移植困难等。Themida有很多监视断点的SEH，当时没有采用相应措施，所以被Themida频频发现。它的“监视”方法很多，用得最多的大约有(1)int 1中断，(2)内存访问异常中断，(3)代码扫描等。对于(1)(2)没有任何办法摘除，但脚本的一个循环可与它周旋；对于(3)在我跟踪的代码段中，用脚本将它摘除了。所以脚本运行得非常顺利(使用在其它被Themida加密的程序中也一样)。<br />
      (1)脚本中的 mov [Addr_0],0062e990 就是将该地址的“jb”改成了“jmp”，跳过了代码扫描监视。&#8212;相当于挖掉了它的一只眼睛&#8212;<br />
      (2)Thmida的另一(多)只眼睛实在难于发现，不管你是什么类型的断点，很快被发现并单步异常后弹出对话框，然后退出运行。请注意，Themida设置的是单步中断，如果让它自行处理这个中断，就是前面的结果。如果将它拦截下来，自已处理就可以绕过了它的SEH。“拦截”方法就是打开OD“选项&#8211;调试设置&#8211;异常页”只选“非法访问内存”一项，其余全部不能选取。这样除非法访问内存异常让它自行处理外，其余全部交由OD处理。这样当Themida发现断点后产生的单步异常就被OD拦截了。自行处理的方式就是脚本中“First：”标签部分。(用脚本处理OD拦截下来的中断是非常容易的)<br />
       脚本中的First部分(断点循环)就是判断中断地址是不是自己设置的，是则进入相应操作；若不是，则一定是Thmida发现断点后的 SEH中断地址(单步中断)，处理方式就是用“run“。OD的这个run，就是让程序在eip中断地址上继续运行，绕过了Themida的SEH处理程序(陷阱)。&#8212;相当于蒙上了它的另一只眼睛&#8212;-<br />
       脚本中的其余部分无须多说，请参考我的前一篇文章。</p>
<p>      3.运行脚本后的神奇效果<br />
      用OD打开程序后，加载这个脚本，程序运行得很快。当它暂停后Themida外壳已经被除掉。转到代码段401000，让OD分析代码一次。如果Themida在code段中没有虚拟API函数，则显示在你面前的是一个非常清晰的可读的反汇编程序，各个API函数调用和名称显露无遗。如果你仅仅是想了解原程序的基本结构和思路，这就够了。如果Themida虚拟了部分API，请往下看。如果你一定要dump出来，并去掉垃圾代码，也请往下看。</p>
<p>      二、恢复程序的入口代码<br />
      如果想进入它的VM(虚拟机)部分，清理它的handler，还原出原代码，我是绝对无能为力了，下决心不碰它了。<br />
      那么，我是怎样恢复入口代码的呢？跟踪Themida发现，它对解压出来的代码段并不重视，居然没有设置断点监视？你可以任意设断和修改，我巧妙地利用了它这一弱点。</p>
<p>      1.设断技巧（以提供的PeInfo_them.exe为例）<br />
      用脚本脱壳后，转到401000代码区，让OD对代码分析一次，来到程序的尾部，API函数都集中在这里(称它为API表)(VC++程序的函数表分散在代码中,相对集中)。</p>
<p>  004015FC   $- FF25 5820400&gt;jmp     dword ptr [402058]  ;  USER32.wsprintfA<br />
  00401602   .- FF25 5420400&gt;jmp     dword ptr [402054]  ;  USER32.DialogBoxParamA          jmp     dword ptr [402050]  ;  USER32.EndDialog<br />
  0040160E   $- FF25 4C20400&gt;jmp     dword ptr [40204C]  ;  USER32.GetDlgItem<br />
  00401614   .- FF25 4820400&gt;jmp     dword ptr [402048]  ;  USER32.GetWindowTextLengthA     jmp     dword ptr [402044]  ;  USER32.LoadIconA<br />
  00401620   .- FF25 4020400&gt;jmp     dword ptr [402040]  ;  USER32.MessageBoxA              jmp     dword ptr [40203C]  ;  USER32.SendMessageA             jmp     dword ptr [402038]  ;  USER32.SetWindowTextA<br />
  00401632   $- FF25 2420400&gt;jmp     dword ptr [402024]  ;  kernel32.CloseHandle<br />
  00401638   $- FF25 2820400&gt;jmp     dword ptr [402028]  ;  kernel32.CreateFileA<br />
  0040163E   $- FF25 2C20400&gt;jmp     dword ptr [40202C]  ;  kernel32.CreateFileMappingA<br />
  00401644   .- FF25 3020400&gt;jmp     dword ptr [402030]  ;  kernel32.ExitProcess            jmp     dword ptr [402020]  ;  kernel32.FreeLibrary            jmp     dword ptr [40201C]  ;  kernel32.GetFileSize<br />
  00401656   .- FF25 1820400&gt;jmp     dword ptr [402018]  ;  kernel32.GetModuleHandleA       jmp     dword ptr [402014]  ;  kernel32.LoadLibraryA           jmp     dword ptr [402010]  ;  kernel32.MapViewOfFile<br />
  00401668   $- FF25 0C20400&gt;jmp     dword ptr [40200C]  ;  kernel32.UnmapViewOfFile<br />
  0040166E   $- FF25 0820400&gt;jmp     dword ptr [402008]  ;  kernel32.lstrcpyA<br />
  00401674   $- FF25 0020400&gt;jmp     dword ptr [402000]  ;  comdlg32.GetOpenFileNameA</p>
<p>      (1)注意到API表中有“$”的地方(如果全都没有,则再分析一次)，$表示程序中有call在呼叫，若没有则表示没有关联(VC++编写的程序有很多无关联的垃圾函数)。在这里没有关联的函数肯定是被Themida虚拟了call代码。在没有“$”的地址上设F2中断。<br />
       明眼一看，本例是一个对话框窗口，它只有DialogBoxParamA，没有CreateWindowEx、消息循环等函数。若是Window窗口，则不能在消息循环函数上设断，否则OD将进入假死状态。<br />
      (2)在解压后代码段中浏览，发现了一段连续的乱码，用OD分析也无用，它一般就是入口代码段了。本例是4015B6&#8211;4015FB这一段(被虚拟了)。<br />
      (3)从401000开始寻找跳进006xxxxx段的jmp，这些jmp都是跳到被VM虚拟后的API代码中(代码E9前面都有一个“-”号)，本例中跳进VM中的8个jmp地址如下：</p>
<p>  0040100D   .- E9 E0532300  jmp     006363F2<br />
  00401029   .- E9 408F2300  jmp     00639F6E<br />
  0040103E   .- E9 95CC2300  jmp     0063DCD8<br />
  00401371   .- E9 4A092400  jmp     00641CC0<br />
  00401385   .- E9 F0422400  jmp     0064567A<br />
  004013C9   .- E9 B2802400  jmp     00649480<br />
  004013DD   .- E9 61B52400  jmp     0064C943<br />
  0040151B   .- E9 39F32400  jmp     00650859<br />
      在以上的每个地址都用F2设断。（放心设断,Themida是不来过问的。）</p>
<p>      2.操作技巧(以后的操作基本上都是F9或alt-F9，无须shift-F9)<br />
      (1)当设置完成后，按F9运行一次，程序中断在<br />
  0040165C   .- FF25 1420400&gt;jmp     dword ptr [402014]  ;  kernel32.LoadLibraryA<br />
      且在堆栈中出现<br />
  0013FF90   00654697  /CALL 到 LoadLibraryA<br />
  0013FF94   00402060  \FileName = 『RichEd20.dll』<br />
  0013FF98   004001C0  ASCII 』   』                &lt;&#8211;这是应用程序开始的栈顶，dump堆栈平衡时弹出至此<br />
  0013FF9C   0013FFE0  指向下一个 SEH 记录的指针<br />
  0013FFA0   005E0DB2  SE处理程序<br />
  0013FFA4   7C930738  ntdll.7C930738<br />
      堆栈中0013FF98是进入应用程序后的栈顶，13FF94的(00402060)是压入的参数，0013FF90的(00654697)是VM中的呼叫地址。<br />
      记录下堆栈中的数据，并将4015B6开始的乱码改写为：(它就是解密出来的入口第一组代码)<br />
      push  00402060<br />
      call  0040165C  jmp     dword ptr [402018]  ;  kernel32.GetModuleHandleA</p>
<p>      堆栈中出现<br />
  0013FF90   006546A3    /CALL 到 GetModuleHandleA<br />
  0013FF94   00000000    \pModule = NULL<br />
      这里记下堆栈，接着前面如下修改乱码；<br />
      push  0<br />
      call  00401656   jmp     dword ptr [402054]  ;  USER32.DialogBoxParamA<br />
      堆栈是<br />
  0013FF80   006546BB    /CALL 到 DialogBoxParamA<br />
  0013FF84   00400000    |hInst = 00400000            &lt;&#8211;GetModuleHandleA的返回值<br />
  0013FF88   000003E8    |pTemplate = 3E8             &lt;&#8211;资源ID<br />
  0013FF8C   00000000    |hOwner = NULL<br />
  0013FF90   00401544    |DlgProc = PeInfo_t.00401544 &lt;&#8211;窗口程序地址<br />
  0013FF94   00000000    \lParam = NULL</p>
<p>      因为程序进入了DialogBoxParamA后，不会退出，但初始化窗口时还会调用其它函数，只有关闭窗口后才退出。<br />
      这里将前面3次中断后堆栈中的值，加上必须保存的句柄，将入口处的乱码改写如下：<br />
      push  402060<br />
      call  0040165C  ;LoadLibraryA<br />
      mov   [xxxxx],eax                  &lt;&#8212;返回RichEdit20A句柄<br />
      push  0<br />
      call  00401656  ;GetModuleHandleA<br />
      mov   [xxxxx],eax                  &lt;&#8212;返回GetModuleHandleA句柄<br />
      push  0<br />
      push  401544<br />
      push  0<br />
      push  3E8<br />
      push  [xxxxx]                      &lt;&#8212;它一定是GetModuleHandleA返回的句柄<br />
      call  00401602  ;DialogBoxParamA</p>
<p>     打开403000全局变量区，每中断一次就会写入一些数据。你会发现LoadLibraryA句柄存入了[403004]，GetModuleHandleA句柄存入了[403000]，这样前面的三个[xxxxx]都解决了(需要一些API函数知识)：即</p>
<p>      push  402060                        &lt;&#8212;查402060是字串RichEd20.dll，原来是装载RichEd20库<br />
      call  0040165C       ;call LoadLibraryA<br />
      mov   [403004],eax                  &lt;&#8212;返回RichEdit20A句柄<br />
      push  0<br />
      call  00401656       ;call GetModuleHandleA<br />
      mov   [403000],eax                  &lt;&#8212;返回GetModuleHandleA句柄<br />
      push  0<br />
      push  401544    &lt;&#8211;DialogBoxParamA函数的Proc地址<br />
      push  0<br />
      push  3E8       &lt;&#8211;窗口资源ID<br />
      push  [403000]                      jmp     dword ptr [40203C]  ;  USER32.SendMessageA<br />
     堆栈中是<br />
  0013FC14   00641CD7    /CALL 到 SendMessageA<br />
  0013FC18   004600B2    |hWnd = 4600B2<br />
  0013FC1C   00000080    |Message = WM_SETICON<br />
  0013FC20   00000001    |wParam = 1<br />
  0013FC24   0C1A027D    \lParam = C1A027D<br />
     原来401371加密前应该是call 401625(即call SendMessageA)，查看地址401371，参数非常清晰，你不必费力去研究它的参数来源，它是装载图标。<br />
     注意，这个call SendMessageA不是接在开局的call DialogBoxParamA后面，因为程序还没有退出DialogBoxParamA。<br />
     记下00401371地址，将要修改为call 401625(参数修复前不要修改，可能程序会反复调用它)。<br />
     ……………………………………<br />
     这样反复F9，反复记下中断地址和中断函数，(每中断一个jmp的地址，就关闭它的断点(API表中的F2不能关闭)。这样凡是与初始化有关的被虚拟的API都现身了！若发现再F9，老在API表中的SendMessageA(或其它函数)上中断，这是初始化中的调用，运行时总要进入系统领空，可按alt-F9让其返回(在VM中)，再F9回到用户领空。窗口未出现前可以先关闭SendMessageA的F2断点，但窗口出现后一定要恢复其断点。</p>
<p>    (5)如果F9后，OD没有反应，但状态栏提示读取[FFFFFFFF]异常，不管它，这时，窗口已经出现了(看桌面状态条），程序进入了DialogBoxParamA中的消息循环。<br />
     到此为止，代码段中还有5个断点没有被访问，它们是窗口运行后才要访问的地址。</p>
<p>    (6)按普通程序一样运行窗口，让它随便打开一个.exe文件，它立即中断在某jmp虚拟函数上，按前面同样的方法操作，在API函数表中就发现了它调用的API是谁了，这样就一个个地把Themida虚拟的函数清理完了。当代码段中的F2中断地址关闭完后。被VM虚拟的全部函数都现身了。（如何恢复参数，后面再说）</p>
<p>    (7)反复运行窗口发现在代码中设置的断点0040151B9(jmp 00650859)始终没有被调用，而API表中的 MessageBoxA也没有被调用，可以肯定0040151B9(jmp 00650859)是虚拟了call MessageBoxA。原来它是一个出错对话框，当你打开一个非exe文件时，对话框就出现了。在堆栈中也可以找到它全部参数。</p>
<p>    (8)入口的后半部<br />
    当清理完代码段中的所有jmp断点后(被虚拟的API)，可以关闭窗口了，按下关闭钮，立即中断在<br />
  0040164A   .- FF25 2020400&gt;jmp     dword ptr [402020]  ;  kernel32.FreeLibrary<br />
    堆栈是<br />
  0013FF90   006546CA    /CALL 到 FreeLibrary<br />
  0013FF94   74D90000    \hLibModule = 74D90000      0040100D   .- E9 E0532300   jmp     006363F2            00401029   .- E9 408F2300   jmp     00639F6E              0040103E   .- E9 95CC2300   jmp     0063DCD8              &lt;&#8211;应该是call SendMessageA<br />
  00401043   .  46            inc     esi<br />
  00401044   .  6F            outs    dx, dword ptr es:[edi]<br />
  00401045   .  C2 0400       retn    4</p>
<p>       (1)第一个call GetWindowTextLengthA，参数只有一个push [40300C]，前面已知这是RichEdit20A的句柄，显然它是获取编辑软件RichEdit20A中的字符数，结果应该暂存，eax怎样操作？<br />
       (2)第2个是call SendMessageA，消息发往RichEdit20A，堆栈中的表示是：<br />
  0013F798   00639F81  /CALL 到 SendMessageA<br />
  0013F79C   00450292  |hWnd = 450292<br />
  0013F7A0   00000437  |Message = MSG(437)<br />
  0013F7A4   00000000  |wParam = 0<br />
  0013F7A8   0013F7CC  \lParam = 13F7CC  &lt;&#8211;移动光标或选择范围的操作是该参数指向一个CHARRANGE结构(8字节)</p>
<p>       这下难了，必须弄清RichEdit20A是干什么的？原来它是一个大型文本编辑软件，操作十分复杂，这里是大才小用，只用它来显示数据，并不对数据编辑。对RichEdit20A的操作主要是靠SendMessageA发送消息。它操作前，一定要确定光标位，确定光标位消息中的 lParam参数指向一个CHARRANGE结构(2个dword)，这两个值相等，其值是光标位置；若不等则表示选择一个区间。<br />
       清楚了，GetWindowTextLengthA获取屏幕上字符长度，第1个SendMessageA应该将光标定于尾部，好让第2个 SendMessageA向它添加字符。那么第1个SendMessageA的参数13F7CC就一定是指向CHARRANGE结构，从ebp的值知 13F7CC是指向[ebp-8]，[ebp-4]即一个CHARRANGE结构，两个dword值应该相等且就是当前的字串长度。<br />
       这样，显然应该有：mov [ebp-8],eax；mov [ebp-4],eax。所以，代码应该如下：<br />
       call GetWindowTextLengthA<br />
       mov [ebp-8],eax<br />
       mov [ebp-4],eax<br />
       lea eax,[ebp-8]<br />
       push  eax         &lt;&#8212;取CHARRANGE结构地址<br />
       push  0<br />
       push  437<br />
       push [40300C]<br />
       call SendMessageA</p>
<p>       第2个SendMessageA一定是将buffer中的字串添加上去。它的参数lParam应该指向一个buffer。堆栈中参数是<br />
  0013F798   0063DCE9  /CALL 到 SendMessageA<br />
  0013F79C   00E20202  |hWnd = 450292<br />
  0013F7A0   000000C2  |Message = EM_REPLACESEL    &lt;&#8211; EM_REPLACESEL=C2<br />
  0013F7A4   00000000  |wParam = 0<br />
  0013F7A8   0040222F  \Text = &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
      MSG消息EM_REPLACESEL也表示向RichEdit20A添加字符，参数lParam指向40222F，是直接push 40222F还是由调用程序带来？查调用401000的呼叫，知道它有多个地方调用，它的参数一定得由调用程序带来。<br />
      这样，接着的代码是<br />
      push  [ebp+8]    &lt;&#8211;唯一的带来参数<br />
      push  0<br />
      push  0C2        &lt;&#8211; 0C2=EM_REPLACESEL<br />
      push  [40300C]<br />
      call  SendMessageA</p>
<p>      (4)SendMessageA没有返回值，最后还有乱码46 6f的原码是什么？观察程序，前面有pushad，后面一定要有popad，又汇编程序是堆栈自动平衡方式，最后一般都有leave，最后这个C2 0400 (retn 4)是否是原码呢？应该说是，Themida一般不去惹 call ebx、jmp eax、retn等代码，因为它的转跳是不定的，themida操作起来很复杂。<br />
      至此，这段代码被还原了。有的地方说法可能很勉强(因为有原码参考，所以我说得很肯定)，用在其它地方可能就不正确了。不管怎么说，分析起来虽然很困难，但肯定比从VM虚拟代码中还原要容易得多了。<br />
      本方法有个致命的弱点是，一些与被虚拟的函数无关的代码，如add eax,6，mov ecx,edi等是永远找不回来的。好在是已经编译过的.exe文件再用Themida加密，如果不提供原编译文件，则只能对API虚拟了，包含它附近的几个代码。有关API的参数代码相对简单一些，很少有前面说到的那些代码形式，退后一步说，即使有，且被漏掉了，但所有的API都被还原了，关系清楚了，虽然dump后的程序不能运行，但破解的欲望达到了！ </p>
<p>      四、可能出现的问题<br />
      1.如果你用OD打开文件后加载脚本，OD象没有反应一样直接就运行到了窗口出现。<br />
        结论：你可能是第1次将脚本用到其它程序上而又忘记了将脚本中的jmp Second恢复过来，或者你忘记了存盘。<br />
      2.用脚本第1次弹出对话框没问题，第2次按要求修改也存了盘，但就是不出现任何结果。<br />
        结论：Themida版本可能不是1.8.5.5版。或者“调试设置&#8211;异常页”的选项选得太多，特别是选择了“忽略特权指令或无效指令”。<br />
      3.脚本不能运行到底，Themida弹出警告框后退出。<br />
        结论：“调试设置&#8211;异常页”的选项选得太多，特别是选择了“忽略单步异常”。</p>
<p>        我说话很啰索，谢谢你耐心读完。 </p>
<p> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=57&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e3%80%90%e5%8e%9f%e5%88%9b%e3%80%91themida%e7%9a%84%e5%8f%a6%e7%b1%bb%e7%a0%b4%e8%a7%a3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 加殼與脫殼小教學</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e5%8a%a0%e6%ae%bc%e8%88%87%e8%84%ab%e6%ae%bc%e5%b0%8f%e6%95%99%e5%ad%b8/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e5%8a%a0%e6%ae%bc%e8%88%87%e8%84%ab%e6%ae%bc%e5%b0%8f%e6%95%99%e5%ad%b8/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:48:35 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=55</guid>
		<description><![CDATA[(一）殼的概念 作者編好軟件後，編譯成exe可執行文件。 1.有一些版權資訊需要保護起來，不想讓別人隨便改動，如作者的姓名，即為了保護軟件不被破解，通常都是採用加殼來進行保護。 2.需要把程式搞的小一點，從而方便使用。於是，需要用到一些軟件，它們能將exe可執行文件壓縮， 3.在駭客界給木馬等軟件加殼脫殼以躲避殺毒軟件。實現上述功能，這些軟件稱為加殼軟件。 （二）加殼軟件最常見的加殼軟件 ASPACK ，UPX，PEcompact 不常用的加殼軟件WWPACK32；PE-PACK ；PETITE NEOLITE （三）偵測殼和軟件所用編寫語言的軟件 因為脫殼之前要查他的殼的類型。 1.偵測殼的軟件fileinfo.exe 簡稱fi.exe（偵測殼的能力極強）。 2.偵測殼和軟件所用編寫語言的軟件language.exe（兩個功能合為一體，很棒），推薦language2000中文版（專門檢測加殼類型）。 3.軟件常用編寫語言Delphi，VisualBasic（VB）&#8212;最難破，VisualC（VC）。 （四）脫殼軟件 軟件加殼是作者寫完軟件後，為了保護自己的代碼或維護軟件產權等利益所常用到的手段。目前有很多加殼工具，當然有盾，自然就有矛，只要我們收集全常用脫殼工具，那就不怕他加殼了。軟件脫殼有手動脫和自動脫殼之分，下麵我們先介紹自動脫殼，因為手動脫殼需要運用彙編語言，要跟蹤斷點等，不適合初學者，但我們在後邊將稍作介紹。 加殼一般屬於軟件加密，現在越來越多的軟件經過壓縮處理，給漢化帶來許多不便，軟件漢化愛好者也不得不學習掌握這種技能。現在脫殼一般分手動和自動兩種，手動就是用TRW2000、TR、SOFTICE等調試工具對付，對脫殼者有一定水準要求，涉及到很多彙編語言和軟件調試方面的知識。而自動就是用專門的脫殼工具來脫，最常用某種壓縮軟件都有他人寫的反壓縮工具對應，有些壓縮工具自身能解壓，如UPX；有些不提供這功能，如：ASPACK，就需要 UNASPACK對付，好處是簡單，缺點是版本更新了就沒用了。另外脫殼就是用專門的脫殼工具來對付，最流行的是PROCDUMP v1.62 ，可對付目前各種壓縮軟件的壓縮檔。在這裡介紹的是一些通用的方法和工具，希望對大家有幫助。我們知道檔的加密方式，就可以使用不同的工具、不同的方法進行脫殼。下面是我們常常會碰到的加殼方式及簡單的脫殼措施，供大家參考：脫殼的基本原則就是單步跟蹤，只能往前，不能往後。脫殼的一般流程是：查殼 -&#62;尋找OEP-&#62;Dump-&#62;修復找OEP的一般思路如下：先看殼是加密殼還是壓縮殼，壓縮殼相對來說容易些，一般是沒有異常，找到對應的popad後就能到入口，跳到入口的方式一般為。我們知道文件被一些壓縮加殼軟件加密，下一步我們就要分析加密軟件的名稱、版本。因為不同軟件甚至不同版本加的殼，脫殼處理的方法都不相同。 常用脫殼工具： 1、文件分析工具（偵測殼的類型）：Fi，GetTyp，peid，pe-scan。 2、OEP入口查找工具：SoftICE，TRW，ollydbg，loader，peid 。 3、dump工具：IceDump，TRW，PEditor，ProcDump32，LordPE。 4、PE文件編輯工具PEditor，ProcDump32，LordPE。 5、重建Import Table工具：ImportREC，ReVirgin。 6、ASProtect脫殼專用工具：Caspr（ASPr V1.1-V1.2有效），Rad（只對ASPr V1.1有效），loader，peid 。 （1）Aspack： 用的最多，但只要用UNASPACK或PEDUMP32脫殼就行了。 （2）ASProtect+aspack：次之，國外的軟件多用它加殼，脫殼時需要用到SOFTICE+ICEDUMP，需要一定的專業知識，但最新版現在暫時沒有辦法。 （3）Upx： 可以用UPX本身來脫殼，但要注意版本是否一致，用-D 參數。 （4）Armadill： 可以用SOFTICE+ICEDUMP脫殼，比較煩。 （5）Dbpe： 國內比較好的加密軟件，新版本暫時不能脫，但可以破解。 （6）NeoLite： 可以用自己來脫殼。 （7）Pcguard： 可以用SOFTICE+ICEDUMP+FROGICE來脫殼。 （8）Pecompat： 用SOFTICE配合PEDUMP32來脫殼，但不要專業知識。 （9）Petite： 有一部分的老版本可以用PEDUMP32直接脫殼，新版本脫殼時需要用到SOFTICE+ICEDUMP，需要一定的專業知識。 （10）WWpack32： [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=55&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>(一）殼的概念<br />
作者編好軟件後，編譯成exe可執行文件。 1.有一些版權資訊需要保護起來，不想讓別人隨便改動，如作者的姓名，即為了保護軟件不被破解，通常都是採用加殼來進行保護。 2.需要把程式搞的小一點，從而方便使用。於是，需要用到一些軟件，它們能將exe可執行文件壓縮， 3.在駭客界給木馬等軟件加殼脫殼以躲避殺毒軟件。實現上述功能，這些軟件稱為加殼軟件。</p>
<p>（二）加殼軟件最常見的加殼軟件<br />
ASPACK ，UPX，PEcompact 不常用的加殼軟件WWPACK32；PE-PACK ；PETITE NEOLITE</p>
<p>（三）偵測殼和軟件所用編寫語言的軟件<br />
因為脫殼之前要查他的殼的類型。<br />
1.偵測殼的軟件fileinfo.exe 簡稱fi.exe（偵測殼的能力極強）。<br />
2.偵測殼和軟件所用編寫語言的軟件language.exe（兩個功能合為一體，很棒），推薦language2000中文版（專門檢測加殼類型）。<br />
3.軟件常用編寫語言Delphi，VisualBasic（VB）&#8212;最難破，VisualC（VC）。</p>
<p>（四）脫殼軟件<br />
軟件加殼是作者寫完軟件後，為了保護自己的代碼或維護軟件產權等利益所常用到的手段。目前有很多加殼工具，當然有盾，自然就有矛，只要我們收集全常用脫殼工具，那就不怕他加殼了。軟件脫殼有手動脫和自動脫殼之分，下麵我們先介紹自動脫殼，因為手動脫殼需要運用彙編語言，要跟蹤斷點等，不適合初學者，但我們在後邊將稍作介紹。<br />
加殼一般屬於軟件加密，現在越來越多的軟件經過壓縮處理，給漢化帶來許多不便，軟件漢化愛好者也不得不學習掌握這種技能。現在脫殼一般分手動和自動兩種，手動就是用TRW2000、TR、SOFTICE等調試工具對付，對脫殼者有一定水準要求，涉及到很多彙編語言和軟件調試方面的知識。而自動就是用專門的脫殼工具來脫，最常用某種壓縮軟件都有他人寫的反壓縮工具對應，有些壓縮工具自身能解壓，如UPX；有些不提供這功能，如：ASPACK，就需要 UNASPACK對付，好處是簡單，缺點是版本更新了就沒用了。另外脫殼就是用專門的脫殼工具來對付，最流行的是PROCDUMP v1.62 ，可對付目前各種壓縮軟件的壓縮檔。在這裡介紹的是一些通用的方法和工具，希望對大家有幫助。我們知道檔的加密方式，就可以使用不同的工具、不同的方法進行脫殼。下面是我們常常會碰到的加殼方式及簡單的脫殼措施，供大家參考：脫殼的基本原則就是單步跟蹤，只能往前，不能往後。脫殼的一般流程是：查殼 -&gt;尋找OEP-&gt;Dump-&gt;修復找OEP的一般思路如下：先看殼是加密殼還是壓縮殼，壓縮殼相對來說容易些，一般是沒有異常，找到對應的popad後就能到入口，跳到入口的方式一般為。我們知道文件被一些壓縮加殼軟件加密，下一步我們就要分析加密軟件的名稱、版本。因為不同軟件甚至不同版本加的殼，脫殼處理的方法都不相同。</p>
<p>常用脫殼工具：<br />
1、文件分析工具（偵測殼的類型）：Fi，GetTyp，peid，pe-scan。<br />
2、OEP入口查找工具：SoftICE，TRW，ollydbg，loader，peid 。<br />
3、dump工具：IceDump，TRW，PEditor，ProcDump32，LordPE。<br />
4、PE文件編輯工具PEditor，ProcDump32，LordPE。<br />
5、重建Import Table工具：ImportREC，ReVirgin。<br />
6、ASProtect脫殼專用工具：Caspr（ASPr V1.1-V1.2有效），Rad（只對ASPr V1.1有效），loader，peid 。<br />
（1）Aspack： 用的最多，但只要用UNASPACK或PEDUMP32脫殼就行了。<br />
（2）ASProtect+aspack：次之，國外的軟件多用它加殼，脫殼時需要用到SOFTICE+ICEDUMP，需要一定的專業知識，但最新版現在暫時沒有辦法。<br />
（3）Upx： 可以用UPX本身來脫殼，但要注意版本是否一致，用-D 參數。<br />
（4）Armadill： 可以用SOFTICE+ICEDUMP脫殼，比較煩。<br />
（5）Dbpe： 國內比較好的加密軟件，新版本暫時不能脫，但可以破解。<br />
（6）NeoLite： 可以用自己來脫殼。<br />
（7）Pcguard： 可以用SOFTICE+ICEDUMP+FROGICE來脫殼。<br />
（8）Pecompat： 用SOFTICE配合PEDUMP32來脫殼，但不要專業知識。<br />
（9）Petite： 有一部分的老版本可以用PEDUMP32直接脫殼，新版本脫殼時需要用到SOFTICE+ICEDUMP，需要一定的專業知識。<br />
（10）WWpack32： 和PECOMPACT一樣其實有一部分的老版本可以用PEDUMP32直接脫殼，不過有時候資源無法修改，也就無法漢化，所以最好還是用SOFTICE配合 PEDUMP32脫殼。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/55/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=55&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e5%8a%a0%e6%ae%bc%e8%88%87%e8%84%ab%e6%ae%bc%e5%b0%8f%e6%95%99%e5%ad%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 破解基礎(獻給剛接觸破解的新手)</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e7%a0%b4%e8%a7%a3%e5%9f%ba%e7%a4%8e%e7%8d%bb%e7%b5%a6%e5%89%9b%e6%8e%a5%e8%a7%b8%e7%a0%b4%e8%a7%a3%e7%9a%84%e6%96%b0%e6%89%8b/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e7%a0%b4%e8%a7%a3%e5%9f%ba%e7%a4%8e%e7%8d%bb%e7%b5%a6%e5%89%9b%e6%8e%a5%e8%a7%b8%e7%a0%b4%e8%a7%a3%e7%9a%84%e6%96%b0%e6%89%8b/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:47:14 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=53</guid>
		<description><![CDATA[不可不說一下學習破解的三個階段： 初級,修改程序,用ultraedit等工具修改exe文件,稱暴力破解,簡稱爆破 中級,追出軟件的註冊碼 高級,寫出註冊機 先說這爆破。所謂爆破，就是指通過修改可執行文件的源文件，來達到相應的目的。你不明白？呵呵，舉個例子好了，比如說某共享軟件，它比較用戶輸入的註冊碼，如果用戶輸入的，跟它通過用戶名（或其它）算出來的註冊碼相等的話（也就是說用戶輸入的註冊碼正確了），那麼它就會跳到註冊成功的地方去，否則就跳到出錯的地方去。 明白過來了吧，我們只要找到這個跳轉指令，把它修改為我們需要的「造型」，這樣，我們是不是就可以為所欲為了？（某軟件雙手放在胸口，你要幹嘛？） 常見的修改方法有兩種，我給你舉例說明： no.1 在某軟件中，這樣來進行註冊： 00451239 CALL 00405E02 (關鍵CALL，用來判斷用戶輸入的註冊碼是否正確) 0045123D JZ 004572E6 (!!!&#60;&#8211;此為關鍵跳轉，如果用戶輸入的註冊碼正確，就跳向成功處，即004572E6處) 0045XXXX YYYYYYYYYY XXXXXXXX YYYYYYYYYY XXXXXXXX YYYYYYYYYY XXXXXXXX 執行到此處，就提示用戶註冊失敗 &#8230;提示用戶註冊碼不正確等相關信息 &#8230; 004572E6 &#8230; &#60;&#8211;(註冊成功處!!!) &#8230;提示用戶註冊成功等相關信息 呵呵，看明白了嗎？沒有的話，我來給你講一下。在軟件執行到00451239處的時候，CALL置0045E02處來進行註冊碼判斷。接著回來後就來一個跳轉語句，即如果用戶輸入的註冊碼正確就跳到004572E6處，跳到此處，就算是註冊成功了。如果用戶輸入的註冊碼不正確的話，那麼就不會在 0045123D處進行跳轉，而一直執行下去。在下面等它的，是註冊失敗部分。 想明白了嗎？嘿嘿&#8230;沒錯，我們只要把那個關鍵跳轉JZ給改為JNZ(如果用戶輸入的註冊碼錯誤，就註冊成功，輸入正確則註冊失敗)。當然你也可以將JNZ修改為Jmp，這樣的話，你輸入的註冊碼無論正確與否。都可以註冊成功。 no.2 我們再來講一下另外的一種情況： 00451239 CALL 00405E02 (關鍵CALL，用來判斷用戶輸入的註冊碼是否正確) 0045123D JNZ 004572E6 (!!!&#60;&#8211;此為關鍵跳轉，如果用戶輸入的註冊碼不正確，就跳向失敗處，即004572E6處) 0045XXXX YYYYYYYYYY XXXXXXXX YYYYYYYYYY XXXXXXXX YYYYYYYYYY XXXXXXXX 執行到此處，就提示用戶註冊成功 &#8230;提示用戶註冊成功等相關信息 &#8230; 004572E6 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=53&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>不可不說一下學習破解的三個階段：<br />
初級,修改程序,用ultraedit等工具修改exe文件,稱暴力破解,簡稱爆破<br />
中級,追出軟件的註冊碼<br />
高級,寫出註冊機<br />
先說這爆破。所謂爆破，就是指通過修改可執行文件的源文件，來達到相應的目的。你不明白？呵呵，舉個例子好了，比如說某共享軟件，它比較用戶輸入的註冊碼，如果用戶輸入的，跟它通過用戶名（或其它）算出來的註冊碼相等的話（也就是說用戶輸入的註冊碼正確了），那麼它就會跳到註冊成功的地方去，否則就跳到出錯的地方去。<br />
明白過來了吧，我們只要找到這個跳轉指令，把它修改為我們需要的「造型」，這樣，我們是不是就可以為所欲為了？（某軟件雙手放在胸口，你要幹嘛？）<br />
常見的修改方法有兩種，我給你舉例說明：<br />
no.1<br />
在某軟件中，這樣來進行註冊：<br />
00451239 CALL 00405E02 (關鍵CALL，用來判斷用戶輸入的註冊碼是否正確)<br />
0045123D JZ 004572E6   (!!!&lt;&#8211;此為關鍵跳轉，如果用戶輸入的註冊碼正確，就跳向成功處，即004572E6處)<br />
0045XXXX YYYYYYYYYY<br />
XXXXXXXX YYYYYYYYYY<br />
XXXXXXXX YYYYYYYYYY<br />
XXXXXXXX 執行到此處，就提示用戶註冊失敗<br />
&#8230;提示用戶註冊碼不正確等相關信息<br />
&#8230;<br />
004572E6 &#8230; &lt;&#8211;(註冊成功處!!!)<br />
&#8230;提示用戶註冊成功等相關信息<br />
呵呵，看明白了嗎？沒有的話，我來給你講一下。在軟件執行到00451239處的時候，CALL置0045E02處來進行註冊碼判斷。接著回來後就來一個跳轉語句，即如果用戶輸入的註冊碼正確就跳到004572E6處，跳到此處，就算是註冊成功了。如果用戶輸入的註冊碼不正確的話，那麼就不會在 0045123D處進行跳轉，而一直執行下去。在下面等它的，是註冊失敗部分。<br />
想明白了嗎？嘿嘿&#8230;沒錯，我們只要把那個關鍵跳轉JZ給改為JNZ(如果用戶輸入的註冊碼錯誤，就註冊成功，輸入正確則註冊失敗)。當然你也可以將JNZ修改為Jmp，這樣的話，你輸入的註冊碼無論正確與否。都可以註冊成功。<br />
no.2<br />
我們再來講一下另外的一種情況：<br />
00451239 CALL 00405E02 (關鍵CALL，用來判斷用戶輸入的註冊碼是否正確)<br />
0045123D JNZ 004572E6   (!!!&lt;&#8211;此為關鍵跳轉，如果用戶輸入的註冊碼不正確，就跳向失敗處，即004572E6處)<br />
0045XXXX YYYYYYYYYY<br />
XXXXXXXX YYYYYYYYYY<br />
XXXXXXXX YYYYYYYYYY<br />
XXXXXXXX 執行到此處，就提示用戶註冊成功<br />
&#8230;提示用戶註冊成功等相關信息<br />
&#8230;<br />
004572E6 &#8230; &lt;&#8211;(註冊失敗處!!!)<br />
&#8230;提示用戶註冊碼不正確等相關信息<br />
這次我相信，並且深信不疑。你一定明白了。我還是不明白&#8230;倒&#8230;<br />
你一定看出跟第一種情況不同的地方了吧。沒錯！它與第一種不同的，就是第一種情況是如果註冊碼正確，就跳到註冊成功處，如果沒有跳走，就會執行到失敗處。而這一種情況則是如果註冊碼不正確，就跳到註冊失敗處，否則將執行到註冊成功處。<br />
這種情況的修改，除了把JNZ改為JZ外，還可以將其改為Nop，Nop這個指令沒有任何意義，將該條指令修改為Nop後，便可隨意輸入註冊碼來進行註冊了。<br />
原理以經給你講了，下面我們再來講一下具體的修改辦法吧。（我假設你以經明白了我所說的工具的使用方法）<br />
先說一下虛擬地址和偏移量轉換的問題，在SoftICE和W32Dasm下顯示的地址值是所謂的內存地址（memory offset），或稱之為虛擬地址（Virual Address，VA）。而十六進制工具裡，如：Hiew、Hex Workshop等顯示的地址就是文件地址，稱之為偏移量（File offset) 或物理地址(RAW offset)。<br />
所以當我們要通過那些十六進制工具來對可執行文件中的相應指令進行修改的話，先要找到它的File offset。我們沒有必要去使用那些專門的轉換工具，在W32Dasm中就有這個功能，比如說你W32Dasm中來到0045123D處，在 W32Dasm界面下方的狀態欄中就會出現該條指令的虛擬地址和偏移地址，即@:0045123D @offset 0005063Dh 後面的這個0005063Dh就是相應的偏移地址。我們得到該地址後，便可用UltraEdit等十六進制工具來對可執行文件進行修改了。比如使用 UltraEdit，你先用UltraEdit打開該可執行文件，然後按Ctrl+G，接著輸入你得到的偏移地址，就可以來到其相應的機器碼處。<br />
再給你講一下機器碼，所謂的機器碼。就是你看到的那些個十六進制數據了。還記的它們與彙編指令是一一對應的嗎？<br />
以下這幾個是爆破時要用到的，其它的如果感興趣，可自行查看相關資料：<br />
JZ=74;JNZ=75;JMP=EB;Nop=90<br />
爆破的時候，只要對以上機器碼進行相應的修改就行了，比如第一種情況的時候，可以將74修改為EB，即將JZ修改為JMP。而第二種情況，責需將75修改為90，即將JNZ修改為Nop。<br />
由於本章只講原理，具體一點的。如怎樣找到關鍵跳轉等，我們在下一章中再講。（一個磚頭飛了上來！嘿嘿，這次被俺接到了）<br />
上邊講了爆破的原理，你需要明白的是。爆破只是你學習Crack的開始，是很簡單的手段。剛入門的時候可以玩玩兒，但希望你不要就此不前！<br />
（嘿嘿，再說了。人家的軟件中不是都說了嘛，不准對其進行逆向修改。你動了人家的身子，怎麼能不買帳呢？ ）<br />
偶就不喜歡爆破，做不出註冊機也要找出註冊碼。否則我就不會去註冊這個軟件，既然想不掏錢，就要靠你自己的本事。（等以後我有錢了，會考慮去註冊那些優秀的共享軟件的 ）。所以，從某種意義上來說，我是一個正人君子<br />
其實要找到註冊碼並不是一件多麼難的事，我是指你所針對的軟件不太那個的時候 不過你無需懼怕。<br />
剛才我們說爆破的時候不提到過關鍵CALL嗎？一般情況下，這個關鍵CALL就是對兩個註冊碼（一個是軟件自身通過你的註冊名或機器什麼的計算出來的正確的註冊碼，令一個就是你輸入的錯誤的註冊碼）進行比較。我前邊提到過，CALL之前一般會把所用到的數據先放到一個地方，CALL過去的時候再從這些地方把先前放入的數據取出來，進行相應的處理。這個關鍵CALL也是這樣，在CALL之前，一般會把那兩個註冊碼放到堆棧或某個寄存器中。嘿嘿，我們只要在調試器中，單步執行到該CALL，在未進去之前通過CALL之前的指令判斷其將正確的和不正確的註冊碼放到哪裡了。然後再用相應指令進行查看就成了，我說過不難的。<br />
下面列出兩個最常見的情況（可參考相關教程）：<br />
no.1<br />
mov eax [     ] 這裡可以是地址，也可以是其它寄存器<br />
mov edx [     ] 同上，該條指令也可以是pop edx<br />
call 00??????   關鍵call<br />
test eax eax<br />
jz(jnz)或jne(je) 關鍵跳轉<br />
看明白了吧，在關鍵CALL之前，軟件會把兩個註冊碼分別放入eax和edx中，你只要在CALL處下d eax或d edx就能看到正確的註冊碼了。<br />
no.2<br />
mov eax [     ] 這裡可以是地址，也可以是其它寄存器<br />
mov edx [     ] 同上，該條指令也可以是pop edx<br />
call 00??????   關鍵call<br />
jne(je)       關鍵跳轉<br />
以上兩種情況最為常見，而那些個不太常見的情況，我們這裡就不再提了。到下下一章的時候，我會給你講相關方法的&#8230;<br />
關於查找軟件註冊碼的部分，就到這裡。具體內容，下下一章咱們再說。(不是說了嗎？我以經可以接到你的磚頭了，幹嘛還要丟呢？ )<br />
最後，再來說最後的所謂的高級階段，如果你相信自己。並且熱愛Crack，那麼你一定會熬到這個階段的，只是時間因人而異。<br />
其實分析軟件的算法，是有好多技巧在裡面的。呵呵，最起碼我剛開始的時候就摸不著頭腦，那麼多CALL，每個看起來，都很重要，都追一遍？結果連好多API都被追了進去。等你自己真正用心分析了一個軟件的算法，並寫出了註冊機後。你就會明白其中的道理了</p>
<p>======================================================<br />
EDIT by john0312:</p>
<p>轉貼自: http://www.pediy.com/bbshtml/BBS5/pediy50555.htm</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=53&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e7%a0%b4%e8%a7%a3%e5%9f%ba%e7%a4%8e%e7%8d%bb%e7%b5%a6%e5%89%9b%e6%8e%a5%e8%a7%b8%e7%a0%b4%e8%a7%a3%e7%9a%84%e6%96%b0%e6%89%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 脫殼新手該學習的五種脫殼方法</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e8%84%ab%e6%ae%bc%e6%96%b0%e6%89%8b%e8%a9%b2%e5%ad%b8%e7%bf%92%e7%9a%84%e4%ba%94%e7%a8%ae%e8%84%ab%e6%ae%bc%e6%96%b9%e6%b3%95/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e8%84%ab%e6%ae%bc%e6%96%b0%e6%89%8b%e8%a9%b2%e5%ad%b8%e7%bf%92%e7%9a%84%e4%ba%94%e7%a8%ae%e8%84%ab%e6%ae%bc%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:46:43 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=51</guid>
		<description><![CDATA[廢話不多說 方法一：　　 1.用OD載入，不分析代碼！　　 2.單步向下跟蹤F8，是向下跳的讓它實現。　　 3.遇到程式往回跳的（包括循環），我們在下一句代碼處按F4（或者右健單擊代碼，選擇斷點??運行到所選）。　　 4.綠色線條表示跳轉沒實現，不用理會，紅色線條表示跳轉已經實現！　　 5.如果剛載入程式，在附近就有一個CALL的，我們就F7跟進去，這樣很快就能到程式的OEP。 6.在跟蹤的時候，如果運行到某個CALL程式就運行的，就在這個CALL中F7進入。　　 7.一般有很大的跳轉，比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就會到程式的OEP。 方法二：　　 ESP定理脫殼（ESP在OD的寄存器中，我們只要在命令行下ESP的硬體訪問斷點，就會一下來到程式的OEP了！）　　 1.開始就點F8，注意觀察OD右上角的寄存器中ESP有沒出現。　　 2.在命令行下：dd 0012FFA4(指在當前代碼中的ESP地址)，按回車！　　 3.選種下斷的地址，下硬體訪問WORD斷點。　　 4.按一下F9運行程式，直接來到了跳轉處，按下F8，到達程式OEP，脫殼 方法三：　　 內存跟蹤：　　 1：用OD打開軟體！　　 2：點擊選項』調試選項』異常，把裡面的忽略全部√上！CTRL+F2重載下程式！　　 3：按ALT+M，打開內存鏡象，找到第一個.rsrc.按F2下斷點，然後按SHIFT+F9運行到斷點，接著再按ALT+M，開內存鏡象，找到.RSRC上面的CODE，按F2下斷點！然後按SHIFT+F9，直接到達程式OEP，脫殼 方法四：　　 一步到達OEP（前輩們總結的經驗）　　 1.開始按Ctrl+F,輸入：popad（只適合少數殼，包括ASPACK殼），然後按下F2，F9運行到此處　　 2.來到大跳轉處，點下F8，脫殼它！ 方法五：　　 1：用OD打開軟體！　　 2：點擊選項』"調試選項』"異常，把裡面的√全部去掉！CTRL+F2重載下程式！　　 3：一開是程式就是一個跳轉，在這裡我們按SHIFT+F9，直到程式運行，記下從開始按F9到程式　　運行的次數！　　 4：CTRL+F2重載程式，按SHIFT+F9（次數為程式運行的次數-1次　　 5：在OD的右下角我們看見有一個SE 句柄，這時我們按CTRL+G，輸入SE 句柄前的地址！　 6：按F2下斷點！然後按SHIFT+F9來到斷點處！　　 7：去掉斷點，按F8慢慢向下走！　　 8：到達程式的OEP，脫殼！<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=51&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>廢話不多說</p>
<p>方法一：　　<br />
1.用OD載入，不分析代碼！　　<br />
2.單步向下跟蹤F8，是向下跳的讓它實現。　　<br />
3.遇到程式往回跳的（包括循環），我們在下一句代碼處按F4（或者右健單擊代碼，選擇斷點??運行到所選）。　　<br />
4.綠色線條表示跳轉沒實現，不用理會，紅色線條表示跳轉已經實現！　　<br />
5.如果剛載入程式，在附近就有一個CALL的，我們就F7跟進去，這樣很快就能到程式的OEP。<br />
6.在跟蹤的時候，如果運行到某個CALL程式就運行的，就在這個CALL中F7進入。　　<br />
7.一般有很大的跳轉，比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就會到程式的OEP。</p>
<p>方法二：　　<br />
ESP定理脫殼（ESP在OD的寄存器中，我們只要在命令行下ESP的硬體訪問斷點，就會一下來到程式的OEP了！）　　<br />
1.開始就點F8，注意觀察OD右上角的寄存器中ESP有沒出現。　　<br />
2.在命令行下：dd 0012FFA4(指在當前代碼中的ESP地址)，按回車！　　<br />
3.選種下斷的地址，下硬體訪問WORD斷點。　　<br />
4.按一下F9運行程式，直接來到了跳轉處，按下F8，到達程式OEP，脫殼</p>
<p>方法三：　　<br />
內存跟蹤：　　<br />
1：用OD打開軟體！　　<br />
2：點擊選項』調試選項』異常，把裡面的忽略全部√上！CTRL+F2重載下程式！　　<br />
3：按ALT+M，打開內存鏡象，找到第一個.rsrc.按F2下斷點，然後按SHIFT+F9運行到斷點，接著再按ALT+M，開內存鏡象，找到.RSRC上面的CODE，按F2下斷點！然後按SHIFT+F9，直接到達程式OEP，脫殼</p>
<p>方法四：　　<br />
一步到達OEP（前輩們總結的經驗）　　<br />
1.開始按Ctrl+F,輸入：popad（只適合少數殼，包括ASPACK殼），然後按下F2，F9運行到此處　　<br />
2.來到大跳轉處，點下F8，脫殼它！</p>
<p>方法五：　　<br />
1：用OD打開軟體！　　<br />
2：點擊選項』"調試選項』"異常，把裡面的√全部去掉！CTRL+F2重載下程式！　　<br />
3：一開是程式就是一個跳轉，在這裡我們按SHIFT+F9，直到程式運行，記下從開始按F9到程式　　運行的次數！　　<br />
4：CTRL+F2重載程式，按SHIFT+F9（次數為程式運行的次數-1次　　<br />
5：在OD的右下角我們看見有一個SE 句柄，這時我們按CTRL+G，輸入SE 句柄前的地址！　<br />
6：按F2下斷點！然後按SHIFT+F9來到斷點處！　　<br />
7：去掉斷點，按F8慢慢向下走！　　<br />
8：到達程式的OEP，脫殼！</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=51&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e8%84%ab%e6%ae%bc%e6%96%b0%e6%89%8b%e8%a9%b2%e5%ad%b8%e7%bf%92%e7%9a%84%e4%ba%94%e7%a8%ae%e8%84%ab%e6%ae%bc%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 手工脫殼基本常識</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e6%89%8b%e5%b7%a5%e8%84%ab%e6%ae%bc%e5%9f%ba%e6%9c%ac%e5%b8%b8%e8%ad%98/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e6%89%8b%e5%b7%a5%e8%84%ab%e6%ae%bc%e5%9f%ba%e6%9c%ac%e5%b8%b8%e8%ad%98/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:45:05 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=49</guid>
		<description><![CDATA[基本知識 　　手動脫殼就是不借助自動脫殼工具，而是用動態調試工具SOFTICE或TRW2000來脫殼。這課談談一些入門方面的知識，如要瞭解更深的脫殼知識 　　工具 　　*調試器：SoftICE 、TRW2000 　　*記憶體抓取工具：Procdump等； 　　*十六進位工具：Hiew、UltraEdit、Hex Workshop等； 　　*PE編輯工具： Procdump、PEditor等； 　 　　名詞概念 　　★PE文件：Microsoft設計了一種新的檔格式Portable Executable File Format(即PE格式)，該格式應用於所有基於Win32的系統：Windows NT、Windows 2000、Win32s及Windows 95/98。 　 　　★基址（ImageBase ）:是指裝入到記憶體中的EXE或DLL程式的開始位址，它是Win32中的一個重要概念。 在Windows NT中，缺省的值是10000h;對於DLLs，缺省值為400000h。在Windows 95中，10000h不能用來裝入32位的執行檔，因為該位址處於所有進程共用的線性位址區域，因此Microsoft將Win32可執行檔的缺省基底位址改變為400000h。 　 　　★RVA：相對虛擬位址（Relative Virual Address），是某個項相對於檔映象位址的偏移。例如：裝載程式將一個PE檔裝入到虛擬位址空間中，從10000h開始的記憶體中，如果PE中某個表在映射中的起始地址是10464h,那麼該表的RVA就是464h。虛擬位址(RVA)＝偏移位址＋基址（ImageBase ) 　 　　★Entry Point：入口點，就是程式在完成了對原程式的還原後，開始跳轉到剛還原的程式執行，此時的位址就是入口點的值。 　　2、步驟 　 　　★確定殼的種類 　 　　一般拿到軟體後，可用工具FileInfo、gtw、TYP32等偵測文件類型的工具來看看是何種殼，然後再採取措施。 　 　　★入口點（Entry Point）確定 　 　　對初學者來說定位程式解殼後的入口點確定較難，但熟練後，入口點查找是很方便的。 決大多數 PE 加殼程式在被加密的程式中加上一個或多個段。 所以看到一個跨段的 JMP 就有可能是了。如：UPX 用了一次跨段的 JMP ， ASPACK 用了兩次跨段的 JMP [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=49&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>基本知識   </p>
<p>　　手動脫殼就是不借助自動脫殼工具，而是用動態調試工具SOFTICE或TRW2000來脫殼。這課談談一些入門方面的知識，如要瞭解更深的脫殼知識</p>
<p>　　工具   </p>
<p>　　*調試器：SoftICE 、TRW2000   </p>
<p>　　*記憶體抓取工具：Procdump等；   </p>
<p>　　*十六進位工具：Hiew、UltraEdit、Hex Workshop等；   </p>
<p>　　*PE編輯工具： Procdump、PEditor等； 　   </p>
<p>　　名詞概念   </p>
<p>　　★PE文件：Microsoft設計了一種新的檔格式Portable Executable File Format(即PE格式)，該格式應用於所有基於Win32的系統：Windows NT、Windows 2000、Win32s及Windows 95/98。 　   </p>
<p>　　★基址（ImageBase ）:是指裝入到記憶體中的EXE或DLL程式的開始位址，它是Win32中的一個重要概念。 在Windows NT中，缺省的值是10000h;對於DLLs，缺省值為400000h。在Windows 95中，10000h不能用來裝入32位的執行檔，因為該位址處於所有進程共用的線性位址區域，因此Microsoft將Win32可執行檔的缺省基底位址改變為400000h。 　   </p>
<p>　　★RVA：相對虛擬位址（Relative Virual Address），是某個項相對於檔映象位址的偏移。例如：裝載程式將一個PE檔裝入到虛擬位址空間中，從10000h開始的記憶體中，如果PE中某個表在映射中的起始地址是10464h,那麼該表的RVA就是464h。虛擬位址(RVA)＝偏移位址＋基址（ImageBase ) 　   </p>
<p>　　★Entry Point：入口點，就是程式在完成了對原程式的還原後，開始跳轉到剛還原的程式執行，此時的位址就是入口點的值。</p>
<p>　　2、步驟 　   </p>
<p>　　★確定殼的種類 　   </p>
<p>　　一般拿到軟體後，可用工具FileInfo、gtw、TYP32等偵測文件類型的工具來看看是何種殼，然後再採取措施。 　   </p>
<p>　　★入口點（Entry Point）確定 　   </p>
<p>　　對初學者來說定位程式解殼後的入口點確定較難，但熟練後，入口點查找是很方便的。 決大多數 PE 加殼程式在被加密的程式中加上一個或多個段。 所以看到一個跨段的 JMP 就有可能是了。如：UPX 用了一次跨段的 JMP ， ASPACK 用了兩次跨段的 JMP 。 這種判斷一般是跟蹤分析程式而找到入口點，如是用TRW2000也可試試命令：PNEWSEC，它可讓TRW2000中斷到入口點上。   </p>
<p>　　PNEWSEC：執行直到進入一個 PE 程式記憶體的新的 section時產生中斷點。（如不懂，以後到脫殼高級篇自會明白） 　   </p>
<p>　　另外也可用D.boy的衝擊波2000,它能輕易的找到任何加密殼的入口點， 　   </p>
<p>　　★dump取記憶體己還原檔 　   </p>
<p>　　找到入口點後，在此處可以用 Procdump的FULL DUMP功能來抓取記憶體中整個檔，   </p>
<p>　　如是用TRW2000也可用命令： 　   </p>
<p>　　makepe命令含義：從記憶體中整理出一個指令名稱的PE格式的exe檔， 當前的 EIP 將成為新的程式入口，生成檔的 Import table 已經重新生成過了。生成的PE檔可執行任何平臺和微機上。 　   </p>
<p>　　pedump命令含義：將PE檔的記憶體映射直接映射到指定的檔裏。生成的檔只能在本機執行，不能在其他系統平臺或微機執行。 　　   </p>
<p>　　★修正剛dump取的檔 　   </p>
<p>　　如是用 Procdump的FULL DUMP功能脫殼的檔，要用 Procdump或PEditor等PE編輯工具修正入口點（Entry Point）。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=49&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e6%89%8b%e5%b7%a5%e8%84%ab%e6%ae%bc%e5%9f%ba%e6%9c%ac%e5%b8%b8%e8%ad%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 10招讓你快速增加自己破解技能</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-10%e6%8b%9b%e8%ae%93%e4%bd%a0%e5%bf%ab%e9%80%9f%e5%a2%9e%e5%8a%a0%e8%87%aa%e5%b7%b1%e7%a0%b4%e8%a7%a3%e6%8a%80%e8%83%bd/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-10%e6%8b%9b%e8%ae%93%e4%bd%a0%e5%bf%ab%e9%80%9f%e5%a2%9e%e5%8a%a0%e8%87%aa%e5%b7%b1%e7%a0%b4%e8%a7%a3%e6%8a%80%e8%83%bd/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:36:23 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=47</guid>
		<description><![CDATA[下面談到了一些在學習解密過程中經常遇到的問題，本人根據自己的經驗簡單給大家談一談。這些問題對於初學人來說常常是很需要搞明白的，根據我自己的學習經歷，如果你直接照著很多破解教程去學習的話，多半都會把自己搞得滿頭的霧水，因為有很多的概念要么自己不是很清楚，要么根本就不知道是怎么一回事，所以希望透過下面的討論給大家一定的幫助︰ 1. 斷點︰所謂斷點就是程式被中斷的地方，這個詞對於解密者來說是再熟悉不過了。那麼什麼又是中斷呢？中斷就是由於有特殊事件（中斷事件）發生，計算機暫停當前的任務（即程式），轉而去執行另外的任務（中斷服務程式），然後再返回原先的任務繼續執行。打個比方︰你正在上班，突然有同學打電話告訴你他從外地坐火車過來，要你去火車站接他。然後你就向頭家臨時請假，趕往火車站去接同學，接著將他安頓好，隨後你又返回公司繼續上班，這就是一個中斷過程。我們解密的過程就是等到程式去獲取我們輸入的註冊碼並準備和正確的註冊碼相比較的時候將它中斷下來，然後我們透過分析程式，找到正確的註冊碼。所以我們需要為被解密的程式設定斷點，在適當的時候切入程式內部，追蹤到程式的註冊碼，從而達到crack的目的。 2. 領空︰這是個非常重要的概念，但是也初學人是常常不明白的地方。我們在各種各樣的破解文章裡都能看到領空這個詞，如果你搞不清楚到底程式的領空在那裡，那麼你就不可能進入破解的大門。或許你也曾破解過某些軟體，但那只是瞎貓碰到死老鼠而已（以前我就是這樣的^_^,現下說起來都不好意思喔﹗）。所謂程式的領空，說白了就是程式自己的地方，也就是我們要破解的程式自己程式碼所處的位置。也許你馬上會問︰我是在程式營運的時候設定的斷點，為什麼中斷後不是在程式自己的空間呢？因為每個程式的編寫都沒有固定的模式，所以我們要在想要切入程式的時候中斷程式，就必須不倚賴具體的程式設定斷點，也就是我們設定的斷點應該是每個程式都會用到的東西。在DOS時代，基本上所有的程式都是工作在中斷程式之上的，即幾乎所有的DOS程式都會去調用各種中斷來完成任務。但是到了WINDOWS時代，程式沒有權力直接調用中斷，WINDOWS系統提供了一個系統功能調用平台（API），就向DOS程式以中斷程式為基礎一樣，WINDOWS程式以API為基礎來實現和系統打交道，從而各種功能，所以WINDWOS下的軟體破解其斷點設定是以API函數為基礎的，即當程式調用某個API函數時中斷其正常營運，然後進行解密。例如在SOFTICE中設定下面的斷點︰bpx GetDlgItemText（獲取對話框文本），當我們要破解的程式要讀取輸入的數據而調用GetDlgItemText時，立即被SOFTICE攔截到，從而被破解的程式停留在GetDlgItemText的程式區，而GetDlgItemText是處於WINDWOS自己管理的系統區域，如果我們擅自改掉這部分的程式代碼，那就大禍臨頭了^_^﹗所以我們要從系統區域返回到被破解程式自己的地方（即程式的領空），才能對程式進行破解，至於怎樣看程式的領空請看前面的SOFTICE圖解。試想一下︰對於每個程式都會調用的程式段，我們可能從那裡找到什麼有用的東西嗎？（怎么樣去加密是程式自己決定的，而不是調用系統功能實現的﹗） 3. API︰即Application Programming Interface的簡寫，中文叫應用程式編程界面，是一個系統定義函數的大集合，它提供了訪問作業系統特徵的方法。 API包含了幾百個應用程式調用的函數，這些函數執行所有必須的與作業系統相關的操作，如內存分發、向螢幕輸出和創建視窗等，用戶的程式透過調用API界面同WINDOWS打交道，無論什麼樣的應用程式，其底層最終都是透過調用各種API函數來實現各種功能的。通常API有兩中基本形式︰Win16和 Win32。 Win16是原來的、API的16位版本，用於Windows 3.1；Win32是現下的、API的32位版本，用於Windows 95/98/NT/ME/2000。Win32包括了Win16，是Win16的超集，大多數函數的名字、用法都是相同的。16位的API函數和32位的 API函數的區別在於最後的一個字母，例如我們設定這樣的斷點︰bpx GetDlgItemText、bpx GetDlgItemTextA和bpx GetDlgItemTextW，其中 GetDlgItemText是16位API函數，GetDlgItemTextA和GetDlgItemTextW是32位API函數，而 GetDlgItemTextA表示函數使用單位元組，GetDlgItemTextW表示函數使用雙位元組。現下我們破解中常用到的是Win32單位元組API函數，就是和GetDlgItemTextA類似的函數，其它的兩種（Win16 API和Win32雙位元組API函數）則比較少見。 Win32 API函數包含在動態鏈接庫（Dynamic Link Libraries，簡稱DLLs）中，即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中，這就是為什麼我們要在softice中用exp=C:\windows\system\kernel32.dll等命令行將這些動態鏈接庫匯入 softice中的原因。因為不這樣做的話，我們就無法攔截到系統Win32 API函數調用了。 4. 關於程式中註冊碼的存在模式︰破解過程中我們都會去找程式中將輸入的註冊碼和正確的註冊碼相比較的地方，然後透過對程式的跟蹤、分析找到正確的註冊碼。但是正確的註冊碼通常在程式中以兩種形態存在︰顯式的和隱式的，對於顯式存在的註冊碼，我們可以直接在程式所處的內存中看到它，例如你可以直接在 SOFTICE的數據視窗中看到類似』297500523&#8243;這樣存在的註冊碼（這裡是隨意寫的），對於註冊碼顯式存在的軟體破解起來比較容易；但是有些軟體的程式中並不會直接將我們輸入的註冊碼和正確的註冊碼進行比較，比如有可能將註冊碼換算成整數、或是將註冊碼拆開，然後將每一位註冊碼分開在不同的地方逐一進行比較，或者是將我們輸入的註冊碼進行某種變換，再用某個特殊的程式進行驗証等等。總之，應用程式會採取各種不同的複雜運算模式來迴避直接的註冊碼比較，對於這類程式，我們通常要下功夫去仔細跟蹤、分析每個程式功能，找到加密算法，然後才能破解它，當然這需要一定的8086彙編編程功底和很大的耐心與精力。 5. 關於軟體的破解模式︰本人將破解模式分為兩大類，即完全破解和暴力破解。所謂完全破解主要是針對那些需要輸入註冊碼或密碼等軟體來說的，如果我們能透過對程式的跟蹤找到正確的註冊碼，透過軟體本身的註冊功能正常註冊了軟體，這樣的破解稱之為完全破解；但如果有些軟體本身沒有提供註冊功能，只是提供試用（DEMO），或是註冊不能透過軟體本身進行（例如需要獲取另外一個專用的註冊程式，透過INTERNET的註冊等等），或者是軟體本身的加密技術比較複雜，軟體破解者的能力、精力、時間有限，不能直接得到正確的註冊碼，此時我們需要去修改軟體本身的程式碼，即人為改淙砑 腦誦蟹較 庋 鈉平獬浦 ζ平狻? 6. 關於破解教程中程式代碼位址問題︰破解教程中都會放上一部分程式代碼以幫助講解程式的分析方法，例如下面的一段程式代碼︰ &#8230;&#8230; 0167:00408033　PUSH　00 0167:00408035　PUSH　EBX 0167:00408036　CALL　[USER32!EndDialog] 0167:0040803C　JMP　0040812C &#8230;&#8230; 在這裡程式中的代碼位址如0167:00408033，其代碼段的值（即0167）有可能根據不同的電腦會有區別，不一定一模一樣，但偏移值應該是固定的（即00408033不變），所以如果看到破解文章裡的程式代碼的位址值和自己的電腦裡不一樣，不要以為搞錯地方了，只要你的程式代碼正確就不會有問題。 7. 關於如何設定斷點的問題︰正確恰當的設定好斷點對於快速有效的解密非常重要，好的斷點設定可以使我們迅速找到關鍵的程式段，而不恰當的斷點則會對解密造成不必要的精力消耗，甚至根本就不能攔截到程式的營運。但是具體什麼時候用什麼斷點比較合適很難說，這需要自己用經驗去累積，總的說來bpx hmemcpy這個萬能斷點對大多數註冊碼模式的軟體都有用，初學人不妨多試試這個斷點（通常我也是用這個斷點設定，懶嘛^_^，哈哈。。。）。對於那些需要暴力破解的非註冊碼模式的軟體，通常我們應該攔截對話框（如bpx DialogBox）和消息框（如bpx MessageBox(A)）等。不論對於哪一類軟體，當我們設定的斷點均沒有效果時，可是試一下bpx lockmytask，這個斷點的作用是攔截任何一個按鍵的動作，具體常用的一些斷點設定請參考』破解常用斷點設定』一文。另外，在註冊碼的破解中通常需要輸入用戶名和註冊碼，一般說來用戶名和密碼都可以隨意輸入，但是根據我自己的經驗，很多軟體對於註冊碼都會逐位的進行處理，假如輸入』78787878&#8243;這串數字，那麼在跟蹤程式的時候我們就無法知道我們當時所看到的』78&#8243;倒底是哪一個』78&#8243;，所以我比較喜歡用』12345678&#8243;這樣的註冊碼輸入模式，這樣的話就就能知道程式是在對註冊碼的哪一位進行運算，同樣的對於那些需要輸入較長序列號的軟體，輸入類似』12345-67890-ABCDEF』這樣的序列號較好。 不過有一點大家需要特別的注意︰上面講的註冊碼輸入模式』12345678&#8243;是針對攔截WIN32 API函數來說的，假如有些時候直接攔截WIN32 API函數難以找到程式的突破口，而要借助於』S』指令在內存中尋找我們輸入的用戶名或註冊碼時，就最好不要採用』12345678&#8243;作為註冊碼，因為內存中很可能有許多的』12345678&#8243;字元串，這樣我們沒有辦法知道倒底我們要破解的程式使用的是哪一個』12345678&#8243;，所以我們應該選擇一個不易和內存數據相同的註冊碼，比如︰74747474（本人喜歡用，意思嘛︰去死去死。。。哈哈哈^_^），對應的搜索指令為︰ [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=47&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>下面談到了一些在學習解密過程中經常遇到的問題，本人根據自己的經驗簡單給大家談一談。這些問題對於初學人來說常常是很需要搞明白的，根據我自己的學習經歷，如果你直接照著很多破解教程去學習的話，多半都會把自己搞得滿頭的霧水，因為有很多的概念要么自己不是很清楚，要么根本就不知道是怎么一回事，所以希望透過下面的討論給大家一定的幫助︰</p>
<p>1. 斷點︰所謂斷點就是程式被中斷的地方，這個詞對於解密者來說是再熟悉不過了。那麼什麼又是中斷呢？中斷就是由於有特殊事件（中斷事件）發生，計算機暫停當前的任務（即程式），轉而去執行另外的任務（中斷服務程式），然後再返回原先的任務繼續執行。打個比方︰你正在上班，突然有同學打電話告訴你他從外地坐火車過來，要你去火車站接他。然後你就向頭家臨時請假，趕往火車站去接同學，接著將他安頓好，隨後你又返回公司繼續上班，這就是一個中斷過程。我們解密的過程就是等到程式去獲取我們輸入的註冊碼並準備和正確的註冊碼相比較的時候將它中斷下來，然後我們透過分析程式，找到正確的註冊碼。所以我們需要為被解密的程式設定斷點，在適當的時候切入程式內部，追蹤到程式的註冊碼，從而達到crack的目的。</p>
<p>2. 領空︰這是個非常重要的概念，但是也初學人是常常不明白的地方。我們在各種各樣的破解文章裡都能看到領空這個詞，如果你搞不清楚到底程式的領空在那裡，那麼你就不可能進入破解的大門。或許你也曾破解過某些軟體，但那只是瞎貓碰到死老鼠而已（以前我就是這樣的^_^,現下說起來都不好意思喔﹗）。所謂程式的領空，說白了就是程式自己的地方，也就是我們要破解的程式自己程式碼所處的位置。也許你馬上會問︰我是在程式營運的時候設定的斷點，為什麼中斷後不是在程式自己的空間呢？因為每個程式的編寫都沒有固定的模式，所以我們要在想要切入程式的時候中斷程式，就必須不倚賴具體的程式設定斷點，也就是我們設定的斷點應該是每個程式都會用到的東西。在DOS時代，基本上所有的程式都是工作在中斷程式之上的，即幾乎所有的DOS程式都會去調用各種中斷來完成任務。但是到了WINDOWS時代，程式沒有權力直接調用中斷，WINDOWS系統提供了一個系統功能調用平台（API），就向DOS程式以中斷程式為基礎一樣，WINDOWS程式以API為基礎來實現和系統打交道，從而各種功能，所以WINDWOS下的軟體破解其斷點設定是以API函數為基礎的，即當程式調用某個API函數時中斷其正常營運，然後進行解密。例如在SOFTICE中設定下面的斷點︰bpx GetDlgItemText（獲取對話框文本），當我們要破解的程式要讀取輸入的數據而調用GetDlgItemText時，立即被SOFTICE攔截到，從而被破解的程式停留在GetDlgItemText的程式區，而GetDlgItemText是處於WINDWOS自己管理的系統區域，如果我們擅自改掉這部分的程式代碼，那就大禍臨頭了^_^﹗所以我們要從系統區域返回到被破解程式自己的地方（即程式的領空），才能對程式進行破解，至於怎樣看程式的領空請看前面的SOFTICE圖解。試想一下︰對於每個程式都會調用的程式段，我們可能從那裡找到什麼有用的東西嗎？（怎么樣去加密是程式自己決定的，而不是調用系統功能實現的﹗）</p>
<p>3. API︰即Application Programming Interface的簡寫，中文叫應用程式編程界面，是一個系統定義函數的大集合，它提供了訪問作業系統特徵的方法。 API包含了幾百個應用程式調用的函數，這些函數執行所有必須的與作業系統相關的操作，如內存分發、向螢幕輸出和創建視窗等，用戶的程式透過調用API界面同WINDOWS打交道，無論什麼樣的應用程式，其底層最終都是透過調用各種API函數來實現各種功能的。通常API有兩中基本形式︰Win16和 Win32。 Win16是原來的、API的16位版本，用於Windows 3.1；Win32是現下的、API的32位版本，用於Windows 95/98/NT/ME/2000。Win32包括了Win16，是Win16的超集，大多數函數的名字、用法都是相同的。16位的API函數和32位的 API函數的區別在於最後的一個字母，例如我們設定這樣的斷點︰bpx GetDlgItemText、bpx GetDlgItemTextA和bpx GetDlgItemTextW，其中 GetDlgItemText是16位API函數，GetDlgItemTextA和GetDlgItemTextW是32位API函數，而 GetDlgItemTextA表示函數使用單位元組，GetDlgItemTextW表示函數使用雙位元組。現下我們破解中常用到的是Win32單位元組API函數，就是和GetDlgItemTextA類似的函數，其它的兩種（Win16 API和Win32雙位元組API函數）則比較少見。 Win32 API函數包含在動態鏈接庫（Dynamic Link Libraries，簡稱DLLs）中，即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中，這就是為什麼我們要在softice中用exp=C:\windows\system\kernel32.dll等命令行將這些動態鏈接庫匯入 softice中的原因。因為不這樣做的話，我們就無法攔截到系統Win32 API函數調用了。</p>
<p>4. 關於程式中註冊碼的存在模式︰破解過程中我們都會去找程式中將輸入的註冊碼和正確的註冊碼相比較的地方，然後透過對程式的跟蹤、分析找到正確的註冊碼。但是正確的註冊碼通常在程式中以兩種形態存在︰顯式的和隱式的，對於顯式存在的註冊碼，我們可以直接在程式所處的內存中看到它，例如你可以直接在 SOFTICE的數據視窗中看到類似』297500523&#8243;這樣存在的註冊碼（這裡是隨意寫的），對於註冊碼顯式存在的軟體破解起來比較容易；但是有些軟體的程式中並不會直接將我們輸入的註冊碼和正確的註冊碼進行比較，比如有可能將註冊碼換算成整數、或是將註冊碼拆開，然後將每一位註冊碼分開在不同的地方逐一進行比較，或者是將我們輸入的註冊碼進行某種變換，再用某個特殊的程式進行驗証等等。總之，應用程式會採取各種不同的複雜運算模式來迴避直接的註冊碼比較，對於這類程式，我們通常要下功夫去仔細跟蹤、分析每個程式功能，找到加密算法，然後才能破解它，當然這需要一定的8086彙編編程功底和很大的耐心與精力。</p>
<p>5. 關於軟體的破解模式︰本人將破解模式分為兩大類，即完全破解和暴力破解。所謂完全破解主要是針對那些需要輸入註冊碼或密碼等軟體來說的，如果我們能透過對程式的跟蹤找到正確的註冊碼，透過軟體本身的註冊功能正常註冊了軟體，這樣的破解稱之為完全破解；但如果有些軟體本身沒有提供註冊功能，只是提供試用（DEMO），或是註冊不能透過軟體本身進行（例如需要獲取另外一個專用的註冊程式，透過INTERNET的註冊等等），或者是軟體本身的加密技術比較複雜，軟體破解者的能力、精力、時間有限，不能直接得到正確的註冊碼，此時我們需要去修改軟體本身的程式碼，即人為改淙砑 腦誦蟹較 庋 鈉平獬浦 ζ平狻?</p>
<p>6. 關於破解教程中程式代碼位址問題︰破解教程中都會放上一部分程式代碼以幫助講解程式的分析方法，例如下面的一段程式代碼︰<br />
&#8230;&#8230;<br />
0167:00408033　PUSH　00<br />
0167:00408035　PUSH　EBX<br />
0167:00408036　CALL　[USER32!EndDialog]<br />
0167:0040803C　JMP　0040812C<br />
&#8230;&#8230;<br />
在這裡程式中的代碼位址如0167:00408033，其代碼段的值（即0167）有可能根據不同的電腦會有區別，不一定一模一樣，但偏移值應該是固定的（即00408033不變），所以如果看到破解文章裡的程式代碼的位址值和自己的電腦裡不一樣，不要以為搞錯地方了，只要你的程式代碼正確就不會有問題。</p>
<p>7. 關於如何設定斷點的問題︰正確恰當的設定好斷點對於快速有效的解密非常重要，好的斷點設定可以使我們迅速找到關鍵的程式段，而不恰當的斷點則會對解密造成不必要的精力消耗，甚至根本就不能攔截到程式的營運。但是具體什麼時候用什麼斷點比較合適很難說，這需要自己用經驗去累積，總的說來bpx hmemcpy這個萬能斷點對大多數註冊碼模式的軟體都有用，初學人不妨多試試這個斷點（通常我也是用這個斷點設定，懶嘛^_^，哈哈。。。）。對於那些需要暴力破解的非註冊碼模式的軟體，通常我們應該攔截對話框（如bpx DialogBox）和消息框（如bpx MessageBox(A)）等。不論對於哪一類軟體，當我們設定的斷點均沒有效果時，可是試一下bpx lockmytask，這個斷點的作用是攔截任何一個按鍵的動作，具體常用的一些斷點設定請參考』破解常用斷點設定』一文。另外，在註冊碼的破解中通常需要輸入用戶名和註冊碼，一般說來用戶名和密碼都可以隨意輸入，但是根據我自己的經驗，很多軟體對於註冊碼都會逐位的進行處理，假如輸入』78787878&#8243;這串數字，那麼在跟蹤程式的時候我們就無法知道我們當時所看到的』78&#8243;倒底是哪一個』78&#8243;，所以我比較喜歡用』12345678&#8243;這樣的註冊碼輸入模式，這樣的話就就能知道程式是在對註冊碼的哪一位進行運算，同樣的對於那些需要輸入較長序列號的軟體，輸入類似』12345-67890-ABCDEF』這樣的序列號較好。 不過有一點大家需要特別的注意︰上面講的註冊碼輸入模式』12345678&#8243;是針對攔截WIN32 API函數來說的，假如有些時候直接攔截WIN32 API函數難以找到程式的突破口，而要借助於』S』指令在內存中尋找我們輸入的用戶名或註冊碼時，就最好不要採用』12345678&#8243;作為註冊碼，因為內存中很可能有許多的』12345678&#8243;字元串，這樣我們沒有辦法知道倒底我們要破解的程式使用的是哪一個』12345678&#8243;，所以我們應該選擇一個不易和內存數據相同的註冊碼，比如︰74747474（本人喜歡用，意思嘛︰去死去死。。。哈哈哈^_^），對應的搜索指令為︰ S 30:0 L FFFFFFFF &#8217;74747474&#8242; 。當然，以上只是我個人的習慣而已，具體用什麼樣的輸入形式可以根據本人的愛好、習慣來定，不必拘泥於某一固定的模式。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=47&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-10%e6%8b%9b%e8%ae%93%e4%bd%a0%e5%bf%ab%e9%80%9f%e5%a2%9e%e5%8a%a0%e8%87%aa%e5%b7%b1%e7%a0%b4%e8%a7%a3%e6%8a%80%e8%83%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 破解入門</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e7%a0%b4%e8%a7%a3%e5%85%a5%e9%96%80/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e7%a0%b4%e8%a7%a3%e5%85%a5%e9%96%80/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:35:06 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=45</guid>
		<description><![CDATA[首先,我來講一下匯編語言的幾條常用命令: &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 跳轉命令 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 根據條件作出是否跳轉的決定,通常前面會有一個判斷語句,例如: CMP AX,BX JZ XX 上面兩條命令意為用AX減BX,它的值如果為0則跳轉到XX的標號行. 常用的跳轉命令有: JZ/JE 相等或為零為則跳轉 JNZ/JNE 不相等或不為零則跳轉 JL/JLE 小於/小於或等於則跳轉 JG/JGE 大於/大於或等於則跳轉 JMP 無條件跳轉 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 比較語句 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; CMP AX,BX AX 寄存器減去BX寄存器的內容 AND AX,BX AX 與BX做』與運算』 OR AX,BX AX 與BX做』或運算』 TEST AX,BX 與 AND AX,BX 命令有相同效果 XOR AX,AX 使AX的內容清零,每個寄存器與自己作異或運算等於清零動作. &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 子程式 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 一個子程的模樣長得像這個樣子 CALL 15F:334422 子程式是個很重要的概念,它是主程式的一個分支,用來做特定動作. 打個比方: 你要上班,先你是走路到車站,然後上車,然後下車,然後走到自己的辦公室. 這里如果要把上班編為一段程式的話,那麼就可以把』走路』,』搭車』,』走到辦公室』做為分支程式來處理. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=45&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>首先,我來講一下匯編語言的幾條常用命令:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>跳轉命令</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>根據條件作出是否跳轉的決定,通常前面會有一個判斷語句,例如: CMP AX,BX JZ XX 上面兩條命令意為用AX減BX,它的值如果為0則跳轉到XX的標號行. 常用的跳轉命令有: JZ/JE 相等或為零為則跳轉<br />
JNZ/JNE 不相等或不為零則跳轉<br />
JL/JLE 小於/小於或等於則跳轉<br />
JG/JGE 大於/大於或等於則跳轉<br />
JMP 無條件跳轉</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>比較語句</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>CMP AX,BX AX 寄存器減去BX寄存器的內容<br />
AND AX,BX AX 與BX做』與運算』<br />
OR AX,BX AX 與BX做』或運算』<br />
TEST AX,BX 與 AND AX,BX 命令有相同效果<br />
XOR AX,AX 使AX的內容清零,每個寄存器與自己作異或運算等於清零動作.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>子程式</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>一個子程的模樣長得像這個樣子 CALL 15F:334422 子程式是個很重要的概念,它是主程式的一個分支,用來做特定動作. 打個比方: 你要上班,先你是走路到車站,然後上車,然後下車,然後走到自己的辦公室. 這里如果要把上班編為一段程式的話,那麼就可以把』走路』,』搭車』,』走到辦公室』做為分支程式來處理. 說得再通俗一點就是: 你要破解的程式不可能就是一條主程式到底,肯定會呼叫下面的子程式,由子程式來處理你送出的注冊資訊,然後比較,然後標記是否注冊正確,這些都是靠它來完成的. 所以說,破解的關鍵在於,你找準程式在哪兒將會作注冊判斷,並進入那個注冊子程式,仔細觀察,你就成功了.子程式的返回碼是 RET</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>算術運算</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>ADD AX,BX 加法運算 AX=AX+BX<br />
SUB AX,BX 減法運算 AX=AX-BX<br />
INC AX 寄存器加一 AX=AX+1<br />
DEC AX 寄存器減一 AX=AX-1<br />
MUL 乘法運算<br />
DIV 除法運算</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>資料操作</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>MOV AX,BX 資料傳送指令,將BX的值移送到AX中<br />
XCHG AX,BX 將AX與BX的值互換</p>
<p>2.破解的工具介紹</p>
<p>修改檔案的工具: PCTOOLS, HVIEW, PSE等,這些都是DOS下的修改程式,如今是WINDOWS的天下,當然應該選用 ULTRA-EDIT了,它的功能可是非常強大哦,我會在下期將它放在破解工具區中.</p>
<p>除錯程式的工具: DEBUG, SYMDEB, GAMETOOLS, CM386等,太多了,但是這些都只能調試實模式下的程式,所以如果要破WINDOWS下的 軟體,必須備上: SOFT-ICE, TR, 等.</p>
<p>編碼相關工具: UNP, PKLITE, GT, WWPACK, UNWWPACK等是一些壓縮及解壓縮的工具,一個程式被壓縮的目的是防止有人破解它,它通過一定的運算法編輯,執行的時候用自己的壓縮算法 在記憶體中開辟一塊區域,解碼後再執行,所以如果你要破解一個被壓縮了的軟體時,在記憶體中看到的機械碼會與軟體本身不一樣,從而使你不能修改它. 所以另一類常駐式的修改工具相應而生,如 TSRCRACK. </p>
<p>檔案回寫工具: EXEWRITE, EXESHAPE等,這些工具的目的也是為了解壓縮程式,它通過害記憶體中追蹤到的一毓的寄存器的位址,加上一些運算來重新產生一個新的沒有編碼的軟體.</p>
<p>破解強手之路: SOFT-ICE</p>
<p>鬼佬的SOFT-ICE,功能非常強大,防當能力也是一流,所以幾乎沒有什麼程式它不能夠追不下去的. 說起來就有點讓人激動,確實如此,下面簡單地介紹一些它的常用指令:</p>
<p>命令代碼 命令意義 示例<br />
S 在記憶體中搜尋指定字符串 S 0:F L30 &#8217;7979&#8242; 在0:F至0:F+30的記憶體中搜尋&#8217;7979&#8242;字符<br />
D 看記憶體內容 D EAX 查看EAX的記憶體內容<br />
E 編輯記憶體內容 E DS:EAX 編輯DS:EAX的記憶體<br />
R 修改寄存器內容 R EAX 1 修改EAX寄存器值為1<br />
A 反匯編指令 A 11:22 在11:22的記憶體中直接反匯編機器指令<br />
BPM/BPX 下中斷點指令 BPX HMEMCPY 下中斷點在&#8217;Hmemcpy&#8217;<br />
BL 列出當前所有中斷點 BL<br />
BC/BD 清除/禁止中斷點 BC * 清除所有的中斷點</p>
<p>另外,再介紹 ICE 常用的幾條快捷指令鍵,必須熟悉掌它們.</p>
<p>F4鍵 看USER的畫面<br />
F5鍵 返回USER程式<br />
F6鍵 游標在命令與記憶體區切換<br />
F7鍵 讓程序執行到游標所在處<br />
F8鍵 單步執行,遇到CALL則進入執行<br />
F9鍵 在游標所在代碼處下中斷點<br />
F10鍵 單步執行,遇到CALL則跳過執行<br />
F12鍵 相當於指令P RET,返回主程式<br />
CTRL-D鍵 呼叫ICE<br />
F1鍵 ICE的幫助資訊,請詳細參看</p>
<p>3.KANJIWEB V3.0注冊實例破解</p>
<p>各位破解愛好者們,你們好.相信大家都盼這一集盼了很久吧?不錯,真刀實槍上戰場的時候到了,不要掉頭跑開哦.</p>
<p>這次拿來開刀的程式是我比較喜歡用的內碼識別及轉換工具,它也是我的破解處女作.這個小程序功能很不錯,不過不注冊的話,只能用一個月左右. 它每次安裝都會產生一個隨機數字,然後根據這個數字來算出注冊碼,所以每次安裝的注冊碼都不會完全相同.</p>
<p>首先,請準備一本草稿紙及一支筆,然後就可以開始了.</p>
<p>將 KanJiWeb V3.0的主程式 MultiWord 程式打開,然後單擊』X』形功能表,選擇』Register&#8230;』功能表,出現一個對話框: 最下面寫著: REGISTERED NO: 521608708 ,當然我們看到的數字肯定不一樣,因為是隨機的嘛!程式會根據這9個數字來重新算出9個字符的注冊碼來. 好,廢話少說,單擊 Register 按鈕,在 Serial NO: 中填入: 79797979. 第一步: 填好以後,記住不要急著按OK按鈕,因為我們先要進到 ICE 里面把中斷設好,不然的話怎麼攔它呀?按 CTRL-D組合鍵呼出 ICE 來. 在命令區內輸入: BPX MESSAGEBOX . 第二步: 現在按 F5鍵返回原程式,按下剛才未按下的 OK 按鈕. 第三步: 發生了什麼事? 看到了吧,厲害的ICE馬上攔到了,看看你現在在什麼地方:<br />
User !messagebox<br />
從此處開始 按 F10鍵單步跟蹤程式&#8230;<br />
178F:0000 POP EAX<br />
178F:0002 XOR EBX,EBX<br />
178F:0005 POP DX<br />
178F:0006 AND BX,BF7F<br />
178F:000A PUSH EBX<br />
178F:000C PUSH 00<br />
178F:000E PUSH EAX<br />
178F:0010 JMP 0013<br />
178F:0013 PUSH BP<br />
178F:0014 MOV BP,SP<br />
178F:0016 PUSH 6B<br />
178F:0019 MOV BX,[BP+14]<br />
178F:001C TEST BX,BX<br />
178F:001E JNZ 0025<br />
178F:0020 XOR EAX,EAX<br />
178F:0023 JMP 0028<br />
178F:0025 CALL 00A0<br />
178F:0028 PUSH EAX<br />
&#8230;(略)<br />
178F:0043 CALL 0119<br />
178F:0046 MOV AX,[BP+08]<br />
178F:0049 MOV CX,[BP+0A]<br />
178F:004C TEST AX,0C08<br />
178F:004F JNZ 0057<br />
178F:0051 TEST CX,FFFE<br />
178F:0055 JZ 005D<br />
178F:0057 MOV BX,F005<br />
178F:005A CALL 0105<br />
178F:005D PUSH CX<br />
178F:005E PUSH AX<br />
178F:005F PUSH WORD PTR[BP+06]<br />
178F:0062 PUSH CS<br />
178F:0063 CALL 1DE2<br />
當程式走到 178F:0063 CALL 1DE2 處時會出現注冊碼錯誤的資訊框,我們重新注冊一遍, 當再次走到此地時按F8鍵進入觀察:<br />
178F:1DE2 Enter 0024,00<br />
178F:1DE6 PUSH ESI<br />
178F:1DE8 PUSH DS<br />
178F:1DE9 MOV AX,1087<br />
178F:1DEC MOV DS,AX<br />
178F:1DEE MOV ESI,[BP+14]</p>
<p>當走到此處時,下命令: D BP+14 ,在記憶體區會看見一組數字: D0980200(4 BYTES), 你的數字和我寫的可能不一樣,再次下命令如下格式: D 000298D0 ,在記憶體區右邊欄里會看見一組9個字符,對了,這就是注冊碼了. 趕快用筆抄下來,那麼這個軟體就破解完成了,是不是很簡單啊?!</p>
<p>另外說明一下: 為什麼 D0980200 在用 D 命令查看時會是 000298D0 呢?因為在匯編中寄存器的位置是高位在後,低位在前, 所以變成 0200為第一個高字組,而排列時又為: 0002了,D098的排列一樣,排到 0200 的後面,變成是: 98D0.嗯,是有點復雜,不過習慣了就好了.</p>
<p>也許又有人問: 為什麼我會知道剛才那處是注冊碼露頭的地方呢? 老實說,要靠判斷及經驗的積累,光靠一處處的死看是看不出來的, 有個重要的概念給你們先提出來: 破解的時候,眼睛緊盯著很有問題的 CMP (比較命令)和 JNZ(跳轉命令)之類的語句,另外,像EAX,EDX,ESI,EDI,在算注冊碼的CALL處都會發生變化,注意它們的變化對你的破解會很有幫助.當進入一個CALL時,你要注意EBP的變化,它是隱藏真正注冊碼和你輸入的注冊碼的最後基地</p>
<p>KANJIWEB V3.0注冊實例破解<br />
今天我再來給大家講一講KANJIWEB V3.0的破解,與上一個不同的是: 這次換用另一個中斷點,會有什麼不同呢?往下看看就知道了.<br />
第一步,將KanJiWeb啟動,然後將注冊框敲出來,輸入注冊碼: &#8217;79797979&#8242;.輸入完了,不要急著按OK鍵.<br />
第二步,切換到ICE中(知道怎麼切換吧:按CTRL-D鍵),下中斷: Bpx GetDlgItemText ,然後按F5鍵返回注冊程式.<br />
第三步,按下注冊框的OK鍵,發生什麼事了,對,被ICE攔下來了,到此步,我們已經成功一半了.也許有的網友表示懷疑,但是你要給自己一點自信心嘛!不然,我怎麼教你也白搭.<br />
第四步,將中斷暫時屏蔽,用什麼命令呢?對了: Bd * ,星號代表所有的中斷.<br />
第五步,按一下F12鍵,在我的機器上是一次就夠了,你自己要試按.停下後,按F10鍵開始追蹤了&#8230;</p>
<p>10C7:3900 LEA AX,[BP+FF52]<br />
&#8230; 略過<br />
10C7:39C9 XOR BYTE PTR [SI],86<br />
10C7:39CC INC SI<br />
10C7:39CD LEA AX,[BP+FE2F]<br />
10C7:39D1 CMP SI,AX<br />
10C7:39D3 JB 39C9<br />
程式在此循環九遍<br />
10C7:39D5 LEA DI,[BP+FE26]<br />
10C7:39D9 LEA SI,[BP-4A]<br />
在此下命令: D SI /D DI<br />
看見什麼了: SI=自己輸入的注冊碼<br />
DI=真正的注冊碼<br />
&#8230; 略過<br />
10C7:39F4 OR AX,AX<br />
10C7:39F6 JNZ 3A3A<br />
&#8230; 略過<br />
10C7:3A32 JMP 3A53<br />
10C7:3A34 MOV SI,[BP-08]<br />
10C7:3A37 JMP 3A6D<br />
10C7:3A39 NOP<br />
10C7:3A3A MOV SI,0001<br />
10C7:3A4E CALL USER!MESSAGEBOX<br />
當程式走到 10C7:3A4E 處就會出現注冊失敗的資訊框,那怎樣避免呢?很簡單,往上面看看有什麼地方可跳過此CALL呢? 找到了嗎?對了,它在: 10C7:3A32 JMP 3A53 處,但剛才為何沒走到此處呢?當你重新追蹤一遍會發現問題出在: 10C7:39F6 JNZ 3A3A 處, 知道了吧,如果沒有那個跳轉命令,就不會出現討厭的注冊失敗的資訊了.知道該怎麼辦呢?當然是動手干掉它了,將它NOP掉就可以了. NOP的機器碼是: 90. 下 CODE ON 命令,將 JNZ 3A3A 的兩個BYTE改為 9090 即可.</p>
<p>DEBUG 在每個人的機器里都會有,只是很多人對它都很陌生,如果你掌握了它的用法,對你的日常使用及維護工作會帶來很大的方便,下面介紹一些它的基本指令用法:</p>
<p>指令 格式 功能 註解<br />
A A [記憶體位址] 組譯匯編語言指令 A 100<br />
C C [區段1] [區段範圍] [區段2] 將兩塊記憶體作比較 C 100 L20 200<br />
D D [記憶體拉址] 顯示記憶體的內容 D 100<br />
E E [記憶體位址] 編輯記憶體資料 E 100<br />
F F [指定區段範圍] 填充指定記憶體區塊內容 F 100 L10 90<br />
G G [區段:區址] 帶有任選斷點執行 G 100(現在不要試用)<br />
H H [運算子] [運算子] 十六進制加減運算 H 44 33<br />
I I [連接埠] 讀/顯示輸入位元組<br />
L L [記憶位址]或[磁碟,磁軌,磁區] 裝入文件或磁區 L 100 2 1 2<br />
M M [區段範圍] [記憶體位址] 傳送記憶體區塊 M 100 L10 110<br />
N N [檔案名稱] 定義文件及參量 N bb.com<br />
O O [連接埠位址] 輸出位元組到連接埠<br />
P P [區段:區址] 在下一指令上停止 P 2<br />
Q Q 退出DEBUG界面 Q<br />
R R [寄存器] 顯示修改寄存器/標志 R AX<br />
S S [記憶區段範圍] 對字符進行檢索 S 100 L70 &#8216;j&#8217;<br />
T T [=記憶區段]或[數值範圍] 單步追蹤 T<br />
U U [記憶位址] 對指令進行反匯編 U 100<br />
W W [記憶區段]或[指定範圍] 寫入文件或磁盤扇區 W 100 0 1 1</p>
<p>下面對一些常用指令進行詳細剖析:<br />
A (Assemble) 匯編指令<br />
1,輸入匯編語句被匯編到記憶體的指定區段,此區段在開始時用A address 指定.<br />
2,所有語句輸入完成後,按ENTER鍵返回<br />
3,完成輸入後,可以用U命令觀看它的機械碼<br />
D (Dump) 顯示命令<br />
1,從指定的地址開始顯示內容,如果沒有指定地址,則從前一個D命令繼續顯示.<br />
2,如果沒指定地址並是第一次,則從DS:100處開始顯示.</p>
<p>G (Go) 轉移命令<br />
1,執行正在調試的程序,當執行到指定的地址時停止,並顯示寄存器樗和下一條要執行的命令<br />
2,G [=address].用於執行正在調試沒有斷點的程式.<br />
3,程序運行結束,DEBUG顯示』Porgram terminated normally』</p>
<p>R (Register) 寄存器命令<br />
1,顯示一個寄存器的十六進制內容,並可根據需要改變它們.<br />
2,顯示8個字母的狀態標志,並可根據需要更改它們之中的任一個或全部</p>
<p>U (Unassemble) 反匯編命令<br />
1,對指令進行反匯編,它們的地址和十六進制以類似於匯編語言的語句一起顯示出來.<br />
2,單獨用U命令從CS:100處開始反匯編<br />
3,U命令預設段地址包含CS寄存器中.</p>
<p>DEBUG 技巧應用<br />
1,用DEBUG對子目錄加密 DOS在管理文件目錄時,用32個位元組來保存根目錄和子目錄的資訊,對子目錄而言,0~10位元組為子目錄域,第11位元組為屬性.我們只要將子目錄屬性位元組的值從10H改為13H時,子目錄即具有拒絕DIR,TREE等命令的性能.例如:<br />
對A盤的SUBDIK子目錄進行加密:<br />
C:\&gt;DEBUG<br />
-L 100 0 5 7 (將A盤中目錄讀入記憶體)<br />
-S 100 FFF 『SUBDIK』 (搜索子目錄)<br />
-38EB:07c0 (搜索到的子目錄地址)<br />
-E 07CB (07C)+0B=07CB 為屬性位元組位址)<br />
38EB:07CB 10.13 (修改完成)<br />
-W 100 0 5 7 (目錄寫回A盤中)<br />
-Q (退出)</p>
<p>2,解除BIOS密碼<br />
C:\&gt;DEBUG<br />
-O 70 10<br />
-O 71 11<br />
重新啟動,BIOS密碼已被攻破</p>
<p>3,冷啟動實現<br />
C:\&gt;DEBUG RESET.COM<br />
-A 100<br />
JMP FFFF:0000<br />
INT 20<br />
-RCX<br />
00007<br />
-W<br />
-Q</p>
<p>4,熱啟動實現<br />
C:\DEBUG BOOT.COM<br />
-A 0100<br />
MOV AX,0040<br />
MOV DS,AX<br />
MOV AX,1234<br />
MOV SI,0072<br />
MOV [SI],AX<br />
JMP FFFF:0<br />
INT 20<br />
-RCX<br />
0014<br />
-W<br />
-Q</p>
<p>這一集里,我就一些網友提出的問題作一個系統的整理,我會從ICE的安裝開始一步步地說起,到ICE的使用界面介紹,及一些我的破文中的疑難之處.有許多問題都還弄不懂的朋友千萬要記住來看哦.<br />
Soft-ICE的安裝<br />
在下載本站的ICE後,用ZIP打開,選擇SETUP.EXE即直接進行安裝了<br />
第一步,出現軟體的版本相關資訊,按NEXT進行下一步.<br />
第二步,出現版權資訊,選擇YES,同意啦.<br />
第三步,出現注冊碼,因為是已經破解版,所以不用輸注冊碼,有很多網友寫信來問注冊碼,其實不用管它啦.直接NEXT了.<br />
第四步,選擇安裝目錄,預設為:C:\SIW95下,選擇完畢後按NEXT.<br />
第五步,在Manufacturer中選擇合適的顯示器,在Model中選擇相應的類型,預設為:Standard VGA,一般不用更改,選擇好以後,按一下TEST再NEXT.<br />
第六步,選擇滑鼠的連接埠配置,一般預設為:COM1,自己看著辦,再NEXT.<br />
第七步,系統配置,有三個選擇,選擇第一個,讓ICE來配置AUTOEXEC.BAT文件,第三個不做任何改動.<br />
第八步,同意以上幾種配置嗎?同意就按NEXT開始安裝了.<br />
注: 有的網友寫信來說ICE經常死機,即出現&#8217;R'/&#8217;C'字樣,按&#8217;R'返回ICE的界面,打EXIT即可脫離ICE的環境,出現這種情況多半是因為 WINDOWS出現記憶體中的非法操作而導致的.建議的做法是:平時不使用它時,在AUTOEXEC.BAT文件中用REM語句屏掉ICE的啟動,需要時再讓它啟動.我就是這麼做的.</p>
<p>Soft-ICE界面講述<br />
現在很多網友來信,問我的講座中的記憶體區指什麼地方? 下面做一個系統的介紹.<br />
首先,在ICE啟動的情況下,按CTRL-D組合鍵呼出ICE,打入』R』指令,這時你看見的像: EAX=00000003 EBX=00300040 ECX=20783303 EDX=A0F23300 等,這就是寄存器顯示資訊,它會對你的破解很有幫助的.<br />
第二欄長得像這個樣子: 0028:C000C0E7 JECXZ C000C0F4 ,這里你看到的就是程式的流程碼了,破解時也是要盯在這里,其中0028:C000C0E7是程式的區段:偏移址,你可以把它看作是命令: JECXZ C000C0F4的家,每條命令都有一條位址&#8217;家&#8217;.我把這一欄叫做程式流程區,如果敲入CODE ON即可看到該程式命令的機械碼了.<br />
第三欄就是ICE的最底部,當你切入ICE時,游標停在那里,等待你輸入命令,我把它叫做命令區,如果你第一次操作,可打入HELP來看看ICE的一些命令介紹.<br />
第四欄當你在命令區敲入D命令時,會出現如: 0030:00000000 9E0FC90065047000 &#8211; 1600DF0C65047000 &#8230;..e.p&#8230;..e.p. 這樣的東東,它就是我常說的記憶體區了.它分為左邊欄和右邊欄,右邊欄是記憶體中的ASCII碼,不過大部分你看到的都是亂碼.可使用E 位址 命令來修改左邊欄.</p>
<p>Soft-ICE中斷選擇<br />
很多網友來信問為什麼他的中斷開的都不行呢?原因很簡單,其實開中斷也有一些技巧可言,很多中斷都是破解前輩們摸索出來的,我們現在只需要照做就行了,是不是幸福多了.一個中斷點的選擇好坏直接關係到程式破解力度的強弱,有的網友問我其中有什麼區別呢?關於這一點,我也只能簡單地說一說,因為本人的水平有限.<br />
BPX HMEMCPY 注冊碼破解的萬能中斷點<br />
BPX CREATEWINDOWEX 開窗攔截中斷,可用來破解時間過期程式<br />
BPX LOCKMYTASK ErrorFree 試出來的,當你找不到合適的中斷時,可試試它,它是攔截你按一個按鈕的動作<br />
BPX GETDLGITEMTEXT 注冊碼攔截中斷,對於有的程式並不生效,它在取碼時發生中斷.<br />
BPX DIALOGBOX 攔截對話框中斷,16位程式<br />
BPX DIALOGBOXPARAM 攔截對話框中斷,32位程式<br />
BPX MESSAGEBOX 攔截送出資訊中斷<br />
BPX UPDATEWINDOW 我試出來的中斷之一<br />
BPX GETMESSAGE 我試出來的中斷之二</p>
<p>另外,本人曾遇到過任何中斷無效的東東,怎麼辦呢?這時候可以使用ICE附帶的Symbol Loader程式來載入.</p>
<p>目標軟體: 心奕1.0<br />
首先打開程序,選擇』幫助』=&gt;』注冊心奕』 然後在注冊名框中輸入coolfly,在注冊碼框中輸入』79797979&#8243;.這是我的習慣,你也可以輸入任意數字.<br />
按CTRL-D鍵呼出ICE,下中斷: bpx hmemcpy. 記住,下完中斷後,按F5鍵返回程序,然後才可以按下注冊畫面的確認鍵.這時被ICE攔下,試按F12鍵,看多少次會出現失敗畫面. 記住你剛才的按下,如N次.再次重復動作,被攔下時,按N-1次F12鍵,停下後開始按F10鍵單獨追蹤程式:<br />
15F:00403B9D CMP EAX,01<br />
15F:00403BAD JNZ 00403C95 &#8230; 15F:00403C53 CALL [ECX+10] =&gt;按F10鍵帶過此CALL時會出現失敗窗. 15F:00403C56 TEST EAX,EAX 15F:00403C58 JZ 00403C77 判斷15F:00403C53的那個CALL必定有問題,在此設斷(將游標放到那一行,然後按下F9鍵即可).重新注冊會被直接在此攔到,按F8鍵進入這個CALL:<br />
&#8230;<br />
15F:10001722 CALL 10001880 當程式走到此處時,停下來.<br />
15F:10001727 TEST EAX,EAX 此時如果你輸入的注冊碼不對,則EAX的值肯定為0,正確則為1<br />
15F:10001729 JZ 10001830<br />
重新注冊,進入15F:10001722的CALL:<br />
15F:10001880 PUSH FF<br />
&#8230;<br />
15F:1000189B MOV EDI,[EBX+28] 在此用D EDI可看到自己的注冊名 &#8230;<br />
15F:100018AC MOV EAX,[EAX-08] 在此用D EAX可看到自己的注冊碼 &#8230;<br />
15F:100018C8 MOVSX EDX,BYTE PTR[ECX+EDI] 15F:100018CC LEA EAX [EAX*4+EAX] 15F:100018CF INC ECX 15F:100018D0 CMP ECX,ESI ESI中存有注冊名的個數N 15F:100018D2 LEA EAX,[EAX*2+EDX] 15F:100018D5 JL 100019C8 程式在此會有N個循環,由注冊名來算出注冊碼. &#8230; 15F:100018FF CALL 10001AE8 15F:10001904 MOV EAX,[EBX+24] 用D EAX可看到自己輸入的注冊碼 15F:10001907 MOV EDX,[ESP+18] 用D EDX可看到真正的注冊碼:bbdb0b92 抄下它吧,大功告成,下結論吧:<br />
Name: coolfly S/N: bbdb0b92<br />
到此為止,是不是覺得很簡單,不要害怕,有什麼不懂的可以來問我,共同學習,不要不懂裝懂哦,年輕人要以學習為重.<br />
目標軟體: IP搜索客V1.0<br />
首先用右鍵單擊該程序圖標,選擇注冊<br />
在注冊框里面輸入: 79797979<br />
按CTRL-D鍵切換到ICE,輸入: bpx hmemcpy 下中斷,然後按F5鍵回到程序中,按程序的注冊按鈕,這時被ICE攔到,開始按F12慢慢走,同時要記住數按F12的次數,直到出現失敗畫面出現.<br />
此為一按.<br />
再次重復上面的步驟,不過按F12的次數為上一次按數減1.<br />
此為二按!<br />
二按後,在此停下:<br />
15F:0040327B MOV ESI,[ESP+14]<br />
15F:0040327F MOV EAX,[EDI+5C]<br />
15F:00403282 MOV DL,[EAX] 在此下D EAX命令可以看到真正的注冊為:268279.此號因程序給出的序號不同而不同.<br />
15F:00403284 MOV BL,[ESI] 在此下D ESI命令可以看到79797979,是自己下的注冊碼</p>
<p>&#8230;<br />
下面的程式都是一些判斷注冊碼是否正確的程式,只要將EAX中的東東抄下即可完成破解了.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=45&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e7%a0%b4%e8%a7%a3%e5%85%a5%e9%96%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] 反組譯常用斷點大全</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e5%8f%8d%e7%b5%84%e8%ad%af%e5%b8%b8%e7%94%a8%e6%96%b7%e9%bb%9e%e5%a4%a7%e5%85%a8/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e5%8f%8d%e7%b5%84%e8%ad%af%e5%b8%b8%e7%94%a8%e6%96%b7%e9%bb%9e%e5%a4%a7%e5%85%a8/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:06:11 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=43</guid>
		<description><![CDATA[反組譯常用斷點大全 密碼常用中斷 Hmemcpy (win9x專用) GetDlgItemTextA GetDlgItemInt vb: getvolumeinformationa 　 vbastrcomp (trw) Bpx __vbaStrComp (記得是兩個 &#8216;;_&#8217;;) MSVBVM60!_vbastrcomp&#124;sofice MSVBVM50! &#124;　 VBAI4STR　 Ctrl+D bpx msvbvm60!__vbastrcomp do 『d *(esp+0c)』(softice) 按幾次F5出冊碼出來了。 bpx regqueryvalueexa do 「d esp－&#62;8」(trw)　 vbaVarTstEq 判斷是否註冊的函數 (0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], ax 改為0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], bx) 時間常用中斷 GetSystemTime GetLocalTime GetTickCount vb: rtcGetPresentDate //取得當前日期　 殺窗常用中斷 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=43&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>反組譯常用斷點大全</p>
<p>密碼常用中斷<br />
Hmemcpy (win9x專用)<br />
GetDlgItemTextA<br />
GetDlgItemInt<br />
vb:<br />
getvolumeinformationa 　<br />
vbastrcomp (trw)<br />
Bpx __vbaStrComp (記得是兩個 &#8216;;_&#8217;;)<br />
MSVBVM60!_vbastrcomp|sofice<br />
MSVBVM50!           |　<br />
VBAI4STR　<br />
Ctrl+D<br />
bpx msvbvm60!__vbastrcomp do 『d *(esp+0c)』(softice)<br />
按幾次F5出冊碼出來了。<br />
bpx regqueryvalueexa do 「d esp－&gt;8」(trw)　<br />
vbaVarTstEq 判斷是否註冊的函數<br />
(0042932F 66898580FEFFFF          mov word ptr [ebp+FFFFFE80], ax<br />
改為0042932F 66898580FEFFFF       mov word ptr [ebp+FFFFFE80], bx)</p>
<p>時間常用中斷<br />
GetSystemTime<br />
GetLocalTime<br />
GetTickCount<br />
vb:<br />
rtcGetPresentDate          //取得當前日期　<br />
殺窗常用中斷<br />
Lockmytask (win9x專用)<br />
DestroyWindow<br />
mouse_event (鼠標中斷)<br />
postquitmessage (Cracking足彩xp,很有用^_^)<br />
vb:<br />
_rtcMsgBox　<br />
ini文件內容常用中斷<br />
GetPrivateProfileStringA<br />
GetPrivateProfileProfileInt　<br />
key文件:<br />
getprivateprofileint<br />
ReadFile<br />
CreateFileA　</p>
<p>註冊表常用中斷<br />
RegQueryvalueA<br />
RegQueryvalueExA　</p>
<p>狗加密中斷<br />
BPIO -h 278 R<br />
BPIO -h 378 R 　</p>
<p>其它常用函數斷點<br />
CreateFileA (讀狗驅動程序),<br />
DeviceIOControl,<br />
FreeEnvironmentStringsA (對付HASP非常有效).<br />
Prestochangoselector (16-bit HASP&#8217;;s), &#8216;;7242&#8242;; 查找字符串 (對付聖天諾).具體含義參考下面的範例。　</p>
<p>光盤破解中斷<br />
16:<br />
getvolumeinformation<br />
getdrivetype<br />
int 2fh (dos)<br />
32:<br />
GetDriveTypeA<br />
GetFullPathNameA<br />
GetWindowsDirectoryA　</p>
<p>讀磁盤中斷<br />
GETLASTERROR 返回擴充出錯代碼 　</p>
<p>限制中斷<br />
EnableMenuItem 允許、禁止或變灰指定的菜單條目<br />
EnableWindow 允許或禁止鼠標和鍵盤控制指定窗口和條目（禁止時菜單變灰） 　</p>
<p>不知道軟盤中斷是什麼了？還有其它特殊中斷，不知道其他朋友可否說一下了？<br />
如:Lockmytask and mouse_event，這些就不是api32函數？<br />
win9x 與 win2k進行破解，以上中斷有部分已經不能用了？<br />
不知道在win2k上，以上常用中斷函數是什麼了？<br />
也就是問密碼、時間、窗口、ini、key、註冊表、加密狗、光盤、軟盤、限制等！<br />
瞭解常用的中斷，對破解分析可以做到事半功倍！<br />
請大家說一下！還有如何破解了某個軟件時，一重啟就打回原形？<br />
不知道下什麼中斷了？可以分為三種情況：<br />
1.比較可能在註冊表中<br />
2.比較在特殊文件(*.key *.ini *.dat等)<br />
3.比較在程序中，沒有任何錯誤提示或者反譯也找不到明顯字符(這個就是我想問的)　<br />
還有一個是最難的，就是去掉水印！<br />
也可以三種情況：<br />
A.水印是位圖文件(bitblt,creatBITMAP等位圖函數)<br />
B.水印是明顯字符(反譯分析)<br />
C.水印不是明顯字符(如：This a demo!它只是顯示在另一個製作文件上,可是*.htm *.exe等)<br />
C.才是最難搞，也是很多人想知道的！包括我在內。不知道高手們有何提示了？　</p>
<p>廣告條：<br />
可以分兩種情況:<br />
A.從創建窗口進手,可以用到movewindow或者其它窗口函數!<br />
B.從位圖進手,也可以用到bitblt或者其它位圖函數!<br />
最後可以借助一些現有工具(如:api27,vwindset,freespy之類的工具)　<br />
葡萄雖無樹，藤生棚中秧。<br />
人處凡塵中，豈不惹塵埃?　</p>
<p>小球[CCG]<br />
那要看是在哪作的標記，通常是在註冊表中留下信息！<br />
在softice中就要用bpx regqueryvalueexa do 『d esp-&gt;8&#8243;來中斷看看，<br />
在trw中要用bpx regqueryvalueexa do 『d*(esp+8)』來中斷看看。<br />
還有的是在本目錄下留下註冊信息，常見的有.dat .ini .dll等等，<br />
我是用bpx readfile來中斷的，還有的是在windows目錄下留下註冊信息。<br />
你可以借助專用的工具幫助你查看，入filemon等！ 　<br />
vb:　<br />
1、__vbaVarTstNe              //比較兩個變量是否不相等<br />
2、rtcR8ValFromBstr            //把字符串轉換成浮點數<br />
3、rtcMsgBox  顯示一信息對話框<br />
4、rtcBeep                    //讓揚聲器叫喚<br />
5、rtcGetPresentDate          //取得當前日期 　</p>
<p>針對字串:<br />
__vbaStrComp<br />
__vbaStrCmp<br />
__vbaStrCompVar<br />
__vbaStrLike<br />
__vbaStrTextComp<br />
__vbaStrTextLike</p>
<p>針對變量:<br />
__vbaVarCompEq<br />
__vbaVarCompLe<br />
__vbaVarCompLt<br />
__vbaVarCompGe<br />
__vbaVarCompGt<br />
__vbaVarCompNe 　</p>
<p>VB的指針:<br />
THROW 　<br />
VB DLL還調用了oleauto32.dll中的部分函數。oleauto32.dll是個通用的proxy/stub DLL，其每個函數的原型在 中定義，並在MSDN中有詳細描述。這也有助於理解VB DLL中的函數的作用。 　<br />
舉例： 　<br />
LEA EAX, [EBP-58]<br />
PUSH EAX<br />
CALL [MSVBVM60!__vbaI4Var] 　<br />
執行call之前敲dd eax+8，得到的值為3；<br />
執行完call之後，eax = 3<br />
從而可知__vbaI4Var的作用是將一個VARIANT轉換為I4（即一個長整數）。　<br />
__vbaVarTstNe似乎是用來進行自校驗的，正常情況下返回值為0。<br />
已知適用的軟件有：網絡三國智能機器人、音樂賀卡廠。當這兩個軟件被脫殼後都回出錯，網絡三國智能機器人會產生非法*作，而音樂賀卡廠會告訴你是非法拷貝，通過修改__vbaVarTstNe的返回值都可讓它們正常運行。<br />
所以當您遇到一個VB軟件，脫殼後無法正常運行，而又找不出其它問題時，可試試攔截這個函數，說不定會有用哦。8-）　<br />
API不太知道,也許可以通過BIOS在98平台上讀寫扇區,不過在2000/NT下可以通過內黑ATAPI,HAL寫扇區</p>
<p>machoman[CCG]<br />
bpx WRITE_PORT_BUFFER_USHORT<br />
NT/2000下這個斷點,當edx=1f0h,時,可以看見EDI地址內數據為扇區位置數據,必須先 在winice.dat 中裝入hal.sys 詳細內容看ATAPI手冊 　</p>
<p>補充篇:<br />
關於對VB程序和時間限制程序的斷點<br />
CrackerABC<br />
先給出修改能正確反編譯VB程序的W32DASM的地址：<br />
======================<br />
offsets 0x16B6C-0x16B6D 　<br />
修改機器碼為： 98 F4<br />
====================== 　</p>
<p>VB程序的跟蹤斷點： 　<br />
============<br />
MultiByteToWideChar,<br />
rtcR8ValFromBstr,<br />
WideCharToMultiByte,<br />
__vbaStrCmp<br />
__vbaStrComp<br />
__vbaStrCopy<br />
__vbaStrMove<br />
__vbaVarTstNe<br />
rtcBeep<br />
rtcGetPresentDate (時間API)<br />
rtcMsgBox<br />
========= 　</p>
<p>時間限制斷點： 　<br />
================<br />
CompareFileTime<br />
GetLocalTime<br />
GetSystemTime<br />
GetTimeZoneInformation<br />
msvcrt.diffTime()<br />
msvcrt.Time()<br />
================ 　</p>
<p>一般處理<br />
bpx hmemcpy<br />
bpx MessageBox<br />
bpx MessageBoxExA<br />
bpx MessageBeep<br />
bpx SendMessage　<br />
bpx GetDlgItemText<br />
bpx GetDlgItemInt<br />
bpx GetWindowText<br />
bpx GetWindowWord<br />
bpx GetWindowInt<br />
bpx DialogBoxParamA<br />
bpx CreateWindow<br />
bpx CreateWindowEx<br />
bpx ShowWindow<br />
bpx UpdateWindow　<br />
bmsg xxxx wm_move<br />
bmsg xxxx wm_gettext<br />
bmsg xxxx wm_command<br />
bmsg xxxx wm_activate  　</p>
<p>時間相關<br />
bpint 21 if ah==2A (DOS)<br />
bpx GetLocalTime<br />
bpx GetFileTime<br />
bpx GetSystemtime  　<br />
CD-ROM 或 磁盤相關<br />
bpint 13 if ah==2 (DOS)<br />
bpint 13 if ah==3 (DOS)<br />
bpint 13 if ah==4 (DOS)<br />
bpx GetFileAttributesA<br />
bpx GetFileSize<br />
bpx GetDriveType<br />
bpx GetLastError<br />
bpx ReadFile<br />
bpio -h (Your CD-ROM Port Address) R  　</p>
<p>軟件狗相關<br />
bpio -h 278 R<br />
bpio -h 378 R  　</p>
<p>鍵盤輸入相關<br />
bpint 16 if ah==0 (DOS)<br />
bpint 21 if ah==0xA (DOS)  　</p>
<p>文件訪問相關<br />
bpint 21 if ah==3dh (DOS)<br />
bpint 31 if ah==3fh (DOS)<br />
bpint 21 if ah==3dh (DOS)<br />
bpx ReadFile<br />
bpx WriteFile<br />
bpx CreateFile<br />
bpx SetFilePointer<br />
bpx GetSystemDirectory 　</p>
<p>INI 初始化文件相關<br />
bpx GetPrivateProfileString<br />
bpx GetPrivateProfileInt<br />
bpx WritePrivateProfileString<br />
bpx WritePrivateProfileInt 　</p>
<p>註冊表相關<br />
bpx RegCreateKey<br />
bpx RegDeleteKey<br />
bpx RegQueryvalue<br />
bpx RegCloseKey<br />
bpx RegOpenKey 　</p>
<p>註冊標誌相關<br />
bpx cs:eip if EAX==0 　</p>
<p>內存標準相關<br />
bpmb cs:eip rw if 0&#215;30:0x45AA==0 　</p>
<p>顯示相關<br />
bpx 0&#215;30:0x45AA do 『d 0&#215;30:0x44BB』<br />
bpx CS:0x66CC do 『? EAX』</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=43&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-%e5%8f%8d%e7%b5%84%e8%ad%af%e5%b8%b8%e7%94%a8%e6%96%b7%e9%bb%9e%e5%a4%a7%e5%85%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[提問] CE裡的autoassembler怎麼寫?</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e6%8f%90%e5%95%8f-ce%e8%a3%a1%e7%9a%84autoassembler%e6%80%8e%e9%ba%bc%e5%af%ab/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e6%8f%90%e5%95%8f-ce%e8%a3%a1%e7%9a%84autoassembler%e6%80%8e%e9%ba%bc%e5%af%ab/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 14:57:07 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=41</guid>
		<description><![CDATA[1. [enable] 2. registersymbol(KiKiVac) //註冊變數 3. alloc(KiKiVac,256) //宣告所佔記憶體容量 4. label(KiKiReturn) //標記 5. 6. KiKiVac: // 533b7d 7. mov edx,[7cd55c] //把[7cd55c]位址的內容複製到edx 8. lea edx,[edx+35c] //把[edx+35c]的地址給edx 9. mov ecx,[edx] //把edx位址的內容複製到ecx 10. mov edx,[7cd55c] 11. lea edx,[edx+358] 12. lea eax,[edx] //把[edx]的地址給eax 13. mov eax,[eax] 14. jmp KiKiReturn //跳到 KiKiReturn 執行 15. KiKiReturn: 16. jmp 53B852 //跳到 53B852 執行 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=41&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>   1. [enable]<br />
   2. registersymbol(KiKiVac)                  //註冊變數<br />
   3. alloc(KiKiVac,256)                //宣告所佔記憶體容量<br />
   4. label(KiKiReturn)                //標記<br />
   5.</p>
<p>   6. KiKiVac: // 533b7d<br />
   7. mov edx,[7cd55c]                //把[7cd55c]位址的內容複製到edx<br />
   8. lea edx,[edx+35c]                //把[edx+35c]的地址給edx<br />
   9. mov ecx,[edx]                        //把edx位址的內容複製到ecx<br />
  10. mov edx,[7cd55c]<br />
  11. lea edx,[edx+358]<br />
  12. lea eax,[edx]                        //把[edx]的地址給eax<br />
  13. mov eax,[eax]<br />
  14. jmp KiKiReturn                        //跳到 KiKiReturn 執行<br />
  15. KiKiReturn:<br />
  16. jmp 53B852                      //跳到 53B852 執行<br />
  17. [disable]<br />
  18. unregistersymbol(KiKiVac)        //註銷變數<br />
  19. dealloc(KiKiVac)                //釋放記憶體<br />
//mov  傳遞變數數值<br />
//lea  傳遞變數地址</p>
<p>基本上來說, 這段程式碼是作一個Detour Hook. 有許多外掛的核心運作原理就是Hook.</p>
<p>一般來說, 如果需要更改一個程式的行為, 我們可以有兩種主要的方法來達成, 一種就是更改那個程式運行時候的變數. ( CE 裡面加入地址跟值的那種 ) 另一種就是改變程式的程式碼.</p>
<p>有時候, 我們需要改變一段程式碼, 例如說, 程式碼原本是 0xAA 0xBB 0xCC 0xDD 0&#215;11 0&#215;22, 那我們要把他改成0xAA 0xBB 0xFF 0xDD 0&#215;11 0&#215;22, 原本的0xCC變成0xFF, 程式的行為就改變了. 但是, 時常出現的問題是, 我們要改的東西比原本的大, 例如說, 我們要把0xCC改成0&#215;77 0&#215;88 0&#215;99, 那空間不夠, 怎麼辦呢? 我們就再取得一塊記憶體( alloc(KiKiVac,256) ), 然後寫我們要的程式碼進去, 然後, 再將原本的地方改成跳至我們取得的那塊記憶體執行即可, 這種方式就是Hook. 那特別是使用jmp的方法改變執行順序的Hook方式, 我們叫他Detour Hook.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>如果想要真正了解這段程式碼, 我建議你一定要熟讀x86的指令集, 這是最基本的, 然後在了解CE的Auto assembly的指令( [enable], [disable], alloc, dealloc, registersymbol, unregistersymbol, label ), 最後要了解遊戲程序裡面, 靠近你Hook的程式碼附近是什麼意義, 那就可以了解這段程式碼真正的意義.</p>
<p>參考: x86 指令集官方參考資料 http://www.intel.com/products/processor/manuals/ ( 詳見Volumn 2 )</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=41&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e6%8f%90%e5%95%8f-ce%e8%a3%a1%e7%9a%84autoassembler%e6%80%8e%e9%ba%bc%e5%af%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
		<item>
		<title>[分享] Cheat Engine 各個模組原碼分析以及運作原理</title>
		<link>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-cheat-engine-%e5%90%84%e5%80%8b%e6%a8%a1%e7%b5%84%e5%8e%9f%e7%a2%bc%e5%88%86%e6%9e%90%e4%bb%a5%e5%8f%8a%e9%81%8b%e4%bd%9c%e5%8e%9f%e7%90%86/</link>
		<comments>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-cheat-engine-%e5%90%84%e5%80%8b%e6%a8%a1%e7%b5%84%e5%8e%9f%e7%a2%bc%e5%88%86%e6%9e%90%e4%bb%a5%e5%8f%8a%e9%81%8b%e4%bd%9c%e5%8e%9f%e7%90%86/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 14:53:44 +0000</pubDate>
		<dc:creator>diablorex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://diablorex.wordpress.com/?p=39</guid>
		<description><![CDATA[幫轉：John 大大以前在 TW-Share 寫過有關的遊戲作弊文章 【標 題】：Cheat Engine 各個模組原碼分析以及運作原理 【作 者】：john0312 【時 間】：2006-12-17 10:45 PM 【連 結】：http://bbs.twshare.net/viewthread.php?tid=122985 我中文不好,若有詞不達意,請各位見諒. 小弟在此獻醜,希望這裡的大大們不嫌棄. 1. 簡介 『工欲善其事,必先利其器』, 當我們要搞外掛, 就要對我們的工具 &#8212; Cheat Engine 瞭如指掌. Cheat Engine 是由荷蘭人 Dark Byte (它的暱稱) 寫的. 至今, Dark Byte 已將五年的心血花在 Cheat Engine 上, 這程式的規模自然不小, 因此我今天將為大家解釋 Cheat Engine 的各個模組, 以及他內部的運作. 2. 必要的知識,以及用詞的定義 一. 從 CPU 說起 我們目前用的 x86 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=39&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>幫轉：John 大大以前在 TW-Share 寫過有關的遊戲作弊文章</p>
<p>【標 題】：Cheat Engine 各個模組原碼分析以及運作原理<br />
【作 者】：john0312<br />
【時 間】：2006-12-17 10:45 PM<br />
【連 結】：http://bbs.twshare.net/viewthread.php?tid=122985</p>
<p>                                                                                                                                                                                                                                                                        我中文不好,若有詞不達意,請各位見諒.<br />
小弟在此獻醜,希望這裡的大大們不嫌棄.</p>
<p>1. 簡介<br />
『工欲善其事,必先利其器』, 當我們要搞外掛, 就要對我們的工具 &#8212; Cheat Engine 瞭如指掌. Cheat Engine<br />
是由荷蘭人 Dark Byte (它的暱稱) 寫的. 至今, Dark Byte 已將五年的心血花在 Cheat Engine 上,<br />
這程式的規模自然不小, 因此我今天將為大家解釋 Cheat Engine 的各個模組, 以及他內部的運作.</p>
<p>2. 必要的知識,以及用詞的定義<br />
一. 從 CPU 說起<br />
我們目前用的 x86 CPU ( x86 就是一般 Intel 和 AMD 的 32位元 CPU ) 有4個權限層次 ( 英文裡叫做<br />
Ring ) &#8212; Ring 0, Ring 1, Ring 2, Ring 3.<br />
Ring 0 是甚麼指令都可以執行,甚麼記憶體都可存取.<br />
Ring 3 是最受限制的層次, 也不可以存取非Ring3以外的記憶體</p>
<p>我們用的 Windows 作業系統只用到Ring3以及Ring0, 分別是 User-mode 以及 Kernel-mode.<br />
一般程式執行於 Ring3 ( User-mode ). 則作業系統核心以及驅動程式執行於 Ring0 ( Kernel-Mode ).</p>
<p>二. 虛擬記憶體</p>
<p>我們的 CPU 有一個功能,那就是將任何一塊實體記憶體貼在虛擬記憶體上,當存取那塊虛擬記憶體時,就像存取那塊實體記憶體一樣.<br />
正確一點來說,作業系統可以規定哪一塊實體記憶體對應虛擬記憶體的哪一個位置,例如:作業系統說0&#215;00001000到0&#215;00002000的實體記憶體貼到0&#215;00401000的記憶體,那程式存取0x004018FF,就等於存取實體記憶體的0x000018FF,若程式存取0x00403E66,那也會存取對應的實體記憶體.<br />
另外一點,虛擬記憶體的觀念是由CPU和作業系統管理的,一般的程式是不知道的,程式中的地址也是虛擬記憶體的地址(你們的代碼也是虛擬記憶體的地址)<br />
在Windows作業系統裡,虛擬記憶體地址0&#215;00000000~0x7FFFFFFF是Usermode記憶體<br />
0&#215;80000000~0xFFFFFFFF是KernelMode記憶體.<br />
在每個程序間,KernelMode的記憶體都是相同的,但UserMode記憶體卻對應著不同的實體記憶體.</p>
<p>3. 外掛運行的原理<br />
外掛主要分兩種: 1. 記憶體修改 ( 包括: Debug Register ) 2. 人工智慧練功 ( 如: 達人, MSBot.. etc )<br />
Cheat Engine 屬於記憶體修改, 我們用的地址, 是遊戲程式用來決定一些事情的指令 ( 例如: 無敵地址是決定你有沒有被打中 )<br />
由於大家都是執行於UserMode. 而UserMode的程式又不能存取實體記憶體,所以需要透過一些系統的API來達成修改遊戲程式的記憶體.</p>
<p>4. 模組間的關係,以及Cheat Engine整體運作原理</p>
<p>Windows 本身有提共一些外掛用得到的API,例如: OpenProcess(), ReadProcessMemory(),<br />
WriteProcessMemory()&#8230; 等.<br />
由於一些可惡(又可愛 XD)的防外掛軟件,用Hooking技術,導致這些API不能使用. 因此Dark Byte寫了一些代替的API.<br />
Cheat Engine 內的選項允許你選擇使用Windows的API(透過kernel32.dll)或是用Cheat<br />
Engine本身的API(部分跟Windows相同)<br />
CheatEngine的API都是由dbk32.sys處理. CheatEngine.exe 本身不呼叫 dbk32.sys,<br />
但是他載入dbk32.dll,而dbk32.dll呼叫dbk32.sys<br />
CheatEngine還有許多模組,例如: cehook.dll, stealth.dll, dxhook.dll&#8230; 等,<br />
但他們不常用到,因此這次就不提了.</p>
<p>5. CheatEngine.exe 分析<br />
CheatEngine.exe主要是由Pascal(Delphi)語言寫的, 是原碼中的CheatEngine.dpr編譯成的.<br />
CheatEngine.dpr 使用(Include/use)原碼中主目錄下面大多的檔案. CheatEngine.dpr<br />
的檔案主要有兩種,一種主要與你溝通,這種檔案每一個 .pas 檔和 .dfm 檔組成一個視窗 ( 如:<br />
MemoryBrowserFormUnit.pas 以及 MemoryBrowserFormUnit.dfm 組成我們用的 Memory<br />
View ) 另一種是與下面一層的API溝通,如Debuger.pas, Debuger2.pas,<br />
NewKernelHandler.pas&#8230; 等<br />
NewKernelHandler.pas直得我們得關注,他與dbk32.dll溝通. 不像一般程式載入DLL,<br />
newkernelhandler.pas用LoadLibrary()及GetProcAddress(), 手動載入DLL.<br />
&#8230;.<br />
   DarkByteKernel:= LoadLibrary(dbkdll);<br />
   if DarkByteKernel=0 then exit;<br />
   KernelVirtualAllocEx:=GetProcAddress(darkbytekernel,&#8217;VAE&#8217;);<br />
   KernelOpenProcess:=GetProcAddress(darkbytekernel,&#8217;OP&#8217;);<br />
   KernelReadProcessMemory:=GetProcAddresS(darkbytekernel,&#8217;RPM&#8217;);<br />
   KernelWriteProcessMemory:=GetProcAddress(darkbytekernel,&#8217;WPM&#8217;);<br />
&#8230;.<br />
NewKernelHandler.pas 同時也會跟 Windows 本身的 API 講話.<br />
&#8230;.<br />
  WindowsKernel:=LoadLibrary(&#8216;Kernel32.dll&#8217;);<br />
  if WindowsKernel=0 then Raise Exception.create(&#8216;Something is really<br />
messed up on your computer! You don』t seems to have a kernel!!!!&#8217;);<br />
  ReadProcessMemory:=GetProcAddress(WindowsKernel,&#8217;ReadProcessMemory&#8217;);<br />
  WriteProcessMemory:=GetProcAddress(WindowsKernel,&#8217;WriteProcessMemory&#8217;);<br />
  OpenProcess:=GetProcAddress(WindowsKernel,&#8217;OpenProcess&#8217;);<br />
  VirtualQueryEx:=GetProcAddress(WindowsKernel,&#8217;VirtualQueryEx&#8217;);<br />
&#8230;.</p>
<p>6. dbk32.dll 的分析<br />
dbk32.dll 可以說是今天說到的幾個最小的模組, 是原碼在dbk32目錄下. 少的只有兩個檔案 &#8212; dbk32.dpr and<br />
dbk32functions.pas.<br />
dbk32.dll 與 dbk32.sys 溝通.<br />
在我分析dbk32.dll的原碼之前,我要先說明KernelMode的驅動程式和Usermode的程式是如何溝通的. Kernelmode<br />
與 Usermode 之間有 n 種溝通方式,<br />
但最常用的是DeviceIOControl,UserMode程式一般先對KernelMode驅動程式提出要求(並提共一個要求代碼(CTL_CODE),這代碼是兩邊都懂的),並準備一個緩衝區(Buffer).<br />
KernelMode驅動程式收到要求,就從緩衝區讀出資料,做該做的動作,再將結果寫回緩衝區.<br />
我們來看看dbk32functions.pas中是如何做的:<br />
&#8230;.<br />
const IOCTL_CE_READMEMORY             = (IOCTL_UNKNOWN_BASE shl 16) or<br />
($0800 shl 2) or (METHOD_BUFFERED ) or (FILE_RW_ACCESS shl 14);<br />
const IOCTL_CE_WRITEMEMORY            = (IOCTL_UNKNOWN_BASE shl 16) or<br />
($0801 shl 2) or (METHOD_BUFFERED ) or (FILE_RW_ACCESS shl 14);<br />
const IOCTL_CE_OPENPROCESS                      =       (IOCTL_UNKNOWN_BASE shl 16) or<br />
($0802 shl 2) or (METHOD_BUFFERED ) or (FILE_RW_ACCESS shl 14);<br />
&#8230;.<br />
以上是KernelMode驅動程式以及Usermode的dbk32.dll約定好的要求代碼,我在以GetIDTCurrentThread做一個例子<br />
&#8230;.<br />
function GetIDTCurrentThread:dword;<br />
var cc,br: dword;<br />
   idtdescriptor: packed record<br />
                    wLimit:word;<br />
                    vector: dword;<br />
                  end;<br />
begin<br />
if hdeviceINVALID_HANDLE_VALUE then<br />
begin<br />
   cc:=IOCTL_CE_GETIDT;<br />
   deviceiocontrol(hdevice,cc,nil,0,@idtdescriptor,6,br,nil);<br />
   result:=idtdescriptor.vector;<br />
end else result:=0;<br />
end;<br />
&#8230;.<br />
他先檢查dbk32.sys是否已連接上<br />
要求代碼存在cc中,之後傳到DeviceIOControl Function上. idtdescriptor 則是緩衝區</p>
<p>7. dbk32.sys 分析<br />
由於dbk32.sys執行於KernelMode,幾乎所有外掛的動作皆是由dbk32.sys執行的. 因此,我個人認為dbk32.sys是最精華的一部分.<br />
dbk32.sys 在原碼的DBKKernel目錄下, 程式的進入點在DBKDrv.c.<br />
DBKDrv.c 主要跟 dbk32.dll 溝通. 一些要求當場在DBKDrv.c處理,一些則交給其他檔案處理.<br />
DBKDrv.c 的 MSJDispatchIoctl 處理dbk32.dll的DeviceIOControl要求<br />
由於dbk32.sys中的原碼比較難,所以我就不多說.</p>
<p>8. 附錄: 推薦閱讀<br />
I.<br />
II.<br />
III.<br />
IV. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/diablorex.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/diablorex.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/diablorex.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/diablorex.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/diablorex.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/diablorex.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/diablorex.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/diablorex.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=diablorex.wordpress.com&amp;blog=9142646&amp;post=39&amp;subd=diablorex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://diablorex.wordpress.com/2011/04/20/%e5%88%86%e4%ba%ab-cheat-engine-%e5%90%84%e5%80%8b%e6%a8%a1%e7%b5%84%e5%8e%9f%e7%a2%bc%e5%88%86%e6%9e%90%e4%bb%a5%e5%8f%8a%e9%81%8b%e4%bd%9c%e5%8e%9f%e7%90%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/49c8c76dc9ed2f664193b35faef93d2d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">diablorex</media:title>
		</media:content>
	</item>
	</channel>
</rss>
