两次内存断点法寻找OEP】的更多相关文章

所谓“两次内存断点法寻找OEP”,按照<加密与解密*第三版>上的解释来说,就是这样的.一般的外壳会依次对.text..rdata..data..rsrc区块进行解压(解密)处理,所以,可以先在.rdata..data等区块下内存访问断点,中断后,此时代码已解压,接着再对代码段(.text)下内存访问断点,即可到达OEP.…
 0x00 前言 上一篇介绍了壳程序的加载过程以及通过两次内存断点法寻找OEP,这篇我们将利用新的的方法——堆栈平衡法来寻找OEP. 0x01 堆栈平衡法原理 堆栈平衡原理就是利用壳程序在运行前后需要保存和恢复原程序的堆栈环境来实现的.我们可以把壳程序当作一个子程序,调用这个子程序前,肯定需要保存原程序的堆栈环境,子程序调用完毕之后,就需要pop处原堆栈的值从而实现堆栈平衡.通常来说,壳程序使用pushhad/pophad或者pushfd/popfd指令来实现.脱壳时可以实根据堆栈平衡原理对ES…
  0x00 前言 对于加壳程序第一件事就是要找到OEP(oringinal Entry point),由于加壳的缘故,当PE文件载入OD或者其他调试软件时进入的的往往是壳程序的入口地址.所以要进行逆向分析第一步就必须找到PE程序的原始入口点.   0x01 壳的加载过程 壳和病毒在某些方面比较类似,都需要比原程序更早获得控制权.壳修改了原程序的的执行文件的组织结构,从而比原程序更早获得控制权,并且并不会影响原程序的正常运行.了解的壳的加载过程对于脱壳加壳异常重要.壳的加载过程如下: 1)保存入…
一步直达法 所谓的一步直达法就是利用壳的特征.壳一般在执行完壳代码之后需要跳转到OEP处,而这个跳转指令一般是call ,jmp ,push retn类型的指令,而且因为壳代码所在的区段和OEP代码所在的区段一般属于不同的区段,所以我们可以通过搜索这些特殊指令的机器码并查看其跳转范围,如果跳转范围较大(也就是跨段跳转)则可以判断为此指令会跳到OEP处. 下面以UPX壳为例: 我们在OD中通过Crty + B来搜索二进制字串,call的机器码为E8,jmp的机器码为E9.这里我们搜索E9,通过Ct…
经过第一节的基础知识,我们都知道了,加壳程序首先解把原来压缩的代码解压,然后放到所对应的区块中,当外壳程序执行完毕后,跳回到OEP执行,我们都知道,OEP是放在代码段中,也就是当外壳程序处理完毕后,跳回到代码段来执行,那我们是不是可以利用壳的这个特点来进行脱壳呢?答案是肯定的,是可以的!有的时候紧紧在代码段下断是不够的,那怎么办呢?其实很简单,用两次内存断点就可以了,一般的壳会一堆对.text..rdata..data.rsrc区块进行解压,根据这个原理,我们可以在适当的时候,对其他的几个区段下…
1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:“在数据窗口中跟随”,到内存数据窗口,将内存数据窗口以HEX 数据形式显示,在刚才的地址起始位置上(如0012FFA4)上右键:“断点”->“硬件访问”->“字”,F9直接运行,再F8一次或二 次,一般会到push ebp这句代码,这句代码所在的地址,就是OEP. 2.二次断点法 OD载入后,点击“M”按钮进入内存映射页面,先在数据(data).资源(rsrc).rdata.idata等区段下访问…
1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:"在数据窗口中跟随",到内存数据窗口,将内存数据窗口以HEX数据形式显示,在刚才的地址起始位置上(如0012FFA4)上右键:"断点"->"硬件访问"->"字",F9直接运行,再F8一次或二次,一般会到push ebp这句代码,这句代码所在的地址,就是OEP. 2.二次断点法 OD载入后,点击"M"…
OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) 代表程序的入口点 POPAD (出栈) 代表程序的出口点,与PUSHAD相对应,一般找到这个OEP就在附近啦! 常见寻找OEP脱壳的方法:   方法一: 1.用OD载入,不分析代码! 2.单步向下跟踪F8,是向下跳的让它实现 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断…
转载自: https://www.zhihu.com/question/52625624 旅人的回复 作者:旅人链接:https://www.zhihu.com/question/52625624/answer/131557817来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 首先是关于内存断点的一些前置知识:1.在windows系统上,内存是一页一页的,也就是说并不是0x00000000~0x7FFFFFFF(0xFFFFFFFF)中任何一个地址都是可以访问的,…
素数的两种打表法 下面介绍两种素数打表法,由于是两年前留下的笔记,所以没有原创链接~~ @_@!! 第一种疯狂打表法: #include<stdio.h> #include<math.h> #define N 100000 int a[N]; ]; int main() { int i,j,k,n; ;i<=N;i++)//初始化表一 a[i]=; n=(int)sqrt(N);//注意n!!! ;i<=n;i++)//表一进行打表 { for(j=i+i;j<=…