常见寻找OEP的方法
软件破解脱壳法
![软件破解脱壳法](https://img.taocdn.com/s3/m/08642b1fc5da50e2524d7f36.png)
软件破解脱壳法什么是脱壳技术?在一些电脑软件里有一段专门负责保护软件不被非法修改或反编译的程序。
它们一般都是先于程序运行拿到控制权,然后完成它们保护软件的任务。
就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。
由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。
就像电脑病毒和自然界的病毒一样,其实都是命名上的方法罢了。
从功能上抽象,软件的壳和自然界中的壳相差无几。
无非是保护、隐蔽壳内的东西。
而从技术的角度出发,壳是一段执行于原始程序前的代码。
原始程序的代码在加壳的过程中可能被压缩、加密……。
当加壳后的文件执行时,壳这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。
软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类,目的都是为了隐藏程序真正的OEP(入口点,防止被破解)。
关于“壳”以及相关软件的发展历史请参阅吴先生的《一切从“壳”开始》。
(一)壳的概念:作者编好软件后,编译成exe可执行文件。
1.有一些版权信息需要保护起来,不想让别人随便改动如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。
2.需要把程序搞的小一点,从而方便使用。
于是需要用到一些软件,它们能将exe可执行文件压缩。
3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。
实现上述功能,这些软件称为加壳软件。
(二)加壳软件最常见的加壳软件ASPACK ,UPX,PEcompact 不常用的加壳软件WWPACK32;PE-PACK;PETITE NEOLITE(三)侦测壳和软件所用编写语言的软件,因为脱壳之前要查他的壳的类型。
1.侦测壳的软件 fileinfo.exe 简称 fi.exe (侦测壳的能力极强)。
2.侦测壳和软件所用编写语言的软件language.exe(两个功能合为一体,很棒)推荐。
language2000中文版(专门检测加壳类型)。
脱壳入门----脱ASPack壳保护的DLL
![脱壳入门----脱ASPack壳保护的DLL](https://img.taocdn.com/s3/m/4984e711b42acfc789eb172ded630b1c59ee9b04.png)
脱壳⼊门----脱ASPack壳保护的DLL前⾔结合脱dll壳的基本思路,对看雪加密解密⾥的⼀个ASPack壳保护的dll进⾏脱壳分析。
脱壳详细过程寻找程序的OEP先将⽬标DLL拖⼊OD,来到壳的⼊⼝处。
然后利⽤堆栈平衡原理在pushad后,对栈顶下硬件访问断点。
之后我们直接运⾏程序,当程序popad后会被断下,观察得出OEP的RVA为0x1240。
找到壳的重定位代码我们在来到程序真正的⼊⼝点后可以看到⼀些会被重定位的代码,我们选择最近的⼀个会进⾏重定位的代码记住其RVA。
本例⼦中我们选的是RVA为0x1253的代码。
然后我们重新加载dll,我们先对刚刚记住的那个RVA下内存写⼊断点,程序会先断在壳代码解压区块处我们需要在壳代码将所有的区段解压缩后对刚刚记住的那个RVA再下内存访问断点,然后程序会断在壳的重定位代码处。
跳过重定位代码并dump程序我们只需要将修正重定位数据的代码nop去就可以让重定位代码⽆法发挥作⽤。
nop去重定位代码后我们继续运⾏程序,程序会停在我们寻找OEP时设置的断点处。
然后我们就可以⽤LordPE来dump⽂件了,将dump的⽂件命名为ASP.dll重建输⼊表在重建输⼊表前我们需要知道原程序IAT表的位置,我们可以在OD中Alt + M查看内存然后我们在主模块可以看到各个区块,⼀般IAT表都是在.rdata区块处。
我们在此处右击然后选择在cpu数据窗⼝查看,然后将cpu数据窗⼝的显⽰形式调为地址。
我们可以看到在区块⼀开始就是IAT表。
此IAT表的RVA为0x7000。
在查找IAT表⽰还要注意,不要将原程序的IAT表与壳的IAT表搞混。
在区块.aspack处也存在⼀个IAT,这个IAT是壳代码的。
获取IAT的RVA后我们可以打开ImportRE⼯具重建输⼊表,我们在OEP处填写1240,在IAT 的RVA处填写7000,⼤⼩尽量填⼤点。
然后点击获取输⼊表。
获取输⼊表后我们发现有好多⽆效的这是因为我们IAT的⼤⼩填的过⼤,我们只需点击显⽰⽆效函数,然后右击剪切/删除指针数据即可去除⽆效数据。
加壳与脱壳应用及实现
![加壳与脱壳应用及实现](https://img.taocdn.com/s3/m/1dbad4650b1c59eef8c7b498.png)
加壳与脱壳的应用与实现一、加壳 (2)1.什么是壳 (2)2.加壳原因 (2)3.壳的加载过程 (3)4.压缩引擎 (5)5.常见的加壳工具 (6)a.常用压缩壳介绍 (6)b.加密保护壳介绍 (7)二、脱壳 (10)1.侦壳 (10)2.脱壳 (13)a.查找程序的真正入口点(OEP) (13)b.抓取内存映像文件 (15)c.输入表重建 (15)附:视频“加壳与脱壳(软件)”和“手动脱壳” (17)加壳与脱壳一、加壳1.什么是壳在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。
它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
图1.12.加壳原因就把这样的程序称为“壳”了。
作者编好软件后,编译成exe可执行文件。
1)有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。
2)需要把程序搞的小一点,从而方便使用。
于是,需要用到一些软件,它们能将exe可执行文件压缩。
3)在黑客界给木马等软件加壳脱壳以躲避杀毒软件。
实现上述功能,这些软件称为加壳软件。
3.壳的加载过程1)获取壳自己所需要使用的API地址如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,甚至只有Kernel32.dll以及GetProcAddress这个API 函数。
壳实际上还需要其他的API函数来完成它的工作,为了隐藏这些API,它一般只在壳的代码中用显式链接方式动态加载这些API函数2)解密原程序的各个区块(Section)的数据壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个区块。
在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。
壳一般按区块加密的,那么在解密时也按区块解密,并且把解密的区块数据按照区块的定义放在合适的内存位置。
寻找程序真正的入口点——ESP定律
![寻找程序真正的入口点——ESP定律](https://img.taocdn.com/s3/m/20f564c689eb172ded63b7e4.png)
寻找真正的入口(OEP)--广义ESP定律作者:LenusFROM: /bbsE-MAIL:Lenus_M@1.前言在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,ESP定律的原理是什么,如何使用ESP定律?看到了我在/dispbbs.asp?boardID=5&ID=54&page=1调查结果发现,大家对ESP定律很感兴趣,当然因为实在是太好用了,现在我就来告诉大家什么是ESP定律,它的原理是什么!!BTW:在看完了手动脱壳入门十八篇了以后,再看这篇文章也许会对你更有帮助!在下面地址下载:/SoftView/SoftView_23125.htm2.准备知识在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。
1.call这个命令是访问子程序的一个汇编基本指令。
也许你说,这个我早就知道了!别急请继续看完。
call真正的意义是什么呢?我们可以这样来理解:1.向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处。
例如:00401029 . E8 DA240A00 call 004A35080040102E . 5A pop edx在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!2.RET与call对应的就是RET了。
对于RET我们可以这样来理解:1.将当前的ESP中指向的地址出栈;2.JMP到这个地址。
这个就完成了一次调用子程序的过程。
在这里关键的地方是:如果我们要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
这也就是著名的“堆栈平衡”原理!3.狭义ESP定律ESP定律的原理就是“堆栈平衡”原理。
让我们来到程序的入口处看看吧!1.这个是加了UPX壳的入口时各个寄存器的值!EAX 00000000ECX 0012FFB0EDX 7FFE0304EBX 7FFDF000ESP 0012FFC4EBP 0012FFF0ESI 77F51778 ntdll.77F51778EDI 77F517E6 ntdll.77F517E6EIP 0040EC90 note-upx.<ModuleEntryPoint>C 0 ES 0023 32bit 0(FFFFFFFF)P 1 CS 001B 32bit 0(FFFFFFFF)A 0 SS 0023 32bit 0(FFFFFFFF)Z 0 DS 0023 32bit 0(FFFFFFFF)S 1 FS 0038 32bit 7FFDE000(FFF)T 0 GS 0000 NULLD 0O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E)2.这个是UPX壳JMP到OEP后的寄存器的值!EAX 00000000ECX 0012FFB0EDX 7FFE0304EBX 7FFDF000ESP 0012FFC4EBP 0012FFF0ESI 77F51778 ntdll.77F51778EDI 77F517E6 ntdll.77F517E6EIP 004010CC note-upx.004010CCC 0 ES 0023 32bit 0(FFFFFFFF)P 1 CS 001B 32bit 0(FFFFFFFF)A 0 SS 0023 32bit 0(FFFFFFFF)Z 1 DS 0023 32bit 0(FFFFFFFF)S 0 FS 0038 32bit 7FFDE000(FFF)T 0 GS 0000 NULLD 0O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E) 呵呵~是不是除了EIP不同以外,其他都一模一样啊!为什么会这样呢?我们来看看UPX的壳的第一行:0040EC90 n> 60 pushad //****注意这里*****0040EC91 BE 15B04000 mov esi,note-upx.0040B015PUSHAD就是把所有寄存器压栈!我们在到壳的最后看看:0040EE0F 61 popad //****注意这里*****0040EE10 - E9 B722FFFF jmp note-upx.004010CC //JMP到OEPPOP就是将所有寄存器出栈!而当我们PUSHAD的时候,ESP将寄存器压入了0012FFC0--0012FFA4的堆栈中!如下:0012FFA4 77F517E6 返回到ntdll.77F517E6 来自ntdll.77F78C4E //EDI 0012FFA8 77F51778 返回到ntdll.77F51778 来自ntdll.77F517B5 //ESI 0012FFAC 0012FFF0 //EBP 0012FFB0 0012FFC4 //ESP 0012FFB4 7FFDF000 //EBX 0012FFB8 7FFE0304 //EDX 0012FFBC 0012FFB0 //ECX 0012FFC0 00000000 //EAX所以这个时候,在教程上面就告诉我们对ESP的0012FFA4下硬件访问断点。
脱Armadillo壳(两种脱法)
![脱Armadillo壳(两种脱法)](https://img.taocdn.com/s3/m/0e76d33e2e60ddccda38376baf1ffc4ffe47e214.png)
脱Armadillo壳(两种脱法)标题:【原创】脱Armadillo壳(两种脱法)发帖人:Anwil时间: 2005-06-25 20:43原文链接:详细信息:【破解作者】 Anwil【作者邮箱】略【作者主页】略【使用工具】 Ollydbg、PEiD、LordPE、ImportREC 1.6、ResScope 1.94【破解平台】 WinXP【软件名称】图像格式转换专家 V2.3 Build 20050621【下载地址】【软件简介】批量图像格式转换的专门工具,对不同目录下的多个文件同时进行格式转换,支持所有网络常见图像格式间的相互转换,并专门对图像质量进行了优化,转换后的图像质量明显优于其他同类型软件,绝对保持您珍贵图像的质量。
【软件大小】 1999 KB【加壳方式】 Armadillo+X壳【保护方式】 NAG+时间限制【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)--------------------------------------------------------------------------------【脱壳过程】脱了Armadillo壳也有一段时间了,今天终于忍不住也来“班门弄斧”,希望各位不让扔我鸡蛋,就当是抛砖引玉吧,技术不高,多多海涵!设置Ollydbg忽略所有的异常选项,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
0065E000 b> 60 pushad ; 载入程序后停在这里0065E001 E8 00000000 call batchfor.0065E006 0065E006 5D pop ebp一、由于是单进程的,所以不用使程序把自己当成子进程运行,因此第一步跳过了二、避开IAT加密下断:He GetModuleHandleA,F9运行77E5AD86 k> 837C24 04 00 cmp dword ptr ss:[e sp+4],0 ; 断在这,注意看堆栈77E5AD8B 0F84 37010000 je kernel32.77E5AEC 877E5AD91 FF7424 04 push dword ptr ss:[esp +4]77E5AD95 E8 F8050000 call kernel32.77E5B392在这里中断八次,然后Alt+F9返回程序,判断的时机很容易把握,很多高手都点明了^_^★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★0012D264 00DA519B /CALL 到 GetModuleHandleA 来自 00DA51950012D268 0012D3A0 \pModule = "kernel32.dll"0012D264 00DA519B /CALL 到 GetModuleHandleA 来自 00DA51950012D268 0012D3A0 \pModule = "user32.dll"0012D264 00DA519B /CALL 到 GetModuleHandleA 来自 00DA51950012D268 0012D3A0 \pModule = "MSVBVM60.DLL"0012CB68 66001BC5 /CALL 到 GetModuleHandleA 来自 66001BBF0012CB6C 6600F4D0 \pModule = "kernel32.dll"0012CB5C 6600281E /CALL 到 GetModuleHandleA 来自 660028180012CB60 6600F4FC \pModule = "KERNEL32"0012CB54 660031CE /CALL 到 GetModuleHandleA 来自 660031C80012CB58 00000000 \pModule = NULL0012D264 00DA519B /CALL 到 GetModuleHandleA 来自 00DA51950012D268 0012D3A0 \pModule = "advapi32.dll"0012D3D4 00DA5895 /CALL 到 GetModuleHandleA 来自 00DA588F ; 别犹豫了,返回的好时机,GO!0012D3D8 00000000 \pModule = NULL★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★00DA588B 8B5D 0C mov ebx,dword ptr ss:[ ebp+C]00DA588E 57 push edi00DA588F FF15 A450DC00 call dword ptr ds:[D C50A4] ; kernel32.GetModuleHandleA00DA5895 3945 08 cmp dword ptr ss:[ebp+ 8],eax ; //返回这里00DA5898 75 07 jnz short 00DA58A100DA589A BE C073DC00 mov esi,0DC73C000DA589F EB 60 jmp short 00DA590100DA58A1 393D A879DC00 cmp dword ptr ds:[ DC79A8],edi00DA58A7 B9 A879DC00 mov ecx,0DC79A8 00DA58AC 74 3C je short 00DA58EA ; Magic Jump00DA58AE 8B35 80D7DC00 mov esi,dword ptr ds:[DCD780]00DA58B4 A1 8016DD00 mov eax,dword ptr d s:[DD1680]1、找到Magic Jump ,只要将je改为jmp,就能得到正确的输入表00DA58AC 74 3C je short 00DA58EA ; 原来的代码改为00DA58AC EB 3C jmp short 00DA58EA ; 修改的Magic Jump2、Ctrl+F在当前位置查找命令:salc,当看到jmp、salc、salc 代码连在一起时,OK,这就是IAT解密已经完成的地方。
第16课 手动脱壳的常规方法
![第16课 手动脱壳的常规方法](https://img.taocdn.com/s3/m/4b16cbbfc77da26925c5b0d7.png)
第16课手动脱壳的常规方法手动脱壳主要分为三大步骤(你可以将其想像为程咬金的三板斧):①寻找入口点(OEP)、②转储(Dump)程序、③修复输入表(Import Table)。
对于复杂的加密壳,还需要在①②之间再加上一个步骤:寻找魔力跳(Magic Jump)。
直接跟踪法直接跟踪法的基本原则为:1.时刻把自己想像成中国象棋中的“兵”或“卒子”,只准前进,不准后退。
一旦往回跳,则在程序的下一行按F4,继续向下走(解释:F4——运行到指定行)。
2.一般情况下,一路按F8走。
一旦追踪的过程中,目标程序运行起来,宣告脱壳失败。
则需要重新来过,通常的术语被称为“程序跑飞”。
3.注意识别变形call(其实质是一种变形的jmp)。
不能直接F8带过,会跑飞。
这种情况下应该按F7。
判断的方法是它所call的地址和它自身所在的当前行地址极其接近,感觉离得不远,像近房亲戚、孪生兄弟或姐妹。
4.遇到在循环中跑来跑去时,要想办法跳出循环圈。
时刻留意其中一些跳的比较远的跳转,可以ctrl+G,直接到那个位置;或者按F2设断,F9或点按钮,断下后再F2取消断点。
〔例1〕目标程序:UnPackMe_EZIP1.0.exe。
壳为ezip1.0。
程序载入后,来到这里。
F8,来到这里F8走,直到这里,看到类似下图的跳转,由于是向下跳,注意看红线和V形向下小箭头,任由它跳即可。
来到下图的跳转时,当心,已经来到46861A,却要跳回到46855F。
注意看红线和^形向上小箭头,不让它跳,在下一行(即46861F)用鼠标点住,按F4。
继续F8向下走,直到468688这行:程序在46××××,却要跳到4271B0(42××××),如此大的跨段大跳跃,就是跳到入口点(传说中的OEP)的典型标志,看EAX的值也可知道=4271B0。
所以OEP=4271B0F8走一下,来到入口点。
第三课 - 散人手把手教你学破解
![第三课 - 散人手把手教你学破解](https://img.taocdn.com/s3/m/51ca99c258f5f61fb7366620.png)
第三课- 手把手教你学破解2012年1月23日星期一13:18大家好!我是散人,呵呵!我们又见面了,看过我课的朋友今天就继续往下看了!没看过的朋友假如有兴趣的话就请先把前两节课看完!好,按照惯例,今天应该讲脱壳了!好,我们先看一下“壳”的定义:我认为一个软件为什么加壳,主要原因还是利益问题,加了壳的软件一般是不能够编译破解使用的,就达不到我们免费的目的,只有我们先把他的皮剥下去,才能达到我们的破解目的。
这也就是我们为什么要学习脱壳的原因。
壳有千万种,但常用的就那几种,我们只要把常用的几种壳的脱法学会,那别的什么壳也就自然会了,这是一个过程,是要慢慢积累的!在这里我尽量教大家快捷简单的脱壳方法,尽量让大家一看就懂。
现在我们先讲一下给一个软件脱壳我们要用到的软件:----------------------------------------------------------------------------------------------------------------- 1、查壳工具PEID--功能强大的侦壳工具,自带脱壳插件(但是,效果不怎么样,所以我们就用它查壳就够了!)工作原理:核心是userdb.txt(呵何!大家可以看看)[通过壳的入口特征码进行辨认]使用方法:可以拖放、也可以把PEID添加到右键菜单里面去(如图)下载地址:PEid0.94汉化版.rar2、手动脱壳工具(为什么不用自动的呢?因为没有手动来的干净,好使!)ODbyDYK(OD)--第一节课有讲过的,我就不多说了!常用快捷键:F2:在需要的地方下断点(INT3型断点)F3:选择打开程序F4:运行到所选择的那一行F7:单步进入F8:单步跟踪F9:执行程序(运行程序)3、修复工具Import REConstructor 1.6—非常强大的修复工具哦~!~!~(如图)下载地址:Import_Fix_1.6.rar------------------------------------------------------------------------------------------------------------------------------好!现在我们讲一下我们破解软件的工作原理:查壳(使用工具PEID)--->寻找OEP(OEP就是脱壳的关键地点)(使用工具OD)--->脱壳--->修复(使用工具Import REConstructor)好!工作原理知道了吧·那我们今天就脱个带有ASPack壳的笔记本,让他脱下狼的伪装,漏出真面目!ASPack是现在比较流行的一种壳!进入正题!带有ASPack壳的笔记本下载地址:NotePad.98.E(ASPack_2.12).exe脱壳步骤1。
pediy exe格式脱壳
![pediy exe格式脱壳](https://img.taocdn.com/s3/m/5b74050f79563c1ec5da71d0.png)
RebPE.exe
1 OEP寻找技巧
OEP也就是原函数的入口点,在这里停止可以通过dump去掉外壳。
1)直接跟踪到.text段
2)内存访问断点,麻烦!!!!(除非熟悉该外壳算法,不然中断次数太多了)
3)堆栈平衡去找(快啊),在command 设置读取的断点,马上就找到了
4)找到之后,可以通过编译语言确认一下,如:
GetVersion是VC6.0独有的特征。
OEP为00401130
2 停在OEP口之后,就是DUMP了,使用LordPE
设置从磁盘黏贴文件头,避免PE头被破坏
右键修正ImageSize大小,然后full dumpl(完整脱壳),这里有可能PE头无法访问
使用od在<m>里面修改PE文件头的属性。
3 重建输入表
随便找一个函数调用的
<command>d 0x405028;然后在数据窗口点击长型(long)->地址,就可以看到整个输入表了
00405000 7C810EF1 kernel32.GetFileType
004050B8 FFFFFFFF
如此,输入表的大小为004050B8-00405000=B8,起点为004050B8
关键是这里,刚才找到的信息如下:
OEP:1130
RV A:5000
Size:B8
EXE的base默认为00400000(DLL就不一定了)
接着查看这里面有没有无效的数据,有的话就要手工了。
接着dump就行了,这里发现“吾爱破解专用版”在这里失效,可能小生弄太多插件了,有bug,用ollyICE就没有问题。
Armadillo脱壳知识和方法大全
![Armadillo脱壳知识和方法大全](https://img.taocdn.com/s3/m/ffa93d4aa8956bec0975e35c.png)
般情况下,这个跳转比较大的话,就改为jmp,而跳转比较小的话,就改nop)。[注:下此断点的目的是找到Magic Jump,修改Magic Jump目的
是避开的IAT的加密。]
2、找OEP
下断点bp GetCurrentThreadId/bp CreateThread,shift+f9运行,中断后,取消断点,Alt+F9返回,单步执行,看到一个call edi之类的。F7
进入,即到oep。OD不要关!打开import--选择进程--OEP输入va--自动搜索IAT--获取输入表--显示无效函数--CUT!
(二) 双线程的标准壳
总体步骤:1、要双变单;2、处理IAT,修改Magic Jump;3、寻找OEP;4、修复
1、双变单,方法有三。
方法一:PATCH代码法
004010109D popfd
0040101161 popad
00401012- E9 8F9FA777jmp KERNEL32.OpenMutexA
点右键选择重建eip,f9运行,断下后,取消断点, ctrl+g到00401000,恢复修改。
方法二:下断点BP OpenMutexA,SHIFT+F9运行,断下后,ALT+F9返回,返回后,将返回代码下面的第一个跳转改为相反跳转,再次SHIFT+F9
,断下后,ALT+F9返回,再次将返回代码下面的第一个跳转改为相反跳转。然后再一次SHIFT+F9,取消断点,至此,同样,双进程转单进程完毕!
此法相对简单,另外适用于00401000空数据不能修改的程序。
(2)修改Magic Jump 。
下断BP GetModuleHandleA+5,运行,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree后,再运行一次,就是返回时机,中
od内存断点寻找真正的入口(OEP)--内存断
![od内存断点寻找真正的入口(OEP)--内存断](https://img.taocdn.com/s3/m/9cefda4fe45c3b3567ec8b80.png)
od内存断点:寻找真正的入口(OEP)--内存断点疯狂代码 / ĵ:http://Security/Article71892.htmlAuthor:LenusFrom: ; ; ; & E-mail:Lenus_M@--------------------------------------------------1.前言; ; ;发现论坛中很多兄弟在询问:什么是 2次内存断点 3次内存断点还有很多人对内存断点原理不是很明白其实只要懂得壳是如何解压代码那么就完全可以按自己喜欢来下断; ; ;; ; ;本文要解决问题是:; ; ;1.什么是内存断点?; ; ;2.如何在寻找OEP时使用内存断点; ; ;3.内存断点局限性; ; ;2.内存断点寻找OEP原理; ;i.首先在OD中内存断点和普通断点(F2下断)是有本质区别; ;内存断点等效和命令bpm他中断要用到DR0-DR7调试寄存器也就是说OD通过这些DR0-DR7调试寄存器来判断是否断下; ;普通断点(F2下断)等效于bpx他是在所执行代码当前地址个字节修改为CC(3)当运行到3时候就会产生个异常而这个异常将交给OD处理把这个异常regEIP-1以后就正好停在了需要中断地方(这个根据系统区别会不样)同时OD在把上面3修改回原来代码; ;; ;内存断点分为:内存访问断点内存写入断点; ;我们知道在运行时候会有3种基本状态产生:读取写入执行004AE242 ; ; ; ; ;A1 00104000 ; ; ; ; ; ; ;mov eax,dword ptr ds:[004AE24C] ; ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存读取004AE247 ; ; ; ; ;A3 00104000 ; ; ; ; ; ; ;mov dword ptr ds:[004AE24C],eax ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存写入004AE24C ; ; ; ; ;83C0 01 ; ; ; ; ; ; ; ; ; ; ;add eax,1 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存执行; ;; ;那么我们应该如何中断在上面几行呢?; ;1.当我们对004AE24C下内存访问断点时候可以中断在004AE242也可以中断在004AE247; ;2.当我们对004AE24C下内存写入断点时候只能中断在004AE247; ;3.当我们对004AE24C下内存访问断点时候能中断在004AE24C; ;到这里你可能不明白了为什么内存访问断点能中断在004AE247这句对004AE24C写入而且还能中断在004AE24C执行呢?; ;其实很简单我们只要仔细体会下“内存访问”这 4个字含义遍可以知道当我们对004AE24C进行读取时候需要“访问”他吧当我对004AE24C进行写入时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C代码时候也是还是要“访问”他!; ;所以我们不难得出下面结论:; ;1.内存写入中断地方定是也可以用内存访问中断; ;2.内存执行地方也可以用内存访问中断; ;如果这时你认为那么内存写入岂不是没用了呵呵~那我要告诉你当然不是如果你想快速准确定位到004AE247这行时候那么他就大有作用了!; ;整理总结下:内存断点不修改改原代码不会像普通断点那样修改代码被校验而导致中断失败;对于区段访问只是区域大了点其原理和上面分析 3行代码是样; ;ii.如何使用内存断点来寻找OEP呢?; ;要回答这个问题首先要回答这个问题:壳是如何解压代码?; ;正如我们知道壳如果要把原来加密或压缩代码运行起来就必须要解压和解密原来代码而这个过程我们难道不能将他看做是对代码段(code段)写入吗?好了解压完毕了我们要从壳代码区段JMP到原来代码段时候难道不正是对代码段(code段)执行吗?理清了上面关系就好办了那么如果载入OD后我们直接对code段下内存访问断点时候定会中断在壳对code段写入代码上面就像上面004AE247这行而如果当他把code段代码全部解压解密完毕了以后JMP到OEP时候我们是不是还可以停在OEP代码上面呢?而且每按下F9都会中断这时code段在执行中哦!; ;相信很多人到这里已经明白了为什么在教程中到达了某个时候某行时候牛人们就叫我们对code段下内存访问断点了吧; ;而如果你还要继续问我为什么定要到那个地方才可以下断呢?我难道不可以开始就下断吗?; ;正入我上面所说如果你在前面下断很可能壳对code段还没解压完毕呢这时如果你不停按F9你将会看到OD下方不断在提示你“对401000写入中断” “对401002写入中断”“对401004写入中断”.......如果你不介意按F9到他把正个code段写完话我除了同情你“F9”以外没什么其他意见!; ;; ;那么我们就没有别更快点办法了吗?; ;有!那就是我们呼的欲出两次内存断点办法; ;如何理解两次内存断点呢?; ;让我来做个假设吧假设我是个壳作者个EXE文件有code段data段rsrc段.....依次排列在你内存空间中那么我会如何解码呢?呵呵~我比较笨点我会先将code段解码然后再将data段解压接着是rsrc段......那么聪明你不难发现只要你在data断或者rsrc段下内存访问断点那么中断时候code段就已经解压完毕了这时我们再对code段下内存反问断点不就可以到达OEP了吗?; ;这里注意上面虽然下了两次内存访问断点但是本质是不样目也是不样; ;1.对data段下内存访问断点而中断是内存写入中断目是断在对对data段解压时这时壳要对data段写数据但是code段已经解压 完毕; ;2.对code段下内存访问断点而中断是内存执行中断目当然就是寻找OEP了; ;整理总结下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点找到OEP如果不知道那么我们就依*2次内存断点去找如果还不行就用多次内存断点总的明白了原理在多次内存断点其实都样从这个过程中我们了解是壳在对区段解码顺序!; ;iii.实战; ;说了这么多我想大家都越越欲试了吧; ;好吧来弄个猛壳如何样:; ;点击浏览该文件; ;; ;这个壳是个hying旧版我们用他来实验下我们内存断点法; ;; ;OD载入以后来到这里0040D000 u> ; ;56 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push esi ; ; ; ; ; ; ; ; ; ; ; ; ; ;//这里0040D001 ; ; ; ; ;52 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push edx0040D002 ; ; ; ; ;51 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ecx0040D003 ; ; ; ; ;53 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebx0040D004 ; ; ; ; ;55 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebp0040D005 ; ; ; ; ;E8 15010000 ; ; ; ; ; ; ; ; ; ; ;call unpackme.0040D11F; ;根据跟过次经验我们将先设置除3异常以外忽略其他异常SHIFT+F9003725B9 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//到这里003725BA ; ; ; ; ;8BCD ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ecx,ebp; ;然后再设置除“除零”异常外忽略其他异常SHIFT+F900372660 ; ; ; ; ;F7F3 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;div ebx ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//到这里00372662 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop; ;; ;下面是很多单步异常太麻烦我们不管他现在开始用内存断点思路方法对code段下内存访问断点希望他已经解压完毕F90040D19D ; ; ; ; ;A4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;movs ptr es:[edi], ptr ds:[esi] ; ; ; ; ; ; ; ; ;//还没解完呢0040D19E ; ; ; ; ;B3 02 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov bl,2对data段下内存“写入”断点试试看他是不是要写data段00372712 ; ; ; ; ;F3:A4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;rep movs ptr es:[edi], ptr ds:[esi] ; ; ; ; ; ;//断到这里00372714 ; ; ; ; ;5E ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop esi下面再对code段下内存访问断点F900372855 ; ; ; ; ;8907 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[edi],eax ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; SHELL32.DragFinish ; ;//这里是对IAT加密地方了!!!00372857 ; ; ; ; ;5A ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop edx00372858 ; ; ; ; ;0FB642 FF ; ; ; ; ; ; ; ; ; ; ; ; ;movzx eax, ptr ds:[edx-1]0037285C ; ; ; ; ;03D0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edx,eax0037285E ; ; ; ; ;42 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;inc edx0037285F ; ; ; ; ;83C7 04 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edi,400372862 ; ; ; ; ;59 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop ecx00372863 ; ; ;^ E2 A9 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;loopd 0037280E00372865 ; ; ;^ E9 63FFFFFF ; ; ; ; ; ; ; ; ; ; ;jmp 003727CD0037286A ; ; ; ; ;8BB5 93060000 ; ; ; ; ; ; ; ; ;mov esi,dword ptr ss:[ebp+693] ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;;//到这里下断F2现在如果再对data下访问断点已经是没用了这时应该格外小心我们现在就想既然这段是对code解码那么我们就绕过他吧!到0037286A下断F2然后清除内存断点!!!!F9以后停在这里继续对code下内存访问断点看看左下角还在解码哎~真是麻烦!003728E1 ; ; ; ;/EB 1D ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;jmp 00372900003728E3 ; ; ; ;|25 FFFFFF7F ; ; ; ; ; ; ; ; ; ; ;and eax,7FFFFFFF003728E8 ; ; ; ;|0385 83060000 ; ; ; ; ; ; ; ; ;add eax,dword ptr ss:[ebp+683]003728EE ; ; ; ;|2B85 8F060000 ; ; ; ; ; ; ; ; ;sub eax,dword ptr ss:[ebp+68F]003728F4 ; ; ; ;|8BDE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ebx,esi003728F6 ; ; ; ;|2BD8 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sub ebx,eax003728F8 ; ; ; ;|8958 FC ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[eax-4],ebx ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//停在这里003728FB ; ; ; ;|83C7 08 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edi,8003728FE ; ; ;^|EB DB ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;jmp 003728DB00372900 ; ; ; ;\64:FF35 30000000 ; ; ; ; ; ;push dword ptr fs:[30] ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//清除内存断点以后到这里下断F9又是段解码代码再次使用上面办法手动跳出去现在继续对code段下内存访问断点!!F9以后到达这里004010CC ; ; ; ; ;FFD7 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;call edi ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; unpackme.004010CE ; ; ;//OEP哦004010CE ; ; ; ; ;58 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop eax004010CF ; ; ; ; ;83EC 44 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sub esp,44004010D2 ; ; ; ; ;56 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push esi004010D3 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop004010D4 ; ; ; ; ;E8 B518F7FF ; ; ; ; ; ; ; ; ; ; ;call 0037298E004010D9 ; ; ; ; ;8BF0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov esi,eax呵呵~虽然不是我们熟悉OEP但是地址是没错了况且根据我们步骤我可以很肯定说这是code段第次“执行”中断!所以这就是OEP了整理总结下:当我们在寻找OEP时候要多次对code下断“赌”“赌”他解压完毕如果不是就对别段试试~如果跑飞了那就没办法了重来呗~其实说起来要赌是:当data段idata段rsrc段摆在你面前你会好好“珍惜”那个段不过还好上天还会给我们从来次机会(ctrl+F2 ^_^)那么我们会对那个不会跑飞段说3个字----“先断你”如果非要在上面加个次数我希望是“次内存断点就好了”; ;vi.下面来讨论下内存断点局限性问题; ;是不是什么壳都可以用内存中断啊?; ;不是每个都可以些像UPX和ASPACK就不行; ;为什么?; ;呵呵~follew me!; ;情况1.; ;我们来看看UPX壳; ;首先他壳代码在UPX1段这里是他要跳到OEP地方0040ED4F ; ; ; ;/77 11 ; ; ; ; ; ; ; ; ; ; ; ; ;ja NOTEPAD_.0040ED62 ; ; ; ; ; ; ; ; ; ; ; ;0040ED51 ; ; ; ;|01C3 ; ; ; ; ; ; ; ; ; ; ; ; ; ;add ebx,eax0040ED53 ; ; ; ;|8B03 ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov eax,dword ptr ds:[ebx]0040ED55 ; ; ; ;|86C4 ; ; ; ; ; ; ; ; ; ; ; ; ; ;xchg ah,al0040ED57 ; ; ; ;|C1C0 10 ; ; ; ; ; ; ; ; ; ; ;rol eax,10 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//在解码0040ED5A ; ; ; ;|86C4 ; ; ; ; ; ; ; ; ; ; ; ; ; ;xchg ah,al0040ED5C ; ; ; ;|01F0 ; ; ; ; ; ; ; ; ; ; ; ; ; ;add eax,esi0040ED5E ; ; ; ;|8903 ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[ebx],eax0040ED60 ; ; ;^|EB E2 ; ; ; ; ; ; ; ; ; ; ; ; ;jmp NOTEPAD_.0040ED440040ED62 ; ; ; ;\24 0F ; ; ; ; ; ; ; ; ; ; ; ; ;and al,0F0040ED64 ; ; ; ; ;C1E0 10 ; ; ; ; ; ; ; ; ; ; ;shl eax,100040ED67 ; ; ; ; ;66:8B07 ; ; ; ; ; ; ; ; ; ; ;mov ax,word ptr ds:[edi]0040ED6A ; ; ; ; ;83C7 02 ; ; ; ; ; ; ; ; ; ; ;add edi,20040ED6D ; ; ;^ EB E2 ; ; ; ; ; ; ; ; ; ; ; ; ;jmp NOTEPAD_.0040ED51 ; ; ; ; ; ; ; ;//回跳解码0040ED6F ; ; ; ; ;61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;popad0040ED70 ; ; ;- E9 5723FFFF ; ; ; ; ; ; ;jmp NOTEPAD_.004010CC ; ; ; ; ; ; ; ; ; ; ; ; ;//跳到OEP我们看到他在对code段解压完毕时候马上就JMP到OEP去了那么我们根本就来不及使用内存断点办法你可能说我可以在0040ED6F ; ; ; ; ;61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;popad //这句下段然后使用啊呵呵~~当然可以不过你把花在下内存断点时间多按下几次F8不更好?!也就是说当个壳如果他在JMP 到OEP前行代码仍在都在对code段解压那么我们就不能再使用这种办法了! 或者说我们没必要使用内存断点更贴切点!; ;情况2.; ;对于些在OEP处有stolen code代码; ;我们来看看个OEP0049E2F4 u> ; ;55 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebp ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//OEP0049E2F5 ; ; ; ; ;8BEC ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ebp,esp0049E2F7 ; ; ; ; ;83C4 F4 ; ; ; ; ; ; ; ; ; ; ;add esp,-0C0049E2FA ; ; ; ; ;B8 BCE04900 ; ; ; ; ; ; ;mov eax,unpack.0049E0BC0049E2FF ; ; ; ; ;E8 048CF6FF ; ; ; ; ; ; ;call unpack.00406F08 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//这里子0049E304 ; ; ; ; ;A1 B8FE4900 ; ; ; ; ; ; ;mov eax,dword ptr ds:[49FEB8]0049E309 ; ; ; ; ;50 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push eax0049E30A ; ; ; ; ;6A 00 ; ; ; ; ; ; ; ; ; ; ; ; ;push 00049E30C ; ; ; ; ;68 1F000F00 ; ; ; ; ; ; ;push 0F001F0049E311 ; ; ; ; ;E8 E68EF6FF ; ; ; ; ; ; ;call <jmp.&kernel32.OpenFileMappingA> ; ;//API0049E316 ; ; ; ; ;A3 60194A00 ; ; ; ; ; ; ;mov dword ptr ds:[4A1960],eax0049E31B ; ; ; ; ;833D 60194A00 00 ; ;cmp dword ptr ds:[4A1960],0这个软件Software在被PESPIN加壳了以后这些全被偷掉了!也就是说壳在模拟OEP代码时候必然会执行0049E2FF ; ; ; ; ;E8 048CF6FF ; ; ; ; ; ; ;call unpack.00406F08 ; ;//这步而这个地方是call向code段如果我们使用内存访问断点那么就停在这个子地方00406F08 ; ; ; ; ;50 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push eax ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//会停在这里00406F09 ; ; ; ; ;6A 00 ; ; ; ; ; ; ; ; ; ; ; ; ;push 000406F0B ; ; ; ; ;E8 F8FEFFFF ; ; ; ; ; ; ;call <jmp.&kernel32.GetModuleHandleA>00406F10 ; ; ; ; ;BA 04F14900 ; ; ; ; ; ; ;mov edx,unpack.0049F10400406F15 ; ; ; ; ;52 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push edx这里既不是处理stolen code地方也不是FOEP地方这就会对我们判断产生误导当然你可以alt+F9返回到壳处理stolen地方然后用内存断点或者按几下F8到达FOEP处但试问如果你拿到个未知壳时候又如何知道应该这么处理呢?还有其他些情况留给大家整理总结吧!在下砖已抛出各位玉不久矣--------------------------------------------------3.整理总结; ; ; ; ; ;好了说了很多大家应该对内存断点办法有了全面了解如果了解了内存断点原理就不难明白他使用思路方法不难明白为什么有写壳不能使用内存断点办法其实任何种办法都需要经验积累相信如果大家在回答开篇3个问题已经不难了; ; ; ; ; ;下面给出些使用内存断点寻找OEP例子大家可以结合原理再好好体会下; ; ; ; ; ;1.手动脱壳进阶第 8篇Skvp1.32; ; ; ; ; ;2./bbs/dispbbs.asp?BoardID=5&ID=1485--------------------------------------------------- ; ; ; ; ; ;4.研究题; ; ;使用多次内存断点办法要谨慎对待datarsrc区域内存访问断点即使要下也要注意尽量用写入断点为什么?上篇文章: 逆向追踪+TC(模拟跟踪)思路方法寻找暗桩--解除脱UPX后校验下篇文章: 推广ESP定律---EBP妙用。
手动脱壳简简单单
![手动脱壳简简单单](https://img.taocdn.com/s3/m/b188f208bed5b9f3f90f1c9f.png)
手动脱壳简简单单在我们进行逆向分析的时候,通常会遇到有些文件被加密处理过,也就是我们通常所说的被加了壳,这时他的内部结构都已经改变,我们想要继续分析是很麻烦的,所以我们需要把它从壳中分离出来,也就是我们常说的脱壳。
现在越来越多的软件都使用了加壳的保护方法,所以脱壳是我们在逆向分析过程中很主要的步骤,掌握它至关重要壳是最早出现的一种专业加密软件。
不同的壳的侧重点也不同,有的侧重于压缩,有的侧重于加密,所以出现了压缩壳和加密壳。
压缩壳的特点是减小软件的体积,我们常见的有:UPX,ASPack,PECompack等。
加密壳的则侧重于加密,保护强度较大,常见的有:ASProtect,Armadillo,Themida等。
第一步寻找OEP★OEP(Original Entry Point):程序的原入口点,就是壳程序在完成了对原程序的还原后,开始跳转到刚还原的程序执行,此时的地址就是入口点的值。
1 单步跟踪首先,我们运行peid, 将我们要检测的程序拖到上面,可以看到它是用aspack加的壳,如图1。
我们运行OD,点击菜单栏中的“文件”→“打开”,把我们需要脱壳的文件加载进来,接着就会弹出一个对话框“模块……你仍要继续分析吗”,如图2,我们选择“否”(不管什么方法脱壳都要按“否”),程序就会停以下的代码处:01013001 > 90 nop01013002 60 pushad01013003 E8 03000000 call 0101300B01013008 - E9 EB045D45 jmp 465E34F80101300D 55 push ebp0101300E C3 retn0101300F E8 01000000 call 0101301501013014 EB 5D jmp short 01013073我们按F8来跟踪一下,当到了call 0101300B这里的时候,记事本自己打开了,我们按Ctrl+F2重新载入文件,再来跟踪,当我们再次遇到call 0101300B这一句的时候我们按F7跟进,代码会来到这里:0101300B 5D pop ebp0101300C 45 inc ebp0101300D 55 push ebp0101300E C3 retn我们继续F8来跟踪,当到了retn一句时,程序返回了,停在了call的下面一句jmp465E34F8上,跳转以后代码来到了下面的这一句call 01013015,继续F8,如果遇到程序往回跳,那么我们就在下一句代码处按F4,这样跟踪一段时间以后,我们会看到这样的代码:010133BB 68 9D730001 push 0100739D010133C0 C3 retn再F8一下我们的程序就返回了了这里:0100739D 6A 70 push 700100739F 68 98180001 push 01001898010073A4 E8 BF010000 call 01007568到这里,我们就已经到达OEP,单步跟踪法测试成功。
od常用下断api
![od常用下断api](https://img.taocdn.com/s3/m/3d83dcd44128915f804d2b160b4e767f5acf8081.png)
OD 常用下断API(2009-10-10 11:33:17)标签:od api 断点 it 分类:破解之道1.GetModuleHandleA获取一个应用程序或动态链接库的模块句柄常用于找Magic Jump,破解加密的IAT2.GetCurrentThreadId获取当前线程一个唯一的线程标识符常用于寻找OEP3. CreateFile这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台常用于程序自校验4.SetWindowText设置窗口的标题文字或控件的内容(在vb里使用:针对vb窗体,应使用caption或text属性)5.VirtualAlloc VirtualFree内存的分配与释放6.bp OpenMutexA双进程转单进程7.LoadLibraryA (用于找Magic Jump)8.he OutputDebugStringA断下后,选中%s%之类的字符,点右键->二进制->使用00填充 常用于 避开Anti ,OD的字符串泄漏漏洞字符串bp GetDlgItemTextA(W) ****bp GetDlgItemIntbp GetWindowTextA(W) ****bp GetWindowWordbmsg XXXX wm_gettext对话框bp MessageBeepbp MessageBoxA(W) ****bp MessageBoxExA(W)bp DialogBoxParamA(W)bp GreateWindowExA(W)bp ShowWindowbp UpdateWindowbmsg XXXX wm_command对于VB的程序用bp MessageBoxA是无法断下来的,bp rtcMsgBox注册表相关bp RegCreateKeyA(W)bp RegDeleteKeyA(W)bp RegQueryValueA(W)bp RegCloseKeybp RegOpenKeyA(W) ****bp RegOpenKeyExA **** 一种不行用另一种时间相关bp GetLocalTimebp GetFileTimebp GetSystemtimeCD-ROM或磁盘相关bp GetFileAttributesA(W) bp GetFileSizebp GetDriveTypebp GetLastErrorbp ReadFilebpio -h (CD-ROM端口地址) R软件狗bpio -h 278Rbpio -h 378RINI初始化文件相关bp GetPrivateProfileStringA **** bp GetPrivateProfileIntbp WritePrivateProfileStringbp WritePrivateProfileInt文件访问相关bp ReadFilebp WriteFilebp CreateFileA ****bp SetFilePointerbp GetSystemDirectory参考自:标 题: 笑解 API 函数 -- API 绝密档案系列之一作 者: gzgzlxg时 间: 2006-03-01 07:14链 接: /showthread.php?threadid=21959详细信息:1. HMODULE GetModuleHandle(LPCTSTR lpModuleName // address of module name to return handle// for);GetModuleHandle 实际上分为两个函数GetModuleHandleA--处理 Ansi 字符串GetModuleHandleW--处理 Unicode 字符串其实真正干活的函数是,GetModuleHandleW (指NT以后的系统),GetModuleHandleA 只不过将用户输入的 Ansi 字符串转成 Unicode 字符串然后就直接调用 GetModuleHandleW,所以在 OD 中如果下断拦截这个函数,直接拦截 GetModuleHandleW 就可以了,保险一个都跑不掉。
软件破解简明教程
![软件破解简明教程](https://img.taocdn.com/s3/m/916655232f60ddccda38a032.png)
最近一直想写点东西,是关于程序破解方面的。
不过网上看了一下,发现有篇基础教程写得挺不错的,现在发布上来,供各位对程序反编译有兴趣的朋友们学习参考。
-------------------------------------------------我是开始分割线-------------------------------------------------先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧!----------------------------------------------------------------------------------------------------------------语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a 与b比较大小.mov a,b //mov是赋值语句,把b的值赋给a.je/jz //就是相等就到指定位置(也叫跳转).jne/jnz //不相等就到指定位置.jmp //无条件跳转.jl/jb //若小于就跳.ja/jg //若大于就跳.jge //若大于等于就跳.----------------------------------------------------------------------------------------------------------------------这些都是我们在以后的课程中会经常遇到的语句,应该记住它们,接下来我们在讲讲破解工具的使用:我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg界面如图1它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息.右下角的是当前堆栈情况,还有注释啊.它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息.右下角的是当前堆栈情况,还有注释啊.恩,今天的课程就上到这了,大家可以在自己的电脑下试试OD,了解了解OD,下堂课我将破解一款软件给大家看,我们就用今天讲的语句和OD来破解,在以后的课程里我还会教大家脱壳,因为现在的软件为了维护版权多数都加了壳的,所以要破解就必须脱壳现在来破解个软件给大家看看!大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话加我QQ!有时间给你补节课!呵呵!好!孔子曰:“废话不可多说也”OK!!!~!!!先讲下预备知识:JZ/JE //相等则跳转JNE/JNZ //不相等则跳转JMP //无条件跳转目标柏林:LRC傻瓜编辑器杀杀杀~~~~~~~~~简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。
第31课 内存二次断点法
![第31课 内存二次断点法](https://img.taocdn.com/s3/m/036871db2af90242a995e558.png)
第31课内存二次断点法内存二次断点法的原理是:第一次,先通过对数据(data)、资源(rsrc )、rdata、idata等区段下断,以达到等待壳对代码(code)段解压完毕的目的;第二次,在代码段寻找OEP。
一般来说,壳是最后对代码(code)段解压的。
[例1] ex1710,PESHiELD 0.25加壳的win98记事本脱壳由于此程序调试时经常莫名其妙地退出,故有反调试代码,故需要在“插件”中隐藏调试器OllyICE载入后程序停在40D0000040D000 > 60 pushad0040D001 E8 2B000000 call 0040D031首先OllyDbg异常设置:忽略所有异常首先,对主程序的资源区段下内存断点,看到资源区段变红然后Shift+F9来到:7C9322FD 66:8B50 0C mov dx, word ptr [eax+C]7C932301 66:8955 B4 mov word ptr [ebp-4C], dxAlt+M再次打开内存镜像,在主程序的代码区段下内存断点,看到代码区段变红Shift+F9来到:接下来,命令行进行条件追踪,tc eip<405000,不一会儿就停在了OEP:用OllyDbg的Dump插件直接脱壳,选方式一,修复输入表即可。
[例2] ex1711,OllyICE载入后程序停在40C0000040C000 > 60 pushad0040C001 E8 00000000 call 0040C006首先OllyDbg异常设置:忽略所有异常F9运行或点按钮,点Shift+F9程序运行。
故重新来过,重复上面的步骤堆栈窗口如下:OllyDbg主窗口右键菜单“转到→表达式”输入00a6046f在00A6046F行F2下断,然后Shift+F9,取消断点。
接下来,Alt+M打开内存镜像,使用内存二次断点法直接来到OEP。
第一次的区段第二次的区段最后,用LordPE转存程序,用Import REConstructor修复输入表,用三个级别分别修复,还剩3个无效指针。
新手必须知道的脱壳及修复工具解读
![新手必须知道的脱壳及修复工具解读](https://img.taocdn.com/s3/m/0508a6f419e8b8f67c1cb9a8.png)
新手必须知道的脱壳及修复工具很多软件都加了壳,除了易语言软件很少加壳。
对于我们这些新手也叫菜鸟级的,既然想学破解,脱壳是第一步,我也在学习啦,第一步就是个人电脑里面必须装的必备脱壳及修复工具,现在发一个工具介绍,我想对新手应该有用,大家可以复制工具名字,去网上下载:脱壳工具以及脱壳一般流程查壳(PEID、FI、PE-SCAN)--->寻找OEP(OD)--->脱壳/Dump(LordPE、PeDumper、OD自带的脱壳插件、PETools)--->修复(Import REConstructor)【工具介绍】1、查壳PEID--功能强大的侦壳工具,自带脱壳插件(但是,效果不怎么样)工作原理:核心是userdb.txt(大家看看就完全明白了)[通过壳的入口特征码进行辨认]使用方法:可以拖放、也可以把PEID添加到右键菜单里面去FI--功能强大的侦壳工具,DOS界面。
使用方法:可以拖放、可以使用DOS命令行2、寻找OEPollydbg的四个区域左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示.cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息.右下角的是当前堆栈情况,还有注释啊.几个经常使用的快捷键F2:在需要的地方下断点(INT3型断点)F3:选择打开程序F4:运行到所选择的那一行F7:单步进入F8:单步跟踪F9:执行程序(运行程序)其中要特别讲一下3个F9的区别和作用:根据Ollydbg.hlp的中文翻译Shift+F9 - 与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
C语言反汇编-数据类型与常量
![C语言反汇编-数据类型与常量](https://img.taocdn.com/s3/m/3e51b800cd7931b765ce0508763231126edb7768.png)
C语⾔反汇编-数据类型与常量反汇编(Disassembly) 即把⽬标⼆进制机器码转为汇编代码的过程,该技术常⽤于软件破解、外挂技术、病毒分析、逆向⼯程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解⾼级语⾔代码都有相当⼤的帮助,软件⼀切神秘的运⾏机制全在反汇编代码⾥⾯。
寻找OEP1.使⽤编译器 VS 2013 Express 版本,写代码,并关闭基地址随机化,编译采⽤debug版。
2.寻找OEP,x64dbg 载⼊,默认停在,回车跟进。
call <__tmainCRTStartup> 再次回车跟进。
下⽅看到⼀个安全cookie检测,主要防⽌在⽬标堆栈中瞎搞,⽽设计的安全机制。
编译器开启后,每次运⾏都会⽣成随机cookie,结束时会验证是否⼀致,防⽌瞎搞,⽼版本编译器中不存在这个选项,⼀开始开发⼈员也没想那么多,后来瞎搞的⼈多了,才加上的,主要是害怕⾃⼰的windows被玩坏。
继续向下看代码,看到以下代码就到家了,call 0x0041113B 跟进去就是main.数值类型变量:数值类型默认在32位编译器上是4字节存储的。
#include <stdio.h>int main(int argc, char* argv[]){int x = 10, y = 20, z = 0;printf("%d\n", x + y);return 0;}反汇编结果如下,如果在vc6下mov ecx,0xC 原因 int=4 3*4=0xC004113CC | 8DBD 1CFFFFFF | lea edi,dword ptr ss:[ebp-0xE4] | 取出内存地址004113D2 | B9 39000000 | mov ecx,0x39 | 指定要填充的字节数004113D7 | B8 CCCCCCCC | mov eax,0xCCCCCCCC | 将内存填充为0xcccccc004113DC | F3:AB | rep stosd | 调⽤rep指令,对内存进⾏初始化004113DE | C745 F8 0A000000 | mov dword ptr ss:[ebp-0x8],0xA | 对变量x初始化为10004113E5 | C745 EC 14000000 | mov dword ptr ss:[ebp-0x14],0x14 | 对变量y初始化为20004113EC | C745 E0 00000000 | mov dword ptr ss:[ebp-0x20],0x0 | 对变量c初始化为0004113F3 | 8B45 F8 | mov eax,dword ptr ss:[ebp-0x8] | 取出10并放⼊eax004113F6 | 0345 EC | add eax,dword ptr ss:[ebp-0x14] | 与20相加得到结果付给eax004113F9 | 8BF4 | mov esi,esp | 保存当前栈帧004113FB | 50 | push eax |004113FC | 68 58584100 | push consoleapplication1.415858 | 415858:"%d\n"00411401 | FF15 14914100 | call dword ptr ds:[<&printf>] |00411407 | 83C4 08 | add esp,0x8 |除了整数类型外,浮点数也是⼀种数值运算⽅式,将上⽅代码稍微修改后,编译并查看其反汇编代码.#include <stdio.h>int main(int argc, char* argv[]){double x = 1.05, y = 20.56, z = 0;z = x + y;printf("%f\n", z);return 0;}观察以下汇编代码,会发现前⾯的初始化部分完全⼀致,但后⾯则使⽤了xmm0寄存器,该寄存器是专门⽤于运算浮点数⽽设计的浮点运算模块默认⼤⼩就是64位,其将内存中的值取出来并放⼊xmm0中进⾏中转,然后复制到堆栈中,等待最后调⽤addsd命令完成对浮点数的加法运算,并将运算结果回写到缓冲区,最后调⽤打印函数实现输出.004113CC | 8DBD 10FFFFFF | lea edi,dword ptr ss:[ebp-0xF0] |004113D2 | B9 3C000000 | mov ecx,0x3C |004113D7 | B8 CCCCCCCC | mov eax,0xCCCCCCCC |004113DC | F3:AB | rep stosd |004113DE | F2:0F1005 70584100 | movsd xmm0,qword ptr ds:[<__real@3ff0cccccccccccd>] | 将内存地址中的值取出并放⼊xmm0中004113E6 | F2:0F1145 F4 | movsd qword ptr ss:[ebp-0xC],xmm0 | 将数据放⼊堆栈中存储004113EB | F2:0F1005 80584100 | movsd xmm0,qword ptr ds:[<__real@40348f5c28f5c28f>] |004113F3 | F2:0F1145 E4 | movsd qword ptr ss:[ebp-0x1C],xmm0 |004113F8 | F2:0F1005 60584100 | movsd xmm0,qword ptr ds:[<__real@0000000000000000>] |00411400 | F2:0F1145 D4 | movsd qword ptr ss:[ebp-0x2C],xmm0 |00411405 | F2:0F1045 F4 | movsd xmm0,qword ptr ss:[ebp-0xC] | main.c:60041140A | F2:0F5845 E4 | addsd xmm0,qword ptr ss:[ebp-0x1C] | 对浮点数进⾏相加操作0041140F | F2:0F1145 D4 | movsd qword ptr ss:[ebp-0x2C],xmm0 | 结果放⼊堆栈等待被打印00411414 | 8BF4 | mov esi,esp |00411416 | 83EC 08 | sub esp,0x8 |00411419 | F2:0F1045 D4 | movsd xmm0,qword ptr ss:[ebp-0x2C] |0041141E | F2:0F110424 | movsd qword ptr ss:[esp],xmm0 |00411423 | 68 58584100 | push consoleapplication1.415858 | 415858:"%f\n"==L"春\n"00411428 | FF15 14914100 | call dword ptr ds:[<&printf>] |0041142E | 83C4 0C | add esp,0xC |字符与字符串变量:#include <stdio.h>int main(int argc, char* argv[]){char x = 'a', y = 'b',z = 'c';printf("x = %d --> y = %d --> z = %d", x,y,z);return 0;}反汇编结果如下,观察发现字符型的表现形式与整数类型基本⼀致,只是在数据位⼤⼩⽅⾯有所区别,如上int类型使⽤dword作为存储单位,⽽字符类型则默认使⽤byte形式存储。
壳和oep的基本概念
![壳和oep的基本概念](https://img.taocdn.com/s3/m/892387ad0875f46527d3240c844769eae009a3a9.png)
壳(Shell)和OEP(Operating Environment Parameters)是操作系统中两个关键的概念。
它们在操作系统的设计和实现中起着重要作用。
下面分别介绍壳和OEP 的基本概念:1. 壳(Shell):壳是操作系统中最上层的管理程序,负责管理系统资源、调度用户程序运行、提供用户界面以及执行操作系统命令等。
壳的主要任务是协调和控制操作系统内部的各种功能模块,以及管理与用户和外部设备的交互。
壳可以分为两类:命令行界面(CLI)和图形用户界面(GUI)。
命令行界面(CLI)是一种基于文本的用户界面,用户通过输入特定的命令来控制系统。
CLI 适用于熟练掌握操作系统命令的专业用户。
典型的CLI 命令包括文件操作(如ls、cd、cp、mv 等)、系统管理(如top、df、ps、kill 等)以及网络管理(如ping、telnet、ftp 等)等。
图形用户界面(GUI)是一种基于图标的用户界面,通过鼠标、键盘等输入设备进行操作。
GUI 使得操作系统更加易用和直观,适用于普通用户。
GUI 应用程序通常具有相似的界面布局和操作方式,如文件管理器、文本编辑器、浏览器等。
2. OEP (Operating Environment Parameters):OEP 是操作系统中用于配置和控制系统环境的一组参数。
这些参数决定了操作系统的运行方式和性能表现。
OEP 主要包括以下几类:(1)系统设置:如时区、语言、键盘布局等。
(2)用户环境:如用户目录、shell 配置、别名等。
(3)网络设置:如IP 地址、子网掩码、网关等。
(4)安全性设置:如访问控制列表(ACL)、防火墙规则等。
(5)硬件配置:如内存、CPU、磁盘等信息。
(6)软件安装:如已安装的软件包、版本信息等。
OEP 通常通过操作系统的配置文件或图形界面进行设置。
正确的OEP 配置有助于提高操作系统的稳定性和性能。
06寻找OEP
![06寻找OEP](https://img.taocdn.com/s3/m/217c49c481eb6294dd88d0d233d4b14e85243ed4.png)
第六课寻找OEP一般的压缩壳,如Aspack等都有专用的脱壳机。
而加密壳(如ASProtect,Armadillo)一般很少有脱壳机,必须手工脱壳。
手工脱壳一般情况是分三步:一是查找程序的真正入口点(OEP);二是抓取内存映像文件;三是输入表重建。
(当然现在的加密壳复杂些,要考虑更多的东西)OEP是Original Entry Point缩写,即程序加壳前的真正的入口点。
外壳初始化的现场环境(各寄存器值)与原程序的现场环境是相同的。
加壳程序初始化时保存各寄存器的值,外壳执行完毕,会恢复各寄存器内容。
其代码形式一般如下:PUSHFD ; 将标志寄存器入栈保存PUSHAD ; push eax, ecx, edx, ebx, esp, ebp, esi, edi……; 外壳代码部分POPAD ; pop edi, esi, ebp, esp, ebx, edx, ecx, eaxPOPFD ; 恢复标志寄存器JMP OEP ;OEP: ……; 解压后的程序原代码为了讲述方便,本节用UPX加壳的Win98记事本来演示。
首先用PEid查看加壳前的记事本:PEid显示Notepad.exe程序是用Microsoft Visual C++ 6.0编译的,接下来用UPX来加壳,方法是开个DOS窗口,用命令upx notepad.exe。
如下图所示:这时再用PEid查看加壳的文件,PEid会给出如下信息:UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & LaszloUPX的壳可以用UPX.exe自身来脱,命令是:upx -d 文件名。
一些变种的UPX壳用UP X.EXE自身脱不了,这时可以试试UPX ShellEx这款工具。
本节实例下载:notepad.upx.rar脱壳前建议用PE工具LordPE打开目标文件查看一下区块,以尽可能地多了解一些信息,对脱壳有帮助,如下图:1.根据跨段指令寻找OEP推荐用Ollydbg来调试脱壳,比SoftICE和TRW2000方便多了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP
6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入
7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。
7:去掉断点,按F8慢慢向下走!
8:到达程序的OEP,脱壳!
OEP一般有以下特征,基本上C++编写的OEP处会这样:
0040224E > 55 push ebp
0040224F 8BEC mov ebp,esp
00402251 6A FF push -1
00402253 68 08394000 push unpacked.00403908
VB程序会是这样的:
00403004 > 68 9C334000 push llk.0040339C ; ASCII "VB5!6&*"
00403009 E8 EEFFFFFF call <jmp.&MSVBVM60.ThunRTMain>
3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序
运行的次数!
4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次
5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!
6:按F2下断点!然后按SHIFT+F9来到断点处!
方法二: ห้องสมุดไป่ตู้
ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)
1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现。
2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车!
3.选种下断的地址,下硬件访问WORD断点。
4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳
方法三:
内存跟踪:
1:用OD打开软件!
2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!
3:按ALT+M,DA 打开内存镜象,找到第一个。rsrc.按F2下断点,
然后按SHIFT+F9运行到断点,接着再按ALT+M,DA 打开内存镜象,找到。RSRC上面的CODE,按
00402258 68 D4234000 push <jmp.&msvcrt._except_handler3>
0040225D 64:A1 00000000 mov eax,dword ptr fs:[0]
00402263 50 push eax
00402264 64:8925 00000000 mov dword ptr fs:[0],esp
===============================常见寻找OEP脱壳的方法============================
方法一:
1.用OD载入,不分析代码!
2.单步向下跟踪F8,是向下跳的让它实现
3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选)
F2下断点!然后按SHIFT+F9,直接到达程序OEP,脱壳!
方法四:
一步到达OEP(前辈们总结的经验)
1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处
2.来到大跳转处,点下F8,脱壳之!
方法五:
1:用OD打开软件!
2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序!