对壳的一些理解

需要两个文件:待加壳的a.exe和加壳程序。加壳程序对a.exe文件处理后,对a.exe做的手脚也就是清除或者加密原文件的IAT和各个段(代码和数据段等),并且会在a.exe文件中新增加一些内容,这些内容可能独立的在一个新的段中,也可能在原来的段中,一般新的内容是可执行的,这些新的内容就构成了外壳程序;外壳程序的作用就是对加壳程序的所作所为“负责“,加壳程序对a.exe文件各段加密和压缩,那外壳程序就要对a.exe文件的各个段解密和解压缩。

细节:1、加壳程序的处理,修改程序入口点,使先执行自己的程序段,加壳程序在a.exe文件中新增加一个自己的输入表,修改a.exe原文件PE头中的指向输入表的指针为指向自己建立的新的输入表,加壳程序还会对原文件中数据加密压缩;2、外壳程序,对已经加壳的文件各区段解密,填充原来的IAT,跳转来OEP。

Stolen Bytes:是一种保护技术,把OEP处的代码搬移出来一些,这样在外壳程序处理完事情后,不是直接跳转到原来OEP,而是先执行一些代码再跳转,使壳和原程序没有明显的分界线,增加了迷惑性吧;

外壳程序需要的函数:一般情况下必须的有,LoadLibrary用来载入模块如Kernel32.dll等,GetProcAddr用来得到其他函数(如VirtualAlloc申请内存)的地址,还有GetModuleHandle函数和LoadLibrary功能相近;当然外壳程序会用到 的函数会有很多,其他的函数都能通过这三个函数来调用;

找OEP方法:1、两次内存断点法,外壳程序对原来数据段解密填充时会写入一次,把所有断解密完成后对原代码段执行时会访问一次,对其他段的读取也会有一次访问,一种方法是在.data数据段设置断点,再在代码段.text设置断点;第一次运行到断点处时把text段解压完毕,开始解压数据段,第二次运行到断点处时开始执行所有段解压完毕,开始执行代码段。2、ESP定律,外壳代码执行开始处一般会对栈操作(并且操作都是以压栈开始),假如程序装入OD时ESP为*******4,第一回对栈操作(压栈)后ESP会变化为*******0,对*******0下硬件断点并执行程序会到外壳程序出口处,也就是到了OEP处;其原理是堆栈平衡原理,外壳程序相当于一个子程序,子程序操作完时会把栈恢复到原来的状态,这样为断点找子程序的结束成为可能。hr是硬件读操作断点,hw硬件写操作断点3、根据编译语言,不同的编译语言在程序开始前会调用一些启动函数来处理初始化工作,然后再执行main函数,例如VC6会调用GetVersion函数,通过断点(hr  GetVersion)这些函数来完成找到OEP。

 

壳的工作猜想:壳会间接调用VirtualAlloc等函数来在内存中申请一些内存来运行其他重要的函数,因为原始的函数只有LoadLibrary和GetProcAddr等;

posted @ 2012-12-16 21:08  deeeeeed  阅读(261)  评论(0编辑  收藏  举报

pppppppppppppp