Posted by CFC4N on 2006/06/12
HP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍。
那么,是否可以在PHP脚本中调用外部命令呢?如果能,如何去做呢?有些什么方面的顾虑呢?相信你看了本文后,肯定能够回答这些问题了。
是否可以?
答案是肯定的。PHP和其它的程序设计语言一样,完全可以在程序内调用外部命令,并且是很简单的:只要用一个或几个函数即可。
Posted by CFC4N on 2006/06/11
文章作者:MGF HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。 这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和 NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOK TextOut()或ExtTextOut()这两个 函数实现的,在操作系统用这两个函数输出文本之前,就把相应的英文替换成中文而达到即 时翻译;IFS和NDIS过滤也是如此,在读写磁盘和收发数据之前,系统会调用第三方提供的 回调函数来判断操作是否可以放行,它与普通HOOK不同,它是操作系统允许的,由操作系统 提供接口来安装回调函数。 甚至如果没有HOOK,就没有病毒,因为不管是DOS下的病毒或WINDOWS里的病毒, 都是靠HOOK系统服务来实现自己的功能的:DOS下的病毒靠HOOK INT 21来感染文件(文件型病毒),靠HOOK INT 13来感染引导扇区(引导型病毒);WINDOWS下的病毒靠HOOK 系统API(包括RING0层的和RING3层的),或者安装IFS(CIH病毒所用的方法)来感染文件。因此可以说“没有HOOK,就没有今天多姿多彩的软件世界”。 由于涉及到专利和知识产权,或者是商业机密,微软一直不提倡大家HOOK它的系统API, 提供IFS和NDIS等其他过滤接口,也是为了适应杀毒软件和防火墙的需要才开放的。所以在 大多数时候,HOOK API要靠自己的力量来完成。 HOOK API有一个原则,这个原则就是:被HOOK的API的原有功能不能受到任何影响。就象 医生救人,如果把病人身体里的病毒杀死了,病人也死了,那么这个“救人”就没有任何意义了。 如果你HOOK API之后,你的目的达到了,但API的原有功能失效了,这样不是HOOK,而是REPLACE,操作系统的正常功能就会受到影响,甚至会崩溃。 HOOK API的技术,说起来也不复杂,就是改变程序流程的技术。在CPU的指令里,有几条 指令可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。理论上只要改变API 入口和出口的任何机器码,都可以HOOK,但是实际实现起来要复杂很多,因为要处理好以下问题: 1,CPU指令长度问题,在32位系统里,一条JMP/CALL指令的长度是5个字节,因此你只有替换API 里超过5个字节长度的机器码(或者替换几条指令长度加起来是5字节的指令),否则会影响被更 改的小于5个字节的机器码后面的数条指令,甚至程序流程会被打乱,产生不可预料的后果; 2,参数问题,为了访问原API的参数,你要通过EBP或ESP来引用参数,因此你要非常清楚你的HOOK代码里此时的EBP/ESP的值是多少; 3,时机的问题,有些HOOK必须在API的开头,有些必须在API的尾部,比如HOOK createFilaA(), 如果你在API尾部HOOK API,那么此时你就不能写文件,甚至不能访问文件;HOOK RECV(), 如果你在API头HOOK,此时还没有收到数据,你就去查看RECV()的接收缓冲区,里面当然没有 你想要的数据,必须等RECV()正常执行后,在RECV()的尾部HOOK,此时去查看RECV()的缓冲区, 里面才有想要的数据; 4,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了; 5,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要; 6,最后要注意的是,被替换的CPU指令的原有功能一定要在HOOK代码的某个地方模拟实现。 下面以ws2_32.dll里的send()为例子来说明如何HOOK这个函数: Exported fn(): send – Ord:0013h 地址 机器码 汇编代码 :71A21AF4 [...]
Posted by gleon on 2006/06/11
Windows SQL Server 安全检查列表 作者:未知 文章来源:未知 点击数:163 更新时间:2005-9-17 【字体:小 大】 1. 确认已经安装了NT/2000和SQL Server的最新补丁程序,不用说大家应该已经安装好了,但是我觉得最好还是在这里提醒一下。 2. 评估并且选择一个考虑到最大的安全性但是同时又不影响功能的网络协议。 多协议是明智的选择, 但是它有时不能在异种的环境中使用。 3. 给 “sa” 和 “probe” 帐户设定强壮的密码来加强其安全性。设定一个强壮的密码并将其保存在一个安全的地方。 注意: probe帐户被用来进行性能分析和分发传输。 当在标准的安全模态中用的时候 , 给这个帐户设定高强度的密码能影响某些功能的使用。 4. 使用一个低特权用户作为 SQL 服务器服务的查询操作账户,不要用 LocalSystem 或sa。 这个帐户应该有最小的权利 ( 注意作为一个服务运行的权利是必须的)和应该包含( 但不停止)在妥协的情况下对服务器的攻击。 注意当使用企业管理器做以上设置时 , 文件,注册表和使用者权利上的 ACLs同时被处理。 5. 确定所有的 SQL 服务器数据,而且系统文件是装置在 NTFS 分区,且appropraite ACLs 被应用。 如果万一某人得到对系统的存取操作权限,该层权限可以阻止入侵者破坏数据,避免造成一场大灾难。 6.如果不使用Xp_cmdshell就关掉。 如果使用 SQL 6.5, [...]
Posted by gleon on 2006/06/11
::SetWindowPos(this->GetSafeHwnd(), HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | WS_EX_TOPMOST);
SetWindowPos(hwnd,-1,0,0,0,0,0B);
只要这个函数就OK了.真郁闷还到找!!!!!!!!!!!
Posted by CFC4N on 2006/06/11
一、Web服务器安全 PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。PHP可以和各种Web服务器结合,这里也只讨论Apache。非常建议以chroot方式安装启动Apache,这样即使Apache和PHP及其脚本出现漏洞,受影响的也只有这个禁锢的系统,不会危害实际系统。但是使用chroot的Apache后,给应用也会带来一定的麻烦,比如连接mysql 时必须用127.0.0.1地址使用tcp连接而不能用localhost实现socket连接,这在效率上会稍微差一点。还有mail函数发送邮件也是个问题,因为php.ini里的: [mail function] ; For Win32 only. SMTP = localhost ; For Win32 only. sendmail_from = me@localhost.com 都是针对Win32平台,所以需要在chroot环境下调整好sendmail。 二、PHP本身问题 1、远程溢出 PHP-4.1.2以下的所有版本都存在文件上传远程缓冲区溢出漏洞,而且攻击程序已经广泛流传,成功率非常高: http://packetstormsecurity.org/0204-exploits/7350fun http://hsj.shadowpenguin.org/misc/php3018_exp.txt 2、远程拒绝服务 PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST请求处理远程漏洞,虽然不能获得本地用户权限,但是也能造成拒绝服务。 3、safe_mode绕过漏洞 还有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函数绕过safe_mode限制执行命令漏洞,4.0.5版本开始mail函数增加了第五个参数,由于设计者考虑不周可以突破safe_mode 的限制执行命令。其中4.0.5版本突破非常简单,只需用分号隔开后面加shell命令就可以了,比如存在PHP脚本evil.php:
Posted by gleon on 2006/06/11
进程隐藏技术详解 文章出处:网络 发布时间:2005-09-03 :如何让程序在后台运行??help!!!有什么方法或软件可以让程序在后台运行,而不会弹出窗口???(我用的是windows系统) 答:问题猜解:是否在你开了很多程序,或者网页后发现有很多窗口显示,觉得很恼火呢?如果你想不会弹出窗口,那就最小化,自然不见弹出窗口了。它也是在后台运行了,而且没有弹出窗口,但我想你问的问题可能不是证明简单,我们可以延伸下: 问题延伸:是否在你开了很多程序,或者网页后发现有很多窗口显示,在任务栏有很多窗口图标,这些是很烦恼的事情,你一定也想去掉这些窗口。 1,在软件开发过程中相关的窗口属性原本就有相应设置。比如豪杰,比如qq它们都可以在软件自身功能项中实现“窗口总在最前运行”,去掉即可。又比如Serv-U由两大部分组成,引擎和用户界面。Serv-U引擎(ServUDaemon.exe)其实是一个常驻后台的程序,也是Serv-U整个软件的心脏部分,它负责处理来自各种FTP客户端软件的FTP命令,也是负责执行各种文件传送的软件。在运行Serv-U引擎也就是ServUDaemon.exe文件后,我们看不到任何的用户界面,它只是在后台运行,通常我们无法影响它,但在ServUAdmin.exe中我们可以停止和开始它。另外木马程序的Server端为了隐藏自己,必须在设计中做到不让自己显示到任务栏或者系统进程控制器中,同时还不会影响其他程序的正常运行,当使用者电脑处于断线状态下,Server段不会发送任何信息到预设的端口上,而会自动检测网络状态直到网络连接好,Server会通过email或者其他形式将Server端系统资料通知Client端,同时接收Client发送出来的请求。 2,对qq用户来说。要隐藏起来了?怕领导或长辈老师看见,呵呵。想挂QQ,但别人发现了就关,有什么办法能把QQ任务栏的图标隐藏起来吗?答案是有,很简单,启动QQ,用鼠标单击QQ窗口左下角的主菜单,在弹出的快捷菜单中选“系统参数”,弹出“QQ参数设置”对话框,在“参数设置”标签中,取消“在任务栏显示图标”、“自动弹出信息”选择,选择“使用热键”复选项,您还可以选择“自定义热键”定义自己的热键,在“声音设置”标签中,选择“声音开关”中的“关闭声音”。另外把QQ用鼠标点住拉到屏幕顶部,它会自动隐藏的!用时`把鼠标放在那个位置就会出来。 3,对其他用户,在上班或者上课怕他人看见,可以使用软件实现彻底隐藏。 “任务栏”是Windows桌面底部一条灰色的区域,其左边是“开始”按钮,右边有一个小窗口显示时间、输入法等图标,也称为系统托盘。根据操作系统与软件安装与配置的不同,在“任务栏”上具有不同的图标,而且根据个人的需要和喜好我们也可以自定义“任务栏”内容。Windows 任务栏有自动隐藏功能:在任务栏空白处单击鼠标右键,选择“属性”,然后选中“自动隐藏任务栏”前的复选框再单击“确定”退出即可。但这个功能总让人感觉不太完美,原因是任务栏隐藏的不太好,总会在屏幕最底下留着一条线(露出一个“尾巴”),这给有些工作带来麻烦,比如你要用Print Screen 键截图的话,还要去掉那条线。网上找的一款名为TaskbarHide的免费软件,其主程序只有200多KB,最新版本为1.2b,http://home4.inet.tele.dk/mbresson/tbhide/tbhid12b.zip。 下载后得到一个只有三个文件的压缩包,直接解压缩后双击执行文件,你会发现任务栏最右侧的系统托盘处出现了T 型图标,同时你会看到任务栏已经自动隐藏了,而且隐藏得非常彻底,不留一丝的痕迹。当我们把鼠标移到屏幕底部时,任务栏会自动弹出,比原来灵敏多了! 如果你想停止自动隐藏的话,只要用鼠标单击T 型图标即可,比原来方便得多。如果你想退出TaskbarHide,直接用鼠标右键点击T 型图标,从弹出的菜单中选择“Close”命令。怎么样,有了TaskbarHide,可以让Windows 自带的任务栏隐藏功能下岗了吧! 4,对编程爱好者来说,让程序通过按一组合键就隐藏到后台运行,再按一次又到前台。 可以通过hide和show来实现。首先,我们看一个术语,系统托盘是任务栏上一个很小的区域,隐藏在那儿的程序只显示小图标,比如说你的Outlook在收取新邮件的时候。任务栏是一个贯穿屏幕的工具条(ToolBar)。程序的图标就放在那儿,要隐藏任务栏图标,你可以用Application->Handle 调用API函数 ShowWindow。 ShowWindow(Application->Handle, SW_HIDE); 你想重新显示图标,简单地改变SW_HIDE而代之以SW_SHOW. ShowWindow(Application->Handle, SW_SHOW); 注意:你可以通过设置主窗体的Visible 属性的值为false来隐藏它。 注意:用ShowWindow隐藏任务栏图标并不长久,某几个动作将使得任务栏图标重新出现。你可以移去程序的任务栏图标并让它不再出现,就是使应用程序的窗口成为工具窗口(Tool Windows)。工具窗口是不会有任务栏图标的,但是这样做有一个缺点就是程序不会在ALT+TAB中出现。把应用程序窗口编程工具窗口用的是API函数GetWindowLong和SetWindowLong WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE); dwExStyle |= WS_EX_TOOLWINDOW; SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle); try { Application->Initialize(); Application->createForm(__classid(TForm1), &Form1); Application->Run(); [...]
Posted by gleon on 2006/06/11
如何防止Edit框中的Password不被非法获取 作者:未知 文章来源:来自网络 点击数:77 更新时间:2004-12-9 Windows虽然是一个功能强大的操作系统,但其存在的一些先天性不足,给黑客留下了许多可乘之机,著名的BO程序就是利用Windows的这些漏洞来危害计算机的安全。笔者最近发现了一个很流行的专门获取Edit框Password的工具,甚至其源代码已在某报纸发表,这无疑是对Edit的Password功能的完全否定。本文将首先分析非法获取Password的原理,然后给出用Visual C++来实现保护Edit框中的Password不被非法获取的对策。 (一) 非法获取Password的原理 Edit是Windows的一个标准控件,当把其Password属性设为True时,就会将输入的内容屏蔽为星号(*),从而达到保护的目的。而Edit框中的内容可通过发WM_GETTEXT,EM_GETLINE消息来获取。黑客程序就是利用Edit的这个特性,首先枚举当前程序的所有子窗口,当发现枚举的窗口是EDIT并且具有ES_PASSWORD属性时,则通过SendMessage向此窗口发送WM_GETTEXT或EM_GETLINE消息,这样Edit框中的内容就一目了然了。 (二) 对Password进行保护 由上述分析可看出,Edit的漏洞在于没有检查发送WM_GETTEXT或EM_GETLINE消息者的身份,只要找到Edit窗口句柄,任何进程都可获取其内容。这里给出一种简单的方法来验证发送消息者的身份是否合法。 1) 创建新CEdit类 从CEdit继承一个子类CPasswordEdit, 申明全局变量g_bAuthorIdentity表明消息发送者的身份: BOOL g_bAuthorIdentity; 然后响应CWnd的虚函数DefWindowProc,在这个回调函数中进行身份验证: LRESULT CPasswordEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // 对Edit的内容获取必须通过以下两个消息之一 if(( message == WM_GETTEXT) || ( message == EM_GETLINE)) { // 检查是否为合法 if( !g_bAuthorIdentity) { // 非法获取,显示信息 AfxMessageBox(_T(“我的密码,可不能让你看哦!”)); [...]
Posted by gleon on 2006/06/11
windows进程中的内存结构 windows进程中的内存结构 基础知识:堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方式。先来看下面这段代码: #include int g1=0, g2=0, g3=0; int main() { static int s1=0, s2=0, s3=0; int v1=0, v2=0, v3=0; //打印出各个变量的内存地址 printf(“0x%08x\n”,&v1); //打印各本地变量的内存地址 printf(“0x%08x\n”,&v2); printf(“0x%08x\n\n”,&v3); printf(“0x%08x\n”,&g1); //打印各全局变量的内存地址 printf(“0x%08x\n”,&g2); printf(“0x%08x\n\n”,&g3); printf(“0x%08x\n”,&s1); //打印各静态变量的内存地址 printf(“0x%08x\n”,&s2); printf(“0x%08x\n\n”,&s3); return 0; } 编译后的执行结果是: 0x0012ff78 0x0012ff7c 0x0012ff80 0x004068d0 0x004068d4 0x004068d8 0x004068dc 0x004068e0 0x004068e4 输出的结果就是变量的内存地址。其中v1,v2,v3是本地变量,g1,g2,g3是全局变量,s1,s2,s3是静态变量。你可以看到这些变量在内存是连续分布的,但是本地变量和全局变量分配的内存地址差了十万八千里,而全局变量和静态变量分配的内存是连续的。这是因为本地变量和全局/静态变量是分配在不同类型的内存区域中的结果。对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 ├———————┤低端内存区域 │ …… [...]