Pespin 1.32全保护手工分析之一Debug Blocker(续)

合集下载

Pespin 1.32全保护手工分析之二API Redirection

Pespin 1.32全保护手工分析之二API Redirection

破吧独家首发】Pespin 1.32全保护手工分析之二API Redirection本文来自: 破吧论坛作者: hflywolf 日期: 2009-11-19 14:06 阅读: 413人收藏Redirection, API, Pespin, 手工【详细过程】前言:先说几句闲话开下头:)在上2篇分析文中,我已经就Debug Blocker处理的过程分析完成了。

我在上篇文章说过当过掉两处Int1单步异常后子进程中的异常已经处理完成,此时子进程的后续代码以及原始程序代码也都全部解开完毕,所以子进程的流程接下来就要开始API Redirection的处理了,这就是我这篇文章的重点分析的地方。

想必大家应该也看过有关通过Patch某个关键地方来修焉pespin壳对API 重定向了的破文或视频了吧?嘿嘿,只是这些破文或视频只给出Pacth的地方以及方法,而没有说明为什么要在那个地方Patch?而patch方法的原理是什么?我说学习的目的不但是要知其然,而且还要知其所以然。

如果你也想知其所以然的说,那就跟着来往下看吧!三、分析API Redirection 保护过程以及如何通过PA TCH来跳过API Redirection的保护看代码:0041D791 C3 retn ;回顾一下前文,在第二int1异常后,我们在这新建EIP ,F7走0041A6AD /EB 04 jmp short 0041A6B3 ;返回到这里,F7大胆往下走0041A6AF |7A EB jpe short 0041A69C0041A6B1 |04 9A add al, 9A0041A6B3 ^\EB FB jmp short 0041A6B00041A6B6 F685 916B4000 0>test byte ptr [ebp+406B91], 1 ;F70041A6BD 74 51 je short 0041A7100041A6D0 BB 80080000 mov ebx, 880 ;ebx=0x8800041A6D5 0BDB or ebx, ebx ;size!=00041A6D7 74 37 je short 0041A710 ;等于0,不处理0041A6D9 2BC0 sub eax, eax0041A6DB 2185 B7574000 and dword ptr [ebp+4057B7], eax ;将[41B465]内容清零0041A6E1 E8 01000000 call 0041A6E70041A6E7 59 pop ecx0041A6E8 6A40 push 40 ;flProtect = 40 (64.)0041A6EA68 00300000 push 3000 ;flAllocationType = 3000 (12288.)0041A6EF 53 push ebx ;dwSize = 880 (2176.)0041A6F0 50 push eax ;lpAddress = NULL0041A6F1 8D6424 FC lea esp, dword ptr [esp-4]0041A6F5 81C1 23000000 add ecx, 230041A6FB 890C24 mov dword ptr [esp], ecx ;41A709 调用VirtualAlloc 返回的地址0041A6FE FFA5 EE574000 jmp dword ptr [ebp+4057EE] ;调用VirtualAlloc API 申请地址为Buffer IA T redirection用的0041A709 50 push eax ;Buffer = 0x920000 (我这里申请到的内存地址)0041A70A8F85 AF574000 pop dword ptr [ebp+4057AF] ;存放到[41B45D]0041A710 8D85 57183400 lea eax, dword ptr [ebp+341857]0041A716 8D80 5F320C00 lea eax, dword ptr [eax+C325F]0041A71C 48 dec eax0041A71D FFD0 call eax ;CALL 41A763 F70041A763 830424 05 add dword ptr [esp], 50041A767 C3 retn ;F7 返回41A7240041A724 8D85 36EA6A61 lea eax, dword ptr [ebp+616AEA36];F70041A72A2D 9E822A61 sub eax, 612A829E0041A72F EB 02 jmp short 0041A7330041A761 FFD0 call eax ; CALL 0041C446 F7进0041C446 8D85 3E56D6F9 lea eax, dword ptr [ebp+F9D6563E]; F70041C44C EB 07 jmp short 0041C4550041A7AC 83C4 04 add esp, 4 ;一直F7到这里0041A7AF 8BB5 F74D4000 mov esi, dword ptr [ebp+404DF7] ;0041A7B5 03B5 A9574000 add esi, dword ptr [ebp+4057A9] ;esi=0x4054A4 -> 原始程序的输入表结构0041A7BB E8 03000000 call 0041A7C3 ;F7// 输入表结构如下:004054A4 00 00 00 00 00 00 00 00 00 00 00 00 90 56 00 00 ............怴..004054B4 DC 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 躊..............004054C4 AC 56 00 00 00 50 00 00 00 00 00 00 00 00 00 00 琕...P..........004054D4 00 00 00 00 C6 56 00 00 D4 50 00 00 00 00 00 00 ....芕..訮......004054E4 00 00 00 00 00 00 00 00 A8 59 00 00 28 50 00 00 ........╕..(P..004054F4 00 00 00 00 00 00 00 00 00 00 00 00 61 8D 01 00 ............a?.00405504 E0 8C 01--》这个值0x18CE0是壳处理IA T结束的标志,后面我会指出判断的地方0041A7CC 3BB5 A9574000 cmp esi, dword ptr [ebp+4057A9] ;[41B457]=004000000041A7D2 EB 07 jmp short 0041A7DB ;F70041A7DE /75 0F jnz short 0041A7EF ;这里跳0041A7EF 817E 10 E08C010>cmp dword ptr [esi+10], 18CE0 ;看到没,这里判断了,是DLL 处理完的标志0041A7F6 9C pushfd ;下面的代码就是这壳前面常见到的技巧,其实就是个跳转的变形0041A7F7 EB 01 jmp short 0041A7FA;由上面的比较结果产生的标志位来决定跳向哪里0041A7FA C12C24 06 shr dword ptr [esp], 6 ;看到这里的代码是否很熟悉哈!壳反复使用这样的技巧0041A7FE 832424 01 and dword ptr [esp], 10041A802 50 push eax0041A803 52 push edx0041A804 B8 187891BE mov eax, BE9178180041A809 05 798A6E41 add eax, 416E8A790041A80E F76424 08 mul dword ptr [esp+8]0041A812 8D8428 7A4B4000 lea eax, dword ptr [eax+ebp+404B7A]0041A819 894424 08 mov dword ptr [esp+8], eax0041A81D 5A pop edx0041A81E 58 pop eax0041A81F 8D6424 04 lea esp, dword ptr [esp+4]0041A823 FF6424 FC jmp dword ptr [esp-4] ;0x41A828(没处理完) 0x41AAB9(处理完了)复制代码由于我们要分析API Redirection处理的过程,所以我们走0x41A828这线路,在走之前可以先在0x41AAB9地址上设好硬件执行断点以下的过程我就分析一次加密的过程,即USER32.GetDC 这个API的加密,在后面我会讲解如何PA TCH。

Eclipse编程中的Debug工具的使用方法

Eclipse编程中的Debug工具的使用方法

Eclipse编程中的Debug工具(即自动找错工具)的使用方法: 首先在Eclipse中编写一段代码以下边代码为例
看到代码左边的蓝条
找到int n=10,X=5,y=2;这行点击鼠标右键,
点击Toggle Breakpoint
点击后就会在int n=10,X=5,y=2;这行左侧位置出现一个小蓝点
然后在程序栏上点击小虫子图案(Debug)按钮
点击后会弹出以下对话框
问的是要不要更换画面点击“yes”
就到了下边的全新界面
其中区域A 是写代码区域;区域B 是显示变量值的区域;C 区域是程序输出的位置
小箭头指到哪行就是接下来要执行的代码。

点击图片中箭头位置名为(step over )程序就会向下继续读代码。

其中H 标黄色是表示H 值相对原来值有变化了。

程序完全执行完后点击step over 后会出现以下:
不用管。

点击Resume 表示Debug
完成。

A
B
C
点击Resume表示Debug完成出现下边对话框
那接下来怎么回到原来的位置,首先移动到程序最右边,在右上角显示目前在debug模式下,
点击它左边java按钮
就回到了Eclipse熟悉的编辑代码的页面。

可以通过右上角在两个界面来回切换。

如果又上角没有Debug按钮了,点击java左边加号按钮
出现下边对话框
点击debug就回到了debug界面。

本质上debug和自己读代码作用一样;如果程序写不出来的时候用下debug就能找出是哪里出了问题。

友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。

RSView32命令集最终版

RSView32命令集最终版

AcknowledgeAcknowledge [tag_name]确认一个或一组报警。

此命令不能对已经执行的,但对执行过程中如有错误产生,可以显示出一条信息。

如有确认位同报警相关,确认报警会将确认位置位.[tag_name] 被确认的标签名称.可以是一个标签的名称或含有通配符的标签名称或[tag]文字字符串.如没有设定标签,此命令将确认最近的最严重等级的未确认的报警.[tag] 确认激活的图形显示中高亮对象有关的标签报警.注意:如果报警发生的速度很快,不要使用没有标签名称的Acknowledge命令, Acknowledge命令将可能对新报警进行确认而不是对用户打算确认的报警.举例: Acknowledge命令Acknowledge Hopper1\Flow确认所有对标签Hopper1\Flow的报警.Acknowledge Hopper1\*确认在文件夹Hopper1中的所有的标签的报警Acknowledge *确认所有报警Acknowledge [tag]确认在激活图形显示中高亮对象有关联的标签报警AcknowledgeAllAcknowledgeAll确认全部报警。

此命令比Acknowledge*命令运行速度快。

此命令不能对已经执行的,但对执行过程中有错误的可以显示出一条此命令中对信息。

如果报警有确认位,确认报警为,确认报警会将确认位置位。

此命令中对标签数量没有限制。

ActivityActivity打开活动记录设置(Activity Log Setup)编辑器ActivityBarOnActivityBarOn显示活动条用户第一奖活动条拖离原位,移动到屏幕的任何位置移动时先点中Clear和Clear All之间的位置,然后拖动鼠标。

点击标题条并拖动该条直到碰触到RSView32的状态条,就可以使活动条复位。

拖动活动条的一角或一边旧可以重新设置其尺寸。

ActivityBarOffActivityBarOff隐藏活动条ActivityOffActivityOff停止活动记录ActivityOnActivityOn启动活动记录ActivityViewerActivityViewer打开活动记录查看器(Activity Log Viewer)AlarmAlarm打开报警设置(Alarm Setup)编辑器AlarmLogOffAlarm Log Off停止报警记录AlarmLogOnAlarmLogOn启动报警记录AlarmOffAlarmOff停止报警监视此命令不能显示已经执行的,但对执行中有错误的可以显示出一条信息。

破解工具大全

破解工具大全
ompilers) )
VFP 程序 优点:界面和功能较实用 UnFoxAll 3.0 专业增强版 缺点:支持到 vfp6 sp3 后再没更新,反编译还有不少错误,尤其是 SQL 语句方面,表单代 码没法反编译。 FoxTools 是继 Refox 和 Unfoxsll 之后的又一反编译 fox 程序的利器。 /showthread.php?s=&threadid=9114 VFP&EXE2.0 专业版/3.0 企业版还原精灵(公开发行版),本公开版能还原 VFP&EXE2.0 专 业版/3.0 企业版加密后的程序 . 支持 VFP6R.DLL(SP0)/VFP7R.DLL(SP0)/VFP8R.DLL(SP0),也就是说可以对付 VFP6/7/8 各 Foxspy1.73 + v1.93 源码 版本的程序了 /showthread.php?s=&threadid=14361 Delphi 程序 DeDe 3.5 原版。反 Delphi、 C++ bulid。(DeDe3.2004 源码下载) 原版 DEDE 3.50.4 的修改版(超强版:P) by DarkNess0ut 01.修改了 Title 和 ClassName "DeDe"->"DarK",绝大部分的 Anti 检测都没有用了 02.DIY 原 DEDE,使得可以反汇编得到非标准程序的 Forms 格式和 Procedures 的事件 03.直接反汇编功能的选项 04.增加对特殊处理过的 PACKAGEINFO 的 Uint List 的显示 05.修改原有的"Open With DEDE"的注册键错误&BUG,可以使用右键运行 DEDE 反汇编 Delphi/BCB DeDe3.50.04 Fix 加强版 06.去处 NAG 显示 07.修复原有 Dump Active Process 的 BUG 08.Enable Dump 按钮 09.修复拖放处理程序时,确认对话框的 BUG! 10.修复 Forms 下将 DFM 保存为 RES 文件的 BUG! 11.Enable Procedures 下右键的 Analize Class 功能 12.修复 Forms 下 DFM 的"Open With NotePad"功能 13.heXer 提供修复反汇编引擎的代码,主要是解决了反汇编的错误 e 语言 世界上第一款易格式可执行文件分析器 E-Code Explorer. 官方站点:/ ljtt

pe32基本结构

pe32基本结构

pe32基本结构摘要:1.PE32的基本概念2.PE32的结构组成3.PE32的重要部分及其功能4.PE32的应用领域5.总结正文:PE32(Portable Executable 32-bit)是一种可移植的可执行文件格式,广泛应用于Windows操作系统中。

它主要由两部分组成:头部(Header)和节(Section)。

本文将详细介绍PE32的基本结构,以便读者更好地理解和应用这一重要技术。

一、PE32的基本概念PE32是一种32位的可执行文件格式,它起源于微软为取代NE格式而开发的一种新的executable 文件格式。

与NE格式相比,PE32格式具有更好的可移植性和更强大的功能。

二、PE32的结构组成PE32文件的结构主要由以下几个部分组成:1.魔数(Magic Number):位于PE32文件的开头,用于标识该文件是一个PE32格式的可执行文件。

2.机器代码(Machine Code ):用于表示程序的指令,由计算机硬件直接执行。

3.代码签名(Code Signature):用于验证代码的完整性和来源,确保程序不被恶意篡改。

4.导入库(Import Library):用于链接程序依赖的外部库。

5.导出符号(Export Symbol):用于向其他程序提供本程序的接口。

6.资源(Resource):包括程序需要的图形、音频、文本等资源。

7.调试信息(Debug Information):用于调试程序的详细信息。

8.入口点(Entry Point):程序开始执行的地址。

三、PE32的重要部分及其功能1.魔数:它是PE32文件的一个关键组成部分,用于识别文件格式。

不同的魔数对应不同的文件类型,如PE32、PE32+等。

2.导入库和导出符号:这两个部分用于实现程序的模块化。

导入库表示程序依赖的外部库,导出符号表示程序向其他程序提供的接口。

3.资源:这些资源包括程序运行所需的图形、音频、文本等数据。

进入保护模式完整代码(汇编)

进入保护模式完整代码(汇编)

进⼊保护模式完整代码(汇编)⼀开始使⽤C编写进⼊PM代码,因为内嵌汇编太多,不易查询汇编如何出错,所以改⽤纯汇编编写。

过程中学到⼀个⼩技巧,当赋值的数太⼤时,编译会报错,这时在数前加个0即可解决。

程序编译完成,基本过程已然了解,但是在测试机上跑的时候会⾃动重启。

;;;;;;;;;;;;;;;;;;;程序开始;;;;;;;;;;;;;;;;;;;data structjump macro selector, offsetdb 0eahdw offsetdw selectorendmdesp strucsegLimit dw 0; byte0, 1segBaseLow dw 0; byte2, 3segBaseMid db 0; byte4segAttribute dw 0; byte5, 6segBaseHigh db 0; byte7desp endspgdt strucsegLimit dw 0ffffh; byte 0, 1segBase dd 0; byte 2, 3, 4, 5pgdt ends;--------------------------------------------------------------------; real mode data segment begin;.data.386p; if not p, lgdt is not defineddseg segment use16; gdt segment begingdt label byteDUMMY desp <>; 空描述符dataSegDesp desp <0ffffh,0h,0h,092h,> ; data segment isstarted with: 0x00000000hdataSegSel = dataSegDesp - gdtcodeSegDesp desp <0ffffh,,,098h,>codeSegSel = codeSegDesp - gdtextSegDesp desp <0ffffh,,88h,092h,> ; ext segment is started with: 0x00880000hextSegSel = extSegDesp - gdtgdtLen = $ - gdtpgdtr pgdt <gdtLen-1, >; gdt segment end; pmode data segment beginbuffers db 256 dup('@')bufferLen = $ - offset buffersmsgLen = $ - offset msg; pmode data segment endbufferd db 256 dup('y')bufferd2 db 256 dup('x')dseg ends; real mode data segment end;--------------------------------------------------------------------cseg segment use16;.codeassume cs:cseg, ds:dsegstart:MOV ax, dsegMOV ds, ax;prepare to jump to pmode;1>. init gdtr;2>. init code descriptor;3>. init data descriptor;4>. enable a20 address;5>. set cr0;6>. jump pmode;1>. init gdtrMOV bx, 16MUL bxADD ax, offset gdtADC dx, 0MOV WORD PTR pgdtr.segBase, ax MOV WORD PTR pgdtr.segBase+2, dx ;2>. init code descriptorMOV ax, csMUL bxMOV codeSegDesp.segBaseLow, ax MOV codeSegDesp.segBaseMid, dl MOV codeSegDesp.segBaseHigh, dh ;3>. init data descriptorMOV ax, dsMUL bxADD ax, offset buffersadc dx, 0MOV dataSegDesp.segBaseLow, ax MOV dataSegDesp.segBaseMid, dl MOV dataSegDesp.segBaseHigh, dh lgdt pgdtr;4>. enable A20 addresscli;call enableA20PUSH axin al, 92hor al, 2out 92h, alPOP ax;5>. set cr0MOV eax, cr0or eax, 1MOV cr0, eax;6>. jump to pmode;JMP pmodejump <codeSegSel>,<offset pmode> pmode:MOV ax, dataSegSelMOV ds, axMOV ax, extSegSelMOV es, ax;;;;;;;访问SPI空间的内容;;;;;;;;;mov ebx,[0fed1f800h]mov ds:[0000],ebxmov dx,0mov ah,9int 21h ;;;;;;;;;;;;;;;;MOV eax, cr0and eax, 0fffffffehMOV cr0, eaxJMP rmodermode:call disableA20stiMOV ax, dsegMOV ds, axdisableA20 procPUSH axin al, 92hand al, 0fdhout 92h, alPOP axRETdisableA20 endpMOV ah, 4ch int 21h cseg ends END start。

使用IDA调试和反汇编受保护的PE文件

使用IDA调试和反汇编受保护的PE文件

使用IDA调试和反汇编受保护的PE文件
1、PE文件的受保护
PE文件是受到可执行文件保护的。

如果需要从PE文件中提取原始代码或其他重要信息,则必须进行反汇编,这也是保护PE文件所必需的。

保护PE文件的主要目的是防止把PE文件中的代码暴露给外部的攻击者。

除了最基本的反汇编之外,一些加壳程序和虚拟机可以防止PE文件的被反汇编。

调试受保护的PE文件就是要对PE文件进行调试,这是非常重要的,因为它可以帮助我们找到程序中隐藏的漏洞或把现有解决方案改进。

调试受保护的PE文件的最佳方法是使用IDA调试器,它同时提供了反汇编和汇编的功能,还可以查看PE文件中的每个断点,确定其变量值或参数等等。

另外,IDA调试器还支持在反汇编的代码中添加断点和观察点,并提供复杂的goto、step 进、step out等功能。

反汇编受保护的PE文件可以帮助我们更好地了解软件的实现,并找到隐藏在其中的bug或漏洞。

反汇编PE文件是一个复杂的过程,因为受保护的PE文件通常会使用一些反调试技术,比如虚拟机和加壳程序。

为了解决这个问题,就需要一个强大的反汇编工具,帮助我们破坏反调试技术的护罩,从而使反汇编过程更加容易。

电脑组装不求人:Debug常见错误代码解析

电脑组装不求人:Debug常见错误代码解析

电脑组装不求人:Debug常见错误代码解析虽然PC个人电脑经历了数十年的发展,品牌机与笔记本电脑早已成为不少企业和家庭用户的标配,但是在台式机市场,DIY组装机仍然牢牢地占有一席之地。

这是因为要想满足不同消费者,特别是游戏玩家与发烧友那千差万别的个性化需求,目前而言还只有DIY才能做到。

不过因为DIY一台电脑要涉及CPU、散热器、内存、主板、硬盘、显卡等多种配件,所以即使是玩家中的老司机,在组装电脑的时候也常常会遭遇一些问题,譬如机器无法点亮、喇叭长鸣报警等等。

过去要想查找这些问题的来源,玩家往往只能依靠PC喇叭发出的几长几短的故障提示音。

然而故障提示音的种类繁多,不管是分辨还是查找起来都相当费时费力,颇为麻烦。

幸运的是,随着主板技术的不断发展,相关产品的设计和应用也开始变得越来越人性化。

譬如,在产品功能的易用性方面,不少中高端主板就专门为DIY玩家提供了Debug灯,可以通过不同的指示灯组合代码让玩家更加轻松快速地找出故障原因并加以解决。

这也让电脑组装比过去方便快捷了许多。

以笔者手中的这块iGame Z270主板为例,该主板就配备了一块可以显示三位字母或数字的Debug灯。

其中后面两位可以通过不同字母或数字的排列组合,来分别代表不同的故障类型,一共可以显示16组不同的状态。

值得一提的是,除了用来检测故障原因之外,玩家还可以通过功能切换按钮,用这组Debug灯来监控主板上各种配件的工作状态,譬如电压、温度等等,非常方便。

Debug灯常见错误代码一览:在常见的Debug灯错误代码中,出现特殊代码“00”或“FF”及其他起始码,一共有以下三种情况:(1)在自检显示一系列其他代码之后,再出现“00”或者“FF”,说明主板正常点亮,工作状态正常。

(2)如果CMOS中的设置无误,那么只要是不那么严重的故障,都不会影响BIOS自检,并最终出现“00”或“FF”。

(3)如果系统一开机,Debug灯就出现“00”或“FF”又或是其他起始代码,并且始终没有变化,则说明主板没有成功运行,这时就需要查看相应的错误代码来判断问题缘由了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

破吧独家首发】Pespin 1.32全保护手工分析之一Debug Blocker(续)本文来自: 破吧论坛作者: hflywolf 日期: 2009-11-17 17:31 阅读: 544人收藏Blocker, Debug, Pespin, 手工【详细过程】上篇文章在结尾的时候,由于时间关系,进程分离后还有很重要的工作没有分析到,这一篇我接着上回没有完成的工作来进行。

不知大家之前有没有看过大牛脱PESPIN壳的文章,我在这先说一下处理的方法。

看代码;0041CDE7 FF10 call dword ptr [eax] ;上回分析过了,这个CALL如果返回的EAX=0xB7。

说明互斥存在0041CDE9 BB CA7DB9FE mov ebx, 0xFEB97DCA ;此时双进程就变单进程,程序则走子进程的处理过程0041CDEE 81EB 137DB9FE sub ebx, 0xFEB97D13 ;ebx=0xB70041CDF4 3BC3 cmp eax, ebx ;如果相等,说明互斥存在0041CDF6 9C pushfd ;F7到这,将ZF标志置1(网上破文说的方法)0041CDF7 C12C24 06 shr dword ptr [esp], 0x6 ;0041CDFB F71424 not dword ptr [esp]0041CDFE 832424 01 and dword ptr [esp], 0x10041CE02 58 pop eax0041CE03 2BD2 sub edx, edx0041CE05 BB BAE74D02 mov ebx, 0x24DE7BA0041CE0A 81EB 86E74D02 sub ebx, 0x24DE7860041CE10 F7E3 mul ebx0041CE12 81CB FE12F40E or ebx, 0xEF412FE ;通过ZF标志位是否为1来计算0X41CE24处指令跳向哪里!0041CE18 8D8428 A60C91ED lea eax, dword ptr [eax+ebp-0x126EF35A];如果ZF=0即互斥不存在则跳向父进程处理过程eax=0x41CE710041CE1F 2D 179B50ED sub eax, 0xED509B17 ;如果ZF=1即互斥存在则跳向子进程处理过程eax=0x41CE3D0041CE24 FFE0 jmp eax ;F2,F9,F2 (F8走下来也可以,但不能F4)。

此时跳向0x41CE3D0041CE3D F1 int1 ;跳这。

发现INT1,也就是单步异常。

此异常是由父进程处理的。

0041CE3E E8 1C030000 call 0041D15F ;后面我会分析父进程处理异常的过程。

0041CE43 85C0 test eax, eax ;在网上看到的破文这个地方有两种方法跳过去。

0041CE45 75 23 jnz short 0041CE6A ;其实这两种方法原理一样的。

现在我就为什么这样处理0041CE47 8BC3 mov eax, ebx ;分析一下。

0041CE49 35 08001F0E xor eax, 0E1F00080041CE4E C3 retn复制代码第一种方法(可以搜ximo的PESpin1.32学习笔记之Debug Blocker的处理) 0041CE3D F1 int1 ;先记下当前ESP的值和当前堆栈的值0041CE3E E8 1C030000 call 0041D15F ;Ctrl+G 输入0x41CE3E+0x1E(即0x41CE5C)0041CE43 85C0 test eax, eax0041CE45 75 23 jnz short 0041CE6A0041CE47 8BC3 mov eax, ebx0041CE49 35 08001F0E xor eax, 0E1F00080041CE4E C3 retn复制代码ESP值:EAX 0041CE3D LCGUnPac.0041CE3DECX 0013FF48EDX 00000000EBX 0EF412FEESP 0013FFC0 ;此时ESP=0x13FFC0(不同系统此值可能不同,记下你显示的即可)EBP 00015CAEESI 7C800000 kernel32.7C800000EDI 0041DDC6 LCGUnPac.0041DDC6EIP 0041CE3D LCGUnPac.0041CE3D堆栈的值:0013FFC0 0041951B 返回到LCGUnPac.0041951B ;这个地址要记下来(第二种方法是在这个地址上新建EIP的)0013FFC4 7C816FE7 返回到kernel32.7C816FE70013FFC8 0013C0C40013FFCC 006057280041CE5C 8B85 C66C4000 mov eax, dword ptr [ebp+406CC6] ;到这。

新建EIP (注意此时堆栈的值) F8往下走0041CE62 50 push eax ;注意这里压栈了。

此时ESP=0x13FFC0-0x4=0x13FFEC0041CE63 8D85 A6AC88ED lea eax, dword ptr [ebp+ED88ACA6]0041CE69 2D BD5448ED sub eax, ED4854BD0041CE6E FF10 call dword ptr [eax] ;释放Mutex 此时ESP=0x13FFC00041CE70 C3 retn ;堆栈的值是0x41951B 返回到这个地址。

0041951B B8 16D5D710 mov eax, 10D7D516 ;返回到这。

此时ESP=0x13FFC0+0x4=0x13FFC4(记住这里的变化)00419520 2BC9 sub ecx, ecx00419522 83C9 15 or ecx, 1500419525 0FA3C8 bt eax, ecx00419528 0F83 81000000 jnb 004195AF复制代码第二种方法(可以看Zoolander的视频),其实就是第一方法的变通。

0041CE3D F1 int1 ;先记下当前ESP的值和当前堆栈的值0041CE3E E8 1C030000 call 0041D15F ;Ctrl+G 输入0x41951B0041CE43 85C0 test eax, eax0041CE45 75 23 jnz short 0041CE6A0041CE47 8BC3 mov eax, ebx0041CE49 35 08001F0E xor eax, 0E1F00080041CE4E C3 retn0041951B B8 16D5D710 mov eax, 10D7D516 ;到这。

新建EIP 此时ESP=0x13FFC000419520 2BC9 sub ecx, ecx ;将esp 的值加4(看第一种方法的结果,知道为什么要加4了吧!)00419522 83C9 15 or ecx, 15 ;这就是堆栈平衡00419525 0FA3C8 bt eax, ecx00419528 0F83 81000000 jnb 004195AF复制代码看到了吧,网上破文的这两种方法其实是相通的。

区别就在第二种方法是在第一种方法返回后的地址处新建EIP,并将esp的值加上4我们接着跟着大牛脱壳的思路走, 在0x41CE5C或0041951B 新建EIP后Ctrl+B 查找二进制值(不推荐这个方法,因为有垃圾指令存在,无法准确定位到地址) F1 87 DF 57 C3或Ctrl+S 查找命令序列(推荐这个方法,因为可以直接定位到地址)int1xchg edi,ebxpush ediretn在这说明一下为什么要搜这个地址,其实要说清楚这个问题没个很长的篇幅是无法说明白了。

我就简单说下吧,因为程序执行到这个地方后,除了这个单步异常外,子进程中无法处理的异常都由父进程处理完了,子程程中能处理的异常由自已处理完成,然后将壳要加密原始程序API的代码,伪OEP处的代码、以及原始程序的代码也都全部解压完毕, 父进程也将原始程序有些关键地址的代码替换掉(即nanomites保护) 大概的意思就是这样。

搜到的代码如下:0041D765 F1 int1 ;来到这,又是int1,第二个单步异常. F2,shift+F9断下,F20041D766 87DF xchg edi, ebx0041D768 57 push edi0041D769 C3 retn复制代码断下后,也是要记下当前ESP的值和当前堆栈的值,这个地方也有两种方法处理.(发现网上破文只讲到在堆栈返回地址处新建EIP)ESP的值:EAX FFFFFFFFECX 00000000EDX 0041D72F LCGUnPac.0041D72FEBX B4801F41ESP 0013FFC0 ;此时ESP=0x13FFC0(不同系统此值可能不同,记下你显示的即可)堆栈的值:0013FFC0 0041A6AD LCGUnPac.0041A6AD ;这个地址要记下来(第二种方法是在这个地址上新建EIP的)0013FFC4 7C816FE7 返回到kernel32.7C816FE70013FFC8 0013C0C40013FFCC 00605728第一种方法: Ctrl+G 输入0x41D766+0x2B(0x41D791) 0041D791 C3 retn ;在这新建EIP 此时ESP=0x13FFC0 F8返回到0x41A6AD0041A6AD /EB 04 jmp short 0041A6B3 ;返回到这里. 此时ESP=0x13FFC0+0x4=0x13FFC40041A6AF |7A EB jpe short 0041A69C0041A6B1 |04 9A add al, 9A0041A6B3 ^\EB FB jmp short 0041A6B0复制代码第二种方法: (看明白第一次单步异常的分析的话,这里也就明白了) 0041A6AD /EB 04 jmp short 0041A6B3 ;这里新建EIP 并将当前esp 加上40041A6AF |7A EB jpe short 0041A69C0041A6B1 |04 9A add al, 9A0041A6B3 ^\EB FB jmp short 0041A6B0复制代码走到这里,子程序中无法处理的异常父进程都处理完毕了,后面壳就开始要加密API地址了。

相关文档
最新文档