PDA

查看完整版本 : PHP写小偷程序的工具


Tony
2005-11-28, 06:09 PM
<?
//////////////////////////////////////////////////////////////
//
// 统一搜集系统 Univeral Gather System (UGS)
// 作者 zj@52linux.com
// 主页 http://www.52linux.com
// 联系QQ 733905
// 类内函数
// steal 用于搜集页面文字
// cut/cutpro 用于剪切文字
// filt/filtx用于过滤文字
// change用于改变文字
// getenterkey用于获得关键位置的链接Array
// _striplinks和_striptext 用于产生锚点的Array和文字
//
//////////////////////////////////////////////////////////////
class ugs
{
var $value_ ; //'窃取到的内容
var $src_ ; //'要偷的目标URL地址
var $isGet_ ; //判断是否已经偷过

function BytesToBstr($f) //'变成1行
{
return join("",$f);

}
function _striptext() //取得文字内容
{

// I didn't use preg eval (//e) since that is only available in PHP 4.0.
// so, list your entities one by one here. I included some of the
// more common ones.

$search = array("'<script[^>]*?>.*?</script>'si", // strip out javascript
"'<[\/\!]*?[^<>]*?>'si", // strip out html tags
"'([\r\n])[\s]+'", // strip out white space
"'&(quot|#34|#034|#x22);'i", // replace html entities
"'&(amp|#38|#038|#x26);'i", // added hexadecimal values
"'&(lt|#60|#060|#x3c);'i",
"'&(gt|#62|#062|#x3e);'i",
"'&(nbsp|#160|#xa0);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&(reg|#174);'i",
"'&(deg|#176);'i",
"'&(#39|#039|#x27);'",
"'&(euro|#8364);'i", // europe
"'&a(uml|UML);'", // german
"'&o(uml|UML);'",
"'&u(uml|UML);'",
"'&A(uml|UML);'",
"'&O(uml|UML);'",
"'&U(uml|UML);'",
"'&szlig;'i",
);
$replace = array( "",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
chr(174),
chr(176),
chr(39),
chr(128),
"?",
"?",
"?",
"?",
"?",
"?",
"?",
);

$text = preg_replace($search,$replace,$this->value_);

return $this->value_=$text;
}
function _striplinks() //取得链接Array
{
preg_match_all("'<\s*a\s.*?href\s*=\s* # find <a href=
([\"\'])? # find single or double quote
(?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next matching
# quote, otherwise match up to next space
'isx",$this->value_,$links);


// catenate the non-empty matches from the conditional subpattern

while(list($key,$val) = each($links[2]))
{
if(!empty($val))
$match[] = $val;
}

while(list($key,$val) = each($links[3]))
{
if(!empty($val))
$match[] = $val;
}

// return the links
return $this->value_=$match;
}


function steal($toline=true) //'窃取目标URL地址的HTML代码的方法
{

if($this->src_!="")
{
$unix=true; //如果您是unix系统 请设置true 条件是系统里有wget 这个软件,如果是window系统,设置为false,或者当有wget.exe 这个软件时也可以设置为true
// wget.exe 可从下面地址得到 http://allserv.ugent.be/~bpuype/wget/
if($unix){
$tmpfile=tempnam("/tmp","FOO");

$cmd="wget -nv -O $tmpfile \"$this->src_\"";
//echo $cmd;
exec($cmd);

$http=file($tmpfile);

unlink($tmpfile);

}
else
{
$http=file($this->src_);

}

//print_r($http);
if($toline) {
$this->isGet_=true;
return $this->value_=$this->BytesToBstr($http);

}
else
{
$this->isGet_=true;

return $this->value_=$http;

}
}
else
{

echo ("<script>alert(\"请先设置src属性!\")</script>");
}


}
function steal_local($toline=true) // 此方法为处理本地文件使用
{
if($this->src_!="")
{
if($toline)
{
$http=file($this->src_);
$this->isGet_=true;
return $this->value_=$this->BytesToBstr($http);

}
else
{
$http=file($this->src_);
$this->isGet_=true;
return $this->value_=$http;

}

}
else
{

echo ("<script>alert(\"请先设置src属性!\")</script>");
}


}


//'删除偷到的内容中里面的换行、回车符以便进一步加工/方法
function noReturn()
{

if(!$this->isGet_) $this->steal();
$this->value_=str_replace("\n","",$this->value_);
$this->value_=str_replace("\r","",$this->value_);
}

//'对偷到的内容中的个别字符串用新值更换/方法
function change($oldStr,$str) //'参数分别是旧字符串,新字符串
{
if(!$this->isGet_) $this->steal();
$this->value_=str_replace($oldStr,$str,$this->value_ );
}



//'按指定首尾字符串对偷取的内容进行裁减(不包括首尾字符串)/方法
function cut($head,$bot) //'参数分别是首字符串,尾字符串
{
if(!$this->isGet_) $this->steal();

$message=explode($head,$this->value_);

if(count($message)>1)
{
$message=explode($bot,$message[1]);
return $this->value_= $message[0];
}
else
{
return $this->value_="";
}


}


function cutpro($start,$end,$no='1',$comprise='') // $no must in {1,2,3,4,5.....} zero is not support
//此方法较cut方法有进步,是可以调节$no 确定切到指定第no个符合条件的文字串
{
$string=explode($start,$this->value_);
//print_r($string);
$string=explode($end,$string[$no]);
//print_r($string);
switch ($comprise){
case 'start':
$string=$start.$string[0];
break;
case 'end':
$string=$string[0].$end;
break;
case 'all':
$string=$start.$string[0].$end;
break;
default:
$string=$string[0];
}
return $this->value_=$string;
}

function cut2($head,$bot) //cut 的另一种实现方法
{
return substr($this->value_,strpos($this->value_,$head)+strlen($head),strpos($this->value_,$bot)-strpos($this->value_,$head)-strlen($head));
}

//'按指定首尾字符串对偷取的内容进行裁减(包括首尾字符串)/方法
function cutX($head,$bot) //'参数分别是首字符串,尾字符串
{
$tmp=$this->cut($head,$bot);

return $this->value_=$head.$tmp.$bot;


}


//'按指定首尾字符串位置偏移指针对偷取的内容进行裁减/方法
function cutBy($head,$headCusor,$bot,$botCusor)
//'参数分别是首字符串,首偏移值,尾字符串,尾偏移值,左偏移用负值,偏移指针单位为字符数
{
if(!$this->isGet_) $this->steal();
return substr($this->value_,strpos($this->value_,$head)+strlen($head)+$headCusor,strpos($this->value_,$bot)-1+$botCusor-strpos($this->value_,$head)-strlen($head)-$headcusor);

}


//'按指定首尾字符串对偷取的内容用新值进行替换(不包括首尾字符串)/方法
function filt($head,$bot,$str)// '参数分别是首字符串,尾字符串,新值,新值位空则为过滤
{
if(!$this->isGet_) $this->steal();
$tmp_v=$this->value_;
$tmp=$this->cut($head,$bot);
return $this->value_=str_replace($tmp,$str,$tmp_v);
}

function filtX($head,$bot,$str)// '参数分别是首字符串,尾字符串,新值,新值位空则为过滤
{
if(!$this->isGet_) $this->steal();
$tmp_v=$this->value_;

$tmp=$this->cutX($head,$bot);

return $this->value_=str_replace($tmp,$str,$tmp_v);
}

//'按指定首尾字符串位置偏移指针对偷取的内容新值进行替换/方法
function filtBy($head,$headCusor,$bot,$botCusor,$str)
//'参数分别是首字符串,首偏移值,尾字符串,尾偏移值,新值,左偏移用负值,偏移指针单位为字符数,新值为空则为过滤
{
if(!$this->isGet_) $this->steal();
// 这里写代码
$tmp_v=$this->value_;
$ttt=substr($this->value_ ,strpos($this->value_ ,$head)+strlen($head)+$headCusor,strpos($this->value_ ,$bot)-1+$botCusor-strpos($this->value_ ,$head)-strlen($head)-$headCusor);
//echo $ttt;
return $this->value_=str_replace($ttt,$str,$tmp_v );

}

//'将偷取的内容中的绝对URL地址改为本地相对地址
function local()
{

}


//'对偷到的内容中的符合正则表达式的字符串用新值进行替换/方法
function replaceByReg($patrn,$str) //'参数是你自定义的正则表达式,新值
{
if(!$this->isGet_) $this->steal();
return $this->value_=join("",preg_replace($patrn,$str,$this->value_));

}

function pickByReg($patrn)
{
//
}

function debug()
{
$tempstr="<SCRIPT>function runEx(){var winEx2 = window.open(\"\", \"winEx2\", \"width=500,height=300,status=yes,menubar=no,scrollbars=yes,resizable=yes\"); winEx2.document.open(\"text/html\", \"replace\"); winEx2.document.write(unescape(event.srcElement.parentElement.children[0].value)); winEx2.document.close(); }function saveFile(){var win=window.open('','','top=10000,left=10000');win.document.write(document.all.asdf.innerText);win.document.execCommand('SaveAs','','javascript.htm');win.close();}</SCRIPT><center><TEXTAREA id=asdf name=textfield rows=32 wrap=VIRTUAL cols=\"120\">".$this->value_."</TEXTAREA><BR><BR><INPUT name=Button onclick=runEx() type=button value=\"查看效果\"> <INPUT name=Button onclick=asdf.select() type=button value=\"全选\"> <INPUT name=Button onclick=\"asdf.value=''\" type=button value=\"清空\"> <INPUT onclick=saveFile(); type=button value=\"保存代码\"></center>";
echo $tempstr;
}

function getkeylinks($key) // 此方法用来确定包含某关键字的行的所有链接情况
{
// this function is used for toline=false
if(!$this->isGet_) $this->steal();
foreach($this->value_ as $k=>$v)
{
if(ereg($key,$v)) {
$this->value_=$v;
return $this->value_=$this->_striplinks();
}
}

}
function hasit($key) // 此方法用来确定是否包含某关键字的行
{
// this function is used for toline=false and true;
if(!$this->isGet_) $this->steal();

foreach($this->value_ as $k=>$v)
{
if(ereg($key,$v))
{

return true;
}

}

return false;
}


}
?>