﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-xingkongyun-文章分类-Windows编程</title><link>http://www.cppblog.com/xingkongyun/category/7360.html</link><description>星空陨的程序小站</description><language>zh-cn</language><lastBuildDate>Sat, 14 Jun 2008 02:37:21 GMT</lastBuildDate><pubDate>Sat, 14 Jun 2008 02:37:21 GMT</pubDate><ttl>60</ttl><item><title>关于全局原子的相关函数</title><link>http://www.cppblog.com/xingkongyun/articles/53206.html</link><dc:creator>杨彬彬</dc:creator><author>杨彬彬</author><pubDate>Sat, 14 Jun 2008 01:45:00 GMT</pubDate><guid>http://www.cppblog.com/xingkongyun/articles/53206.html</guid><wfw:comment>http://www.cppblog.com/xingkongyun/comments/53206.html</wfw:comment><comments>http://www.cppblog.com/xingkongyun/articles/53206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xingkongyun/comments/commentRss/53206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xingkongyun/services/trackbacks/53206.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">在使用registerHotKey等函数时经常要得到一个唯一标识，这是就需要GlobalAddAtom这个函数得到一个<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>全局唯一标识，相关函数如下：<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ATOM&nbsp;GlobalFindAtom(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;lpString);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>作用：在全局原子列表中查找是否存在指定字符串。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>lpString为要查找的字符串名。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>函数返回值：<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>如果在全局原子中存在要查找的字符串，则返回此字符串对应的ID值。没有找到则返回0。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">**********************************************************************</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ATOM&nbsp;GlobalAddAtom(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;lpString);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>作用：增加一个字符串到全局原子列表中，并返回一个唯一标识值。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>lpString为要添加到全局原子表中的字符串。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>函数返回值：<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>如果成功返回一个新增加的全局原子。失败返回0。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">***********************************************************************</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ATOM&nbsp;GlobalDeleteAtom(&nbsp;ATOM&nbsp;nAtom);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>作用：进少对指定全局原子的引用数量，如果引用数量为零，则会在全局原子列表中删除此原子。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>此函数一直返回0；<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*******************************************************************************</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>UINT&nbsp;GlobalGetAtomName(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATOM&nbsp;nAtom,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpBuffer,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nSize<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>作用：返回指定原子所对应的字符串。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>参数；nAtom指定查找的原子<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>lpBuffer存放字符串的缓冲区；<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>nSize缓冲区大小；<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>返回值；成功返回缓冲区接受长度。失败返回0.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/xingkongyun/aggbug/53206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xingkongyun/" target="_blank">杨彬彬</a> 2008-06-14 09:45 <a href="http://www.cppblog.com/xingkongyun/articles/53206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>卸载远程线程中的DLL</title><link>http://www.cppblog.com/xingkongyun/articles/53205.html</link><dc:creator>杨彬彬</dc:creator><author>杨彬彬</author><pubDate>Sat, 14 Jun 2008 01:44:00 GMT</pubDate><guid>http://www.cppblog.com/xingkongyun/articles/53205.html</guid><wfw:comment>http://www.cppblog.com/xingkongyun/comments/53205.html</wfw:comment><comments>http://www.cppblog.com/xingkongyun/articles/53205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xingkongyun/comments/commentRss/53205.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xingkongyun/services/trackbacks/53205.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">如何卸载其他进程中的DLL。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>要卸载其他进程中的DLL一般都要首先提升本进程的权限。相关的操作也很简单，我已经将其封装为一个函数<br><img id=Codehighlighter1_65_135_Open_Image onclick="this.style.display='none'; Codehighlighter1_65_135_Open_Text.style.display='none'; Codehighlighter1_65_135_Closed_Image.style.display='inline'; Codehighlighter1_65_135_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_65_135_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_135_Closed_Text.style.display='none'; Codehighlighter1_65_135_Open_Image.style.display='inline'; Codehighlighter1_65_135_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_65_135_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_65_135_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">******************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>BOOL&nbsp;BDebugProcess2(HANDLE&nbsp;hProcess,&nbsp;LPCTSTR&nbsp;PrivilegeName)<br><img id=Codehighlighter1_197_770_Open_Image onclick="this.style.display='none'; Codehighlighter1_197_770_Open_Text.style.display='none'; Codehighlighter1_197_770_Closed_Image.style.display='inline'; Codehighlighter1_197_770_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_197_770_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_197_770_Closed_Text.style.display='none'; Codehighlighter1_197_770_Open_Image.style.display='inline'; Codehighlighter1_197_770_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_197_770_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_197_770_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>HANDLE&nbsp;hToken;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;TOKEN_PRIVILEGES&nbsp;tkp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">OpenProcessToken(hProcess,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TOKEN_ADJUST_PRIVILEGES&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;TOKEN_QUERY,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">hToken))&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(&nbsp;FALSE&nbsp;);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;LookupPrivilegeValue(NULL,PrivilegeName,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tkp.Privileges[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].Luid);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;tkp.PrivilegeCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;one&nbsp;privilege&nbsp;to&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;tkp.Privileges[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].Attributes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;SE_PRIVILEGE_ENABLED;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;AdjustTokenPrivileges(hToken,&nbsp;FALSE,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tkp,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PTOKEN_PRIVILEGES)NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GetLastError()</span><span style="COLOR: #000000">=!</span><span style="COLOR: #000000">ERROR_SUCCESS)<br><img id=Codehighlighter1_693_754_Open_Image onclick="this.style.display='none'; Codehighlighter1_693_754_Open_Text.style.display='none'; Codehighlighter1_693_754_Closed_Image.style.display='inline'; Codehighlighter1_693_754_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_693_754_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_693_754_Closed_Text.style.display='none'; Codehighlighter1_693_754_Open_Image.style.display='inline'; Codehighlighter1_693_754_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_693_754_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_693_754_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>::MessageBox(NULL,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">所申请的权限全部成功</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">成功</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,MB_OK);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">参数说明：hProcess为你想要提升权限的进程句柄，如果要提升本进程的权限只要传递GetCurrentProcess()函数即可。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrivilegeName为你想要申请的权限，一般传递SE_DEBUG_NAME参数，说明你要对其他进程的内存空间进行操作。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>再提升了自己的进程权限之后就要开始我们的主要操作了，操作分这麽几步：<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.首先要通过调用&nbsp;OpenProcess函数获得宿主进程的句柄，注意给这个函数传递的第一个参数要包括PROCESS_CREATE_THREAD，PROCESS_VM_OPERATION，PROCESS_VM_WRITE<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>。在这说明一下，因为我们要在其他进程进程中创建线程即所谓的远程线程，所以我们要申请PROCESS_CREATE_THREAD权限。再就是我们要对远程进程的地址空间进行操作<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>所以我们要申请PROCESS_VM_OPERATION权限，PROCESS_VM_WRITE申请对进程的地址空间的写操作权限。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.我们要将DLL的路径名写到远程线程的地址空间中去。首先要先计算一下DLL路径名的长路，以确定我们再地址空间中申请多大的空间，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>这步操作用strlen，lstrlen等函数都行。知道了DLL路径名长度以后我们就开始申请空间，调用函数VirtualAllocEx提交一块指定大小的空间<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>，然后调用WriteProcessMemory函数将DLL名写进刚才提交的空间中。以上操作完成以后再远程线程的地址空间中就存在了DLL名。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.正式开始创建远程线程卸载DLL。卸载DLL可以调用FreeLibraryAndExitThread或FreeLibrary函数，这两个函数都需要一个参数就是DLL模块的<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>句柄。而要得到DLL模块而句柄就需要调用GetModuleHandle函数，所以首先要确定GetModuleHandle的函数指针，然后再远程进程中创建一个远程线程<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>进行GetModuleHandle的调用得到DLL的句柄。之后我们就可以再次创建一个远程线程调用FreeLibraryAndExitThread或FreeLibrary将DLL卸载掉<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>，这样我们就完工了。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>完整的操作代码如下（注：自己实在不想写，偷懒再网上找的，看完绝的还不错）<br><img id=Codehighlighter1_1735_1814_Open_Image onclick="this.style.display='none'; Codehighlighter1_1735_1814_Open_Text.style.display='none'; Codehighlighter1_1735_1814_Closed_Image.style.display='inline'; Codehighlighter1_1735_1814_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1735_1814_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1735_1814_Closed_Text.style.display='none'; Codehighlighter1_1735_1814_Open_Image.style.display='inline'; Codehighlighter1_1735_1814_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1735_1814_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_1735_1814_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">***************************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>BOOL&nbsp;UnloadDll(DWORD&nbsp;dwPid,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strDllName)<br><img id=Codehighlighter1_1862_3825_Open_Image onclick="this.style.display='none'; Codehighlighter1_1862_3825_Open_Text.style.display='none'; Codehighlighter1_1862_3825_Closed_Image.style.display='inline'; Codehighlighter1_1862_3825_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1862_3825_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1862_3825_Closed_Text.style.display='none'; Codehighlighter1_1862_3825_Open_Image.style.display='inline'; Codehighlighter1_1862_3825_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1862_3825_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1862_3825_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取宿主进程的句柄，注意那几个参数，不然会出错</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">HANDLE&nbsp;hProcess&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;OpenProcess(PROCESS_CREATE_THREAD</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">PROCESS_VM_OPERATION</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">PROCESS_VM_WRITE,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE,&nbsp;dwPid);<br><img id=Codehighlighter1_2028_2112_Open_Image onclick="this.style.display='none'; Codehighlighter1_2028_2112_Open_Text.style.display='none'; Codehighlighter1_2028_2112_Closed_Image.style.display='inline'; Codehighlighter1_2028_2112_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2028_2112_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2028_2112_Closed_Text.style.display='none'; Codehighlighter1_2028_2112_Open_Image.style.display='inline'; Codehighlighter1_2028_2112_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hProcess&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)</span><span id=Codehighlighter1_2028_2112_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2028_2112_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;::MessageBox(NULL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">无法获取进程句柄</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">错误</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MB_ICONERROR);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwWritten&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwHandle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen(strDllName)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">dll的全路径名的长度，待会分配内存要用到的<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">向宿主进程分配内存，返回一个指针</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">LPVOID&nbsp;lpBuf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;VirtualAllocEx(hProcess,&nbsp;NULL,&nbsp;dwSize,&nbsp;MEM_COMMIT,&nbsp;PAGE_READWRITE);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果在宿主进程空间写失败就直接报错闪人</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_2479_2651_Open_Image onclick="this.style.display='none'; Codehighlighter1_2479_2651_Open_Text.style.display='none'; Codehighlighter1_2479_2651_Closed_Image.style.display='inline'; Codehighlighter1_2479_2651_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2479_2651_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2479_2651_Closed_Text.style.display='none'; Codehighlighter1_2479_2651_Open_Image.style.display='inline'; Codehighlighter1_2479_2651_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">WriteProcessMemory(hProcess,&nbsp;lpBuf,&nbsp;(LPVOID)strDllName.GetBuffer(dwSize),&nbsp;dwSize,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwWritten))</span><span id=Codehighlighter1_2479_2651_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2479_2651_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;VirtualFreeEx(hProcess,&nbsp;lpBuf,&nbsp;dwSize,&nbsp;MEM_DECOMMIT);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hProcess);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">在目标进程中写入失败</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">错误</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MB_ICONERROR);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取GetModuleHandleA函数地址</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">LPVOID&nbsp;pFun&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetProcAddress(GetModuleHandle(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Kernel32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GetModuleHandleA</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在宿主进程中创建一个远程线程，线程函数为上面导出的GetModuleHandleA，参数为lpBuf指针，还<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">记得我们获取的dll全路径不</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">HANDLE&nbsp;hThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateRemoteThread(hProcess,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;(LPTHREAD_START_ROUTINE)pFun,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBuf,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;NULL);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果创建线程失败，直接报错退出</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_3018_3140_Open_Image onclick="this.style.display='none'; Codehighlighter1_3018_3140_Open_Text.style.display='none'; Codehighlighter1_3018_3140_Closed_Image.style.display='inline'; Codehighlighter1_3018_3140_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3018_3140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3018_3140_Closed_Text.style.display='none'; Codehighlighter1_3018_3140_Open_Image.style.display='inline'; Codehighlighter1_3018_3140_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hThread&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)</span><span id=Codehighlighter1_3018_3140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_3018_3140_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hProcess);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;::MessageBox(NULL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">在目标进程创建远程线程失败</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">错误</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MB_ICONERROR);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等待GetModuleHandle运行完毕&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">WaitForSingleObject(hThread,&nbsp;INFINITE);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获得GetModuleHandle的返回值&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">GetExitCodeThread(hThread,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwHandle);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;释放目标进程中申请的空间&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">VirtualFreeEx(hProcess,&nbsp;lpBuf,&nbsp;dwSize,&nbsp;MEM_DECOMMIT);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>CloseHandle(hThread);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使目标进程调用FreeLibraryAndExit，卸载DLL,实际也可以用FreeLibrary，但是我发现前者好一点</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">pFun&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetProcAddress(GetModuleHandle(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Kernel32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FreeLibraryAndExitThread</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>hThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateRemoteThread(hProcess,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;(LPTHREAD_START_ROUTINE)pFun,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPVOID)dwHandle,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;NULL);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等待FreeLibraryAndExitThread执行完毕&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">WaitForSingleObject(hThread,&nbsp;INFINITE);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>CloseHandle(hThread);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>CloseHandle(hProcess);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">操作成功</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_3827_3919_Open_Image onclick="this.style.display='none'; Codehighlighter1_3827_3919_Open_Text.style.display='none'; Codehighlighter1_3827_3919_Closed_Image.style.display='inline'; Codehighlighter1_3827_3919_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_3827_3919_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3827_3919_Closed_Text.style.display='none'; Codehighlighter1_3827_3919_Open_Image.style.display='inline'; Codehighlighter1_3827_3919_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_3827_3919_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_3827_3919_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">****************************************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>再就补充一点，上面的那个函数要求传递的参数为进程的ID号，但大多数情况下我们只知道进程的进程名，由进程名得到进程ID号我自己写了一个<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>函数如下（注：使用此函数需要包含头文件</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Tlhelp32.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">）：<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>DWORD&nbsp;GetProcessIdFromName(LPCTSTR&nbsp;name,PROCESSENTRY32&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;BPE)<br><img id=Codehighlighter1_4085_4441_Open_Image onclick="this.style.display='none'; Codehighlighter1_4085_4441_Open_Text.style.display='none'; Codehighlighter1_4085_4441_Closed_Image.style.display='inline'; Codehighlighter1_4085_4441_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_4085_4441_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4085_4441_Closed_Text.style.display='none'; Codehighlighter1_4085_4441_Open_Image.style.display='inline'; Codehighlighter1_4085_4441_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_4085_4441_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_4085_4441_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;PROCESSENTRY32&nbsp;pe;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;DWORD&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;HANDLE&nbsp;hSnapshot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;pe.dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sizeof(PROCESSENTRY32);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;BOOL&nbsp;PF</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(PF</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Process32First(hSnapshot,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pe);PF;PF</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Process32Next(hSnapshot,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pe))<br><img id=Codehighlighter1_4316_4404_Open_Image onclick="this.style.display='none'; Codehighlighter1_4316_4404_Open_Text.style.display='none'; Codehighlighter1_4316_4404_Closed_Image.style.display='inline'; Codehighlighter1_4316_4404_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_4316_4404_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4316_4404_Closed_Text.style.display='none'; Codehighlighter1_4316_4404_Open_Image.style.display='inline'; Codehighlighter1_4316_4404_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_4316_4404_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_4316_4404_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(strcmp(pe.szExeFile,name)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_4355_4402_Open_Image onclick="this.style.display='none'; Codehighlighter1_4355_4402_Open_Text.style.display='none'; Codehighlighter1_4355_4402_Closed_Image.style.display='inline'; Codehighlighter1_4355_4402_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_4355_4402_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4355_4402_Closed_Text.style.display='none'; Codehighlighter1_4355_4402_Open_Image.style.display='inline'; Codehighlighter1_4355_4402_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_4355_4402_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_4355_4402_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pe.th32ProcessID;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">BPE</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">pe;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>CloseHandle(hSnapshot);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>好了到这里我们就完全可以使用这些函数写出一个专门卸载其他进程DLL的小工具了。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/xingkongyun/aggbug/53205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xingkongyun/" target="_blank">杨彬彬</a> 2008-06-14 09:44 <a href="http://www.cppblog.com/xingkongyun/articles/53205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程守卫 </title><link>http://www.cppblog.com/xingkongyun/articles/53204.html</link><dc:creator>杨彬彬</dc:creator><author>杨彬彬</author><pubDate>Sat, 14 Jun 2008 01:42:00 GMT</pubDate><guid>http://www.cppblog.com/xingkongyun/articles/53204.html</guid><wfw:comment>http://www.cppblog.com/xingkongyun/comments/53204.html</wfw:comment><comments>http://www.cppblog.com/xingkongyun/articles/53204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xingkongyun/comments/commentRss/53204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xingkongyun/services/trackbacks/53204.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 线程守卫前几天看杂志时看到了讲进程守卫技术，读完之后发现也并不是很难，自己就根据作者提供的代码自己试着写了下，在原作者的基础上将原代码进行了以下小的扩充，使之应用范围大些。（原文参考&lt;黑客防线&gt;83期第84页冷风的那篇文章,如有侵权请见谅）.&nbsp;所谓进程守卫顾名思义就是一个进程保卫另一个进程，如果被保卫的进程被终止的话则守卫进程会自动重新启动被保卫进程。这项技术在病毒木马中应用...&nbsp;&nbsp;<a href='http://www.cppblog.com/xingkongyun/articles/53204.html'>阅读全文</a><img src ="http://www.cppblog.com/xingkongyun/aggbug/53204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xingkongyun/" target="_blank">杨彬彬</a> 2008-06-14 09:42 <a href="http://www.cppblog.com/xingkongyun/articles/53204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自写的注册表操作函数收藏</title><link>http://www.cppblog.com/xingkongyun/articles/53203.html</link><dc:creator>杨彬彬</dc:creator><author>杨彬彬</author><pubDate>Sat, 14 Jun 2008 01:39:00 GMT</pubDate><guid>http://www.cppblog.com/xingkongyun/articles/53203.html</guid><wfw:comment>http://www.cppblog.com/xingkongyun/comments/53203.html</wfw:comment><comments>http://www.cppblog.com/xingkongyun/articles/53203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xingkongyun/comments/commentRss/53203.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xingkongyun/services/trackbacks/53203.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天在教室看书实在无聊，赶上这两天在学习注册表操作函数，就写了这堆代码，写完在机子上运行了下感觉还不错，也就把注册表的一些信息写进了单项链表中，便于实现查找操作。代码如下:/**//*存放子键与键值的数据结构*/typedef&nbsp;struct&nbsp;RegValueInfo{DWORD&nbsp;sValueCnt;//键值数量，用于头节点中TCHAR&nbsp;sValueName[...&nbsp;&nbsp;<a href='http://www.cppblog.com/xingkongyun/articles/53203.html'>阅读全文</a><img src ="http://www.cppblog.com/xingkongyun/aggbug/53203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xingkongyun/" target="_blank">杨彬彬</a> 2008-06-14 09:39 <a href="http://www.cppblog.com/xingkongyun/articles/53203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>