首页 > 编程知识 正文

脱壳方法总结,记笔记的方法

时间:2023-05-05 07:07:12 阅读:143213 作者:1651

本文的示例程序是在upx中添加shell的APP应用程序

描述方法:手动单步跟踪法、ESP法则方法、内存二次断点法

一.手动单步跟踪法主要使用的两个快捷键F8和F4

F8 :一步一步

F4 )运行到指定位置(右键单击断点运行到指定位置F4 ) ) ) ) ) ) )。

1、逐级跟踪F8,如果遇到回跳循环,使用F4跳转到下一个执行循环的命令。

说明:遇到在地址0x0055B849返回的命令。 在这种情况下,用鼠标单击地址0x0055B84B,然后单击F4,程序将运行到地址0x0055B84B。 之后,继续追踪到F8就可以了。

2、有时在循环的以下命令中直接执行F4也不一定成功。 在这种情况下,需要自学分析循环弹出时跳到哪个命令。

通过分析0x0055B98F的jmp命令,我们发现用于结束循环的命令为0x0055B950,而je弹出的地址是jmp之后的第二个命令。 这与通常的第一个命令不同。 一般的jmp退出循环后,通常是jmp之后的第一条指令,但这个循环不同。 那么,如何解决类似的问题呢?

)养成良好的分析习惯,可以随访循环,判断这个循环弹出的指令在哪里。

)2)在jmp后面的几个命令中,可以选择F4,而不是下一个直接的开头。 例如,用图像最后一个红框中的命令F4可以避免这种问题。

注意:在某些情况下,jmp后的命令可能是nop命令。 如果用nop命令执行F4,则无法实现。 在这种情况下,程序会跳过。 解决方法与上述相同。

3、添加shell的程序运行时,首先进行解压缩操作,实现代码和数据的解密,修复IAT。 这些操作在一个分项中完成,完成后跳转到原程序的入口点OEP执行。 这个跳跃往往是分项的跳跃。

所以,当我们遇到大地址的跳转时,它可能是对章节的跳转,很可能是对OEP的跳转命令。

例如:

该命令是跳转到OEP的命令语句,是跨越1个段的跳转。

查看节信息:

部分UPX0范围:0x00401000~0x004EE000

段UPX1范围:0x004EE000~0x0055C000

可以看到,0x0055B9D4属于UPX1段,0x004E53C2属于UPX0段。

二、基于ESP定律该方法对许多压缩壶是通用的

ESP定律是什么?

每个函数的调用都在堆栈中有一个堆栈帧。 在整个函数刚进入时,将EBP (总是指向堆栈底部的指针)存储在堆栈中,然后向上移动当前顶部的ESP (总是指向堆栈上方的指针),留下合适的堆栈帧以供子函数使用,以实现子函数需要将ESP放回调用函数之前。简单理解ESP定律是栈帧和栈平衡的原理。

ESP定律使用的原理?

通过了解ESP定律的原理,您知道函数执行完成后,ESP指针将恢复到以前的状态。 现在,可以在ESP寄存器中设置以下硬件断点,以便在ESP返回到调用函数之前的状态时,即函数执行完成时中断。

因此,可以将shell的解压缩方法视为函数的调用。 例如,当添加了UPX shell的程序正在运行时,第一个执行的是upx解压缩的函数。 此时,保存EBP并移动ESP以在函数中留下足够的堆栈帧。 所有解压缩完成后,必须恢复所有堆栈帧,以将ESP恢复到调用函数之前的状态。 此时的硬件断点将会断开。 正好是解压缩函数执行完成的时候。 解冻完成后,跳到OOS!

ESP定律的使用

1、第一个指令是pushad指令,F8执行到下一个指令后,才能将我们的通用寄存器推入栈中。 (包含即将退出硬件断点的ESP寄存器。

2、ESP寄存器中的硬件断点

方法一:鼠标操作的方式

首先在数据窗口随访

然后,在数据窗口中,进行下一个硬件断点,如果从此开始向下,则为硬件访问断点DWORD

方法二:通过命令下硬件断点

HR :用于硬件访问断点的命令

3、F9直接运行程序,在断开之前,与F8继续几步,到达跳转到OEP的jmp指令的地方。

硬件断裂的地方,比如你会发现我们的跨跃只有几步之差,简单的F8和几步就可以了。

注:此时找到OEP后,必须删除硬件断点。 否则,以后调用函数也会断开。

在“调试”中选择硬件断点,删除硬件断点即可

三.内存二次断点法假设你是一个壳的作者,壳的解压缩代码如何来进行解压缩?

解压缩代码,然后解压缩资源…解压缩其他一些东东……也就是逐节解压缩。 因此,您可以将该节视为关键点,并使用该节下的断点搜索OEP。

注:通常为

的壳解压缩都是一部分一部分的解压缩(也就是按区段进行解压),而不是几行代码几行代码的解压缩(这样会比较耗时,涉及到解压缩效率的问题)。

内存二次断点法的原理
(1)首先在资源段上下一个断点,那么在解压缩代码的时候,程序依旧可以正常的运行,因为是先解压缩代码再解压缩资源的。当开始解压缩资源的时候,程序就会中断下来,因为我们在资源段上下了一个断点,此时中断的时候,代码已经全部解压,资源段正在准备解压…
(2)再在代码段上下一个断点,再继续运行,此时程序开始解压缩资源和其他的一些内容,等到全部解压缩完成以后,解压缩程序就需要跳转到OEP上运行,即跳转到代码段上运行,此时中断下来。
(3)再手动F8往下跟几步,就到达跨段跳转到OEP的指令位置。

内存二次断点法的实际使用
1、点击模块的缩写M,在模块窗口中找到我们自身程序所对应的模块。此示例中为upx模块

注:其他的是一些动态链接库的模块,如果模块找错的话,自然断点也就下错了!!!

2、在资源段(.rsrc)上按F2下一个断点,或者右键选择“在访问上设置中断”

然后点击F9,让程序运行起来

3、此时程序中断下来(中断在资源段上),我们不必关系程序在哪里中断下来,接下来我们只需要再在代码段上按F2下一个断点。

然后点击F9,再次让程序运行起来

4、此时程序再次中断下来(中断在代码段上)
中断的地方:

跨段跳转的位置:

接下来我们只需要在中断下来的位置再进行手动往下跟踪即能很简单的到达跨段跳转的地方。
不难看出,中断下来的地址与跨段跳转的地址相差很小,只需要简单的手工跟踪即可找到OEP。

注:本文中寻找OEP的方法,对于压缩壳一般都适用,但是对于一些保护壳就不适用了。

本文难免有所错误,如有问题欢迎留言

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。