使用OllyDBG进行简单的脱壳
OllyDBG是个好东西,它原本是用来调测程序的,但在破解领域它也是必不可少的工具之一! 所谓破解,就是通过添加、删除或者修改某个程序内一段机器指令来改变程序原来的执行顺序或执行条件! 一个可执行文件被压缩(加密)成一段代码(非机器码)并在头部写入解压缩(解密)代码的过程叫做加壳,反过来就叫脱壳!加壳后的程序是不可直接反汇编的,所以也就不能直接破解,要破解,就要先脱壳!今天发一篇入门级的脱壳(压缩加壳)文章,适用于懂一点编程技巧,但又不是破解老鸟的人:) 准备工作: 1、OllyDBG, 2、Dump插件(OllyDBG使用), 3、一些基本的汇编知识, 4、一个经过压缩加壳的文件, 5、WinXP, 2000操作系统. 先说点基本的汇编知识. 汇编是最低级的编程语言,在Win98及其以下的操作系统里通过汇编程序可以直接操作硬件,而在XP等系统内则要通过驱动模式才可以! 一条汇编语句(除伪指令)主要是由操作码及操作数构成,前面为操作码,后面为操作数,每条汇编语句(除伪指令)可以被翻译成一条机器码(通俗一点说就是每条汇编语句可以完成一个硬件单位功能),汇编语句格式如下: XXXX YY,XXXX为操作码,YY为操作数,操作数可以为多个(根据操作码的要求, 比如 MOV EAX, EBX) 要想完成这篇文章所说的操作,你只需要知道几个指令就够了。 第一个是PUSH(PUSHAD)指令,将操作数压栈(栈是什么?GOOGLE一下吧),格式: PUSH XXX(PUSHAD是把所有寄存器(除几个特别的寄存器外)压栈) 第二个是POP(POPAD指令,出栈到操作数(和上一个相对应),格式: POP XXX 第三个是MOV指令,将第二个操作数的内容复制到第一个操作数内,格式: MOV XXX, YYY 第四个是JMP(或JE、JNE等)指令,跳转到操作数,格式: JMP 0x012FF8C 接下来再说说寄存器,寄存器是CPU内部的单元,主要用于保存运算时临时的操作数或结果(除自身特定功能)! 32位通用寄存器有: EAX(累加器), EBX(基址寄存器), ECX(通用寄存器), EDX(数据寄存器), ESI/EDI(变址寄存器), ESP(堆栈指针寄存器), EIP(指令指针寄存器), 段寄存器, 状态寄存器等! 最后再说一说OEP,这个又叫原始程序入口,也就是正常代码的入口点,我们要脱壳,说白了也就是要找程序的OEP,找到了把程序Dump一下就好了! 今天我们主要注意ESP寄存器!就是堆栈指针寄存器! 接下来说一下堆栈平衡原理,堆栈就像一个杯子,里面可以装水,但是有一点就是你装了多少水就要倒出多少水,这就是平衡原理!我在上面提到了2个堆栈操作指令,PUSH和POP,一个程序PUSH多少就要POP多少(也可以直接改变ESP),在程序装入时ESP是什么,结束时ESP就要是什么,要不然程序肯定要出错! |
