ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:55.16KB ,
资源ID:10204906      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10204906.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(脱壳的艺术.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

脱壳的艺术.docx

1、脱壳的艺术脱壳的艺术 #EzhtuH_xn Mark Vincent Yason | M7C_=z= 概述:脱壳是门艺术脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。 jsQHg_2Vd 本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具。这些信息将使研究人员特别是恶意代码分析人员在分析加壳的恶意代码时能识别出这些技术,当这些反逆向技术阻碍其成功分析

2、时能决定下一步的动作。第二个目的,这里介绍的信息也会被那些计划在软件中添加一些保护措施用来减缓逆向分析人员分析其受保护代码的速度的研究人员用到。当然没有什么能使一个熟练的、消息灵通的、坚定的逆向分析人员止步的。 e P_,bF_c_ 关键词:逆向工程、壳、保护、反调试、反逆向 ME$_J42_ 1简介 RC/45:_hZZ 在逆向工程领域,壳是最有趣的谜题之一。在解谜的过程中,逆向分析人员会获得许多关于系统底层、逆向技巧等知识。 _tYXE$ i 壳(这个术语在本文中既指压缩壳也包括加密壳)是用来防止程序被分析的。它们被商业软件合法地用于防止信息披露、篡改及盗版。可惜恶意软件也基于同样的理由在

3、使用壳,只不过动机不良。 /YuIC, 由于大量恶意软件存在加壳现象,研究人员和恶意代码分析人员为了分析代码,开始学习脱壳的技巧。但是随着时间的推移,为防止逆向分析人员分析受保护的程序并成功脱壳,新的反逆向技术也被不断地添加到壳中。并且战斗还在继续,新的反逆向技术被开发的同时逆向分析人员也在针锋相对地发掘技巧、研究技术并开发工具来对付它们。 RfJ_Q5 本文主要关注于介绍壳所使用的反逆向技术,同时也探讨了躲过/禁用这些保护措施的工具及技术。可能有些壳通过抓取进程映像(dump)能够轻易被搞定,这时处理反逆向技术似乎没有必要,但是有些情况下加密壳的代码需要加以跟踪和分析,例如: $5 _0_

4、需要躲过部分加密壳代码以便抓取进程映像、让输入表重建工具正确地工作。 _XPGA uEo 深入分析加密壳代码以便在一个反病毒产品中整合进脱壳支持。 f4fBUZ _A 此外,当反逆向技术被恶意程序直接应用,以防止跟踪并分析其恶意行为时,熟悉反逆向技术也是很有价值的。 _WFiX=SS_ 本文绝不是一个完整的反逆向技术的清单,因为它只涵盖了壳中常用的、有趣的一些技术。建议读者参阅最后一节的链接和图书资料,以了解更多其他逆向及反逆向的技术。 I_H;sVT $M 笔者希望您觉得这些材料有用,并能应用其中的技术。脱壳快乐! J_wB_B 58Ce_*_ 2 调试器检测技术 v_!8=B21 本节列出

5、了壳用来确定进程是否被调试或者系统内是否有调试器正在运行的技术。这些调试器检测技术既有非常简单(明显)的检查,也有涉及到native APIs和内核对象的。 Q_J3#GYNr 2.1 PEB.BeingDebugged Flag : IsDebuggerPresent() g_L_B(AyG 最基本的调试器检测技术就是检测进程环境块(PEB)1中的BeingDebugged标志。kernel32!IsDebuggerPresent() API检查这个标志以确定进程是否正在被用户模式的调试器调试。 Wk_CQf retn z_!IA_ v 除了直接调用IsDebuggerPresent(),有

6、些壳会手工检查PEB中的BeingDebugged标志以防逆向分析人员在这个API上设置断点或打补丁。 _.;W_cCB$ test eax,eax _z_R_z jnz .debugger_found N_V _* 2_ 由于这些检查很明显,壳一般都会用后面章节将会讨论的GHOFFICE过滤词语代码或者反反编译技术进行混淆。 gD_9C_A_* 对策 c3_!xHt5O 人工将PEB.BeingDebugged标志置0可轻易躲过这个检测。在数据窗口中Ctrl+G(前往表达式)输入fs:30,可以在OllyDbg中查看PEB数据。 d_u(BZw_ 另外Ollyscript命令dbh可以补丁这

7、个标志。 n_nyT,e%_ dbh 3N_KN_W_ 最后,Olly Advanced3 插件有置BeingDebugged标志为0的选项。 %unn92)_ 2.2 PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags H1k)ya x4_ PEB.NtGlobalFlag PEB另一个成员被称作NtGlobalFlag(偏移0x68),壳也通过它来检测程序是否用调试器加载。通常程序没有被调试时,NtGlobalFlag成员值为0,如果进程被调试这个成员通常值为0x70(代表下述标志被设置): GJ_B+ b- FLG_HEAP_ENABLE

8、_TAIL_CHECK(0X10) xRWfZ3E_ # FLG_HEAP_ENABLE_FREE_CHECK(0X20) 7_KlL_%_ FLG_HEAP_VALIDATE_PARAMETERS(0X40) _I0F ZU 这些标志是在ntdll!LdrpInitializeExecutionOptions()里设置的。请注意PEB.NtGlobalFlag的默认值可以通过gflags.exe工具或者在注册表以下位置创建条目来修改: lf(_ +k30 HKLMSoftwareMicrosoftWindows NtCurrentVersionImage File Execution Opt

9、ions X?_haHM# Heap Flags 由于NtGlobalFlag标志的设置,堆也会打开几个标志,这个变化可以在ntdll!RtlCreateHeap()里观测到。通常情况下为进程创建的第一个堆会将其Flags和ForceFlags4分别设为0x02(HEAP_GROWABLE)和0 。然而当进程被调试时,这两个标志通常被设为0x50000062(取决于NtGlobalFlag)和0x40000060(等于Flags AND 0x6001007D)。默认情况下当一个被调试的进程创建堆时下列附加的堆标志将被设置: _Nf4_m|# HEAP_TAIL_CHECKING_ENABLED

10、(0X20) ocp5Y3,Os HEAP_FREE_CHECKING_ENABLED(0X40) w_f _ Wm 示例 aUMiRm-_ _ 下面的示例代码检查PEB.NtGlobalFlag是否等于0,为进程创建的第一个堆是否设置了附加标志(PEB.ProcessHeap): IZ_r._|O ;ebx = PEB H_2,auBY Mov ebx,fs:0x30 8;qOsV)UDT eV_ _,W_ ;Check if PEB.NtGlobalFlag != 0 =4_)8a7#. Cmp dword ebx+0x68,0 s _*rBX8N jne .debugger_found

11、/fR6|tJ _k6 OO= ;eax = PEB.ProcessHeap Xq$0c Mov eax,ebx+0x18 dm*p_x m_!INbI_h ;Check PEB.ProcessHeap.Flags U_ChLWf|_ Cmp dword eax+0x0c,2 *k_ ;G? jne .debugger_found F;q9NYRW A_ _7I0_ ;Check PEB.ProcessHeap.ForceFlags P/S,dh_s( Cmp dword eax+0x10,0 _0 S_wuOE jne .debugger_found _U_sF 对策 _2_*W|s7cc

12、可以将 PEB.NtGlobalFlag和PEB.HeapProcess标志补丁为进程未被调试时的相应值。下面是一个补丁上述标志的ollyscript示例: 0*dKgN_ Var peb $5#DU_F/ var patch_addr _0Q_/oU var process_heap (Ms0pm-#t_ Y_|#_Z /patch PEB.NtGlobalFlag _6_ G ,_cc Lea patch_addr,peb+68 F)aF.$-/ mov patch_addr,0 :VR% I;g; H_=5_ _ /patch PEB.ProcessHeap.Flags/ForceFla

13、gs WxJaE;Ige Mov process_heap,peb+18 qP9p4c8_i lea patch_addr,process_heap+0c b-#oE_( mov patch_addr,2 _0_2*b_ lea patch_addr,process_heap+10 _x45F-_w_ mov patch_addr,0 IR8qF_WDZ 同样地Olly Advanced插件有设置PEB.NtGlobalFlag和PEB.ProcessHeap的选项。 5IRUG_)Icr 2.3 DebugPort: CheckRemoteDebuggerPresent()/NtQueryI

14、nformationProcess() Ih5CtcE1d Kernel32!CheckRemoteDebuggerPresent()是另一个可以用于确定是否有调试器被附加到进程的API。这个API内部调用了ntdll!NtQueryInformationProcess(),调用时ProcessInformationclass参数为ProcessDebugPort(7)。而NtQueryInformationProcess()检索内核结构EPROCESS5的DebugPort成员。非0的DebugPort成员意味着进程正在被用户模式的调试器调试。如果是这样的话,ProcessInformati

15、on 将被置为0xFFFFFFFF ,否则ProcessInformation 将被置为0。 _0)i_Y_ Kernel32!CheckRemoteDebuggerPresent()接受2个参数,第1个参数是进程句柄,第2个参数是一个指向boolean变量的指针,如果进程被调试,该变量将包含TRUE返回值。 +WCV_m_ BOOL CheckRemoteDebuggerPresent( O*W/9_ _+ HANDLE hProcess, _0_R_q PBOOL pbDebuggerPresent =)! _t_/_ ) IRsyykp8 ntdll!NtQueryInformation

16、Process()有5个参数。为了检测调试器的存在,需要将ProcessInformationclass参数设为ProcessDebugPort(7): _ fTGVG NTSTATUS NTAPI NtQueryInformationProcess( lgefTT GX) HANDLE ProcessHandle, cZ _,_1?! PROCESSINFOCLASS ProcessInformationClass, MwD8a_2Dg PVOID ProcessInformation, ZkF_6AF_ _ ULONG ProcessInformationLength, :!wt/Y PU

17、LONG ReturnLength V+$f_h_2t ) _W_SIr-_B 示例 X_JA;9_ 下面的例子显示了如何调用CheckRemoteDebuggerPresent()和NtQueryInformationProcess()来检测当前进程是否被调试: whQJ_Wi=ck ; using Kernel32!CheckRemoteDebuggerPresent() 4 udW _6U lea eax,.bDebuggerPresent I_( Yn_ push eax ;pbDebuggerPresent _ _c_ push 0xffffffff ;hProcess 6_P_0

18、2= call CheckRemoteDebuggerPresent L_v jne .debugger_found _pL_ _,l IJDE_)_ ; using ntdll!NtQueryInformationProcess(ProcessDebugPort) *eM_Mf xFl lea eax,.dwReturnLen EvF_h_:C2 push eax ;ReturnLength _=_Gg-E2 push 4 ;ProcessInformationLength s13_3N_?_ lea eax,.dwDebugPort rMA_$PiS push eax ;ProcessIn

19、formation LHSbc!_Y. push ProcessDebugPort ;ProcessInformationClass(7) _ U_ QQ push 0xffffffff ;ProcessHandle 6i* L Dl call NtQueryInformationProcess _)T_x_Dx cmp dword .dwDebugPort,0 %a!_gN_ jne .debugger_found S q4Fd 对策 t8_wO+4_ 一种方法是在NtQueryInformationProcess()返回的地方设置断点,当这个断点被断下来后,将ProcessInformat

20、ion 补丁为0。 下面是自动执行这个方法的ollyscript示例: X!m l_C5_1 var bp_NtQueryInformationProcess _!gq_x_ t(jE9t|2e6 / set a breakpoint handler iUk#hL_LC eob bp_handler_NtQueryInformationProcess SYa_ O_c_ n#Qd!uzM / set a breakpoint where NtQueryInformationProcess returns ILqBa_:_J_ gpa NtQueryInformationProcess,ntdl

21、l.dll 6eF|_GoP find $RESULT,#C21400# /retn 14 qH_vU_Bx0 mov bp_NtQueryInformationProcess,$RESULT |gIE$rt-W bphws bp_NtQueryInformationProcess,X _,) run _m x_q_Y Dp!91NgB p bp_handler_NtQueryInformationProcess: 1_G_K&; I2Imb9kB /ProcessInformationClass = ProcessDebugPort? 9cI0)3p cmp esp+8,7 _ u_x_B_

22、 jne bp_handler_NtQueryInformationProcess_continue ;S _?_l_0 Bk _ bp_handler_NtQueryInformationProcess_continue: IE M_a/n/ run YrB-_n _ Olly Advanced插件有一个patch NtQueryInformationProcess()的选项,这个补丁涉及注入一段代码来操纵NtQueryInformationProcess()的返回值。 w2q_9_pB+ 2.4 Debugger Interrupts Cj5%7 ; set exception handler A*?P_H_bY push .exeception_handler 1o%_#kf_ push dword fs:0 ZBK07#&EH mov fs:0,esp d_A_x ? , r|u36NmA_ ;reset flag(EAX) invoke int3 #_A_z#_0= xor eax,eax _LS_ouR_ int3 XNWtX- X$w_e t_ ;restore exception handler CF_b Yf% pop dword fs:0 c_Z_Ncplt8 add esp,4 _Hyy b0c

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1