脱壳找OEP7种基本方法
(完整版)常见几种脱壳方法

----------------<小A分>----------------一、概论壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳(强壳)两种"UPX" "ASPCAK" "TELOCK" "PELITE" "NSPACK(北斗)" ... "ARMADILLO" "ASPROTECT" "ACPROTECT" "EPE(王)" "SVKP" ...顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。
当然加密壳的保护能力要强得多!-----------<小A分割线>-------------二、工具的认识OllyDBG ring3 shell层级别的动态编译工具、PEid、ImportREC、LordPE、softIce ring0级别调试工具-------------<小A分割>-------------------三、常见手动脱壳方法预备知识1.PUSHAD (入栈/压栈)代表程序的入口点,2.POPAD (弹栈/出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。
------------<小A分割线>--------------------方法一:单步跟踪法1.用OD载入,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。
也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN 的一般很快就会到程序的OEP。
第26课 asprotect脱壳系列

第26课asprotect脱壳系列[例 1]chap707 asprotect0.94b加壳用脱壳最基本的方法――esp硬件断点法很快来到这里push eax eax=442B98retn由retn返回即来到入口点oep,oep等于442B98。
用ollydump插件dump转储程序,注意“重建输入表”选项不要打对勾,因为asprotect这个壳比较复杂,我们需要用import reconstructor重建输入表。
注意:oep输入42b98,点IAT AutoSearch按钮;然后,点Get Imports按钮,再点右上方的show invalid按钮。
如图:231个指针没有认出来,不要惊慌,莫要害怕。
如图,右键选取1级修复。
修复后结果如下:接着,show invalid,选取2级、3级修复,可是很郁闷,这一个还是没有解决掉,还是1个。
关于asprotect的插件还很多,我们逐个试吧。
asprotect#1无效果,asprotect#2亦无效。
所有的均无效。
于是,只能猜函数了:如上图:这之间的出名的函数不多,我们最容易想到的就是跟壳密切相关的一个著名函数GetProcAddress,双击指针,如下图,在弹出的窗口中选取GetProcAddress,点ok即可至此,全部指针修复成功。
点Fix Dump按钮,选中刚才dump的文件即可。
脱壳成功![例 2]unpackme asprotect1.23RC1加壳Olly载入目标程序,“调试选项”中,忽略内存异常打上勾,其余全部不打勾。
如图:F9运行,出现异常,shift+F9 16次后程序运行。
故重新载入程序,F9运行,出现异常,shift+F9 16-1=15次后来到这里。
00E22CD1 3100 xor dword ptr ds:[eax],eax 00E22CD3 64:8F05 00000000 pop dword ptr fs:[0]00E22CDA 58 pop eax00E22CDB 833D 7C6DE200 00 cmp dword ptr ds:[E26D7C],0 00E22CE2 74 14 je short 00E22CF800E22CE4 6A 0C push 0C00E22CE6 B9 7C6DE200 mov ecx,0E26D7C00E22CEB 8D45 F8 lea eax,dword ptr ss:[ebp-8] 00E22CEE BA 04000000 mov edx,400E22CF3 E8 54E1FFFF call 00E20E4C00E22CF8 FF75 FC push dword ptr ss:[ebp-4]00E22CFB FF75 F8 push dword ptr ss:[ebp-8]00E22CFE 8B45 F4 mov eax,dword ptr ss:[ebp-C] 00E22D01 8338 00 cmp dword ptr ds:[eax],000E22D04 74 02 je short 00E22D0800E22D06 FF30 push dword ptr ds:[eax]00E22D08 FF75 F0 push dword ptr ss:[ebp-10] 00E22D0B FF75 EC push dword ptr ss:[ebp-14] 00E22D0E C3 retn以上红色所示的都是标志性的语句。
第16课 手动脱壳的常规方法

第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走一下,来到入口点。
普通壳的脱壳方法和脱壳技巧

普通壳的脱壳方法和脱壳技巧脱壳是指将一个已经打包的可执行文件(通常是二进制文件)恢复为原始的、可以读取和修改的形式。
这在软件逆向工程、安全审计和病毒分析等领域都是非常常见的操作。
下面我将为你介绍普通壳的脱壳方法和脱壳技巧。
一、普通壳的脱壳方法1.静态脱壳静态脱壳是指对目标文件进行分析,找到壳的解密和载入代码,然后将其解密出来,恢复原始的可执行文件。
- 调试器脱壳:使用调试器(如OllyDbg、IDA Pro等)来单步执行目标程序,找到壳的解密代码,并通过调试器的内存分析功能来寻找待解密的数据。
一旦找到解密的算法和密钥,就可以将目标文件完全解密出来。
- 静态分析脱壳:通过静态分析工具(如IDA Pro、Hopper等)来逆向目标文件,找到壳的解密算法和密钥,然后将其解密出来。
2.动态脱壳动态脱壳是指在目标程序运行时,通过对程序的运行过程进行监控和分析,找到壳的解密和载入代码,并将其解密出来,恢复原始的可执行文件。
-API钩取脱壳:通过使用一个DLL注入到目标程序的地址空间中,然后使用API钩子来监控API函数的调用,找到壳解密代码的入口点。
一旦找到壳解密代码的起始地址,就可以通过调试器执行目标程序,并在合适的时机将解密出来的代码或数据导出。
- 内存转储脱壳:通过在目标程序的执行过程中,使用内存转储工具(如winhex、ollydump等)将目标程序的内存转储出来,然后使用静态脱壳的方法对内存转储文件进行分析。
二、普通壳的脱壳技巧1.加载器分析在进行脱壳之前,首先要分析目标文件中的加载器。
加载器是壳程序的一部分,用于解压和载入真正的可执行文件。
通过分析加载器,可以确定载入代码和解密算法的位置,并推导出解密算法的密钥。
2.寻找壳代码的入口点在进行脱壳时,需要找到壳代码的入口点,即壳程序开始执行的位置。
可以通过调试器或者静态分析工具来寻找入口点,并标记下来以备后续使用。
3.内存和断点设置通过内存和断点设置,在目标程序运行过程中定位到关键的内存位置。
pediy exe格式脱壳

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脱壳知识和方法大全

般情况下,这个跳转比较大的话,就改为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后,再运行一次,就是返回时机,中
PECompact壳研究与解密脱壳-电脑资料

PECompact壳研究与解密脱壳-电脑资料因为PECompact有2种加壳方式,我也拜读了DiKeN的"PECompact的OEP的简易查找方法",于是想深入研究一下.这是98的Notepad.exe使用PECompact(JCALG1)压缩过的结果0040AB20 >EB 06 JMP SHORT NOTEPAD.0040AB28<==第一条指令0040AB22 68 CC100000 PUSH 10CC<======这就是程序的原始OEP的RVA地址这是这是98的Notepad.exe使用PECompact(aPLib)压缩过的结果0187:0040AB1F 68EB0668CC PUSH DWORD CC6806EB<==第一条指令0187:0040AB24 1000 ADC [EAX],AL0187:0040AB26 00C3 ADD BL,AL0187:0040AB28 9C PUSHF0187:0040AB29 60 PUSHA这样就不能用DiKeN的"PECompact的OEP的简易查找方法"来找程序的OEP了.于是我手动跟踪了一下,并做了记录:Notepad.exe使用PECompact(JCALG1)压缩过0187:0040AAFF 65EB06 JMP SHORT 0040AB080187:0040AB02 68CC100000 PUSH DWORD 10CC0187:0040AB07 C3 RET0187:0040AB08 9C PUSHF0187:0040AB09 60 PUSHA0187:0040AB0A E802000000 CALL 0040AB11 //这里按F8继续.0187:0040AB0F 33C0 XOR EAX,EAX0187:0040AB13 83C004 ADD EAX,BYTE +04......按F12,到了这里0187:0040AB77 F3A5 REP MOVSD0187:0040AB79 8BFB MOV EDI,EBX0187:0040AB7B C3 RET //光标停在这里0187:0040AB7C BDCF400000 MOV EBP,40CF0187:0040AB81 8BF7 MOV ESI,EDI......再按F12,到了这里0187:0040D551 68CC104000 PUSH DWORD 004010CC 0187:0040D556 C20400 RET 04 //返回OEP 处了!0187:0040D5598BB55B974000 MOV ESI,[EBP+0040975B]到了OEP直接Makepe.Notepad.exe使用PECompact(aPLib)压缩0187:0040AB1F 68EB0668CC PUSH DWORD CC6806EB 0187:0040AB24 1000 ADC [EAX],AL0187:0040AB26 00C3 ADD BL,AL0187:0040AB28 9C PUSHF0187:0040AB29 60 PUSHA0187:0040AB2A E802000000 CALL 0040AB31 //F8进去后0187:0040AB2F 33C0 XOR EAX,EAX0187:0040AB31 8BC4 MOV EAX,ESP......按F120187:0040AB97 F3A5 REP MOVSD0187:0040AB9B C3 RET //停在这里0187:0040AB9C BDCF400000 MOV EBP,40CF......再按F120187:0040D54F 9D POPF0187:0040D550 50 PUSH EAX0187:0040D551 68CC104000 PUSH DWORD 004010CC 0187:0040D556 C20400 RET 04 //又返回OEP了,怎么这么简单?这里还有一点要说明,我发现使用PECompact压缩过的程序,用PROCDUMP或LordPE就算Dump出来还是不能使用对于Dump出来的程序必须要修改入口地址才可以记得以前在脱PECompact的壳时用PROCDUMP来Dump就非法,顺便用TRW跟了一下,有一点点体会如下:记得在TRW中输入Faults on,然后用PROCDUMP脱壳吧,然后TRW就跳出来了0187:004055C3 8B7D10 MOV EDI,[EBP+10]0187:004055C6 56 PUSH ESI0187:004055C7 51 PUSH ECX0187:004055C8 AC LODSB //停在这里,于是下断 bpx eip-1之后就F50187:004055C9 AE SCASB0187:004055CA 750B JNZ 004055D70187:004055CC 803F00 CMP BYTE [EDI],00然后重新运行PROCDUMP,继续脱壳0187:004055C3 8B7D10 MOV EDI,[EBP+10]0187:004055C6 56 PUSH ESI0187:004055C7 51 PUSH ECX //断在这里让我们来修改吧a eip+1nop回车F5看看是不是正常脱壳了啊!当然也可以直接修改主程序,以后就不用这样反复修改了!查找8B 7D 10 56 51 AC AE,改为8B 7D 10 56 51 90 AE就可以了!不知道会不会有什么不对,还请高手指正!后记,其实我在跟踪的时候并不是上面写的时候那么容易,本来我是一步一步慢慢走的,后来跟了几遍,就发现了这个规律,所以没有详细写跟踪过程,只是把自己的总结写了出来,如果有什么不足或欠缺,还请多多指教,本人才疏学浅,还需要大家的帮助修正一点错误关于Procdump的修改,当时没有发现,如果修改了主程序,使用脱壳脚本的时候会有问题,建议保留原来的备份.修改的程序作为专门脱用未修改程序脱壳时非法的工具。
脱壳基础知识入门

脱壳基础知识入门现在加解密发展己形成2个分支了,一个就是传统的算法,另一个就是加密壳。
越来越多的软件采用了密码学相关算法,现在要做出一个软件注册机己不象前几年那么容易,这就要求解密者必须要有一定的数学功底和密码学知识,而这些在短时间内是不容易掌握的。
除了密码学的应用,越来越多的软件加壳了,因此要求解密者必须掌握一些脱壳技术,这就使得壳成了解密必须迈过的一个门槛。
壳发展到今天,强度越来越高了,将许多人挡在门外,使得大家望壳兴叹。
另外,论坛现在两极分化比较严重,高手讨论的脱壳技术新手看不懂,很多人想学脱壳,但看到壳这么难,只好放弃了,造成新手与高手间一个断档,为了鼓励更多新人加入脱壳的行列,很有必要将壳有关知识总结一下。
主页提供的教学确实有点过时了,己到非更新不可了。
相对于密码学算法,脱壳并不难,只要肯花时间,短期内还是比较容易取得成绩的。
第一课 PE格式要想学脱壳,第一步就得掌握PE格式,PE是Portable Executable File Format(可移植的执行体)简写,它是目前Windows平台上的主流可执行文件格式。
Microsoft Visual C++提供的WINNT.H里有PE数据结构的完整定义。
推荐文档:ah007翻译的“PE文件格式”1.9版qduwg翻译的PE文件格式Iczelion's 的PE文件格式PE结构各字段偏移参考学习PE格式的方法是自己先准备一个十六进制工具,如HexWorkshop,WinHex,用这些工具打开一个EXE文件对照着学。
强烈推荐你用Stud_PE v.2.2.0.5这款工具辅助学习PE格式。
PE格式学习的重点是在输入表(Import Table)这块。
Stud_PE工具界面:PE结构图:第二课 SEH技术结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。
SEH是Windows操作系统的一种系统机制,与特定的程序设计语言无关。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
脱壳找OEP7种基本方法
七种找OEP的方法
OD手动脱壳的7种法则
方法一:单步跟踪法
1.用OD载入,点“不分析代码!”
2.单步向下跟踪F8,实现向下的跳。
也就是说向上的跳不让其实现!(通过F4)
3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)
4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!
5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP
6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入
7.一般有很大的跳转(大跨段),比如jmp XXXXXX 或者JE XXXXXX 或者有RETN 的一般很快就会到程序的OEP。
PS:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。
一般情况下可以轻松到达OEP!
方法二:ESP定律法
ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)
1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突变成红色。
(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)
2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!
3.选中下断的地址,断点--->硬件访--->WORD断点。
4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。
方法三:内存镜像法
1:用OD打开软件!
2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!
3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP!
方法四:一步到达OEP
1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPX,ASPACK壳),然后按下F2,F9运行到此处
2.来到大跳转处,点下F8,到达OEP!
方法五:最后一次异常法
1:用OD打开软件
2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序3:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m!
4:CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)5:在OD的右下角我们看见有一个"SE句柄",这时我们按CTRL+G,输入SE句柄前的地址!
6:按F2下断点!然后按SHIFT+F9来到断点处!
7:去掉断点,按F8慢慢向下走!
8:到达程序的OEP!
方法六:模拟跟踪法
1:先试运行,跟踪一下程序,看有没有SEH暗桩之类
2:ALT+M打开内存镜像,找到(包含=SFX,imports,relocations)
内存镜像,项目30
地址=0054B000
大小=00002000 (8192.)
Owner=check 00400000
区段=.aspack
包含=SFX,imports,relocations
类型=Imag 01001002
访问=R
初始访问=RWE
3:地址为0054B000,如是我们在命令行输入tc eip<0054B000,回车,正在跟踪ing。
PS:大家在使用这个方法的时候,要理解他是要在怎么样的情况下才可以使用
方法七:“SFX”法
1:设置OD,忽略所有异常,也就是说异常选项卡里面都打上勾
2:切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”,确定。
3:重载程序(如果跳出是否“压缩代码?”选择“否”,OD直接到达OEP)。