VMP1.8主程序脱壳分析

合集下载

《Armadillo1.xx-2.xx-SiliconRealmsToolworks脱壳分析》

《Armadillo1.xx-2.xx-SiliconRealmsToolworks脱壳分析》

脱壳过程:OD载入程序,老规矩插件隐藏OD,忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、C000001D(ILLEGAL INSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)入口代码:0105A000 N> 60 pushad0105A001 E8 00000000 call NOTEPAD.0105A0060105A006 5D pop ebp0105A007 50 push eax0105A008 51 push ecx0105A009 0FCA bswap edx0105A00B F7D2 not edx0105A00D 9C pushfd下bp OpenMutexA断点shift+F9运行,77E62391 k> 55 push ebp---------中断在这里77E62392 8BEC mov ebp,esp77E62394 51 push ecx77E62395 51 push ecx77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],077E6239A 56 push esi77E6239B 0F84 C2E30100 je kernel32.77E8076377E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]看堆栈0006F710 0103229B /CALL 到OpenMutexA 来自NOTEPAD.010322950006F714 001F0001 |Access = 1F00010006F718 00000000 |Inheritable = FALSE0006F71C 0006FDA0 \MutexName = "52C:A9EEE0AC4"------注意0006fda0,等下会用到0006F720 000000040006F724 000000000006F728 010476B3 NOTEPAD.010476B3Ctrl+G 01001000 键入以下代码:为什么是Ctrl+G 01001000呢?很多教程里都是Ctrl+G 401000,在本例Ctrl+G 401000是无法写入调式程序中的,而且401000处有代码(大家可以试一试),那么如何知道是用Ctrl+G 01001000的呢?个人认为是根据载入口的代码来确定的,形式是入口代码地址的前3位+01000,如本例中的入口代码是:0105A000 N> 60 pushad,取其地址中的前3位010,再加上01000,合起来就是01001000。

VMP脱壳实例

VMP脱壳实例
0041E4E6 68 7161C09F push 9FC06171 //解密后的出口
0041E4EB E8 D8080000 call cm_vmp_c.0041EDC8
0041E4F0 FF7424 04 push dword ptr ss:[esp+4]
004014E5 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
004014E9 51 push ecx
004014EA E8 91FFFFFF call crackme2.00401480
00401517 8BCE mov ecx,esi
00401519 E8 2A020000 call crackme2.00401748
0040151E 5F pop edi
0040151F 5E pop esi
效验3:patch上面的2处后,程序还是出错。继续来进行patch。
继续在0041E4E6下好断点,F9运行,发现运行89后,程序出错,于是写个脚本定位到出错的前1次,
sub al,1C
not al复制代码
下面我们来看下我们爆破的数据:
爆破点:4014FB 75---74
然后来计算下,74加密后的数据为多少。
写个解密函数的逆运算来进行解密吧:
mov al,74
not al
add al,1c
neg al
sub al,47
ror al,5复制代码
004014B0 81EC 00010000 sub esp,100
004014B6 56 push esi
004014B7 8BF1 mov esi,ecx

vmp脱壳还原代码

vmp脱壳还原代码

vmp脱壳还原代码
VMProtect 是一款反调试、加壳保护软件,具有高度的安全性。

可以将程序进行加密,增加程序的难度,从而使得攻击者在破解时更难达到目的。

VMProtect脱壳还原代码就是通过脱去VMProtect壳来恢复原始的程序代码。

一般情况下,脱壳的流程如下:
1. 首先,使用反编译工具,将程序反编译成可读的
C/C++语言代码;
2. 然后,研究反编译出来的代码,找到VMProtect壳的特征和加壳方式;
3. 最后,根据VMProtect壳的特征和加壳方式,编写脱壳程序,将VMProtect壳去掉,还原原始的程序代码;
4. 最后,将还原后的程序代码重新编译,生成程序可执行文件。

vmp壳基础原理

vmp壳基础原理

vmp壳基础原理VMP壳:是⽤来保护关键的代码段的⼀种加密壳原理:抽出局部代码,转变为中间码,虚拟机引擎对中间码进⾏解释,替代CPU解释执⾏代码,然后跳转回源地址,每次执⾏都解释执⾏⼀次代码,虚拟机有⼀套⾃⼰的反编译算法去解释执⾏代码:⽐如mov = 0xe8 ebx = 02 eax = 01 mov ebx,eax 被虚拟机解释执⾏为 e8 02 01注意:这套虚拟机对应的反编译算法是根据程序的不同随机的产⽣脱VMP壳:在⽤⾃⼰的反汇编引擎分析出来,达到解密的效果原理:把虚拟机执⾏的代码,在⽤⾃⼰的反汇编引擎分析出来,达到解密的效果虚拟机句柄的概念:某⼀类的机器码某⼀类的机器码mov,add,等其他指令不同的解释执⾏代码VMP壳加密代码调⽤过程:1 虚拟机申请⼀块内存(可能在堆,可能在栈),保存寄存器环境,中间码执⾏后的结果保存到申请内存的寄存器中,执⾏完后,把寄存器的环境赋值给真正的寄存器,相当于中间码被cpu执⾏了VMP堆栈图ebp 保存中间码栈环境esp 保存虚拟机环境的栈环境补充:1 中间码和虚拟机引擎都会放在代码段下⾯2 虚拟机的分类:栈式虚拟机- 所有操作数通过出栈⼊栈进⾏操作, 优点:中间码体积⼩,缺点:执⾏代码效率低中间码: add eax0, ebx0 虚拟机:push eax0 push ebx0 pop ecx pop edx add ecx, edx mov eax0, ecx push ecx注意:中间码的寄存器带个0典型代表: java,lua5.0以前是栈式虚拟机寄存器式虚拟机 - 所有操作数通过内部寄存器操作,优点:执⾏代码效率⾼缺点:中间码的体积⼤有⼀块内存,相当于⾃⼰的寄存器,reg0 - reg16中间码:add eax0, ebx0 虚拟机: mov reg0, eax0 //reg0 reg1 等寄存器是虚拟机在堆中或栈中模拟的寄存器 mov reg1, ebx0 add reg0, reg1 mov eax0, reg0典型代表: lua5.0以后,davik(android 5.0)寄存器式虚拟机jit - just in time ,即时编译, 将中间码翻译成机器码执⾏典型代表: .net, android art, java现在版本vmprotect。

virbox protector 脱壳方法

virbox protector 脱壳方法

Virbox Protector 是一种用于保护软件安全的工具,它可以对本地程序进行多种方式的保护,包括代码混淆、代码虚拟化、代码加密等。

如果Virbox Protector对某个程序进行了保护,那么该程序可能具有一些防止被反编译或脱壳的机制。

然而,Virbox Protector 的具体脱壳方法因程序的具体保护方式和版本而异。

如果需要针对某个具体的 Virbox Protector 保护的程序进行脱壳,可以尝试以下方法:
1. 静态分析:对程序的代码或数据段进行整体解压缩和解密,然后进行反编译和静态分析,以理解程序的逻辑和功能。

这需要一定的逆向工程知识和技能。

2. 动态调试:使用调试器对程序进行动态调试,单步跟踪程序的执行流程,理解程序的逻辑和行为。

这需要一定的调试技巧和经验。

3. 寻找漏洞:寻找程序中的漏洞或弱点,例如未授权访问、输入验证不严格等,利用这些漏洞来绕过保护机制,从而获取程序的源代码或可执行文件。

这需要较高的安全知识和技能,并可能涉及到违法行为。

需要注意的是,无论采用哪种方法,破解或绕过Virbox Protector 的保护都需要一定的技术水平和专业知识,并且可
能存在法律风险。

因此,建议遵守法律法规和道德规范,不要进行非法的软件破解和反编译活动。

个人总结的一个VMP脱壳步骤

个人总结的一个VMP脱壳步骤

个人总结的一个VMP脱壳步骤个人总结的一个VMP脱壳步骤个人在学习脱VMP加壳的过程中总结的一个步骤。

按照这个步骤,包括VMP1.6—2.0在内应该有70%-80%能脱壳。

脱不了的也别问我,我也刚开始学习。

我还想找人问呢。

想要脱VMP的壳,首要工作当然是要找一个强OD啦!至于是什么版本的OD自己多试验几个,网上大把大把的,一般来说只要加载了你想脱的VMP加壳程序不关闭都可以。

其次就是StrongOD.dll这个插件了,现在用的比较多的就是海风月影,同样网上也是大把大把的。

下载回来后复制到你的OD程序所在的文件夹里面的plugin里。

StrongOD的设置选项搞不懂就全部打钩。

接下来要做的工作就是搞清楚我们要脱壳的程序编程的语言了,可以用PEID或者fastscanner查看,如果在这里看不到也可以在OD载入以后通过里面的字符串判断了。

例如VB的程序会出现MSVB----/VC的会出现MSVC---等等。

这些都是程序运行所需要的windows链接文件。

做完这些预备工作接下来当然是用OD载入文件啦。

文件载入后在反汇编窗口CTRL+G搜索VirtualProtect(注意V跟P要大写,至于为什么要搜索这个别问我)。

一般来说搜索的结果会出现以下的类似:7C801AE3 E8 75FFFFFF call kernel32.VirtualProtectEx我们在这里下F2断点。

然后F9运行到我们下的这个断点。

接下来我们就要注意观察堆栈窗口了。

一般来说当我们F9运行到我们上面下的断点的时候在堆栈窗口会出现以下类似:0012F66C 00401000 |Address = TradeCen.004010000012F670 000280D1 |Size = 280D1 (164049.)0012F674 00000004 |NewProtect = PAGE_READWRITE0012F678 0012FF98 \pOldProtect = 0012FF98我们要注意观察的就是在接下来我们F9运行的时候,ADDRESS和NEWPROTECT这两行的变化。

基于量子逻辑门的代码虚拟(vmp)保护方案

基于量子逻辑门的代码虚拟(vmp)保护方案

NOR(a, b) = ~(a | b) = ~a & ~bNot(a) = NOR(a, a)And(a, b) = NOR(NOR(a, a), NOR(b, b))Or(a, b) = NOR(NOR(a, b), NOR(a, b))Xor(a, b) = NOR(NOR(NOR(a, a), NOR(b, b)), NOR(a, b))NAND(a, b) = ~(a & b) = (~a) | (~b)Not(a) = NAND(a, a)And(a, b) = NAND(NAND(a, b), NAND(a, b))Or(a, b) = NAND(NAND(a, a), NAND(b, b))Xor(a, b) = NAND(NAND(NAND(a, a), b), NAND(a, NAND(b, b)))vAdd(a,b) = a + bSub = Not(vAdd(Not(a),b))sub_flag(a, b) = and(~(0x815), not_flag(not(a) + b)) + and(0x815 , add_flag(not(a), b))1.handler更具有RISC的风格,具有更多的歧义性,通过一条指令可以模拟多条指令的执行结果,pushfd计算更新,大大增加了分析的难度。

2.虚拟寄存器,寄存器滚动,通过虚拟栈传递参数都大大的增加了识别“原始寄存器”的难度,几乎很难通过推理还原出原始寄存器。

3.在原有栈上进行了扩展“虚拟栈”保证了多线程功能。

4.代码变形和垃圾干扰代码过于单一,不少handler计算后pushfd无法变形暴露原始handler功能。

1.动物园系列VM通过两种VM的组合和VM嵌套实现了多种功能组合,实现多种VM生成。

2.代码变形比VMProtect更复杂大大增加了分析难度。

3.指令集随机化(甚至插入垃圾和密钥),虚拟寄存器存储偏移随机化,handler生成更灵活。

VMP壳原理

VMP壳原理

VMP壳原理总结vmp壳基础原理,⼤⽜不要喷啊!1.与传统的加壳⼯具不同,不是简单的把⽬标进⾏压缩、内存解压运⾏,⽽是修改⽬标源码,让⽬标的部分指令在vmp创建的虚拟环境下运⾏,虚拟环境中⽆操作数⽐较指令、条件跳转和⽆条件跳转指令;2.被修改替换的⽬标指令最终形成的字节码有前后相关性,即你改变其他任意⼀个字节会影响到所有被vm虚拟化的指令3.vmp的虚拟机其实是⼀个字节码解释器,循环的读取指令并执⾏,并且只有⼀个⼊⼝和⼀个出⼝4.虚假跳转和垃圾指令, vmp会使⽤⼤量的虚拟跳转和垃圾指令将原有简单的代码变得复杂5.vmp是基于堆栈的虚拟机,虚拟机指令不是显⽰的读取参数,⽽是把要使⽤的参数压⼊堆栈,⽽后直接从堆栈中读取6.vmp指令1)算数运算和移位运算2)堆栈操作3)系统相关4)逻辑运算,这个最复杂,vmp中只有⼀个逻辑运算指令nor, 它可以模拟not and or xor 四个逻辑运算指令6.vmp寄存器轮转mvp将所有的寄存器都放在⼀个堆栈的结构vm_context中, 结构中的每⼀项代码⼀个寄存器或临时变量在程序运⾏过程中, vm_context结构中保存的寄存器不是固定的,每当执⾏完⼀个操作或⼀个指令结构中的项与真实寄存器之间的映射关系会发⽣变化,就像⼀个齿轮随机的转动了⼀下, 转动过后原有的映射关系全部改变了7.字节码加密和随机效验随机效验⽐较⽜B, vmp会在编译好的字节码中加⼊⾃⼰的⼀些指令(专属于vmp⾃动的指令), 每⼀次执⾏都会对⼀段代码随机⽣成hash值, 然后与另⼀个随机数相加, vmp要求相加的结果必须为0, 否则会出错.转载:/showthread.php?t=190351&viewgoodnees=1&prefixid=。

脱壳理论教程[看雪篇]

脱壳理论教程[看雪篇]

第一课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文档(Revision 8.0 - May 16, 2006)学习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 操作系统的一种系统机制,与特定的程序设计语言无关。

外壳程序里大量地使用了SEH,如果不了解SEH,将会使你跟踪十分困难。

SEH in ASM 研究(一)by humeSEH in ASM 研究(二)by humeStructured Exception Handling加密与解密二版菜鸟学习笔记(2) - SEH 结构化异常处理by ytcswb由于Ollydbg对SEH处理异常灵活,因此脱壳用Ollydbg会大大提高效率。

附CONTEXT结构环境:代码:typedef struct _CONTEXT {/*000*/ DWORD ContextFlags;/*004*/ DWORD Dr0;/*008*/ DWORD Dr1;1. 什么是壳?在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。

软件加壳、脱壳基础介绍

软件加壳、脱壳基础介绍

软件加壳、脱壳基础介绍什么是加壳加壳的全称应该是可执⾏程序资源压缩,压缩后的程序可以直接运⾏。

加壳,顾名思义,就是给⼀个东西加上⼀个壳,只不过这⾥是程序。

就好⽐这⼤⾃然中的种⼦⼀样,为了保护⾃⼰,有⼀层壳,要想看到⾥⾯的东西,就要剥开这层壳。

加壳的另⼀种常⽤的⽅式是在⼆进制的程序中植⼊⼀段代码,在运⾏的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的⽬的是隐藏程序真正的OEP(⼊⼝点,防⽌被破解)。

⼤多数病毒就是基于此原理。

加壳的程序需要阻⽌外部程序或软件对加壳程序本⾝的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运⾏。

这种技术也常⽤来保护软件版权,防⽌软件被破解。

但对于病毒,加壳可以绕过⼀些杀毒软件的扫描,从⽽实现它作为病毒的⼀些⼊侵或破坏的⼀些特性。

加壳的⼯具分为压缩壳和加密壳:* UPX ASPCAK TELOCK PELITE NSPACK … ** ARMADILLO ASPROTECT ACPROTECT EPE SVKP …*什么是脱壳 脱壳就是将外⾯的保护程序脱掉,看到⾥⾯的程序。

对于有壳的程序,每次程序的⼊⼝点总是从壳开始,,这个⼊⼝点是EP,那么源程序的⼊⼝点是OEP,壳将真正的OEP隐藏了,我们脱壳就是修改程序的⼊⼝点。

如何脱壳 如果没有基础的汇编知识,那就查出相应的壳,⽤相应的脱壳机进⾏脱壳,那如果,脱壳机⽆法脱呢?⼿动脱壳!基础知识1.PUSHAD (压栈)代表程序的⼊⼝点,2.POPAD (出栈)代表程序的出⼝点,与PUSHAD想对应,⼀般找到这个OEP就在附近3.OEP:程序的⼊⼝点,软件加壳就是隐藏了OEP(或者⽤了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以⽴刻脱壳。

脱壳的⽅法清单⽅法⼀:单步跟踪法1.⽤OD载⼊,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。

也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下⼀句代码处按F4(或者右健单击代码,选择断点——>运⾏到所选)4.绿⾊线条表⽰跳转没实现,不⽤理会,红⾊线条表⽰跳转已经实现!5.如果刚载⼊程序,在附近就有⼀个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运⾏到某个CALL程序就运⾏的,就在这个CALL中F7进⼊7.⼀般有很⼤的跳转(⼤跨段),⽐如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的⼀般很快就会到程序的OEP。

总结的一个VMP脱壳步骤

总结的一个VMP脱壳步骤
0046C090 50 push eax
0046C091 64:8925 00000000 mov dword ptr fs:[0],esp
0046C098 83EC 58 sub esp,58
0046C09B 53 push ebx
0046C09D 57 push edi
其次就是StrongOD.dll这个插件了,现在用的比较多的就是海风月影,同样网上也是大把大把的。下载回来后复制到你的OD程序所在的文件夹里面的plugin里。StrongOD的设置选项搞不懂就全部打钩。
接下来要做的工作就是搞清楚我们要脱壳的程序编程的语言了,可以用PEID或者fastscanner查看,如果在这里看不到也可以在OD载入以后通过里面的字符串判断了。例如VB的程序会出现MSVB----/VC的会出现MSVC---等等。这些都是程序运行所需要的windows链接文件。
0012F66C 0042A000 |Address = TradeCen.0042A000
0012F670 000069DE |Size = 69DE (27102.)
0012F674 00000002 |NewProtect = PAGE_READONLY
0012F678 0012FF98 \pOldProtect = 0012FF98
0046C07B U> 55 push ebp
0046C07C 8BEC mov ebp,esp
0046C07E 6A FF push -1
0046C080 68 18064C00 push UltraSna.004C0618
00401646 |4F dec edi
00401647 |4B dec ebx

VMP脱壳技术

VMP脱壳技术

WinlicenseWinlicenseBy VirusWizard今天第一次接触Themida/Winlicense,基本上都是脚本,算不上什么技术,但作为实验,记录一下。

总体流程:使用Nooby的脚本跑到FakeOEP,然后修复StolenCode。

首先使用Winlicense然后调整脚本中的Base记事本的WinLicen的Base。

我这里的Base是01015000,所以对应的代码修改成:mov tmdbase, 01015000接下来用StrongOD,选项全部勾上,开始跑脚本。

跑完脚本之后,来到这里:01007568 68 BA750001 push 010075BA0100756D 64:A1 00000000 mov eax, dword ptr fs:[0]01007573 50 push eax01007574 8B4424 10 mov eax, dword ptr [esp+10]01007578 896C24 10 mov dword ptr [esp+10], ebp0100757C 8D6C24 10 lea ebp, dword ptr [esp+10]01007580 2BE0 sub esp, eax01007582 53 push ebx01007583 56 push esi01007584 57 push edi01007585 8B45 F8 mov eax, dword ptr [ebp-8]01007588 8965 E8 mov dword ptr [ebp-18], esp0100758B 50 push eax0100758C 8B45 FC mov eax, dword ptr [ebp-4]0100758F C745 FC FFFFFFF>mov dword ptr [ebp-4], -101007596 8945 F8 mov dword ptr [ebp-8], eax01007599 8D45 F0 lea eax, dword ptr [ebp-10]0100759C 64:A3 00000000 mov dword ptr fs:[0], eax010075A2 C3 retn观察堆栈,发现这个:0006FF8C 011ABF9B NOTEPAD_.011ABF9B0006FF90 01001898 NOTEPAD_.010018980006FF94 0000007070有些眼熟,用OD打开原记事本,看到头两行:0100739D > $ 6A 70 push 70 ; (initial cpu selection) 0100739F . 68 push 01001898然后F4到011ABF9B,这个时候会进入VM,我暂时还没那技术去分析。

第2课用相应工具软件为软件自动脱壳(非手动脱壳)解析

第2课用相应工具软件为软件自动脱壳(非手动脱壳)解析

第二课用相应工具软件为软件自动脱壳(非手动脱壳)欲破解一个软件,我们首先应根据前面的内容侦测它的壳,然后我们要把它的壳脱去,还原软件的本来面目。

如果软件是一个PLMM,我们不喜欢穿衣服的MM,我们不喜欢艺术照的MM,我们迫不及待地想把MM脱光,想把MM骗上床。

带壳的软件以后很难分析,带壳的穿衣的MM很难调教,壳是一个拦路虎,我们却不知武松醉在何处。

这就如同我们要吃糖炒栗子,必须先剥掉栗子壳一样。

这一课就教给你如何用自动剥壳机去掉花生壳、栗子壳之类的东东。

若侦测出它根本没加壳,就可省掉这一步了(现在没加壳的软件已经很少很少了,除非软件作者缺乏最基本的加密解密常识)。

脱壳成功的标志是脱壳后的文件能正常运行,功能没有任何损耗。

一般来说,脱壳后的文件长度大于原文件长度;即使同一个文件,当采用不同脱壳软件进行脱壳的时候,由于脱壳软件机理不同,脱出来的文件大小也不尽相同。

但只要能够运行起来,这都是正常的,就如同人的体重,每次上秤,份量都有所不同。

但只要这个人是健康的,就无所谓,合乎情理。

一、脱壳软件的两大类别(两个门派――少林、武当)脱壳软件主要分两大类:专用脱壳软件(武当派)和通用脱壳软件(少林派,源自“全民皆武,天下英雄出少年”)。

每个专用脱壳软件只能脱掉特定的一种或两种加壳软件所加的壳,也就是说它是专门针对某种加壳软件的某个版本而制作的。

通用脱壳软件则具有通用性,可以脱掉许多种不同类型的壳。

根据“以一当一”的原则,专用类此门派为“武当”派。

大家可能会有这样的疑问?既然有通用脱壳软件,为什么还要专用脱壳软件呢?所谓“术业有专攻”,通用的脱壳程序往往不能精确地适用于某些软件,而专用的脱壳程序适用面虽窄,对付特定的壳却极为有效。

因此,少林派和武当派缺一不可,相辅相成。

均掌握了武术之精髓,能置“壳”以死地,打得壳满地找牙,第一时间以迅雷不及掩耳之势极速脱掉壳MM的衣衫。

二、专用脱壳软件的四大类别根据壳的流行程度,常用的脱壳软件主要有三类:脱Aspack类(叉A)、脱UPX类(叉U)、脱pecompact类(叉P,怎么又跟微软搞到一块儿了),分别针对前面提到的3个加壳软件。

VMP脱壳技术

VMP脱壳技术

WinlicenseWinlicenseBy VirusWizard今天第一次接触Themida/Winlicense,基本上都是脚本,算不上什么技术,但作为实验,记录一下。

总体流程:使用Nooby的脚本跑到FakeOEP,然后修复StolenCode。

首先使用Winlicense然后调整脚本中的Base记事本的WinLicen的Base。

我这里的Base是01015000,所以对应的代码修改成:mov tmdbase, 01015000接下来用StrongOD,选项全部勾上,开始跑脚本。

跑完脚本之后,来到这里:01007568 68 BA750001 push 010075BA0100756D 64:A1 00000000 mov eax, dword ptr fs:[0]01007573 50 push eax01007574 8B4424 10 mov eax, dword ptr [esp+10]01007578 896C24 10 mov dword ptr [esp+10], ebp0100757C 8D6C24 10 lea ebp, dword ptr [esp+10]01007580 2BE0 sub esp, eax01007582 53 push ebx01007583 56 push esi01007584 57 push edi01007585 8B45 F8 mov eax, dword ptr [ebp-8]01007588 8965 E8 mov dword ptr [ebp-18], esp0100758B 50 push eax0100758C 8B45 FC mov eax, dword ptr [ebp-4]0100758F C745 FC FFFFFFF>mov dword ptr [ebp-4], -101007596 8945 F8 mov dword ptr [ebp-8], eax01007599 8D45 F0 lea eax, dword ptr [ebp-10]0100759C 64:A3 00000000 mov dword ptr fs:[0], eax010075A2 C3 retn观察堆栈,发现这个:0006FF8C 011ABF9B NOTEPAD_.011ABF9B0006FF90 01001898 NOTEPAD_.010018980006FF94 0000007070有些眼熟,用OD打开原记事本,看到头两行:0100739D > $ 6A 70 push 70 ; (initial cpu selection) 0100739F . 68 push 01001898然后F4到011ABF9B,这个时候会进入VM,我暂时还没那技术去分析。

VMP分析插件应用实例

VMP分析插件应用实例

VMP分析插件应用实例:一个简单的CrackMe上次更新添加了算法分析功能,可以反出类似高级语言的表达式,现在分析简单的程序应该没什么问题了,很多人说不太会用,这里给一个实例分析,讲解一下用法。

这篇文章只讲插件的应用和一般的分析方法,还简单介绍了一下VMP加壳的原理和脱壳方法,其他内容比如插件分析原理和虚拟机代码还原方法等请看VMP分析插件的帖子。

/showthread.php?t=154621先随便输入一些内容,用户名zdhysd,注册码qwertyuiop,点确定弹出注册码错误的提示。

在MessageBox设个断点看看哪里来的,再点确定直接出错,看来有断点检查,在最后的retn设断点试试。

这回断下来了,返回到这里已经是正常代码了,跟进CALL VMPCrack.00402810,上来就是一个JMP,应该是进入虚拟机的,在这里分析虚拟程序。

先选上反汇编后自动分析和分析选项里的分析虚拟机内调用,选中反汇编后自动分析会在每个虚拟程序反汇编后自动做数据和算法分析,选中分析虚拟机内调用会自动分析虚拟机内调用的函数。

分析选项中除了化简无效数据以外也都选中,这样生成的代码比较简单,一般情况下无效数据都是没有用的,不化简可以节省很多时间。

分析用了70多秒,一共分析出了19个虚拟程序,16万多行代码,看看记录,有几个未知的vESP改变和多个来源vESP不同,可能是调用引起的,先不管他。

还有一个未知指令,一般没有什么影响,插件会自动分析指令相关的信息继续反汇编,遇到时再说吧。

因为有虚拟机内调用,虚拟机内调用要在当前程序分析完成后才会分析,这是有些信息无法得到,最好在被调用函数分析完成后再分析一遍,可以在反汇编窗口右键菜单点分析-分析虚拟程序(全部)重新分析一次,这时会自动添加一些相关的分析提示,但不一定准确,调试时最好自己检查一下。

看看代码,大段大段的灰色指令,估计超过80%,而且有很多连接转移,应该是加变形了。

vmp脱壳原理

vmp脱壳原理

vmp脱壳原理
VMP(Virtual Machine Protect)是一种常用的自动化脱壳工具,它的脱壳原理主要包括以下几个步骤:
1. 扫描程序:VMP会首先扫描目标程序,识别出其中使用了VMP保护的代码片段。

VMP保护的代码片段通常被加密或者
混淆,以防止被逆向分析。

2. 反混淆解密:VMP会对识别出的代码片段进行反混淆解密
操作,还原出原始的指令。

这通常需要分析VMP的加密算法
和混淆策略,以便正确解密代码。

3. 修复指令和数据:VMP会根据解密后的代码修复虚拟指令
和数据。

VMP通常会将原始的指令和数据转化为虚拟指令和
数据,并将其存储在一个虚拟指令内存区域中。

因此,脱壳过程需要根据虚拟指令的执行顺序,将其转化为正确的指令和数据。

4. 脱壳:通过分析脱壳程序的执行流程,脱壳工具可以将脱壳程序的内存区域中的数据还原为原始的可执行文件。

通常,脱壳工具会在特定的位置设置断点,当程序执行到该位置时,保存内存中的数据到硬盘中。

5. 修复重定位:由于脱壳过程中改变了程序的内存布局,因此还需要修复程序的重定位信息,以确保程序能够正确执行。

总的来说,VMP的脱壳原理是通过识别、解密和修复VMP保
护的代码片段,最终将脱壳程序的内存区域还原为原始的可执行文件。

这一过程需要对VMP的保护机制和加密算法进行分析和破解。

半仙算命主程序脱壳全记录图文

半仙算命主程序脱壳全记录图文

半仙算命主程序脱壳全记录(图文)第一种方法:“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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VMProtect1.8主程序脱壳分析NOOBY牛已经玩得差不多了我来补一刀 ^_^手中没有正式版的试炼品只好拿1.8DEMO主程序看时间比较久了忘得差不多如果分析有误请各位见谅勾上SOD全部选项载入VMPROTECT.EXE 停在TLS入口 ALT+M看到基址为00010000bp VirtualProtect+13 F9 4次后看到解码了到00011000看看FF25被弄成了什么样子VMP主程序是DELPHI写的因此只关注FF25类IAT 而不用关注 CALL [XX]和MOV EXX,XX/CALL XX这些使得针对性的IAT修复工作减少了不少体力活引用:00011278 55 push ebp00011279 E8 30C52800 call 0029D7AE ; 0029D7AE0001127E 8BC0 mov eax,eax00011280 50 push eax00011281 E8 E8E92700 call 0028FC6E ; 0028FC6E00011286 8BC0 mov eax,eax00011288 55 push ebp00011289 E8 5B333700 call 003845E9 ; 003845E90001128E 8BC0 mov eax,eax00011290 52 push edx00011291 E8 FBE02C00 call 002DF391 ; 002DF391被错位了写段脚本恢复FF25的错位引用:luanxu:inc searchfind search,#E8??????008BC0#cmp $RESULT,0je exitmov search,$RESULTGCI search,DESTINATIONcmp $RESULT,001F3000 //UPX0-VAjb luanxucmp $RESULT,003DE000 //UPX2-VAjae luanxuGCI search,COMMANDdec searchmov [search],#909090909090#asm search,$RESULTjmp luanxu修复后:引用:00011278 E8 31C52800 call 0029D7AE ; 0029D7AE0001127D 90 nop0001127E 8BC0 mov eax,eax00011280 E8 E9E92700 call 0028FC6E ; 0028FC6E00011285 90 nop00011286 8BC0 mov eax,eax00011288 E8 5C333700 call 003845E9 ; 003845E90001128D 90 nop0001128E 8BC0 mov eax,eax00011290 E8 FCE02C00 call 002DF391 ; 002DF39100011295 90 nop找个CALL跟跟看有什么新花样 EIP到00011278 单步什么都不用看只看3条引用:MOV EXX,ALEA EXX,[EXX+B]LEA EXX,[EXX+C]这个CALL里用到以下3条引用:002ADE81 BD 56720500 mov ebp,57256002ADE8A 8BAD AF693000 mov ebp,dword ptr ss:[ebp+3069AF]0034A300 8DAD 626F45AB lea ebp,dword ptr ss:[ebp+AB456F62]前面2条合起来指向一个DWORD 和最后一条组装成最终的函数地址引用:[A+B]=[57256+3069AF]=[0035DC05]=D13B2C85----记为R1R1+AB456F62=7C809BE7--指向我本机的kernel32.CloseHandle NOOBY牛的视频里找的就是这个视频里面最后生成的LOG文件里面每一行的4个成员后面2个一目了然是真实函数以及对应的DLL 前面2个则是A+B,C了这里VMP把A+B拆分成了A和B 使得我们难以在第一次看到A或者B时就能确定是哪个函数(关于NOOBY的VMP1.8脚本可能会另外撰文补充或者等NOOBY牛的BIN ^_^)经过这3条之后最终函数的真实地址保存在EXX中这里的EXX不是固定的给通用脚本编写增加不少难度最后保存在EXX中的函数会通过一个引用:push dword ptr ss:[esp+D]retn E结构返回真实API地址这里的D,E也不是固定的看完FF25后再来看看IAT调用一般的DELPHI程序第一处IAT调用CALL便是这个引用:00011430 53 push ebx00011431 83C4 BC add esp,-4400011434 BB 0A000000 mov ebx,0A00011439 54 push esp0001143A E8 260E3A00 call 003B2265 ; 003B22650001143F F64424 2C 01 test byte ptr ss:[esp+2C],100011444 74 05 je short 0001144B ; 0001144B00011446 0FB75C24 30 movzx ebx,word ptr ss:[esp+30]0001144B 8BC3 mov eax,ebx0001144D 83C4 44 add esp,4400011450 5B pop ebx00011451 C3 retn0001143A处的CALL应该指向FF25型的GetStartupInfoA 然而这里指向的地址003B2265落在UPX1段分析过程略最终知道 VMP把它和FF25型IAT用了同样的方法处理直接指向了真实函数这样使我们的修复工作变得很尴尬因为IAT 和IAT调用都通过CALL指向壳段而FF25修复后占6个字节 IAT调用CALL则只占5个字节如果不分开处理最终会覆盖后面的一字节而且VMP对于每一个函数哪怕是相同的函数都会分配不同的过程来单独处理基于避免与VM正面对抗的想法以及前面提到的种种困难和尴尬我只好用一种尴尬的方法来处理----"云断点"前面提到的每个函数会通过一个PUSH/RETN结构返回真实地址于是我选择对UPX1段所有的这种结构下断最终找到下了几百个断点是为"云断点"云断点:引用:mov fi,001F3000 //001F3000为UPX0段VAloop:inc fifind fi,#FF7424??C2??00#cmp $RESULT,0je UPX1 //继续在UPX1段寻找add $RESULT,4mov fi,$RESULTwrta sFile,fi //记录wrta sFile,"\r\n"bp fi 下断jmp loopUPX1:cmp fi,00289000//UPX1段VAjae exitmov fi,00289000 //循环jmp loopexit:ret然后记录所有IAT和IAT调用经过这种结构的返回地址并分别记录FF25型IAT 和IAT调用的地址在下断和跟踪的过程中发现有一些指向了UPX0段而代码段里被VM处理过的也会指向UPX0段为了避免与VM混淆于是我记录下所有指向UPX0段的CALL 然后手工分离出VMCALL和IAT调用CALL 这样也给后续的修复工作提供了便利所幸的是这样的IAT并不多只有十个左右记录FF25型IAT和真实函数:引用:var fivar sFilevar tmpmov sFile,"FF25.TXT"mov fi,00011000loop:inc fifind fi,#E8??????00??8BC0#//找CALL XX// XX--此处VMP随机填充的一个字节// MOV EAX,EAX结构cmp $RESULT,0je exitmov fi,$RESULTgci fi,DESTINATIONcmp $RESULT,289000jb loopcmp $RESULT,3DE000//判断目标地址是否在UPX1段jae loopwrta sFile,fi //记录IAT地址wrta sFile,"\r\n"mov eip,fiestomov tmp,[esp]wrta sFile,tmp//记录真实函数地址wrta sFile,"\r\n"jmp loop同样方法记录IAT调用及其对应函数地址记为zhizhen.txt .我的思路是这样的:1.首先修复FF252.通过FF25指向的函数地址到IAT调用CALL对应的记录文件中查找最后将对应的IAT调用的指针指向FF25型IAT.因为OLLYSCR中的REV指令对[XX]操作时,会自动过滤前面的0,只好找雪雪写了一个小工具来取反,打包在附件中。

分别对FF25.TXT全部取反,对ZHIZHEN.TXT 隔行取反,方便脚本的操作。

保存结果为FF25.BIN和ZHIZHEN.BIN。

修复FF25:引用:var tmpvar neicunvar neicun1alloc 2000mov neicun,$RESULTlm neicun,2000,"ff25.bin"mov neicun1,neicunmov tmp,[neicun+4]eval "jmp {tmp}"asm [neicun],$RESULT //修复第一个loop:add neicun,8cmp [neicun],0je exitmov tmp,[neicun+4] //+4处为真实函数地址eval "jmp {tmp}"asm [neicun],$RESULT //将原FF25CALL修复成JMP XXjmp loopexit:free neicun1,2000ret脚本运行完毕后用UIF修复直接调用为FF25 记录修复后IAT的RVA 修复IAT调用:引用:var fivar searchvar strvar neicunvar neicun1mov search,00011000alloc 8000mov neicun,$RESULTlm neicun,8000,"zhizhen.bin"//载入mov neicun1,neicunloop:mov neicun,neicun1mov str,0inc searchfind search,#FF25# //在CODE段寻找FF25类IATcmp $RESULT,0je exitmov search,$RESULTcmp [search+2],010E0000//010E0000为UIF修复后的IAT RVA jb loopcmp [search+2],010E0800//本例中IAT大小为800jae loopGCI search,DESTINATIONmov fi,$RESULTeval "#{fi}#"//真实函数地址转换成查找值mov str,$RESULTfind neicun1,str,8000//在IAT调用文件中查找相同函数cmp $RESULT,0je loopmov neicun,$RESULTsub neicun,4mov tmp,[neicun]//指针定位到对应的IAT调用eval "call {search}"asm tmp,$RESULT//将IAT调用指向真实的FF25add neicun,8//第一次修复偷懒直接写了个过程find://循环修复IAT调用find neicun,str,8000cmp $RESULT,0je loopmov neicun,$RESULTsub neicun,4mov tmp,[neicun]eval "call {search}"asm tmp,$RESULTadd neicun,8jmp findexit:ret至此IAT修复完毕找到OEP:001E4C68修复OEP:引用:001E4C68 55 push ebp001E4C69 8BEC mov ebp,esp001E4C6B 83C4 F4 add esp,-0C001E4C6E B8 A0471E00 mov eax,1E47A0001E4C73 E8 702FE3FF call 00017BE8 ; 00017BE8001E4C78 A1 84901E00 mov eax,dword ptr ds:[1E9084]001E4C7D 8B00 mov eax,dword ptr ds:[eax]001E4C7F E8 3425E8FF call 000671B8 ; 000671B8001E4C84 A1 84901E00 mov eax,dword ptr ds:[1E9084]001E4C89 8B00 mov eax,dword ptr ds:[eax]001E4C8B BA E04C1E00 mov edx,1E4CE0 ; ASCII "VMProtect"001E4C90 E8 2721E8FF call 00066DBC ; 00066DBC001E4C95 8B0D A4901E00 mov ecx,dword ptr ds:[1E90A4] ;VMProted.001ED1F0001E4C9B A1 84901E00 mov eax,dword ptr ds:[1E9084]001E4CA0 8B00 mov eax,dword ptr ds:[eax]001E4CA2 8B15 B8011800 mov edx,dword ptr ds:[1801B8] ;VMProted.00180204001E4CA8 E8 2325E8FF call 000671D0 ; 000671D0001E4CAD 8B0D B08F1E00 mov ecx,dword ptr ds:[1E8FB0] ;VMProted.001EDDC4001E4CB3 A1 84901E00 mov eax,dword ptr ds:[1E9084]001E4CB8 8B00 mov eax,dword ptr ds:[eax]001E4CBA 8B15 C02E1D00 mov edx,dword ptr ds:[1D2EC0] ;VMProted.001D2F0C001E4CC0 E8 0B25E8FF call 000671D0 ; 000671D0001E4CC5 A1 84901E00 mov eax,dword ptr ds:[1E9084]001E4CCA 8B00 mov eax,dword ptr ds:[eax]001E4CCC E8 7F25E8FF call 00067250 ; 00067250001E4CD1 E8 76F2E2FF call 00013F4C ; 00013F4C001E4CD6 0000 add byte ptr ds:[eax],al001E4CD8 FFFF ??? ; Unknown command001E4CDA FFFF ??? ; Unknown command001E4CDC 0900 or dword ptr ds:[eax],eax001E4CDE 0000 add byte ptr ds:[eax],al001E4CE0 56 push esi001E4CE1 4D dec ebp001E4CE2 50 push eax001E4CE3 72 6F jb short 001E4D54 ; 001E4D54001E4CE5 74 65 je short 001E4D4C ; 001E4D4C001E4CE7 637400 00 arpl word ptr ds:[eax+eax],si001E4CEB 0000 add byte ptr ds:[eax],al修复几处VM:引用:00017BE8 50 push eax00017BE9 6A 00 push 000017BEB E8 F8FEFFFF call 00017AE8 ; 00017AE800017BF0 BA 08511E00 mov edx,1E510800017BF5 52 push edx00017BF6 8905 DCA41E00 mov dword ptr ds:[1EA4DC],eax00017BFC 8942 04 mov dword ptr ds:[edx+4],eax00017BFF C742 08 0000000>mov dword ptr ds:[edx+8],000017C06 C742 0C 0000000>mov dword ptr ds:[edx+C],000017C0D E8 8AFFFFFF call 00017B9C ; 00017B9C00017C12 5A pop edx00017C13 58 pop eax00017C14 E8 27C2FFFF call 00013E40 ; 00013E4000017C19 C3 retn引用:00013E40 8905 ACA41E00 mov dword ptr ds:[1EA4AC],eax00013E46 31C0 xor eax,eax00013E48 8905 B0A41E00 mov dword ptr ds:[1EA4B0],eax00013E4E 8915 B4A41E00 mov dword ptr ds:[1EA4B4],edx00013E54 8B42 04 mov eax,dword ptr ds:[edx+4]00013E57 8905 20A01E00 mov dword ptr ds:[1EA020],eax00013E5D E8 D6FEFFFF call 00013D38 ; 00013D3800013E62 C605 28A01E00 0>mov byte ptr ds:[1EA028],000013E69 E8 72FFFFFF call 00013DE0 ; 00013DE000013E6E C3 retn引用:00017B9C 53 push ebx00017B9D 81C4 F8FEFFFF add esp,-10800017BA3 68 05010000 push 10500017BA8 8D4424 04 lea eax,dword ptr ss:[esp+4]00017BAC 50 push eax00017BAD A1 DCA41E00 mov eax,dword ptr ds:[1EA4DC]00017BB2 50 push eax00017BB3 E8 28FFFFFF call 00017AE0 ; 00017AE000017BB8 8BC4 mov eax,esp00017BBA E8 C5EDFFFF call 00016984 ; 0001698400017BBF 8BD8 mov ebx,eax00017BC1 891D 18511E00 mov dword ptr ds:[1E5118],ebx00017BC7 85DB test ebx,ebx00017BC9 75 0A jnz short 00017BD5 ; 00017BD500017BCB A1 0C511E00 mov eax,dword ptr ds:[1E510C]00017BD0 A3 18511E00 mov dword ptr ds:[1E5118],eax00017BD5 B8 08511E00 mov eax,1E510800017BDA E8 BDF0FFFF call 00016C9C ; 00016C9C00017BDF 81C4 08010000 add esp,10800017BE5 5B pop ebx00017BE6 C3 retn引用:001A5E44 55 push ebp001A5E45 8BEC mov ebp,esp001A5E47 33C9 xor ecx,ecx001A5E49 51 push ecx001A5E4A 51 push ecx001A5E4B 51 push ecx001A5E4C 51 push ecx001A5E4D 53 push ebx001A5E4E 8BD8 mov ebx,eax001A5E50 33C0 xor eax,eax001A5E52 55 push ebp001A5E53 68 E25F1A00 push 1A5FE2001A5E58 64:FF30 push dword ptr fs:[eax]001A5E5B 64:8920 mov dword ptr fs:[eax],esp001A5E5E 8D55 FC lea edx,dword ptr ss:[ebp-4]001A5E61 8B43 58 mov eax,dword ptr ds:[ebx+58]001A5E64 E8 1F8CE8FF call 0002EA88 ; 0002EA88001A5E69 8B55 FC mov edx,dword ptr ss:[ebp-4]001A5E6C 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC]001A5E72 8B40 58 mov eax,dword ptr ds:[eax+58]001A5E75 E8 268CE8FF call 0002EAA0 ; 0002EAA0001A5E7A 8B15 30921E00 mov edx,dword ptr ds:[1E9230] ;VMProted.001ECBB4001A5E80 8B92 94000000 mov edx,dword ptr ds:[edx+94]001A5E86 8BC3 mov eax,ebx001A5E88 E8 E716EAFF call 00047574 ; 00047574001A5E8D 8B15 30921E00 mov edx,dword ptr ds:[1E9230] ;VMProted.001ECBB4001A5E93 8B92 68010000 mov edx,dword ptr ds:[edx+168]001A5E99 8B83 E8020000 mov eax,dword ptr ds:[ebx+2E8]001A5E9F E8 D016EAFF call 00047574 ; 00047574001A5EA4 BA 885F1A00 mov edx,1A5F88 ; ASCII "VMProtectProfessional v 1.8 [demo]"//省略部分详见附件脚本DUMP-FIX运行DUMP_.EXE 正常运行发现界面上的选项全部都成了乱码无奈对照NOOBY 牛的1.7版修复以下过程引用:001D607C 55 push ebp001D607D 8BEC mov ebp,esp001D607F 81C4 8CFEFFFF add esp,-174001D6085 53 push ebx001D6086 56 push esi001D6087 57 push edi001D6088 33C9 xor ecx,ecx001D608A 898D 8CFEFFFF mov dword ptr ss:[ebp-174],ecx001D6090 894D FC mov dword ptr ss:[ebp-4],ecx001D6093 894D F8 mov dword ptr ss:[ebp-8],ecx001D6096 8BD8 mov ebx,eax001D6098 BF C8DD1E00 mov edi,1EDDC8001D609D 33C0 xor eax,eax001D609F 55 push ebp001D60A0 68 06661D00 push 1D6606001D60A5 64:FF30 push dword ptr fs:[eax]001D60A8 64:8920 mov dword ptr fs:[eax],esp001D60AB BA 1C661D00 mov edx,1D661C ; ASCII "VMProtectProfessional v 1.8 [demo]"//省略部分详见附件脚本此过程将近600字节膜拜一下生猛的NOOBY 我对照1.7修复都花了近2个小时人肉的力量啊~~~剩下几个VM过程没有处理 CPUID? 补区? 水平和精力有限见谅 ^_^捣鼓一番后没有乱码了不过加壳的时候提示出错不再看了等儿童节怕文章写得太乱录了段视频抛砖引玉期待简单的处理方法引用:衷心感谢雪落的瞬间 NOOBY GOLDSUN A_P 啊cr fly 海风月影cyto Κūйɡβǐм等众位朋友在我学习过程中给予的无私帮助与支持.^_^Kissy/。

相关文档
最新文档