<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>零度x&#039;s blog</title>
	<atom:link href="http://www.lingdux.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lingdux.com</link>
	<description>Take it slowly,it&#039;s OK,it&#039;s OK.</description>
	<lastBuildDate>Sat, 19 May 2012 06:45:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>DebugPort清零实现反调试</title>
		<link>http://www.lingdux.com/2012/269.html</link>
		<comments>http://www.lingdux.com/2012/269.html#comments</comments>
		<pubDate>Sat, 19 May 2012 03:00:22 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[DebugPort]]></category>
		<category><![CDATA[反调试]]></category>
		<category><![CDATA[清零]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=269</guid>
		<description><![CDATA[每个进程都有一个EPROCESS结构，这个结构里面有一个DebugPort成员，在处于正常运行状态时候这个值是零。当进程处于被调试状态的时候DebugPort就是一个指针，指向一个专门用于调试的内核对象。

所以当进程处于被调试状态的时候，DebugPort是指向内核的调试对象的，在这时我们强行把DebugProt清零，会导致被调试进程和调试器无法通信，从而达到反调试的效果。

下面是代码，编译加载驱动，ring3使用DeviceIoControl传递进来进程ID后就无法调试了。

<span class="readmore"><a href="http://www.lingdux.com/2012/269.html" title="DebugPort清零实现反调试">阅读全文——共2746字</a></span>]]></description>
			<content:encoded><![CDATA[<p>每个进程都有一个EPROCESS结构，这个结构里面有一个DebugPort成员，在处于正常运行状态时候这个值是零。当进程处于被调试状态的时候DebugPort就是一个指针，指向一个专门用于调试的内核对象。</p>
<p>所以当进程处于被调试状态的时候，DebugPort是指向内核的调试对象的，在这时我们强行把DebugProt清零，会导致被调试进程和调试器无法通信，从而达到反调试的效果。</p>
<p>下面是代码，编译加载驱动，ring3使用DeviceIoControl传递进来进程ID后就无法调试了。</p>
<p><span id="more-269"></span></p>
<pre class="brush: plain; title: ; notranslate">

UNICODE_STRING SymbolicLinkName;

VOID Unload(PDRIVER_OBJECT pDriverObject)
{
 NTSTATUS status;
 PDEVICE_OBJECT pDevice1;
 PDEVICE_OBJECT pDevice2;

 status = IoDeleteSymbolicLink(&amp;SymbolicLinkName);//删除符号链接
 if(STATUS_SUCCESS != status)
 {
  DbgPrint(&quot;IoDeleteSymbolicLink Error!\r\n&quot;);
 }

 pDevice1 = pDriverObject-&gt;DeviceObject;

 while(pDevice1)//删除设备链表
 {
  pDevice2 = pDevice1;
  pDevice1 = pDevice2-&gt;NextDevice;
  IoDeleteDevice(pDevice2);
 }

 DbgPrint(&quot;Unloaded!\r\n&quot;);
}

NTSTATUS MyFunction(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
 PIO_STACK_LOCATION pIoStackLocation;
 HANDLE hProcess;
 OBJECT_ATTRIBUTES ObjectAttributes;
 CLIENT_ID ClientDId;
 ULONG ulProcessId;
 NTSTATUS status;
 PEPROCESS Eprocess;
 pIoStackLocation = IoGetCurrentIrpStackLocation(pIrp);//获取irp的IO堆栈

 pIrp-&gt;IoStatus.Status = STATUS_SUCCESS;
 pIrp-&gt;IoStatus.Information = 0;

 if(IRP_MJ_CREATE == pIoStackLocation-&gt;MajorFunction)
  DbgPrint(&quot;create!\r\n&quot;);
 else if(IRP_MJ_CLOSE == pIoStackLocation-&gt;MajorFunction)
  DbgPrint(&quot;close!\r\n&quot;);
 else if(IRP_MJ_DEVICE_CONTROL == pIoStackLocation-&gt;MajorFunction)//ring3进程向驱动专递进程id
 {
  ulProcessId = *(ULONG *)pIrp-&gt;AssociatedIrp.SystemBuffer;
  DbgPrint(&quot;%d\r\n&quot;, ulProcessId);
  InitializeObjectAttributes(&amp;ObjectAttributes, 0, 0, 0, 0);
  ClientDId.UniqueProcess = ulProcessId;
  ClientDId.UniqueThread = 0;

  status = ZwOpenProcess(&amp;hProcess, PROCESS_ALL_ACCESS, &amp;ObjectAttributes, &amp;ClientDId);//通过进程id获取进程句柄
  if(NT_SUCCESS(status))
  {
   status = ObReferenceObjectByHandle(hProcess, FILE_READ_DATA, 0, KernelMode, &amp;Eprocess, 0);//通过句柄获取EPROCESS结构
   if(NT_SUCCESS(status))
   {
    *(PULONG)((ULONG)Eprocess + 0x0bc) = 0;//EPROCESS结构偏移0x0bc就是DebugPort成员
    DbgPrint(&quot;OK!\r\n&quot;);
   }
  }
 }

 IoCompleteRequest(pIrp, IO_NO_INCREMENT);
 return pIrp-&gt;IoStatus.Status;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
 UNICODE_STRING DeviceName;
 DEVICE_OBJECT MyDevice;
 NTSTATUS status;

 pDriverObject-&gt;DriverUnload = Unload;

 RtlInitUnicodeString(&amp;DeviceName, L&quot;\\Device\\MyDevice&quot;);
 RtlInitUnicodeString(&amp;SymbolicLinkName, L&quot;\\??\\MySymbolicLink&quot;);

 pDriverObject-&gt;MajorFunction[IRP_MJ_CREATE] = MyFunction;
 pDriverObject-&gt;MajorFunction[IRP_MJ_CLOSE] = MyFunction;
 pDriverObject-&gt;MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyFunction;//设置派遣函数

 status = IoCreateDevice(pDriverObject, 0, &amp;DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &amp;MyDevice);//创建设备
 if(STATUS_SUCCESS != status)
 {
  DbgPrint(&quot;IoCreateDevicve Error!\r\n&quot;);
 }

 status = IoCreateSymbolicLink(&amp;SymbolicLinkName, &amp;DeviceName);//绑定符号链接
 if(STATUS_SUCCESS != status)
 {
  DbgPrint(&quot;IoCreateSymbolicLink Error!\r\n&quot;);
 }

 return STATUS_SUCCESS;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2012/269.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SSDT HOOK ZwOpenProcess(续)</title>
		<link>http://www.lingdux.com/2012/266.html</link>
		<comments>http://www.lingdux.com/2012/266.html#comments</comments>
		<pubDate>Tue, 15 May 2012 14:29:39 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[HOOK]]></category>
		<category><![CDATA[SSDT]]></category>
		<category><![CDATA[ZwOpenProcess]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=266</guid>
		<description><![CDATA[昨天写的改写ssdt中ZwOpenProcess地址实现了HOOK ZwOpenProcess（见连接：http://www.lingdux.com/2012/261.html）禁止了任何进程对记事本进程OpenProcess，不能得到记事本进程的句柄。这样实现了我想要的目的（其实没什么目的，就是练手），但是同业也带来了副作用，系统进程也无法获取记事本进程的句柄了，导致记事本没有XP主题的样式，任务管理器中也看不到创建记事本进程的用户名了。

由于本人喜欢完美，这样子实在是不好看，今天就看了一下记事本程序创建进程时候那些系统进程会跳用OpenProcess获取自己的进程句柄。用之前写的ssdt hook把拒绝访问的进程输出到DbgView，发现一共才两个进程，只有explorer.exe和svchost.exe。试了一下发现是允许svchost进程调用主题就没问题了，任务管理器中记事本进程的用户名也可以正常显示了。

<span class="readmore"><a href="http://www.lingdux.com/2012/266.html" title="SSDT HOOK ZwOpenProcess(续)">阅读全文——共1531字</a></span>]]></description>
			<content:encoded><![CDATA[<p>昨天写的改写ssdt中ZwOpenProcess地址实现了HOOK ZwOpenProcess（见连接：<a href="http://www.lingdux.com/2012/261.html">http://www.lingdux.com/2012/261.html</a>）禁止了任何进程对记事本进程OpenProcess，不能得到记事本进程的句柄。这样实现了我想要的目的（其实没什么目的，就是练手），但是同业也带来了副作用，系统进程也无法获取记事本进程的句柄了，导致记事本没有XP主题的样式，任务管理器中也看不到创建记事本进程的用户名了。</p>
<p>由于本人喜欢完美，这样子实在是不好看，今天就看了一下记事本程序创建进程时候那些系统进程会跳用OpenProcess获取自己的进程句柄。用之前写的ssdt hook把拒绝访问的进程输出到DbgView，发现一共才两个进程，只有explorer.exe和svchost.exe。试了一下发现是允许svchost进程调用主题就没问题了，任务管理器中记事本进程的用户名也可以正常显示了。</p>
<p>代码就很简单了，PsGetCurrentProcess获取进程结构EPROCESS的指针，然后从该结构中读取进程名，如果是svchost就放行。修改后的MyNtOpenProcess代码如下：</p>
<p><span id="more-266"></span></p>
<pre class="brush: plain; title: ; notranslate">
NTSTATUS MyNtOpenProcess(PHANDLE pProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES pObjectAttributes, PCLIENT_ID pClientId)
{
	NTSTATUS status;
	PEPROCESS Eprocess;
	UCHAR *pProcessName;

	PEPROCESS SourEprocess;
	UCHAR *pSourProcessName;

	status = pRealZwOpenProcess(pProcessHandle, DesiredAccess, pObjectAttributes, pClientId);//获取进程句柄
	if(status == STATUS_SUCCESS)
	{
		status = ObReferenceObjectByHandle(*pProcessHandle, FILE_READ_DATA, 0, KernelMode, &amp;Eprocess, 0);//通过句柄获取PEPROCESS
		if(status == STATUS_SUCCESS)
		{
			pProcessName = PsGetProcessImageFileName(Eprocess);//从PEPROCESS中读出进程名
			if(strcmp(pProcessName, &quot;notepad.exe&quot;) == 0)
			{
				SourEprocess = PsGetCurrentProcess();//获取EPROCESS结构
				pSourProcessName = PsGetProcessImageFileName(SourEprocess);//从结构中获得进程名
				if(strcmp(pSourProcessName, &quot;svchost.exe&quot;) != 0)//判断下，不是svchost调用的才返回失败
				{
					return STATUS_ACCESS_DENIED;
				}
			}

		}
		else
			DbgPrint(&quot;ObReferenceObjectByHandle Failed!\r\n&quot;);
	}
	else
		DbgPrint(&quot;pRealZwOpenProcess Failed!\r\n&quot;);

	status = pRealZwOpenProcess(pProcessHandle, DesiredAccess, pObjectAttributes, pClientId);
	return status;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2012/266.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SSDT HOOK ZwOpenProcess</title>
		<link>http://www.lingdux.com/2012/261.html</link>
		<comments>http://www.lingdux.com/2012/261.html#comments</comments>
		<pubDate>Mon, 14 May 2012 14:12:46 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[HOOK]]></category>
		<category><![CDATA[SSDT]]></category>
		<category><![CDATA[ZwOpenProcess]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=261</guid>
		<description><![CDATA[博客好久没更新了，今天好好整理一下博客，然后重新记录学习的过程。

最近突然发现工作了以后每天和混日子一样，技术上面没有进步了。这种感觉实在是让人难以忍受，还是静下心来好好学点东西吧。

入正题，最近看了SSDT HOOK，发现没有预想那么复杂，直接替换了SSDT表的函数地址就完成了，灰常简单。

<span class="readmore"><a href="http://www.lingdux.com/2012/261.html" title="SSDT HOOK ZwOpenProcess">阅读全文——共2331字</a></span>]]></description>
			<content:encoded><![CDATA[<p>博客好久没更新了，今天好好整理一下博客，然后重新记录学习的过程。<br />
最近突然发现工作了以后每天和混日子一样，技术上面没有进步了。这种感觉实在是让人难以忍受，还是静下心来好好学点东西吧。</p>
<p>入正题，最近看了SSDT HOOK，发现没有预想那么复杂，直接替换了SSDT表的函数地址就完成了，灰常简单。<br />
这次hook了ZwOpenProcess，为啥hook它？我也不知道，练手随便写的。ring3结束进程，读写内存，注入都需要先获取进程句柄的，hook了这个应该就都不行了吧。<br />
SSDT的原理就不说了，百度一下好几篇，都是很易懂的，下面上代码</p>
<p><span id="more-261"></span></p>
<pre class="brush: plain; title: ; notranslate">
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
   PVOID    ServiceTableBase;
   PULONG   ServiceCounterTableBase;
   ULONG    NumberOfService;
   ULONG    ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;

extern PSERVICE_DESCRIPTOR_TABLE     KeServiceDescriptorTable;

typedef NTSTATUS (_stdcall* PRealZwOpenProcess)(
  __out     PHANDLE ProcessHandle,
  __in      ACCESS_MASK DesiredAccess,
  __in      POBJECT_ATTRIBUTES ObjectAttributes,
  __in_opt  PCLIENT_ID ClientId
);

ULONG AddressOfNtOpenProcess = 0;
ULONG OldAddress = 0;
PRealZwOpenProcess pRealZwOpenProcess = NULL;

UCHAR *PsGetProcessImageFileName(PEPROCESS EProcess);

//这个函数判断了ZwOpenProcess的目标是不是notepad，如果是的话就返回拒绝访问
NTSTATUS MyNtOpenProcess(PHANDLE pProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES pObjectAttributes, PCLIENT_ID pClientId)
{
	NTSTATUS status;
	PEPROCESS Eprocess;
	UCHAR *pProcessName;

	status = pRealZwOpenProcess(pProcessHandle, DesiredAccess, pObjectAttributes, pClientId);//获取进程句柄
	if(status == STATUS_SUCCESS)
	{
		status = ObReferenceObjectByHandle(*pProcessHandle, FILE_READ_DATA, 0, KernelMode, &amp;Eprocess, 0);//通过句柄获取PEPROCESS
		if(status == STATUS_SUCCESS)
		{
			pProcessName = PsGetProcessImageFileName(Eprocess);//从PEPROCESS中读出进程名
			if(strcmp(pProcessName, &quot;notepad.exe&quot;) == 0)
				return STATUS_ACCESS_DENIED;//

		}
		else
			DbgPrint(&quot;ObReferenceObjectByHandle Failed!\r\n&quot;);
	}
	else
		DbgPrint(&quot;pRealZwOpenProcess Failed!\r\n&quot;);

	status = pRealZwOpenProcess(pProcessHandle, DesiredAccess, pObjectAttributes, pClientId);
	return status;
}

VOID UnHook()
{
	*(ULONG *)AddressOfNtOpenProcess = OldAddress;//卸载时候把真是的地址写回去就好了
}

VOID Unload(PDRIVER_OBJECT DriverObject)
{
	UnHook();
}

VOID Hook()
{

	AddressOfNtOpenProcess = 0x7a * 4 + (ULONG)KeServiceDescriptorTable-&gt;ServiceTableBase;//7a是ZwOpenProcess的服务号，ring3分析OpenPorcess得到
	OldAddress = *(ULONG *)AddressOfNtOpenProcess;//保存SSDT中ZwOpenProcess函数地址，恢复的时候用

	pRealZwOpenProcess = NtOpenProcess;//取到真实的ZwOpenProcess给我们自己调用

	*(ULONG *)AddressOfNtOpenProcess = (ULONG)MyNtOpenProcess;//把SSDT中ZwOpenProcess函数的地址替换成MyOpenProcess

}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{

	pDriverObject-&gt;DriverUnload=Unload;

	Hook();

	return STATUS_SUCCESS;
}
</pre>
<p>最后上两张效果图<br />
Hook ZwOpenProcess之后主题XP都没有了，莫非是进程注入？</p>
<p><img title="ssdthook1" src="http://www.lingdux.com/wp-content/uploads/2012/05/ssdthook1.jpg" alt="" width="816" height="748" /></p>
<pre><a href="http://www.lingdux.com/wp-content/uploads/2012/05/ssdthook2.jpg"><img class="aligncenter size-full wp-image-264" title="ssdthook2" src="http://www.lingdux.com/wp-content/uploads/2012/05/ssdthook2.jpg" alt="" width="775" height="502" /></a></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2012/261.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>获取进程数</title>
		<link>http://www.lingdux.com/2011/256.html</link>
		<comments>http://www.lingdux.com/2011/256.html#comments</comments>
		<pubDate>Wed, 09 Mar 2011 14:16:17 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[VC学习]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[获取]]></category>
		<category><![CDATA[进程数]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=256</guid>
		<description><![CDATA[DWORD dwProcs[1024*2];

	DWORD dwNeeded;

	EnumProcesses( dwProcs, sizeof(dwProcs), &#038;dwNeeded );

<span class="readmore"><a href="http://www.lingdux.com/2011/256.html" title="获取进程数">阅读全文——共124字</a></span>]]></description>
			<content:encoded><![CDATA[<p>	DWORD dwProcs[1024*2];<br />
	DWORD dwNeeded;<br />
	EnumProcesses( dwProcs, sizeof(dwProcs), &#038;dwNeeded );<br />
	DWORD dwProcCount = dwNeeded / sizeof(DWORD);<br />
<span id="more-256"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2011/256.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>很久没更新了。。。</title>
		<link>http://www.lingdux.com/2011/253.html</link>
		<comments>http://www.lingdux.com/2011/253.html#comments</comments>
		<pubDate>Tue, 22 Feb 2011 06:53:11 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[生活随笔]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=253</guid>
		<description><![CDATA[很久没更新了，最近太忙，项目终于大体成型了，也搞定了360主攻防御，哇哈哈~

]]></description>
			<content:encoded><![CDATA[<p>很久没更新了，最近太忙，项目终于大体成型了，也搞定了360主攻防御，哇哈哈~<br />
<span id="more-253"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2011/253.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VC监控打印机</title>
		<link>http://www.lingdux.com/2011/250.html</link>
		<comments>http://www.lingdux.com/2011/250.html#comments</comments>
		<pubDate>Sun, 02 Jan 2011 01:09:55 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[VC学习]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[打印机]]></category>
		<category><![CDATA[监控]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=250</guid>
		<description><![CDATA[char temp[50];

	HANDLE hPrinter = NULL;

	DWORD dwNeeded = 0;

<span class="readmore"><a href="http://www.lingdux.com/2011/250.html" title="VC监控打印机">阅读全文——共1008字</a></span>]]></description>
			<content:encoded><![CDATA[<p>	char temp[50];<br />
	HANDLE hPrinter = NULL;<br />
	DWORD dwNeeded = 0;<br />
	DWORD dwReturned = 0;<br />
	JOB_INFO_1 *pJobInfo = NULL;<br />
	int n = 0;<br />
	int ret = OpenPrinter(“\\\\192.168.10.13\\Canon MX310 series Printer”, &#038;hPrinter, NULL);<br />
	if(ret == 0)<br />
	{<br />
		p->MessageBox(“打开打印机失败！”);<br />
		return 0;<br />
	}<br />
<span id="more-250"></span><br />
	while(p->IsListening)<br />
	{<br />
		EnumJobs(hPrinter,0,0xFFFFFFFF,1,NULL,0,&#038;dwNeeded,&#038;dwReturned);<br />
		if((pJobInfo = (JOB_INFO_1*)malloc(dwNeeded)) == NULL)<br />
		{<br />
			p->MessageBox(“分配空间失败！”);<br />
			ClosePrinter(hPrinter);<br />
			return 0;<br />
		}<br />
		if(!EnumJobs(hPrinter,0,0xFFFFFFFF,1,(LPBYTE)pJobInfo,dwNeeded,&#038;dwNeeded,&#038;dwReturned))<br />
		{<br />
			p->MessageBox(“枚举失败！”);<br />
			ClosePrinter(hPrinter);<br />
			free(pJobInfo);<br />
			return 0;<br />
		}</p>
<p>		if(p->id != pJobInfo->JobId)<br />
		{<br />
			n = p->m_list.GetItemCount();<br />
			p->m_list.InsertItem(n, pJobInfo->pDocument);<br />
			p->m_list.SetItemText(n, 1, pJobInfo->pDatatype);<br />
			p->m_list.SetItemText(n, 2, pJobInfo->pMachineName);<br />
			p->m_list.SetItemText(n, 3, pJobInfo->pUserName);<br />
			p->m_list.SetItemText(n, 4, pJobInfo->pPrinterName);<br />
			memset(temp, 0, sizeof(temp));<br />
			itoa(pJobInfo->JobId, temp, 10);<br />
			p->m_list.SetItemText(n, 5, temp);<br />
			p->id = pJobInfo->JobId;<br />
		}<br />
		free(pJobInfo);<br />
		Sleep(1000);<br />
	}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2011/250.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WNET获取共享信息</title>
		<link>http://www.lingdux.com/2011/247.html</link>
		<comments>http://www.lingdux.com/2011/247.html#comments</comments>
		<pubDate>Sat, 01 Jan 2011 05:04:02 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[VC学习]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[WNET]]></category>
		<category><![CDATA[共享]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=247</guid>
		<description><![CDATA[char RemoteName[] = “\\\\192.168.105.9&#8243;;

	DWORD ret;

	NETRESOURCE nr;

<span class="readmore"><a href="http://www.lingdux.com/2011/247.html" title="WNET获取共享信息">阅读全文——共822字</a></span>]]></description>
			<content:encoded><![CDATA[<p>	char RemoteName[] = “\\\\192.168.105.9&#8243;;<br />
	DWORD ret;<br />
	NETRESOURCE nr;<br />
	memset(&#038;nr, 0, sizeof(nr));<br />
	nr.dwScope = RESOURCE_CONNECTED;<br />
	nr.dwType = RESOURCETYPE_ANY;<br />
	nr.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC;<br />
	nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;<br />
	nr.lpRemoteName = RemoteName;<br />
	ret = WNetAddConnection2(&#038;nr, NULL, NULL, CONNECT_UPDATE_PROFILE);<br />
<span id="more-247"></span><br />
	if(ret != NO_ERROR)<br />
	{<br />
		MessageBox(“失败！”);<br />
		return;<br />
	}<br />
	HANDLE hEnum;<br />
	ret = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, &#038;nr, &#038;hEnum);<br />
	if(ret != NO_ERROR)<br />
	{<br />
		MessageBox(“失败！”);<br />
		return;<br />
	}</p>
<p>	DWORD dwResultEnum;<br />
	BYTE buf[16384];<br />
	DWORD cbBuffer = 16384;     // 16K is a good size<br />
	LPNETRESOURCE lpnrLocal = (LPNETRESOURCE)buf;<br />
	DWORD cEntries = -1;  </p>
<p>	do<br />
	{<br />
		cbBuffer = 16384;<br />
		memset(lpnrLocal, 0, 16384);<br />
		dwResultEnum = WNetEnumResource(hEnum,  // resource handle<br />
			&#038;cEntries,      // defined locally as -1<br />
			lpnrLocal,      // LPNETRESOURCE<br />
			&#038;cbBuffer);     // buffer size<br />
		if (dwResultEnum == NO_ERROR)<br />
		{<br />
			for (DWORD i=0; i<cEntries; i++)<br />
			{<br />
				//CString str_remote = lpnrLocal[i].lpRemoteName;//得到共享名称<br />
				if(lpnrLocal[i].dwType == RESOURCETYPE_PRINT)<br />
					MessageBox(lpnrLocal[i].lpRemoteName);<br />
			}<br />
		}<br />
		else if (dwResultEnum != ERROR_NO_MORE_ITEMS)<br />
		{<br />
			break;<br />
		}<br />
	}<br />
	while (dwResultEnum != ERROR_NO_MORE_ITEMS);<br />
	WNetCloseEnum(hEnum);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2011/247.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VC socket 实现post提交~</title>
		<link>http://www.lingdux.com/2010/244.html</link>
		<comments>http://www.lingdux.com/2010/244.html#comments</comments>
		<pubDate>Thu, 02 Dec 2010 04:02:39 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[VC学习]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[提交]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=244</guid>
		<description><![CDATA[DWORD WINAPI Start(LPVOID lParam)

{

	CPostDlg *p = (CPostDlg *)lParam;

<span class="readmore"><a href="http://www.lingdux.com/2010/244.html" title="VC socket 实现post提交~">阅读全文——共1003字</a></span>]]></description>
			<content:encoded><![CDATA[<p>DWORD WINAPI Start(LPVOID lParam)<br />
{<br />
	CPostDlg *p = (CPostDlg *)lParam;<br />
	SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);<br />
	if(sock == SOCKET_ERROR)<br />
	{<br />
		p->MessageBox(“创建套接字失败~”);<br />
		return 0;<br />
	}<br />
	SOCKADDR_IN addr;<br />
	addr.sin_family = AF_INET;<br />
	addr.sin_port = htons(80);<br />
	char url[20] = “192.168.10.104&#8243;;<br />
<span id="more-244"></span><br />
	addr.sin_addr.S_un.S_addr = inet_addr(“192.168.10.104&#8243;);<br />
	int ret =connect(sock, (SOCKADDR *)&#038;addr, sizeof(SOCKADDR_IN));<br />
	if(ret == SOCKET_ERROR)<br />
	{<br />
		p->MessageBox(“连接失败~”);<br />
		return 0;<br />
	}<br />
	char buffer[4096];<br />
	char pwd[] = “fuckhacker”;<br />
	int len = strlen(pwd) + 21;<br />
	sprintf(buffer, “POST /webshell1.php HTTP/1.1\r\n”<br />
					“Content-Type: application/x-www-form-urlencoded\r\n”<br />
					“Host: 192.168.10.104\r\n”<br />
					“Content-Length: %d\r\n”<br />
					“\r\n”<br />
					“password=%s&#038;doing=login”,<br />
					len,<br />
					pwd);<br />
	ret = send(sock, buffer, sizeof(buffer), 0);<br />
	if(ret == SOCKET_ERROR)<br />
	{<br />
		p->MessageBox(“发送失败~”);<br />
		return 0;<br />
	}<br />
	memset(buffer, 0, sizeof(buffer));<br />
	ret = recv(sock, buffer, sizeof(buffer), 0);<br />
	if(ret == SOCKET_ERROR)<br />
	{<br />
		p->MessageBox(“接受失败~”);<br />
		return 0;<br />
	}<br />
	CString buf(buffer);<br />
	if(buf.Find(“Success”, 0) != -1)<br />
		p->MessageBox(“密码正确~”);<br />
	else<br />
		p->MessageBox(“密码错误~”);<br />
	return 0;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2010/244.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用匿名管道实现CMD回显</title>
		<link>http://www.lingdux.com/2010/240.html</link>
		<comments>http://www.lingdux.com/2010/240.html#comments</comments>
		<pubDate>Tue, 16 Nov 2010 08:55:31 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[VC学习]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[匿名管道]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=240</guid>
		<description><![CDATA[DWORD WINAPI MyThread(LPVOID lParam)

{

	CTestDlg *p = (CTestDlg *)lParam;

<span class="readmore"><a href="http://www.lingdux.com/2010/240.html" title="使用匿名管道实现CMD回显">阅读全文——共1004字</a></span>]]></description>
			<content:encoded><![CDATA[<p>DWORD WINAPI MyThread(LPVOID lParam)<br />
{<br />
	CTestDlg *p = (CTestDlg *)lParam;</p>
<p>	char path[1024];<br />
	char cmdline[1024];<br />
	char buffer[1024];<br />
	memset(buffer, 0, sizeof(buffer));<br />
	memset(cmdline, 0, sizeof(cmdline));<br />
	memset(path, 0, sizeof(path));<br />
	::GetSystemDirectory(path, sizeof(path));<br />
<span id="more-240"></span><br />
	strcpy(cmdline, “ping.exe”);<br />
	strcat(cmdline, ” 127.0.0.1&#8243;);</p>
<p>	HANDLE hwrite,hread;<br />
	SECURITY_ATTRIBUTES sa;<br />
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);<br />
	sa.lpSecurityDescriptor = NULL;<br />
	sa.bInheritHandle = TRUE;<br />
	if(!::CreatePipe(&#038;hread, &#038;hwrite, &#038;sa,0))<br />
	{<br />
		p->MessageBox(“创建管道出错！”);<br />
		return 0;<br />
	}</p>
<p>	STARTUPINFO si;<br />
	memset(&#038;si, 0, sizeof(si));<br />
	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;<br />
	si.hStdOutput = hwrite;<br />
	si.hStdError = hwrite;<br />
	si.wShowWindow = SW_HIDE;<br />
	PROCESS_INFORMATION pi;<br />
	memset(&#038;pi, 0, sizeof(pi));</p>
<p>	if(!::CreateProcess( NULL, cmdline, NULL, NULL, TRUE, 0, NULL, path, &#038;si, &#038;pi))<br />
	{<br />
		p->MessageBox(“打开进程出错！”);<br />
		return 0;<br />
	}<br />
	::CloseHandle(hwrite);</p>
<p>	DWORD byte = 0;</p>
<p>	p->m_out = “”;<br />
	while(TRUE)<br />
	{<br />
		if(!ReadFile(hread, buffer, sizeof(buffer), &#038;byte, NULL))<br />
			break;<br />
		if(byte > 0)<br />
		{<br />
			p->m_out += buffer;<br />
		}<br />
		Sleep(1000);<br />
	}<br />
	p->UpdateData(FALSE);<br />
	return 0;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2010/240.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用ado中的Stream对象向数据库上传图片</title>
		<link>http://www.lingdux.com/2010/236.html</link>
		<comments>http://www.lingdux.com/2010/236.html#comments</comments>
		<pubDate>Tue, 26 Oct 2010 08:15:31 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[VC学习]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=236</guid>
		<description><![CDATA[try

	{

		CoInitialize(NULL);

<span class="readmore"><a href="http://www.lingdux.com/2010/236.html" title="使用ado中的Stream对象向数据库上传图片">阅读全文——共1141字</a></span>]]></description>
			<content:encoded><![CDATA[<p>	try<br />
	{<br />
		CoInitialize(NULL);<br />
		_ConnectionPtr	pConnection(__uuidof(Connection));<br />
		_RecordsetPtr	pRecordset(__uuidof(Recordset));</p>
<p>		pConnection->ConnectionString = “Provider=SQLOLEDB.1;Persist Security Info=False;User ID = sa;Initial Catalog = CodeTest;Data Source = 164.70.6.219&#8243;;<br />
		pConnection->Open(pConnection->ConnectionString, “”, “”, -1);//连接数据库</p>
<p>		pRecordset->Open(“SELECT * FROM ma_q_test”,_variant_t((IDispatch*)pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);<br />
		//打开记录集</p>
<p><span id="more-236"></span><br />
		_StreamPtr pStream(__uuidof(Stream));<br />
		_variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);<br />
		pStream->PutType(adTypeBinary);//设置类型为二进制<br />
		pStream->Open(varOptional, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());//生成二进制流<br />
		pStream->LoadFromFile(_bstr_t(“D:\\1.jpg”));//读取文件<br />
		_variant_t varBLOB = pStream->Read(adReadAll);//读取到varBLOB</p>
<p>		pRecordset->AddNew();//曾加一条记录<br />
		pRecordset->GetFields()->GetItem(“image”)->Value = varBLOB;//保存数据对象<br />
		pRecordset->PutCollect(“id”, “1&#8243;);//设置id<br />
		pRecordset->Update();//更新~</p>
<p>		pStream->Close();<br />
		pStream.Release();<br />
		pRecordset->Close();<br />
		pRecordset.Release();<br />
		if(pConnection->State)<br />
			pConnection->Close();<br />
		pConnection.Release();<br />
		CoUninitialize();<br />
	}<br />
	catch(_com_error e)<br />
	{<br />
		MessageBox(e.ErrorMessage());<br />
	}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2010/236.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

