<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[TRock's Space Network]]></title> 
<link>http://www.xiangqiankun.cn/index.php</link> 
<description><![CDATA[计算机偏执狂]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[TRock's Space Network]]></copyright>
<item>
<link>http://www.xiangqiankun.cn/read.php/61.htm</link>
<title><![CDATA[Debugger Interrupts]]></title> 
<author>①梦叁肆年 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[逆向汇编]]></category>
<pubDate>Fri, 26 Jun 2009 06:31:05 +0000</pubDate> 
<guid>http://www.xiangqiankun.cn/read.php/61.htm</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在调试器中步过INT3和INT1指令的时候，由于调试器通常会处理这些调试中断，所以异常处理例程默认情况下将不会被调用，Debugger Interrupts就利用了这个事实。这样壳可以在异常处理例程中设置标志，通过INT指令后如果这些标志没有被设置则意味着进程正在被调试。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外，kernel32!DebugBreak()内部是调用了INT3来实现的，有些壳也会使用这个API。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例<br/>这个例子在异常处理例程中设置EAX的值为0xFFFFFFFF（通过CONTEXT6记录）以此来判断异常处理例程是否被调用：<br/>; set exception handler<br/>push&nbsp;&nbsp;&nbsp;&nbsp; .exeception_handler<br/>push&nbsp;&nbsp;&nbsp;&nbsp; dword [fs:0]<br/>mov&nbsp;&nbsp;&nbsp;&nbsp; [fs:0],esp<br/><br/>;reset flag(EAX) invoke int3<br/>xor&nbsp;&nbsp;&nbsp;&nbsp; eax,eax<br/>int3<br/><br/>;restore exception handler<br/>pop&nbsp;&nbsp;&nbsp;&nbsp; dword [fs:0]<br/>add&nbsp;&nbsp;&nbsp;&nbsp; esp,4<br/><br/>; check if the flag had been set<br/>test&nbsp;&nbsp;&nbsp;&nbsp; eax,eax<br/>je&nbsp;&nbsp;&nbsp;&nbsp; .debugger_found<br/>:::<br/>.exeception_handler:<br/>;EAX = ContextRecord<br/>mov&nbsp;&nbsp;&nbsp;&nbsp; eax,[esp+0xc]<br/>;set flag (ContextRecord.EAX)<br/>mov&nbsp;&nbsp;&nbsp;&nbsp; dword [eax+0xb0],0xffffffff<br/>;set ContextRecord.EIP<br/>inc&nbsp;&nbsp;&nbsp;&nbsp; dword [eax+0xb8]<br/>xor&nbsp;&nbsp;&nbsp;&nbsp; eax,eax<br/>retn<br/><br/><br/>对策<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于调试中断而导致执行停止时，在OllyDbg中识别出异常处理例程（通过视图->SEH链）并下断点，然后Shift+F9将调试中断/异常传递给异常处理例程，最终异常处理例程中的断点会断下来，这时就可以跟踪了。<br/><br/>Tags - <a href="http://www.xiangqiankun.cn/go.php/tags/debugger/" rel="tag">debugger</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/interrupts/" rel="tag">interrupts</a>
]]>
</description>
</item><item>
<link>http://www.xiangqiankun.cn/read.php/58.htm</link>
<title><![CDATA[PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags]]></title> 
<author>①梦叁肆年 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[逆向汇编]]></category>
<pubDate>Mon, 22 Jun 2009 09:21:31 +0000</pubDate> 
<guid>http://www.xiangqiankun.cn/read.php/58.htm</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PEB.NtGlobalFlag&nbsp;&nbsp;PEB另一个成员被称作NtGlobalFlag（偏移0x68），壳也通过它来检测程序是否用调试器加载。通常程序没有被调试时，NtGlobalFlag成员值为0，如果进程被调试这个成员通常值为0x70（代表下述标志被设置）：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLG_HEAP_ENABLE_TAIL_CHECK(0X10)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLG_HEAP_ENABLE_FREE_CHECK(0X20)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLG_HEAP_VALIDATE_PARAMETERS(0X40)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些标志是在ntdll!LdrpInitializeExecutionOptions()里设置的。请注意PEB.NtGlobalFlag的默认值可以通过gflags.exe工具或者在注册表以下位置创建条目来修改：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HKLM&#92;Software&#92;Microsoft&#92;Windows Nt&#92;CurrentVersion&#92;Image File Execution Options<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Heap Flags 由于NtGlobalFlag标志的设置，堆也会打开几个标志，这个变化可以在ntdll!RtlCreateHeap()里观测到。通常情况下为进程创建的第一个堆会将其Flags和ForceFlags4分别设为0x02（HEAP_GROWABLE)和0 。然而当进程被调试时，这两个标志通常被设为0x50000062（取决于NtGlobalFlag）和0x40000060（等于Flags AND 0x6001007D）。默认情况下当一个被调试的进程创建堆时下列附加的堆标志将被设置：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HEAP_TAIL_CHECKING_ENABLED(0X20)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HEAP_FREE_CHECKING_ENABLED(0X40)<br/>&nbsp;&nbsp;<br/>示例<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的示例代码检查PEB.NtGlobalFlag是否等于0，为进程创建的第一个堆是否设置了附加标志(PEB.ProcessHeap)：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = PEB<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx,[fs:0x30]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Check if PEB.NtGlobalFlag != 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword [ebx+0x68],0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jne&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.debugger_found<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = PEB.ProcessHeap<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,[ebx+0x18]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Check PEB.ProcessHeap.Flags<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword [eax+0x0c],2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jne&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.debugger_found<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Check PEB.ProcessHeap.ForceFlags<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword [eax+0x10],0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jne&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.debugger_found<br/><br/>对策<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以将 PEB.NtGlobalFlag和PEB.HeapProcess标志补丁为进程未被调试时的相应值。下面是一个补丁上述标志的ollyscript示例：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; peb<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patch_addr<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process_heap<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//retrieve PEB via a hardcoded TEB address( first thread: 0x7ffde000) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peb,[7ffde000+30]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//patch PEB.NtGlobalFlag<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patch_addr,[peb+68]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[patch_addr],0<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//patch PEB.ProcessHeap.Flags/ForceFlags<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process_heap,[peb+18]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patch_addr,[process_heap+0c]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[patch_addr],2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patch_addr,[process_heap+10]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[patch_addr],0<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同样地Olly Advanced插件有设置PEB.NtGlobalFlag和PEB.ProcessHeap的选项。<br/><br/>Tags - <a href="http://www.xiangqiankun.cn/go.php/tags/peb.ntglobalflag/" rel="tag">peb.ntglobalflag</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/heap.heapflags/" rel="tag">heap.heapflags</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/heap.forceflags/" rel="tag">heap.forceflags</a>
]]>
</description>
</item><item>
<link>http://www.xiangqiankun.cn/read.php/54.htm</link>
<title><![CDATA[PEB.BeingDebugged Flag : IsDebuggerPresent]]></title> 
<author>①梦叁肆年 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[逆向汇编]]></category>
<pubDate>Sat, 20 Jun 2009 02:43:30 +0000</pubDate> 
<guid>http://www.xiangqiankun.cn/read.php/54.htm</guid> 
<description>
<![CDATA[ 
	&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;&nbsp;&nbsp;2.1 PEB.BeingDebugged Flag : IsDebuggerPresent()<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最基本的调试器检测技术就是检测进程环境块(PEB)1中的BeingDebugged标志。kernel32!IsDebuggerPresent() API检查这个标志以确定进程是否正在被用户模式的调试器调试。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面显示了IsDebuggerPresent() API的实现代码。首先访问线程环境块(TEB)2得到PEB的地址，然后检查PEB偏移0x02位置的BeingDebugged标志。<br/><br/>mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax, large fs: 18h<br/>mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax, [eax+30h]<br/>movzx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax, byte ptr [eax+2]<br/>retn<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;除了直接调用IsDebuggerPresent()，有些壳会手工检查PEB中的BeingDebugged标志以防逆向分析人员在这个API上设置断点或打补丁。<br/><br/>示例<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 下面是调用IsDebuggerPresent() API和使用PEB.BeingDebugged标志确定调试器是否存在的示例代码。<br/>;call kernel32!IsDebuggerPresent()<br/>call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[IsDebuggerPresent]<br/>test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,eax<br/>jnz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.debugger_found<br/><br/>;check PEB.BeingDebugged directly<br/>Mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword [fs:0x30]&nbsp;&nbsp;;EAX =&nbsp;&nbsp;TEB.ProcessEnvironmentBlock<br/>movzx&nbsp;&nbsp;&nbsp;&nbsp;eax,byte [eax+0x02]&nbsp;&nbsp;;AL&nbsp;&nbsp;=&nbsp;&nbsp;PEB.BeingDebugged<br/>test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,eax<br/>jnz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.debugger_found<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于这些检查很明显，壳一般都会用后面章节将会讨论的垃圾代码或者反—反编译技术进行混淆。<br/><br/>对策<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;人工将PEB.BeingDebugged标志置0可轻易躲过这个检测。在数据窗口中Ctrl+G（前往表达式）输入fs:[30]，可以在OllyDbg中查看PEB数据。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外Ollyscript命令"dbh"可以补丁这个标志。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbh<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后，Olly Advanced3 插件有置BeingDebugged标志为0的选项。<br/><br/>Tags - <a href="http://www.xiangqiankun.cn/go.php/tags/peb.beingdebugged/" rel="tag">peb.beingdebugged</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/flag/" rel="tag">flag</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/%253A/" rel="tag">:</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/isdebuggerpresent/" rel="tag">isdebuggerpresent</a>
]]>
</description>
</item><item>
<link>http://www.xiangqiankun.cn/read.php/53.htm</link>
<title><![CDATA[脱壳的艺术一（简介）]]></title> 
<author>①梦叁肆年 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[逆向汇编]]></category>
<pubDate>Sat, 20 Jun 2009 02:37:39 +0000</pubDate> 
<guid>http://www.xiangqiankun.cn/read.php/53.htm</guid> 
<description>
<![CDATA[ 
	<p align="center">脱壳的艺术Mark Vincent Yason</p><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 概述：脱壳是门艺术——脱壳既是一种心理挑战，同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧，逆向分析人员有时不得不了解操作系统的一些底层知识，聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者，也牵涉到那些决心躲过这些保护的脱壳者。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp; 本文主要目的是介绍壳常用的反逆向技术，同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具。这些信息将使研究人员特别是恶意代码分析人员在分析加壳的恶意代码时能识别出这些技术，当这些反逆向技术阻碍其成功分析时能决定下一步的动作。第二个目的，这里介绍的信息也会被那些计划在软件中添加一些保护措施用来减缓逆向分析人员分析其受保护代码的速度的研究人员用到。当然没有什么能使一个熟练的、消息灵通的、坚定的逆向分析人员止步的。<br/>关键词：逆向工程、壳、保护、反调试、反逆向<br/><br/><p align="center"><span style="font-size: 18px;">一、简介</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在逆向工程领域，壳是最有趣的谜题之一。在解谜的过程中，逆向分析人员会获得许多关于系统底层、逆向技巧等知识。<br/>壳（这个术语在本文中既指压缩壳也包括加密壳）是用来防止程序被分析的。它们被商业软件合法地用于防止信息披露、篡改及盗版。可惜恶意软件也基于同样的理由在使用壳，只不过动机不良。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于大量恶意软件存在加壳现象，研究人员和恶意代码分析人员为了分析代码，开始学习脱壳的技巧。但是随着时间的推移，为防止逆向分析人员分析受保护的程序并成功脱壳，新的反逆向技术也被不断地添加到壳中。并且战斗还在继续，新的反逆向技术被开发的同时逆向分析人员也在针锋相对地发掘技巧、研究技术并开发工具来对付它们。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本文主要关注于介绍壳所使用的反逆向技术，同时也探讨了躲过/禁用这些保护措施的工具及技术。可能有些壳通过抓取进程映像（dump）能够轻易被搞定，这时处理反逆向技术似乎没有必要，但是有些情况下加密壳的代码需要加以跟踪和分析，例如：<br/>需要躲过部分加密壳代码以便抓取进程映像、让输入表重建工具正确地工作。<br/>深入分析加密壳代码以便在一个反病毒产品中整合进脱壳支持。<br/>此外，当反逆向技术被恶意程序直接应用，以防止跟踪并分析其恶意行为时，熟悉反逆向技术也是很有价值的。<br/>本文绝不是一个完整的反逆向技术的清单，因为它只涵盖了壳中常用的、有趣的一些技术。建议读者参阅最后一节的链接和图书资料，以了解更多其他逆向及反逆向的技术。<br/><br/>Tags - <a href="http://www.xiangqiankun.cn/go.php/tags/%25E8%2584%25B1%25E5%25A3%25B3/" rel="tag">脱壳</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/dump/" rel="tag">dump</a> , <a href="http://www.xiangqiankun.cn/go.php/tags/%25E9%2580%2586%25E5%2590%2591%25E5%25B7%25A5%25E7%25A8%258B/" rel="tag">逆向工程</a>
]]>
</description>
</item>
</channel>
</rss>