脱壳找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操作系统的一种系统机制,与特定的程序设计语言无关。
常见寻找OEP的方法
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来到断点处!
方法二: ห้องสมุดไป่ตู้
浅谈脱壳方法(转)
浅谈脱壳方法(转)写给新手 - 浅谈脱壳方法2008-03-13 10:57:18| 分类:破解相关 | 标签: |字号大中小订阅目标:轻轻松松学开车 6.6地址:最近看到一些新手常问查壳工具查不出是什么壳,末知壳如何脱...我这里就简单的用一个示例程序谈谈脱壳方法. 算是给新手打打气.一般这种没有公开的壳不会太猛(除了hying, vcasm, jingulong等这些圈内人的壳哈), 大多是自己土制的壳, 有的还伪装一下, 致使查壳工具查不出或查出什么Aspack, UPX的壳. 碰到这种壳不用太怕, 认真跟踪分析一下一般都没多大问题.一般加壳后的程序运行时大多是用各种方法AntiDebugger, 其中夹杂很多花指令和垃圾指令, 然后解码,又是一堆AntiDebugger, 可能又解码, 恢复IAT, 又是一堆AntiDebugger...最后再跳到程序真正的OEP处, 对付这种壳一般的方法是先找到OEP, 再修复IAT在壳跳到OEP的时候一般是个跨段跳转, 跳转方法有很多, 如JMP XXXXXXXX, JMP [XXXXXXXX], JE [XXXXXXXX],PUSH XXXXXXXX RET, CALL XXXXXXXXX, CALL [XXXXXXXX], CALL EAX...还有的是在SEH中直接指定EIP等等, 找到这个跳转地址, 然后在相应地址上设上断点, F9运行, 就到达OEP处了, 此时就是最好的Dump时机修复IAT一般用ImportREC, 填写好OEP的RVA, 先点IATAutoSearch, 再点GetImport, 如果找到的API全部有效就可以点Fix Dump了, 如果有无效的就需要修复, 先点Show Invalid, 再对这些无效的API点右键, 共有3个修复级别, 分别是Disasm,HOOK, Trap Flag, 可以一个一个试, 全部API有效或只有一两个API无效时就可以点Fix Dump了, 如果修复不了就只有用手工修复了.手工修复IAT的方法是, 一般壳在运行的时候会恢复IAT或破坏IAT, 你可以在恢复IAT后或破坏IAT之前DUMP出完好的IAT, 再用16进制编辑器, 把完整的IAT复制到Dump出来的文件中, 多做做练习就不难了还是看看目标程序"轻轻松松学开车 6.6", 用PEiD查一下, ASPack 2.12 -> Alexey Solodovnikov用OD载入, 提示入口点在代码外部(以后别再问如何判断程序是否加壳了, 用OD载入如果有这个提示就表示程序是加了壳的), 点确定, 问是否分析, 点否, 来到入口处006AF001 D> 60 pushad ; 壳代码入口006AF002 E8 03000000 call DrvStudy.006AF00A ; 有花指令, F7跟进006AF007 - E9 EB045D45 jmp 45C7F4F7006AF00C 55 push ebp006AF00D C3 retn006AF00E E8 01000000 call DrvStudy.006AF014006AF013 EB 5D jmp short DrvStudy.006AF072在006AF002处call DrvStudy.006AF00A, 代码中没有006AF00A, 是因为花指令让OD错误的分析了代码, 用F7跟进就能来到006AF00A处, 像这种近距离的Call, 其实是变形的Jmp, 都要用F7跟进, 如果F8跳过的话可以会碰到里面的陷阱006AF00A 5D pop ebp ; DrvStudy.006AF007, 跳到这里006AF00B 45 inc ebp ; ebp + 1006AF00C 55 push ebp ; 变形跳转到ebp的地址处006AF00D C3 retn来到006AF008 /EB 04 jmp short DrvStudy.006AF00E ; 来到这里006AF00A |5D pop ebp006AF00B |45 inc ebp ; ebp + 1006AF00C |55 push ebp ; 变形跳转到ebp的地址处006AF00D |C3 retn006AF00E \E8 01000000 call DrvStudy.006AF014 ; 变形跳转, F7跟进006AF014 5D pop ebp006AF015 BB EDFFFFFF mov ebx,-13006AF01A 03DD add ebx,ebp006AF01C 81EB 00F02A00 sub ebx,2AF000 ; 代码重定位006AF022 83BD 22040000 00 cmp dword ptr ss:[ebp+422],0 ; 变量ebp+422是存放的基址006AF029 899D 22040000 mov dword ptr ss:[ebp+422],ebx 006AF02F /0F85 65030000 jnz DrvStudy.006AF39A ; 这里不跳006AF035 |8D85 2E040000 lea eax,dword ptr ss:[ebp+42E] ; "kernel32.dll"006AF03B |50 push eax ; 参数入栈006AF03C |FF95 4D0F0000 call dword ptr ss:[ebp+F4D] ; kernel32.GetModuleHandleA006AF042 |8985 26040000 mov dword ptr ss:[ebp+426],eax ; kernel32.dll的句柄存入ebp+426处006AF048 8BF8 mov edi,eax ; kernel32.77E40000006AF04A 8D5D 5E lea ebx,dword ptr ss:[ebp+5E] ; "VirtualAlloc"006AF04D 53 push ebx006AF04E 50 push eax ; Kernel32.dll句柄006AF04F FF95 490F0000 call dword ptr ss:[ebp+F49] ; GetProcAddress006AF055 8985 4D050000 mov dword ptr ss:[ebp+54D],eax ;把VirtualAlloc的函数地址存入ebp+54D处006AF05B 8D5D 6B lea ebx,dword ptr ss:[ebp+6B] ; "VirtualFree"006AF05E 53 push ebx006AF05F 57 push edi ; Kernel32.dll句柄入栈006AF060 FF95 490F0000 call dword ptr ss:[ebp+F49] ; GetProcAddress006AF066 8985 51050000 mov dword ptr ss:[ebp+551],eax ; 把VirtualFree的函数地址存入ebp+511处006AF06C 8D45 77 lea eax,dword ptr ss:[ebp+77] ; 跳转地址载入eax006AF06F FFE0 jmp eax ; 跳到eax指向的地方006AF08A 8B9D 31050000 mov ebx,dword ptr ss:[ebp+531] ; 来到这里, ebx=0006AF090 0BDB or ebx,ebx006AF092 /74 0A je short DrvStudy.006AF09E ; ebx==0,跳006AF094 |8B03 mov eax,dword ptr ds:[ebx]006AF096 |8785 35050000 xchg dword ptr ss:[ebp+535],eax 006AF09C |8903 mov dword ptr ds:[ebx],eax006AF09E \8DB5 69050000 lea esi,dword ptr ss:[ebp+569] ; 跳到这里, esi指向一标志006AF0A4 833E 00 cmp dword ptr ds:[esi],0006AF0A7 /0F84 21010000 je DrvStudy.006AF1CE ; 不为0, 不跳006AF0AD 6A 04 push 4006AF0AF 68 00100000 push 1000006AF0B4 68 00180000 push 1800006AF0B9 6A 00 push 0006AF0BB FF95 4D050000 call dword ptr ss:[ebp+54D] ; 分配内存C语言描述为VirtualAlloc(NULL, 0x1800, MEM_COMMIT, PAGE_READWRITE);006AF0C7 8B46 04 mov eax,dword ptr ds:[esi+4]006AF0CA 05 0E010000 add eax,10E006AF0CF 6A 04 push 4006AF0D1 68 00100000 push 1000006AF0D6 50 push eax006AF0D7 6A 00 push 0006AF0D9 FF95 4D050000 call dword ptr ss:[ebp+54D] ; 再次分配内存, eax为所需内存大小006AF0DF 8985 52010000 mov dword ptr ss:[ebp+152],eax ; 分配的第2块内存锯柄存入ebp+152处006AF0E5 56 push esi006AF0E6 8B1E mov ebx,dword ptr ds:[esi]006AF0E8 039D 22040000 add ebx,dword ptr ss:[ebp+422] 006AF0EE FFB5 56010000 push dword ptr ss:[ebp+156] ; 0x401000006AF0F4 FF76 04 push dword ptr ds:[esi+4]006AF0F7 50 push eax006AF0F8 53 push ebx006AF0F9 E8 6E050000 call DrvStudy.006AF66C ; 解压代码006AF0FE B3 01 mov bl,1006AF100 80FB 00 cmp bl,0006AF103 75 5E jnz short DrvStudy.006AF163006AF105 FE85 EC000000 inc byte ptr ss:[ebp+EC]006AF10B 8B3E mov edi,dword ptr ds:[esi]006AF10D 03BD 22040000 add edi,dword ptr ss:[ebp+422] 006AF113 FF37 push dword ptr ds:[edi] ; 保护0x401000处的代码006AF115 C607 C3 mov byte ptr ds:[edi],0C3 ; 把0x401000处的代码改为RET006AF118 FFD7 call edi ; 垃圾调用006AF11A 8F07 pop dword ptr ds:[edi] ; 恢复0x401000处的代码F8单步到下面一点点, 来到006AF12D 0BC9 or ecx,ecx006AF12F 74 2E je short DrvStudy.006AF15F006AF131 78 2C js short DrvStudy.006AF15F006AF133 AC lods byte ptr ds:[esi]006AF134 3C E8 cmp al,0E8006AF136 74 0A je short DrvStudy.006AF142006AF138 EB 00 jmp short DrvStudy.006AF13A006AF13A 3C E9 cmp al,0E9006AF13C 74 04 je short DrvStudy.006AF142006AF13E 43 inc ebx006AF13F 49 dec ecx006AF140 ^ EB EB jmp short DrvStudy.006AF12D006AF142 8B06 mov eax,dword ptr ds:[esi] ; 在这里设置一个断点这里找opcode为e8或e9的地方, F9运行后断下, ebx=1FE, eax=[esi]的内容, 紧接着会比较esi指向的地方006AF144 /EB 00 jmp short DrvStudy.006AF146006AF146 \803E 36 cmp byte ptr ds:[esi],36 ; 比较第2个字节的opcode是否为36006AF149 ^ 75 F3 jnz short DrvStudy.006AF13E ; 是就不跳, 这里为36不会跳006AF14B 24 00 and al,0006AF14D C1C0 18 rol eax,18 ; 解码006AF150 2BC3 sub eax,ebx ; 解码006AF152 8906 mov dword ptr ds:[esi],eax ; 解码后的代码存入esi指向的地方006AF154 83C3 05 add ebx,5006AF157 83C6 04 add esi,4006AF15A 83E9 05 sub ecx,5006AF15D ^ EB CE jmp short DrvStudy.006AF12D ; 向上跳可以判断出上面的这段代码是解码的, C30000处的代码会解码, 在006AF15D的下一个指令设好断点, F9运行, 断下006AF15F 5B pop ebx ; 断下, 解码完毕006AF160 5E pop esi006AF161 59 pop ecx006AF162 58 pop eax006AF163 EB 08 jmp short DrvStudy.006AF16D ; 跳006AF16D 8BC8 mov ecx,eax ; 来到这里006AF16F 8B3E mov edi,dword ptr ds:[esi] ; 代码段偏移006AF171 03BD 22040000 add edi,dword ptr ss:[ebp+422] ; 基地址+偏移, 指向代码段006AF177 8BB5 52010000 mov esi,dword ptr ss:[ebp+152] ; 解码后的正确代码地址006AF17D C1F9 02 sar ecx,2006AF180 F3:A5 rep movs dword ptr es:[edi],dword >; 填充正确的代码006AF182 8BC8 mov ecx,eax006AF184 83E1 03 and ecx,3006AF187 F3:A4 rep movs byte ptr es:[edi],byte pt>; 填充正确的代码006AF189 5E pop esi006AF18A 68 00800000 push 8000006AF18F 6A 00 push 0006AF191 FFB5 52010000 push dword ptr ss:[ebp+152]006AF197 FF95 51050000 call dword ptr ss:[ebp+551] ; VirtualFree006AF19D 83C6 08 add esi,8006AF1A0 833E 00 cmp dword ptr ds:[esi],0 ; 解码完成?没完成就跳006AF1A3 ^ 0F85 1EFFFFFF jnz DrvStudy.006AF0C7 ; 又跳到上面因此可以确定这一大段006AF0C7 - 006AF1A3都是解码的代码, 在006AF1A3处的下1条指令设置一个断点, F9运行, 断下006AF1A9 68 00800000 push 8000 ; 断下006AF1AE 6A 00 push 0006AF1B0 FFB5 56010000 push dword ptr ss:[ebp+156]006AF1B6 FF95 51050000 call dword ptr ss:[ebp+551] ; VirtualFree释放内存了006AF1BC 8B9D 31050000 mov ebx,dword ptr ss:[ebp+531] ; ebx=0006AF1C2 0BDB or ebx,ebx006AF1C4 74 08 je short DrvStudy.006AF1CE ; ebx==0,跳006AF1C6 8B03 mov eax,dword ptr ds:[ebx]006AF1C8 8785 35050000 xchg dword ptr ss:[ebp+535],eax 006AF1CE 8B95 22040000 mov edx,dword ptr ss:[ebp+422] ; 跳到这里, ebx=0x400000, 基地址006AF1D4 8B85 2D050000 mov eax,dword ptr ss:[ebp+52D] ; eax=0x400000006AF1DA 2BD0 sub edx,eax006AF1DC 74 79 je short DrvStudy.006AF257 ; ecx==0, 跳下面就是恢复IAT了006AF257 8B95 22040000 mov edx,dword ptr ss:[ebp+422] ; 跳到这里, edx=0x400000, 基地址006AF25D 8BB5 41050000 mov esi,dword ptr ss:[ebp+541] ; esi=0006AF263 0BF6 or esi,esi006AF265 74 11 je short DrvStudy.006AF278 ; esi==0, 跳006AF267 03F2 add esi,edx006AF269 AD lods dword ptr ds:[esi]006AF26A 0BC0 or eax,eax006AF26C 74 0A je short DrvStudy.006AF278006AF26E 03C2 add eax,edx006AF270 8BF8 mov edi,eax006AF272 66:AD lods word ptr ds:[esi]006AF274 66:AB stos word ptr es:[edi]006AF276 ^ EB F1 jmp short DrvStudy.006AF269006AF278 BE 00001E00 mov esi,1E0000 ; 跳到这里, esi=1e0000006AF27D 8B95 22040000 mov edx,dword ptr ss:[ebp+422] ; edx=基地址006AF283 03F2 add esi,edx ; esi=51e0000006AF285 8B46 0C mov eax,dword ptr ds:[esi+C] ; 指向下一个dll文件名的RVA006AF288 85C0 test eax,eax ; 不为空就不跳006AF28A 0F84 0A010000 je DrvStudy.006AF39A006AF290 03C2 add eax,edx ; 得到下一个dll文件名006AF292 8BD8 mov ebx,eax006AF294 50 push eax006AF295 FF95 4D0F0000 call dword ptr ss:[ebp+F4D] ; 取kernel32.dll的句柄006AF29B 85C0 test eax,eax ; 成功, 跳006AF29D 75 07 jnz short DrvStudy.006AF2A6006AF29F 53 push ebx006AF2A0 FF95 510F0000 call dword ptr ss:[ebp+F51]006AF2A6 8985 45050000 mov dword ptr ss:[ebp+545],eax ; 跳到这里, kernel32.dll句柄存入ebp+545006AF2AC C785 49050000 00000000 mov dword ptr ss:[ebp+549],0 ; [ebp+549]=0006AF2B6 8B95 22040000 mov edx,dword ptr ss:[ebp+422] ; edx=基地址006AF2BC 8B06 mov eax,dword ptr ds:[esi] ; eax=0006AF2BE 85C0 test eax,eax006AF2C0 75 03 jnz short DrvStudy.006AF2C5 ; eax==0, 不跳006AF2C2 8B46 10 mov eax,dword ptr ds:[esi+10] ; IAT的FirThunk基地址006AF2C5 03C2 add eax,edx006AF2C7 0385 49050000 add eax,dword ptr ss:[ebp+549] ; 指向下1个API006AF2CD 8B18 mov ebx,dword ptr ds:[eax]006AF2CF 8B7E 10 mov edi,dword ptr ds:[esi+10]006AF2D2 03FA add edi,edx006AF2D4 03BD 49050000 add edi,dword ptr ss:[ebp+549] 006AF2DA 85DB test ebx,ebx006AF2DC 0F84 A2000000 je DrvStudy.006AF384006AF2E2 F7C3 00000080 test ebx,80000000006AF2E8 75 04 jnz short DrvStudy.006AF2EE006AF2EA 03DA add ebx,edx006AF2EC 43 inc ebx ; 取函数名006AF2ED 43 inc ebx ; 取函数名006AF2EE 53 push ebx006AF2EF 81E3 FFFFFF7F and ebx,7FFFFFFF006AF2F5 53 push ebx ; 函数名入栈006AF2F6 FFB5 45050000 push dword ptr ss:[ebp+545] ;kernel32.dll句柄入栈006AF2FC FF95 490F0000 call dword ptr ss:[ebp+F49] ; GetProcAddress006AF302 85C0 test eax,eax006AF304 5B pop ebx006AF305 75 6F jnz short DrvStudy.006AF376 ; 跳取API函数地址成功后跳到下面的地方006AF376 8907 mov dword ptr ds:[edi],eax ; API地址存入edi 指向地址006AF378 8385 49050000 04 add dword ptr ss:[ebp+549],4 ; 取下一个API006AF37F ^ E9 32FFFFFF jmp DrvStudy.006AF2B6 ; 跳006AF384 8906 mov dword ptr ds:[esi],eax006AF386 8946 0C mov dword ptr ds:[esi+C],eax006AF389 8946 10 mov dword ptr ds:[esi+10],eax006AF38C 83C6 14 add esi,14006AF38F 8B95 22040000 mov edx,dword ptr ss:[ebp+422] 006AF395 ^ E9 EBFEFFFF jmp DrvStudy.006AF285 ; 跳去恢复下个导入dll中的函数这个大循环完成后IAT就恢复完成了...这个IAT是没有被破坏的, 根据一般经验, 壳在运行时都会有这么一个大循环来恢复IAT, 有的是破坏, 因此当在你一个循环中碰到GetModuleHandleA, LoadLibraryA, GetProcAddress, 时就要小心了, 记下它, 有可能ImportRec找不回API函数的时候, 需要手工修复IAT时就要用到它循环完后,来到这里006AF39A B8 08CF1C00 mov eax,1CCF08 ; OEP的RVA006AF39F 50 push eax006AF3A0 0385 22040000 add eax,dword ptr ss:[ebp+422] ; OEP值006AF3A6 59 pop ecx006AF3A7 0BC9 or ecx,ecx006AF3A9 8985 A8030000 mov dword ptr ss:[ebp+3A8],eax ; 修改[ebp+3A8]处的代码006AF3AF 61 popad006AF3B0 75 08 jnz short DrvStudy.006AF3BA ; 跳006AF3B2 B8 01000000 mov eax,1006AF3B7 C2 0C00 retn 0C006AF3BA 68 08CF5C00 push DrvStudy.005CCF08 ; 变形跳转006AF3BF C3 retn ; ^_^ 飞向光明之颠这里就是典型的Delphi程序的OEP处代码005CCF08 55 push ebp ; 停在这里005CCF09 8BEC mov ebp,esp005CCF0B 83C4 F0 add esp,-10005CCF0E 53 push ebx005CCF0F B8 80CA5C00 mov eax,DrvStudy.005CCA80005CCF14 E8 B3A7E3FF call DrvStudy.004076CC现在就可在005CCF08处Dump程序了, 用OD的OllyDump插件, Dump出程序, 启动ImportREC, 填入OEP的RVA值先点IATAutoSearch, 再点GetImport, 找到的API全部有效, 点Fix Dump, 修复IAT指针运行程序, 提示系统数据错误, 这是因为程序有自校验, 发现自己被脱壳后拒绝运行, 去除程序的自校验我就不说了...用爆破的方法就能搞定...【总结】本文讲述了脱壳的一般方法, 新手面对末知壳先不要怕, 自己试着跟踪分析一下, 多做练习才会有进步。
半仙算命主程序脱壳全记录图文
半仙算命主程序脱壳全记录(图文)第一种方法:“ESP定律”和“M”内存查找“CODE”一、查壳:是―――“PECompact 2.x - Jeremy Collake”二、启动“OD”载入主程序―――F8下,发现“寄存器(FPU)”中突显“ESP 0012FFC0”,可进行“ESP定律”―――点选“跟随到数据窗口”-“断点”-“硬件访问”-“Word”,F9 运行―――到达下图地址,进入“调试”菜单,删除硬件访问断点,点“M”进入“Memory map”找到“CODE”下断―――到达下图地址,F8下,到达“C3 RETN”自动跳转―――发现“寄存器(FPU)”中突显“ESP 0012FBF0”,可再进行一次“ESP定律”(同上)―――到达下图地址,取消ESP断点,F8下―――到达“-FFE0 JMP EAX”跳转出口―――跳转后到达OEP真正入口―――可以进行DUMP 存盘操作―――入口地址自动修正为“0017407C”―――下图是已脱壳的主程序源码三、启动已脱壳的主程序,不能启动,那么要修复输入表(略)四、检验五、优化减肥,在检验。
OK第二种方法:连续多次“ESP定律”直接到达“OEP”真正入口―――记住:1、要在“调试选项”中忽略所以异常;2、“ESP”设置“硬件访问-WORD”,F9运行到达新的地址后,首先必须“删除”ESP所设置的断点。
―――第一次使用“ESP定律”的地址-“0012FFC0”―――到达新地址后,首先“删除”上一次的断点,接着第二次使用“ESP定律”,地址-“0012FC4C”―――到达新地址后,首先“删除”上一次的断点,接着第三次使用“ESP定律”,地址-“0012FC50”―――到达新地址后,首先“删除”上一次的断点,接着第四次使用“ESP定律”,地址-“0012FFC0”―――F9运行后,看到如下代码段时,说明已经到达OEP入口跳转――――――――――――――――――――――――――――――――――――――――――――――――――006D8AA2 - FFE0 JMP EAX ; 到达OEP入口跳转F8下006D8AA4 7C 40 JL SHORT ssbx.006D8AE6006D8AA6 57 PUSH EDI006D8AA7 00C8 ADD AL,CL―――其余操作同前所叙学习随笔:“PECompact 2.x - Jeremy Collake”这种壳有点古怪,手动单步跟踪还没有一次成功,经常是跟着跟着就晕菜了,或者是跟飞了。
手动脱壳基础知识-电脑资料
手动脱壳基础知识-电脑资料单步跟踪法:1.OD载入,不分析代码,。
2.近CALL—F7,远CALL—F8,实现向下的跳转。
3.有回跳处,下一句代码处—F4 (右键—代码断点运行到所选)4.大的跳转(大跨段,JMP***或JE***或RETN),很快就会到OEP内存镜像法:1.OD载入软件2.点选项—调试选项—忽略全部—CTRL+F2重载3.ALT+N打开内存镜像,找程序第一个.rsrc—F2下断—SHIFT+F9运行到断点,再打开找到程序第一个.rsrc上面的.code处(就是00401000处),F2下断—SHIFT+F9或无异常按F9,到OEP 模拟跟踪法:无暗桩情况下使用1.F9试运行,跑起来就无SEH暗桩之类的,否则就有.2.ALT+N打开内存镜像,找到包含“=sfx,imports reloco tions”字符3.地址=*** 命令行输入:tceip<***,回车.ESP定律法:1.F8,观察OD右上角寄存器中ESP有没有实现(红色)2.命令行下 DD ******(当前代码ESP值),回车3.DD就选中下端地址,断点—硬件访问—DWORD断点,F9运行,到跳转处按F8 到DEP最后一次异常法:1.OD打开—点选项—调试选项—去掉所有异常—CTRL+F2重载.2.SHIFT+F9.只到程序运行,记下次数M3.CTRL+F2重载—按SHIFT+F9(次数为M-1次)4.按CTRL+G—输入OE右下角的SE句柄前的地址.5.F2下断—SHIFT+F9到断点处.6.去断按F8,到OEP.一步到位OEP法:只适合少数壳,如UPX,ASPACK1.CTRL+F—输入:POPAD.回车查找—F2下断—F9运行到此处.2.来到大跳转处,点F8到OEP.SFX法:1.设置OD,忽略所有异常.2.切换到SFX选项卡,选择“字节模式跟踪实际入口”,确定.3.重载—“否”压缩代码,到OEP.。
大智慧主程序脱壳全记录(图文)第1集
大智慧主程序脱壳全记录(图文)第四集今天用大智慧主程序为例进行脱壳操作一、ESP定律手脱法第一步,查壳,“ASPack 2.12 -> Alexey Solodovnikov”第二步,启动OD,加载主程序,来到下图画面所示地址。
进入“选项”-“调试选项”-“异常”,全部钩选(可做也可不做。
普通压缩壳Od调试时候没有异常,加密壳全部有反跟踪代码,会有许多SEH陷阱使OD调试时产生异常。
)用F8进行单步跟踪,在右边窗口寄存器(FUP)中的“ESP”突现“0012FFA4”时停下,用鼠标点选该句,打开右键菜单,如下图所示操作。
(或在左下角“命令”栏中输入“DD 0012FFA4”回车)点选左下角“0012FFA4”语句,打开菜单,选择“断点”-“硬件访问”-“Word”,F9运行如下图所示,在F8单步跟踪,实现大跳转用鼠标右键打开菜单,选择“用OllyDump脱壳调试进程”点击“脱壳”按钮,进行存盘,记住OEP地址为“2F68B5”(在进行输入表修复时要用到的地址)千万记住:要删除先前设置的“断点”,否则,原版主程序运行时会出现异常(按下图所示操作)“调试”-“硬件断点”――――――“删除”===================================================重新载入已脱壳的主程序,可以阅读程序流程(下图)第三步,检验。
启动已脱壳的主程序,如果正常,则不需要修复输入表,否则,还得用前面的方法进行修复操作二、内存镜像法第一步,查壳,“ASPack 2.12 -> Alexey Solodovnikov”(略)第二步,启动OD,加载主程序,来到下图画面所示地址“CTRL+M”调出“Memory Map”,选择“。
rsrc”,用鼠标右键菜单“设置访问中断F2”,F9运行来到下图地址,在“Memory Map”中选择“。
text”,同样用鼠标右键菜单“设置访问中断F2”,F9运行程序停在这里,那就是真正的入口点用鼠标右键打开菜单,选择“用OllyDump脱壳调试进程”点击“脱壳”按钮,进行存盘,记住OEP地址为“2F68B5”(在进行输入表修复时要用到的地址)其余操作同上。
压缩壳脱法
压缩壳脱法:------------------方法一:单步跟踪法------------------介绍:这是最通用的方法,对于未知壳,基本都用这种方法,这种方法过程比较麻烦,要一步一步的跟踪分析,要有一定的耐心.1.用OD载入,选"不分析代码"2.单步向下跟踪按F8,实现向下的跳.不让程序往回跳.3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易运行.5.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入.6.一般遇到很大的跳转(跨段跳),比如 jmp XXXXXX 或 JE XXXXXX 或有RETN的一般很快就会到程序的OEP。
-----------------方法二:ESP定律法-----------------介绍: 这种方法可以脱大部的压缩壳和少数加密壳,操作起来比较简单,脱壳速度也相对比较快.1.开始就点F8向下走,注意观察OD右上角的寄存器中ESP有没突现(变成红色)2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者hrXXXXXXXX),按回车!3.选中下断的地址,断点--->硬件访--->WORD断点。
4.按一下F9运行程序,直接来到了跳转处,按下F8向下走,就到达程序OEP。
-----------------方法三:内存镜像法-----------------介绍:也是一种比较好用的脱壳方法,大部分的压缩壳和加密壳用内存镜像法能快速脱掉.非常实用.1.用OD打开,设置选项——调试选项——异常,忽略所有异常(也就是把里面的忽略全部√上),然后CTRL+F2重载下程序!2.按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点.3.接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE,按F2下断点!然后按SHIFT+F9,直接到达程序OEP!----------------方法四:一步到OEP----------------介绍:这是一种巧方法,脱壳速度最快,前提是要知道这个壳的特征,利用这种壳的共性快速找到程序的OEP.这种方法只用于少数壳.1.开始按Ctrl+F,输入:popad,然后按下F2下断,按F9运行到此处.2.很快来到大跳转,按F8向下走,来到OEP.----------------------方法五:最后一次异常法:----------------------介绍:这种方法一般用于加密壳,这是脱加密壳的一种通用方法.第一步:用OD打开程序,点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序.第二步:接着我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数n.第三步:重载程序,再按SHIFT+F9,这次按的次数为上次让程序运行时的次数的n-1次.第四步:此时观察OD的右下角有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!来到这个地址.第五步:在这里,按F2下断点!然后按SHIFT+F9来到断点处!第六步:这时候我们已经跳过了所有异常,然后去掉断点,按F8慢慢向下跟踪很快就到达OEP 了.----------------------模拟跟踪法----------------------1.运行程序,确定是否有暗桩。
简单脱壳教程笔记(7)---手脱PECompact2.X壳
简单脱壳教程笔记(7)---⼿脱PECompact2.X壳本笔记是针对ximo早期发的脱壳基础视频教程。
整理的笔记。
本笔记⽤到的⼯具下载地址:简单介绍:FSG壳是⼀款压缩壳。
我们这⾥使⽤9种⽅式来进⾏脱壳⼯具:ExeinfoPE或PEid、OD、LordPE、ImportREConstructor脱壳⽂件:05.⼿脱PECompact2.X壳.rar1 单步我们发现有两处call会跑飞。
那么我们须要在跑飞处进⼊,然后在跟就可以。
第⼀个跑飞的call,我们此时不应该单步⽽是进⼊第⼆个跑飞的call,我们此时不应该单步⽽是进⼊OEP2 ESP定律单步到在此处。
并在数据窗体中尾随,下断点,单步跟踪就可以。
可參考前⾯的笔记内容。
3 使⽤BP VirtualFree断点⾸先下 bp VirtualFree断点然后 SHIFT+F9执⾏,接着按F2取消断点接着ALT+F9运⾏到⽤户代码ctrl+f 进⾏查找 push 8000(特征码)F2设置断点, shift+f9执⾏到这,然后取消断点接着单步跟就可以。
就会到达OEP4 相同设置BP VirtualFree⾸先设置断点然后。
两次SHIFT+F9。
然后,取消断点。
Alt+F9 并运⾏到⽤户代码然后单步⾛。
就会到达OEP5.1、载⼊程序后,会发现⾸⾏有个地址0040A86D > B8 74DE4500 mov eax,qqspirit.0045DE742、在该地址处下断点 bp 0045de743、然后shift+f9执⾏,并取消断点4、我们在该处的retn 下⼀⾏设置断点,然后shift+f9执⾏,并取消断点045DE74 B8 F9CB45F0 mov eax,F045CBF90045DE79 8D88 9E120010 lea ecx,dword ptr ds:[eax+1000129E] 0045DE7F 8941 01 mov dword ptr ds:[ecx+1],eax0045DE82 8B5424 04 mov edx,dword ptr ss:[esp+4]0045DE86 8B52 0C mov edx,dword ptr ds:[edx+C]0045DE89 C602 E9 mov byte ptr ds:[edx],0E90045DE8C 83C2 05 add edx,50045DE8F 2BCA sub ecx,edx0045DE91 894A FC mov dword ptr ds:[edx-4],ecx0045DE94 33C0 xor eax,eax0045DE96 C3 retn0045DE97 B8 78563412 mov eax,12345678 //下断点5、接着单步跟就可以。
(完整版)常见几种脱壳方法(可编辑修改word版)
----------------<小 A 分>----------------一、概论壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳(强壳)两种"UPX" "ASPCAK" "TELOCK" "PELITE" "NSPACK(北斗)" ... "ARMADILLO" "ASPROTECT" "ACPROTECT" "EPE(王)" "SVKP" ...顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。
当然加密壳的保护能力要强得多!-----------<小 A 分割线>-------------二、工具的认识OllyDBG ring3 shell 层级别的动态编译工具、PEid、ImportREC、LordPE、softIce ring0 级别调试工具-------------<小 A 分割>-------------------三、常见手动脱壳方法预备知识1.P USHAD (入栈/压栈)代表程序的入口点,2.P OPAD (弹栈/出栈)代表程序的出口点,与 PUSHAD 想对应,一般找到这个OEP 就在附近3.O EP:程序的入口点,软件加壳就是隐藏了 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。
脱壳找OEP7种基本方法
脱壳找OEP7种基本方法七种找OEP的方法OD手动脱壳的7种法则方法一:单步跟踪法1.用OD载入,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。
也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个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!方法四:一步到达OEP1.开始按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初始访问=RWE3:地址为0054B000,如是我们在命令行输入tc eip<0054B000,回车,正在跟踪ing。
用OD脱DEDE的Armadillo1.xx2.xx壳-电脑资料
用OD脱DEDE的Armadillo1.xx2.xx壳-电脑资料前言:前段时间破一个Delphi程序,用到DeDe,但提示输入密码,我哪有?SHIT!只好拿它来开刀,。
开工!正好有关Armadillo的文章较少,来一篇凑个热闹,不当之处请指正。
第一步、跳过调试器检查:先IsDebuggerPresent插件隐藏OD,然后载入DEDE,忽略所有异常。
F9运行,程序提示有Debugger运行,点击OK后退出。
看看在什么地方可以跳过NAG,故点击前BP DestroyWindow,然后点击OK,程序中断,CTRL+F9返回到程序003E3247 CALL DWORD PTR DS:[3E64A8] ; USER32.DestroyWindow003E324D MOV EAX,ESI --->在这继续按Ctrl+F9返回直到如下代码:003E088A JE SHORT 003E08CD --->可以跳过NAG!...........................003E08B5 ADD ESP,28003E08B8 PUSH EAX003E08B9 CALL 003E328D --->CALL NAG003E08BE MOV EAX,DWORD PTR DS:[3F328C] --->返回到这,向上看!003E08C3 ADD ESP,0C003E08C6 XOR DWORD PTR DS:[EAX+74],3366003E08CD JMP SHORT 003E08D2注意在003E088A处可以跳过。
重来一遍,下G 3E088A,提示无效地址。
原来这地址是程序运行动态后生成的。
只好让程序先运行一会在中断下来下断点。
因为Armadillo壳有页保护,故BPVirtualProtect,F9运行,中断后下G 3E088A,程序再次中断,改变标志位令其强行跳转,然后Ctrl+F9返回,并将EAX值改为0,程序将往下运行,出现过期提示,要求输入注册码。
鸟儿学破解系列文章之二软件脱壳打回原形
网络上还没出现铁甲这个壳的脱壳机,所以我们只有手工来搞了,拿出我们菜鸟喜欢用的OllyDbg加载程序,忽略所有的异常。程序停留在0040A000处。
=800)window.open('../images/10_6_45494b8555f664f.gif');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
这里是软件的第二次代码解密的地方,我们和上面一样,单击popad处按下F4,让程序直接解密,这个时候程序已经解密好了,现在我们就是要找OEP了,我们按下CTRL+F,调出查找命令对话框,将整个段块前面的钩去掉,输入popad来查找。经过6次的查找我们来到了如下地方
=800)window.open('../images/10_6_26581a589348103.gif');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
手工脱壳基本步骤:
1. 寻找OEP
2. DUMP文件
3. 修复输入表
我们用PeiD查到我们现在要脱的壳是铁甲。
=800)window.open('../images/10_6_cfd4ecb068008aa.gif');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
- 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)。