使用OllyDbg从零开始Cracking 第三十二章

上传人:feng****heng 文档编号:166116014 上传时间:2022-10-31 格式:DOCX 页数:21 大小:670.14KB
返回 下载 相关 举报
使用OllyDbg从零开始Cracking 第三十二章_第1页
第1页 / 共21页
使用OllyDbg从零开始Cracking 第三十二章_第2页
第2页 / 共21页
使用OllyDbg从零开始Cracking 第三十二章_第3页
第3页 / 共21页
点击查看更多>>
资源描述
第三十二章-OEP寻踪在上一章中我们提到了 OEP(Original EntryPoint)的概念,也就是应用程序原本要执行的第一行代码OEP %99的情况位于第一个区 段中(本章中有一个例子,OEP就不在第一个区段,我是特意举的这个例子,嘿嘿)。我们知道当到达OEP后,各个区段在内存中的分布跟原始程序很接近这个时候我们就可以尝试将其转储到(dump)文件中,完成程 序的重建工作(PS:脱壳)。通常脱壳的基本步骤如下:1:寻找OEP2:转储(PS:传说中的dump)3:修复IAT(修复导入表)4:检查目标程序是否存在AntiDump等阻止程序被转储的保护措施,并尝试修复这些问题。以上是脱壳的经典步骤,可能具体到不同的壳的话会有细微的差别。本章我们主要介绍定位OEP的方法。很多时候我们遇到的壳会想方设法的隐藏原程序的OEP,要定位OEP的话就需要我们尝试各种各样的方法了。首先我们来看看上一章CRACKME UPX,然后再来看其他的壳。1)搜索JMP或者CALL指令的机器码(即一步直达法,只适用于少数壳,包括UPXASPACK壳)对于一些简单的壳可以用这种方式来定位OEP,但是对于像AsProtect这类强壳(PS:AsProtect在04年算是强壳了,嘿嘿)就不适用 了,我们可以直接搜索长跳转JMP(0E9)或者CALL(0E8)这类长转移的机器码,一般情况下(理想情况)壳在解密完原程序各个区段 以后,需要一个长JMP或者CALL跳转到原程序代码段中的OEP处开始执行原程序代码。下面我们将上一章中加了 UPX壳的那个CrueHead的CrackMe加载到0D中::HORT CRACKME_.00 :BX,DWORD PTR DS: :SI,-4:琳 EEX:口 X,E 口 X:BX.EEX:HORT CRACKME_.00 :HORT CRRCKME_.00 :BX,DWORD PTR DS: :SI,-4口対匚口?0 _y 0 2 0 0 _y 0 7 F E 5 0 E L 00 0 0000 00 0 0000 00 0 A-000 00 0 A-000 0000301rt 000R- 0 0 _.K-me 记匚已fRun traceGo to卜Follow in Dump卜Search for卜Name (label) in current meFind references toView卜Copy to executable卜AnalysisName in all modulesCommandSequence of commandsConstantAppearance卜Binary string丄WU Wl W0 0Ut4u.0口 0 0 .h.PM r* i=i Li -! -4X i-i : .4ModiFied command 応这里我们按CTRL+B组合键搜索一下JMP的机器码E9,看看有没有这样一个JMP跳转到原程序的代码段。多按几次CTRL+L。|中|具|1 III 齐in 頁|屛| PI Fl5見|1叫丄1004O9C口.八 E9 63FFFFFFJMP CRHCKME_ 0i3409C0E0040HCHEU0409C 口匚:00斗09C口Em A Ci-iLRh -18E!0283C2 i斗cccrHOFriOU ERXP DWORD PTR DS: CEDX3 ADD EDXP4MChl 1 E.ICRhl-h 1-hTI-h d LFh T 1 LC2搜索到了几处,但都不是跳往第一个区段的,直到定位到如下位置:*|XJ IHJ :|+:| :|i:| -d土 L| E00409D3F004090440040904500409046- E9 BC72FFFF000000drip CRACKME DE: SSDE: SSDE: OS00401000这个JMP是跳转到第一个区段的,我们在这条指令处设置一个断点断在这里时,我们按F7键就可以单步跳转到OEP处。除了搜索JMP指令的机器码以外,大家还可以尝试搜索CALL EAX,CALL EBX,JMP EAX等指令的机器码,因为很多壳是将OEP的值存放在寄存器中,然后通过CALL某寄存器或者JMP某寄存器来跳往OEP的011yBbg提供了搜索ALL COMMANDS的功能,我们可以通过单击鼠标右键选择-Search for-All Commands来搜索,然后各个指令处依次设置断点,下面我们来看个例子。00 00 0000 00 0000 00 0000 00 0003 00 000 00 0061 00 0000 05 0000 0 SS00 0 804F 口S 3400 0 S000 01 000A 00 00HSCII.uLli4.S.8.Q4fl.hQ.Q.Q.f-.OOi4.NextAll intermodular callsAll commandsJAll sequencesLLLLZ: d Cl :iTlH Tt 1rijiiijw in uumpSearch for卜职Find references to3XCRViewCRJ.IORCopy to executable斗AnalysisAppearanceName (label) in current modiName in all modulesCommandSequence of 匚ommandsConstantBinary stringModified command这里没有搜到任何记录,但是如果存在这样的指令的话,那么会在一个列表里面全部显示出来,我们就可以依次在每条记录上单击 鼠标右键选择设置断点,当断下来的时候,我们可以看EAX的值为多少,根据EAX的值来确实是不是CALL或者JMP转移到第一 个区段中。这种搜索机器码的方式大家不是很常用,因为现在大部分的壳的解密例程都具有自修改功能特别对于跳转到OEP这样的指令通 常都是做了隐藏处理的,就是为了防止Cracker搜索机器码,但是,该方法对于一些简单的壳还是挺管用的。2)使用OllyDbg自带的功能定位OEP(SFX法)演示这种方法目标程序我们还是选择CRACKME UPX.EXE,用0D加载该程序,然后选择菜单项 Options-Debugging options-SFX。上图中SFX选项中用箭头标注出来的两个选项就是OllyDbg用来辅助定位OEP的,红色箭头标注的选项定位速度快,绿色箭头标注的选项定位速度慢,但是定位更加精确一些(PS:因为是按字节来定位的),我们来实验一下,选择红色箭头的选项。重新加载该程序,会发现该选项并没有起作用,是因为如下原因:Self-extracting (SFX) filesSeextracting file consists of extracting routine and packed original program. When troubleshriritirig SFX, you usually want to skip extra匚tur and stop on the entry point of original program (real entry). OllyDbg contains several functions that facilitate this task.Usijally extractor loads to address that is outside the executable 已匚tion of the original proqrarn. In this case 匚iIRDbq recoqriizes file as SFX._When SF; i兀itioriE request tra匚ing of real entry, OllyDbg sets memory breakpoint on the whole 匚ode 三芒匚tion. Initialy this is empty or contains compressed data. When program attempts to execute some command .vithin protected area which is neither RET nor JfvIF1, OllyDbg reports real entry. This is how bytewise extraction works.This method is very slow. There is a not her, rnu ch faster method. E 日匚 h time e;工:eption on data read 匚i 匚匚 1rs, OllyDbg enables reading from this 4-K memory block and disables previous read window. On each data write exception it enables writing to this bliK:k and disables previous write V/indow. When program e:::e匚山巳三;匸:ornmand within remaining prote匚馆日 area, OllyDbg reports real entry. However, when real entry is inside read or write window, its 怕匚 at ion .vill be reported incorrectly.我们可以看到OllyDbg帮助文档中的解释是,该选项只有当OllyDbg发现入口点位于代码段之外的时候才会起作用,而当前这个程 序的入口点恰恰是位于代码段中的,所以OllyDbg的该选项就不起作用了。壳的入口点位于代码段中的情况还是比较少见的。为了演示如何该选项在什么情况下能够起作用,这里给大家提供了一个名为UnPackMe_ASPack2.12的小程序,从名称上来看大家 就应该可以猜到使用了 ASPack壳。首先我们使用Options-Debugging options-SFX中默认的选项,看看OllyDbg会不会检测到入口点位于代码段之外。我们可以看到OllyBbg弹出了 一个消息框显示入口点位于代码段之外。Entry Point AlertModule UnPackMe has entry point outside the code (as specified in the PE header) Maybe this file is self-extracting or self-modifying Please keep it in mind when setting breakpoints!Aceptar我们单击Aceptar(确定)按钮。到了壳的入口点处。旦凶 _h Mliil UJJ也 勺 jJE则工四旦00411002 00411007 0041100C 0041100D 0041100EId二二y5 3 _y E ELJ.I二uE03000000EBU45D4E01000000PUSH口匚 IC口LL UnPackMe0041100口jriP 4E9E14F7PUSH EBPF:ETHC口LL Un Pack Me ii411014LommandsUisasm1 ”Hegisters btacK | Analysis IAnalysis Analysis JSecuritvDebugEventsExceptionsT raceSFXStringsAddresses现在我们勾选上红色箭头标注的选项,并确保EXCEPTIONS菜单项中的忽略异常的选项都被勾选上了,重启OD。When m日in module is self-extractable: Extend code section to in elude extractorStop at entry of self-extractorU T race real entry blockwise (inaccurate)Trace real entry bytewise (very slow!两 Use real entry from previous run- Pass exceptions to SFX extractorH Debugging options| XCommandsDisasmCPURegistersStackAnalysis 1 Analysis 2Analysis 3SecurityDebugEventsExceptionsT raceSFXStringsAddresses两 Ignore memory access violations in KERNEL32Ignore (pass to program) following exceptions:两 I NT 3 breaks两 Single-step break两 Memory access violation两 Integer division by 0两 Invalid or privileged instructionAll FPU exceptions两 Ignore also following custom exceptions or ranges:C000008F (FLOAT INEXACT RESULT)Add last exceptionAdd range:5HIOK |UndoCancelDelete selection运行起来。我们可以看到停在了 404000处,OllyDbg显示Real entry point of SFX code,即”真正的自解压代码的入口点爲(该程序是一个特 例,OEP并不位于第一个区段,是位于第三个区段)view ueuuy riuyii-pLiui vvii iuuw ntJipii4i4iii0040403 00404001 0040400 00404006 00404001: 0040400D 0IM0400F 0004014 004ti401y 0040401F Hfi4H4R?49E:DE:E39E:DE:E2D92D U060400I5589E5E8 9103000U68 00000000FF15 F4114U0I口吕 07F0400UlilHlTFINITWAITFCLEXFLDCI.il WORD RTF: DS: 4060U0JPUSH EBPMOU EBPPESPReaL entry point of SFX code匚口1_1_ Un Pack Me U04U43口PUSH UWLL DWORD RTF: 03: E4011F4JMOU DWORD RTF: DS: E40F007PEflX PI ISH口Ir pModu Le 二 NULLL GetHodu LeHand LeO这里我们可以看到该选项起作用了,定位到了 OEP现在我们再来试试绿色箭头标注的选项,011yDbg显示该选项定位OEP会很慢。 我们重启OllyDbg发现不一会儿就又停在了 OEP处(PS:不是说很慢吗?),这是因为壳的解密例程太简短了,如果壳的解密例程很长 的话,这两个选项的速度对比就能体现出来了。这里大家要注意,在使用完该选项以后要记得恢复其默认的选项如果不恢复默认选项的话,OD在分析其他正常的程序的时候就不 会停在正常的入口点处了,进而影响程序的分析工作。3)使用Patch过的OD来定位OEP(即内存映像法)就是我们在VB章节中使用的那个Patch过的0D,即正常的内存访问断点读取,写入,执行的时候都会断下来,该Patch过的0D 内存访问断点仅当执行的时候才会断下来我们可以利用这一点来定位OEP,我们还是来看看CRACKME UPX,首先来看看区段列 表。00409E:F1U0409BF6 00409BFC 0U409BFD 00409C00 00409C02 讪创且白口 roz!60器57S3EB器FUH口匚 IMOU ESIP CF:OCKriE_. 00409609LEA ED I .DWORD RTF: DS: EESI+FFFFSi PUSH EDIOF: EBPpFFFFFFFFJMP SHORT CROCKME_.00409C12NOPNF! 口003E00U0003F00U0004000000040100000409000 0040口000 00410000 004D00U00000400000002600000010000000800000001000000010000000800000002600CF:HCKME_ 匚:FE CKME_ CF:HL:KME_ 匚:FE CKME_UPX0UPX1 rsrcFE header mu口口rts code data.importRWF:RWERWE耳RWERWEW EF: EW EF: EUPX壳的解密例程会解密原程序的各个区段并将各个区段原始字节写回到原处,我们最好不要在解密区段的过程中断下来,说不 定要断成千上万次才能到达OEP这里有了这个Patch过的OD就方便多了,其内存访问断点仅当执行的时候才会断下来当其在执行第一个区段中的代码时,基本上就可以断定是OEP 了。00300000 003E000S 003F000000401000 00409000 0040口00| 00410000 00400000 004E0000 00EF0000 00900000 58C3000U 58C31000 58C口1000 58C口4殛 58CC300O 7636000U 7636100000003000 00004000 00002000 00001000 00008000 00001000 00001000 0000S000 00002000 00103000 000F6000 00002000 00001000 00070000 00003000 0001F000 00004000 00001000 00030000CF:ACKME_ CF:I=I CKMECF:HCKME_ cf:hckme_UPX0UPX1 rsrcC0MCTL32C0MCTL32 tewtC0MCTL32 dataC0MCTL32 rsrcC0MCTL32 re LocC0MDLG32C0MDLG32 tewtRAMm AA?.rlAt a旺口F:F:Ft luRl.iJRl.iJMapRRPE headerI nagRRIilExDeu iceactualizeDump in 匚FLIDumpSearchCtrl+B5et break-un-d匚匚已呂吕F25et memory breakpoint on ate ess5et memury breakpuint on write同样这里也要勾选上了忽略各种异常的选项,运行起来。这种方法可能有点慢,因为设置的是内存访问断点(PS:写过调试器的童鞋应该知道,内存断点的机制决定了其慢的特性)。这里定位OEP的过程快则几秒钟,慢则几分钟不等(PS:大家可以去泡杯咖啡慢慢等,嘿嘿)。不一会儿我们会发现定位到了 OEP。XII4::4:+ILEMTWHC/KBR+ + +S 1?| 00401000胡00PUSH 000401002004010070040100C 0040100E 00401013 0040101S 00401010 0040101C 0040101DFF040000CR204000 00F4204000 口6040000ES R3 曲68E8QBC074 01C3C705 64204000CALL CF:fiCKriE_. 00401505MOU Dl.iJORD PTF: DS: E4020CRPE口X PUSH 0PUSH CF:ACKriE_.004020F4CALL CF:HL:KriE_. 004614E:EJMF to kerne L32 Gmtncjciu LmHmid Lm口OF: EAXpEOXJE SHORT CF:HL:KNE_.0040101DRE1BMOI. Dl.iJORD FTF: DSs 4020641,4003口SCI I ppNo need to d isasn the code*M JHP to USER32.FLndWLndowfi接着我们再来看看UnPackMe_ASPack2.12。003B0000 Fi 1400000 00401000 00402000 00404000 00406000 00407000 00410000 00411000 00414000 00420000 004E0000 004F0000 00600000 77D1000S 77D11000 77D70000w w uuu00001000 00001000 00001000 00002000 00002000 00001000 00009000 00001000 00003000 00001000 0000S000 00002000 00103000 000F6000 00001000 0005F0S0 00002000UnPackHeUnPackMeUnPackHeUnPackHeUnPackHeUnPackMeUnPackMeUnPackHe UnPackHeuser32 user-32 user321丄 L VFr LuI mag1 hW F:liJ F:LU =:三:三: ;iruiTrhrhi.iiFE headerActualizeDump in CPU rsrc tewt databss iriPORTS teddy adata tewt dataresources code codeF data code codeSFXp ipi口口讥wFE header codeP import dataDumpSearch5et break-on-access匚trF25et memory breakpoint on 日tee:运行起来。004010001C3F:ETH00401001 00401007 00401009 0040100口 0040100C 0040100D 00401012 00401014 0040101832口口 口1900000 0001口 4E:1 E:194Bfl 01DU088E:&口 218E4C5C 8393XOR CHPB?TE PTR DS:EEDX+90H1 口匸i匸i BVTE PTF: DS: EECX3P 口L riOUS BYTE PTF: ES: EDIPE:?TE PTF: DSsEESI MOU CLP0B1XCHG EOXrESPMOU EDXP8E:08D001PUSH 21MOU CSpWORD PTR SS:EESP+EBX*2-7D XCHG EOXpEBXSegmeII我们可以看到执行的第一行是这里,我们按下F7键看看会发生什么。旦凶 J_UJ刮 勺 jJE则卫旦旦00411118 C607 C3 FFD7MOU E7TE PTR DS:EEDIPSC3 匸:口LL EDI0041111口8F07POP DWORD PTR DS:EDI00411 liePUSH ERX0041111DPUSH ECX0041111EPUSH ESI004U11FPUSH EBX004111208E:C8MOU ECXpEAX我们可以看到还是返回到了壳的解密例程中了,我们再次运行起来,程序直接运行起来了,为什么会这样呢?因为这里壳的解密例程并不是将原程序代码段解密到第一个区段中,所以我们可以继续给后面的区段设置内存访问断点,逐一排 查。我们再来解释一下整个流程,直接运行该CrackMe的效果如下:Coded by Teddy Rogers f SnD Team 2005 XA5Pack2.12UnPackMeIf you unpa匚kit write a tutorial.:)Aceptar如果弹出了这个窗口就表示该程序在内存中解密区段完毕了,原程序的代码得以执行,我们依次给各个区段设置内存访问断点,然 后运行起来,如果程序直接运行起来了,就证明这个区段不是我们要定位的,继续给下一个区段设置内存访问断点。0040000000001000UnPackMe0040100000001000UnPackMe idmts0040200000002000Un Pack tie rsrc00404000Un Pack tie tewt0046600000001000UnPackHe data0040700000009000UnPackHebss0041000000001000UnPackMeIMPORTS0041100000003000Un Pack tie teddy0041400000001000Un Pack tie adata0042000000008000004E000000002000004F00000010300000600000000F60000040000000050000009E0000000100000099000000003000yyyHUUUU00004000FE headerI nag 1 F:RWETmn DDI.ICActualizeDump in CPUDumpSearchCtrl+5et break-on-accessF25et memory breakpoint on access5et memory breakpoint on write 疚这里由于给第一个区段设置内存访问断点断了下来,但是继续执行程序就运行起来了,所以我们继续给第二个区段设置内存访问断点,当我们给第三个区段设置内存访问断点的时候其断在了 404000地址处。* *1 * *w w 亠*7、 1 , J0040100000001000UnPackMe idmtm0040200000UU2W0Un Pack tie rsrcresourc0040400000002000UnPackHe tewtcode0040600000001000Un Pack tie datacode,d0040700000009000UnPackHebsscode0041000000001000Un Pack Me-IMPORTScode0041100000003000UnPackMe teddySFXP LM0041400000001000Un Pack tie adata0042000000008000004E000000002000004F00000010300000600000000F6000004000000005000000950000000100000099000000003000009口00000000400000yE:00000000700000A3000000003000跑口4000000001000Sn agH口PE heaI Hag F: I nag RRliJE RWEDI.ICActualizeView in DisassemblerDump in CPUDumpSearch5et break-on-access5et memory breakpoint on 日匚cessEnCtF2J FileViewDebugPluginsOptionsWindowHelpX II哄*:4:+J +:L EMTWHC / KBR+S := 100404000 9E:lilHlTRea L en t ry po Lnt of SFX code00404001DBE3FINIT9BWRIT00404004DBE2FCLE;00404006D92D 00604001 FLDCW WORD PTR DS:E4060000040400CE5PUSH EBP0040400089E5nou EBPPESP0040400FE8 91030000 U口LL UnPackMe 094943口吕0040401463 00000000 PUSH 0口Modu Le 二 HULL00404014FF1E F411400 C口LL DliJORD FTF: DS: E40UF4LGetModu LeHandL已口0040401F3 07F94000 riOU DWORDRTF: DS: E40F007JElAX这里我们可以看到断在了 OEP处,如果大家还不放心的话,继续运行,会发现继续断在下一条指令处,可以进一步断定这里是OEP 了。这种方法对很多壳都有效,嘿嘿。4)堆栈平衡法(即ESP定律法)这种方法适用于一些古老的壳。这些壳首先会使用PUSHAD指令保存寄存器环境,在解密各个区段完毕,跳往OEP之前,会使用POPAD指令恢复寄存器环境。XII4::1:+JLEMTWU0409E:F0|60PIJSHHD这里我们来看看CRACKME UPX。00409BF6 跑斗09E:FC 00409EFD 00409C00 U0409C02 U0409C03 004A9C04 00409C05 00409C06 U0409C07 U0409C08 004A9C0口 跑斗09C0B 00409C0D 0O409C0E8DE:E U080FFF 5?83CD FFEE: 109090909090908 口 04688074701DE:JWORD RTF: DS: EESI+FFFF8000JSHORTFFFCKriE_-00409C12LE口 E PUSH EOF: EE:FFF jnp HOF HOP NOP NOP NOP HOF MOU INC nou INC HDDRTF: DS: EESIRLpBVTEESIBYTE FTF: DS: EDI, HL EDI我们可以看到第一条指令就是PUAHAD,有的情况下保存寄存器环境可能不是第一条指令但也在附近了,还有些情况下,有些壳不 使用PUSHAD,而是逐一 PUSH各个寄存器(例如:PUSH EAX,PUSH EBX等等),总而言之,在解密完区段,跳往OEP之前会恢复寄存器环境。这里我们按F7键执行PUSHAD:0012FFO80012FF 口匚:0012FFE0A012FFE4A012FFES6012FFBC0012FFC00012FFC40012FFCSA012FFCCA012FFD06012FFD40012FFDSA012FFDCA012FFE00012FFE46012FFE30012FFEC0012FFF0A012FFF4A012FFFS6012FFFC7C920738 FFFFFFFF 0012FFF0 0012FFC4 7FFDS0A0 7C91EB94 0012FFB0 HHHHPIPlFlFl 7C816D4F 7C92073S FFFFFFFF 7FFDS900 8054 口和 0012FFCS 82E7SD口8 FFFFFFFF 7CS399F3 7CS16D58 00000000 00000000 00000000 00409EF0 00000000ntdl L K l Fast Sy st emCa L L F:etRETURN ntdl L 7T:9erne 132FC81EQ4FEnd of SEH chainSE handlerkern el 32 CROCKME- 可以看到各个寄存器的初始值被压入到堆栈中了,这里我们可以对这些初始值设置内存或者硬件访问断点,当解密例程读取这些初始值的时候就会断下来,断下来处基本上就在OEP附近了。这里我们可以通过在ESP寄存器值上面单击鼠标右键选择-Follow in dump在数据窗口中定位到这些寄存器的初始值。_ I A _ * IEBX 7FFDS000ESP O012FFPMEE:P U012FFF0 ESI FFFFFFFFEDI7C920738p 100 0 1000 L I FE CF口ZSTDO Essssss0023001E:00230023003E:0000In 匚 rementDec rementZero5et to 1ModifyCopy selection to clipCopy all registers to tSTS epipty -UQT 1 C-MI-hl- I I AFollow in Dump数据窗口中显示的堆栈内容如下:Hddress0012FFH40012FFE40U12FFC40U12FFD40U12FFE40012FFF4Hew dum口0 0 F 2 0 0 0 0 F s 0 0 22F700 1 1 |j_ no 一MFl- F F F D A- 0 F F F _y 0 0 0 0 F _y 0 0 FBF 口口二M FCC0C0 F77070 F12 210 F _y 910- 4 FB7FDB FE0F69 F 4 _y 0 _y 0 F_y 3 c 5 F c F c 0 c 0 777s 7 0 2D1430 9F_y5o-0 70 D9 0.- 0 0 8 E 口 _y 0 8 0 F _y 3 0 3043F 0F 0 0 F 0F0 8F000FF0007F 02 0 D F 010 F F 0这里我们可以对这些初始值的第一个字节或者前4个字节设置硬件访问断点。口SCI I5E*ura.- u m 0X - El UT-a - c- o 8 o 日fa-口 SCIIHddress Hew dum口BBIZFF口4A012FFB40012FFC4A012FFD40U12FFE40U12FFF4201430 _y F 8 E s 07 0 D 9 9 0 _H二yG 口 q-u 80FS30 3043F020DF01 0 F F 0A- 0 F F00 07F 08-E!-*- *0mu:8-E!护由笑T护 t.iLAe dalXmu:-0*0BreakpointSearch forFollow DWORD in DisassemblerFollow DWORD in DumpGo toMemory on a匚cessMemory on writeHardware on accessHardware on writeHardware on executionByteWordDword选择字节,字,双字都可以,只要解密例程在读取这些值的时候断下来就OK,运行起来。III :|T:| /:|i:| -O| F|r- I t I 1V1| i 1 VY| n0040903383C3 U4ADD EBXr400409D36严 EE: ElJMP SHORT CRHCKME .0040901900499038 FF96 60950001CALL DWORD PTR DS:EESI+9560J00409D3E 61POPOD0S409D3F- E9 BC72FFFFJHP 匚內 ME_.00401000I 00409044DB 00 X00409045DB 001 i7ii7i.-1 MOri.d i:no QQ我们可以断在了 POPAD指令的下一行,当壳的解密例程读取该值的时候断了下来紧接着下面就是跳往OEP处,说明这个方法起作 用了。我们再来看看 UnPackMe_ASPack2.12。我们可以看到第一行也是PUSHAD,我们依然按F7键执行PUSHAD,然后还是通过在ESP寄存器值上面单击鼠标右键选择-Follow口 SCIIin dump在数据窗口中定位到这些寄存器的初始值。EC:;: U012FFE0ED:;: 7C91EE94EBX 7FFD7000ESP 0012FFA4EBP 0012FFFS ESI FFFFFFFF EDI 7C920738EIP U04U002C 1 ES 0023P O CS 001E: 口 0 SS 0023Z U DS 0023S 1 FS 003B T fi GS fiHHH 匚1 00 0 LastErrEFL U0000283STU empty -USTI epipty 0Inc rementD 已匚 rementZero5et to 1Fnllnw inFollow in DumpntdL LKLFastSystenCaModifyCopy sele匚ti匚ii tu dipt 匚upy all registers to 匚口ddress Hew dump001ZFF口40012FFE40012FFC40A12FFD40012FFE49012FFF4201430_y F 8 5 _y 07 0 D 9 9 00 7 口 9- 08 0 F s 3 03043F 07 - .I-.I E2 0 D F 01 0 F F 05E-U 口 -u mLr 6R-2 XR- up-a - 口鬥因0 8o a BreakpointMemory-j on accessMemory-j on writeHardw-zirej on access 1ByteHardwarej on write卜WordHardwarej on executionDword *5earch forFollow DWORD in DisassemblerFollow DWORD in DumpGo to运行起来。k|E:8 01000000C2 0C00 *68 00404000M0U EHXF1RETN 0CPUSH UnPackMe.00404000RETNMm i 匚口址 nhiripn 口t口 益益匚口口我们可以看到断在了跳往OEP PUSH 404000指令之前,我们继续按F7键单步。可以看到到了 OEP处。这里要给大家说明一点,现在很多壳都能检测这种方法,所以说大家可以多多汲取一些方法和经验,尝试不同的方法,才能知道那种 方法最合适。我们继续来看其他定位OEP的方法。5)VB应用程序定位OEP法(Native或者P-CODE)定位VB程序的OEP比较容易,因为VB应用程序都有一个特点-开始都是一个PUSH指令,紧接着一个CALL指令调用一个VB API函数。我们可以使用Patch过的OD,首先定位到VB的动态库,接着给该动态库的代码段设置内存访问断点,当壳的解密例程解密完原程序各个区段接着就会断在VB DLL的第一条指令处,接着我们可以在堆栈中定位到返回地址就可以 来到OEP的下一条指令处。这里我们也可以使用前面介绍的方法-跟逐一给各个区段设置内存访问断点(使用Patch过的OD),但 是很多壳会检测这种方法,所以大家可能根据需要不同的情况来尝试这不同的方法。这种方法很容易理解,我就不举例子了,以后大 家如果遇到了 VB程序可以试试这种方法。6)最后一次异常法如果我们在脱壳的过程中发现目标程序产生大量异常的话,就可以使用最后一次异常法,我们来看一个例子,名字叫做 ”bitarts_evaluations.c。我们还是使用Patch过的OD来加载它,并且配置好反反调试插件。然后将EXCEPTIONS菜单项中的忽略各个异常的选项都勾选上运行起来。Coded by Teddy Rogers / SnD Team 2005 XCrunch 5.0.0 UnPackMeCompression + EncryptionIf you unpack it write a tutorial.:)Aceptar我们可以看到程序运行起来了,我们单击工具栏中L按钮打开日志窗口。LEMTWHC/KBR+ + +ss_.004e310Hod Lf LCSt Ldn of SE-qpitTi t I E:EDX 33Sh ift constant out of ran匚0046F3F0 70810856 0046EF14 0046ECH1 00ES008E 0046EF14 0046ECA1 00E:H008E 0046EF14 0046ECH1 00EC00SE 0046EF14 0046ECH1 00EE008E 0O46EF14 0O46ECH10046E88F EE:4SS000 5B19W0 746BB000 73261900 74DL:l000 60301000 7C34I000 1 000iB000 7bFlft000 7631B000 7631B000 76F10000 00B60S00 ?4C10000 76030000 77730000 FF口E0000 TV 口F0000 76S90000 ?6E:
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!