某高强度CM的简单分析
本帖最后由 xjun 于 2017-8-9 20:48 编辑本人特此声明,此贴不针对任何人。
仅做技术交流.表达不好还请大牛拍砖。
一、初步分析
程序拿到手先拖入exeinfo 看看信息
从基本的PE信息来看 IAT表是完整的,资源表也是完整的。 我们在来拖入OD看看
入口点进来 直接解密程序的 .text 代码区段解密完之后跳向一段内存加载DLL的shellcode,这个DLL就是他的核心DLL,使用VMP全部加密了。并且兼容性比较差,我WIN10系统跑不起来,WIN7系统跑起来还随机卡死和崩溃现象,啥都没开呢 --!
-----------------------------------------------------------------------------------------------------------
我们此时跳向程序的代码领空发现程序已经解码了,并且各个地方调用IAT也正常,我们直接来到代码段分析.
1. 所有标记的代码段起始地址到结束地方都被抽取掉了,开始地址的地方都是int3,所以必定是利用异常跳转了。
2. 易语言按钮事件,易语言启窗事件,以及命令调用的地方,都把代码变形了
3. 入口点被抽取了,并且还在易语言几个内部的地方设置了暗坑
4. 我找到易语言 FF25 处,随便找了一个jmp跟了十几步,发现代码只是被简单的变形了,并且里面还时不时的有int3。
二、思路整理
1. 我们得还原OEP回去。
2. 还原他易语言内部的几个暗坑
3. 还原用户代码段int3 到正常的跳转 <- 这个是他模拟的jmp
4. 还原变形代码里面的int3 <-这里他用来模拟call (如何辨别jmp|all 看esp是否被减了4)
5. 整理变形的代码,还原变形代码
6. 验证分析与破解
三、开始还原
1. 还原OEP
我们来到0046BC53地址,找个易语言程序对照还原回去即可。
2.还原暗坑
从入口点开始我正常的跑过来,发现进入易语言启动事件的代码被retn掉了。
还有一处暗坑在启窗事件那
那么我是如何分析到 他这2处暗坑的呢? 因为我把OEP还原之后,连启窗事件都没跑完就蹦了,所以这中间必定有问题,然后你只要跟到那个call蹦了,一直这样跟进去,几次就出来了。
因为我对易语言程序比较熟悉,所以能区别哪些是易原体的 哪些是用户自写的代码。
3. 还原用户代码段的 int3被标记的变形代码
首先我们让他进程跑起来,断住KiUserExceptionDispatcher,设置EIP为int3地址代码,单步跟下,发现个VEH异常处理(也可以提取出他的DLL 用E-Debug2.0分析),这个时候我们先记录下他这个VEH异常处理子程序的地址,后面有用。
我们知道 从ff25 那里开始就是用户自学代码的结尾,从00401004开始是用户自写代码段开始.有了大小,我们首先来整理下全部的用户代码段int3 (就是jmp指令)
搜索 VA:00401004 - 00408FA7
第一种:
0040100C 55 push ebp
0040100D 8BEC mov ebp, esp
0040100F 81EC 04000000 sub esp, 0x4
00401015 CC
int3搜索特征为 -> 81EC????????CC
第二种:
0040114F 55 push ebp
00401150 8BEC mov ebp, esp
00401152 81EC 10000000 sub esp, 0x10
00401158 C745 FC 0000000>mov dword ptr , 0x0
0040115F CC int3
搜索特征为 -> C745??????????CC
第三种:
004023BF 55 push ebp
004023C0 8BEC mov ebp, esp
004023C2 CC int3
搜索特征为 -> 558BECCC
然后我们自己构造个EXCEPTION_POINTERS结构去call他的这个异常处理程序,我们还需要判断ESP是否被减了4,如果被减了4,这个int3模拟的就是call指令,并且里面带有返回地址。
DWORD GetAddr(DWORD dwInt3,DWORD *pushdata){
EXCEPTION_POINTERS ExceptInfo;
CONTEXT con = { 0 };
EXCEPTION_RECORD ex = { 0 };
ExceptInfo.ContextRecord = &con;
ExceptInfo.ExceptionRecord = &ex;
char espbuf = { 0 };
ExceptInfo.ContextRecord->Esp = (DWORD)&espbuf;
ExceptInfo.ContextRecord->Eip = dwInt3;
ExceptInfo.ExceptionRecord->ExceptionAddress = (PVOID)dwInt3;
ExceptInfo.ExceptionRecord->ExceptionCode = 0x80000003;
ExceptInfo.ExceptionRecord->NumberParameters = 1;
pfnEVehHandle(&ExceptInfo);
memcpy(pushdata, espbuf, 4);
return ExceptInfo.ContextRecord->Eip;
}
效果如下
这样他的所有用户代码段的代码就被我们还原了,我们打印出MUltIMATE Assembler的格式,一键还原上去。一键还原上去以后在搜索一下用户代码段还存在int3有2个漏修情况,同理还原上去。
4.还原壳区段的int3 代码,当用户代码正常的jmp到变形的代码后,里面还有很多int3指令,这个指令是用来模拟call的
我们可以提取特征 CC420D0A 都是这个特征,如果没这个特征的话,我们也可以直接搜索CC来遍历。搜索出来后,我们也打印出MUltIMATE Assembler格式,一键还原上去。
至此,程序已经能脱离他的核心DLL 独立运行了。
5. 整理变形代码与还原
Push Imm32
jmp xxxxxxxx->还原为 call指令
----------------------------------------------------------------
mov r32,Imm
not r32 ->还原为 mov r32,xxxxx
-----------------------------------------------------------------
pushfd
push eax
mov eax, 0x1D022C
xor eax, 0x76BB29
mov eax, dword ptr
mov dword ptr , 0xFE435F2A
xor dword ptr , eax
not dword ptr 此条指令可能存在
pop eax
popfd
call dword ptr -> 还原为 call指令
-----------------------------------------------------------------
mov dword ptr , 0x7FFFFCFE
not dword ptr
push dword ptr -> 还原为push 指令
-----------------------------------------------------------------
push ecx
mov ecx, 0xFFB45D9B
not ecx
mov eax, dword ptr
pop ecx ->还原为mov r32,dword
-----------------------------------------------------------------
遇到 jmp short 短跳指令,直接进行下一条。
如果没有遗漏的话大概就这么多。
我使用BEA反汇编引擎 ,在加上以上的变形还原规则,
如下效果:
截图的时候。还原工具有BUG,但后面提供下载的还原工具是没有的。
基本已经可以完整的还原出来原始指令。
到这个时候,顺带把易语言的命令调用地方,按钮事件 启窗事件也一并还原了吧(你也可以参考其他易语言程序来还原)
6.验证的破解与分析
机器码部分:
0040776D 55 push ebp
0040776E 8BEC mov ebp, esp
00407770 81EC 04000000 sub esp, 0x4
00407776 E8 A79DFFFF call 00401522 ; <-- 取机器码
0040777B 8945 FC mov dword ptr , eax
0040777E 68 04000080 push 0x80000004
00407783 6A 00 push 0x0
00407785 8B45 FC mov eax, dword ptr
00407788 85C0 test eax, eax
0040778A 0F85 05000000 jnz <seg00>
00407790 B8 74D04800 mov eax, 0048D074
00407795 >50 push eax
00407796 6A 01 push 0x1
00407798 BB 40A44000 mov ebx, <置剪辑板文本>
0040779D E8 61180000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004077A2 83C4 10 add esp, 0x10
004077A5 8B5D FC mov ebx, dword ptr
004077A8 85DB test ebx, ebx
004077AA 0F84 09000000 je <seg01>
004077B0 53 push ebx
004077B1 E8 41180000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004077B6 83C4 04 add esp, 0x4
004077B9 >BB 06000000 mov ebx, 0x6
004077BE E8 4198FFFF call 00401004
004077C3 68 01030080 push 0x80000301
004077C8 6A 00 push 0x0
004077CA 6A 00 push 0x0
004077CC 68 04000080 push 0x80000004
004077D1 6A 00 push 0x0
004077D3 68 25D24800 push 0048D225 ; ASCII "已复制"
004077D8 6A 04 push 0x4
004077DA BB D0A44000 mov ebx, <信息框>
004077DF E8 1F180000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004077E4 83C4 34 add esp, 0x34
004077E7 8BE5 mov esp, ebp
004077E9 5D pop ebp
004077EA C3 retn
call 00401522 为主要取机器码地方
还原后进去看看
00401522 55 push ebp
00401523 8BEC mov ebp, esp
00401525 81EC 24000000 sub esp, 0x24
0040152B C745 FC 0000000>mov dword ptr , 0x0
00401532 C745 F8 0000000>mov dword ptr , 0x0
00401539 C745 F4 0000000>mov dword ptr , 0x0
00401540 6A 01 push 0x1
00401542 6A 00 push 0x0
00401544 6A 01 push 0x1
00401546 8D45 F8 lea eax, dword ptr
00401549 50 push eax
0040154A 6A 01 push 0x1
0040154C 8D45 FC lea eax, dword ptr
0040154F 50 push eax
00401550 E8 85010000 call 004016DA <-硬盘序列号
00401555 E8 A01B0000 call 004030FA <- CPU制造厂商
0040155A 8945 F0 mov dword ptr , eax
0040155D E8 AE1C0000 call 00403210 <- CPU名称
00401562 8945 EC mov dword ptr , eax
00401565 E8 121E0000 call 0040337C <- CPUID
0040156A 8945 E8 mov dword ptr , eax
0040156D E8 241F0000 call 00403496<- 计算机名
00401572 8945 E4 mov dword ptr , eax
00401575 E8 F71F0000 call 00403571 <- 当前登录用户名
0040157A 8945 E0 mov dword ptr , eax
0040157D FF75 E0 push dword ptr
00401580 68 75D04800 push 0048D075
00401585 FF75 E4 push dword ptr
00401588 68 75D04800 push 0048D075
0040158D FF75 F8 push dword ptr
00401590 68 75D04800 push 0048D075
00401595 FF75 FC push dword ptr
00401598 68 75D04800 push 0048D075
0040159D FF75 E8 push dword ptr
004015A0 68 75D04800 push 0048D075
004015A5 FF75 EC push dword ptr
004015A8 68 75D04800 push 0048D075
004015AD FF75 F0 push dword ptr
004015B0 B9 0D000000 mov ecx, 0xD
004015B5 E8 39FBFFFF call <文本相加>
004015BA 83C4 34 add esp, 0x34
004015BD 8945 DC mov dword ptr , eax
004015C0 8B5D F0 mov ebx, dword ptr
004015C3 85DB test ebx, ebx
004015C5 0F84 09000000 je <seg00>
004015CB 53 push ebx
004015CC E8 267A0000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004015D1 83C4 04 add esp, 0x4
004015D4 >8B5D EC mov ebx, dword ptr
004015D7 85DB test ebx, ebx
004015D9 0F84 09000000 je <seg01>
004015DF 53 push ebx
004015E0 E8 127A0000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004015E5 83C4 04 add esp, 0x4
004015E8 >8B5D E8 mov ebx, dword ptr
004015EB 85DB test ebx, ebx
004015ED 0F84 09000000 je <seg02>
004015F3 53 push ebx
004015F4 E8 FE790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004015F9 83C4 04 add esp, 0x4
004015FC >8B5D E4 mov ebx, dword ptr
004015FF 85DB test ebx, ebx
00401601 0F84 09000000 je <seg03>
00401607 53 push ebx
00401608 E8 EA790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
0040160D 83C4 04 add esp, 0x4
00401610 >8B5D E0 mov ebx, dword ptr
00401613 85DB test ebx, ebx
00401615 0F84 09000000 je <seg04>
0040161B 53 push ebx
0040161C E8 D6790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
00401621 83C4 04 add esp, 0x4
00401624 >8B45 DC mov eax, dword ptr
00401627 50 push eax
00401628 8B5D F4 mov ebx, dword ptr
0040162B 85DB test ebx, ebx
0040162D 0F84 09000000 je <seg05>
00401633 53 push ebx
00401634 E8 BE790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
00401639 83C4 04 add esp, 0x4
0040163C >58 pop eax
0040163D 8945 F4 mov dword ptr , eax
00401640 68 04000080 push 0x80000004
00401645 6A 00 push 0x0
00401647 8B45 F4 mov eax, dword ptr
0040164A 85C0 test eax, eax
0040164C 0F85 05000000 jnz <seg06>
00401652 B8 74D04800 mov eax, 0048D074
00401657 >50 push eax
00401658 6A 01 push 0x1
0040165A BB 809D4000 mov ebx, <到字节集>
0040165F E8 9F790000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
00401664 83C4 10 add esp, 0x10
00401667 8945 F0 mov dword ptr , eax
0040166A 68 05000080 push 0x80000005
0040166F 6A 00 push 0x0
00401671 8B45 F0 mov eax, dword ptr
00401674 85C0 test eax, eax
00401676 0F85 05000000 jnz <seg07>
0040167C B8 77D04800 mov eax, 0048D077
00401681 >50 push eax
00401682 6A 01 push 0x1
00401684 B8 02000000 mov eax, 0x2
00401689 BB 50824600 mov ebx, <取数据摘要>
0040168E E8 7C790000 call 0040900F ; jmp to <WH本地验.三方库命令调用>
00401693 83C4 10 add esp, 0x10
00401696 8945 EC mov dword ptr , eax
00401699 8B5D F0 mov ebx, dword ptr
0040169C 85DB test ebx, ebx
0040169E 0F84 09000000 je <seg08>
004016A4 53 push ebx
004016A5 E8 4D790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004016AA 83C4 04 add esp, 0x4
004016AD >8B45 EC mov eax, dword ptr
004016B0 E9 00000000 jmp <seg09>
004016B5 >50 push eax
004016B6 8B5D FC mov ebx, dword ptr
004016B9 85DB test ebx, ebx
004016BB 0F84 09000000 je <seg10>
004016C1 53 push ebx
004016C2 E8 30790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004016C7 83C4 04 add esp, 0x4
004016CA >8B5D F8 mov ebx, dword ptr
004016CD 85DB test ebx, ebx
004016CF 0F84 09000000 je <seg11>
004016D5 53 push ebx
004016D6 E8 1C790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004016DB 83C4 04 add esp, 0x4
004016DE >8B5D F4 mov ebx, dword ptr
004016E1 85DB test ebx, ebx
004016E3 0F84 09000000 je <seg12>
004016E9 53 push ebx
004016EA E8 08790000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004016EF 83C4 04 add esp, 0x4
004016F2 >58 pop eax
004016F3 8BE5 mov esp, ebp
004016F5 5D pop ebp
004016F6 C3 retn
机器码 =MD5(硬盘序列号 + CPU制造商 + CPU名称 + CPUID + 计算机名 + 当前登录用户)
这个就是机器码
验证部分:
0040114F 55 push ebp
00401150 8BEC mov ebp, esp
00401152 81EC 10000000 sub esp, 0x10
00401158 C745 FC 0000000>mov dword ptr , 0x0
0040115F 6A 00 push 0x0
00401161 6A 01 push 0x1
00401163 6A FF push -0x1
00401165 6A 06 push 0x6
00401167 68 35000116 push 0x16010035
0040116C 68 01000152 push 0x52010001
00401171 E8 937E0000 call 00409009 ; jmp to <WH本地验.设置窗口组件内容>
00401176 83C4 18 add esp, 0x18
00401179 E8 A4030000 call 00401522
0040117E 8945 F8 mov dword ptr , eax
00401181 6A FF push -0x1
00401183 6A 08 push 0x8
00401185 68 34000116 push 0x16010034
0040118A 68 01000152 push 0x52010001
0040118F E8 8D7E0000 call 00409021 ; jmp to <WH本地验.获取窗口组件内容>
00401194 83C4 10 add esp, 0x10
00401197 8945 F4 mov dword ptr , eax
0040119A 8D45 F4 lea eax, dword ptr
0040119D 50 push eax
0040119E 8D45 F8 lea eax, dword ptr
004011A1 50 push eax
004011A2 E8 A5240000 call 0040364C
004011A7 8945 F0 mov dword ptr , eax
004011AA 8B5D F8 mov ebx, dword ptr
004011AD 85DB test ebx, ebx
004011AF 0F84 09000000 je <seg00>
004011B5 53 push ebx
004011B6 E8 3C7E0000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004011BB 83C4 04 add esp, 0x4
004011BE >8B5D F4 mov ebx, dword ptr
004011C1 85DB test ebx, ebx
004011C3 0F84 09000000 je <seg01>
004011C9 53 push ebx
004011CA E8 287E0000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004011CF 83C4 04 add esp, 0x4
004011D2 >8B45 F0 mov eax, dword ptr
004011D5 8945 FC mov dword ptr , eax
004011D8 837D FC 00 cmp dword ptr , 0x0
004011DC 0F85 A0000000 jnz <seg02>
004011E2 6A 00 push 0x0
004011E4 6A 00 push 0x0
004011E6 6A FF push -0x1
004011E8 6A 06 push 0x6
004011EA 68 39000116 push 0x16010039
004011EF 68 01000152 push 0x52010001
004011F4 E8 107E0000 call 00409009 ; jmp to <WH本地验.设置窗口组件内容>
004011F9 83C4 18 add esp, 0x18
004011FC 6A 00 push 0x0
004011FE 6A 00 push 0x0
00401200 6A FF push -0x1
00401202 6A 06 push 0x6
00401204 68 3B000116 push 0x1601003B
00401209 68 01000152 push 0x52010001
0040120E E8 F67D0000 call 00409009 ; jmp to <WH本地验.设置窗口组件内容>
00401213 83C4 18 add esp, 0x18
00401216 6A 00 push 0x0
00401218 6A 00 push 0x0
0040121A 6A FF push -0x1
0040121C 6A 06 push 0x6
0040121E 68 3C000116 push 0x1601003C
00401223 68 01000152 push 0x52010001
00401228 E8 DC7D0000 call 00409009 ; jmp to <WH本地验.设置窗口组件内容>
0040122D 83C4 18 add esp, 0x18
00401230 6A 00 push 0x0
00401232 6A 00 push 0x0
00401234 6A FF push -0x1
00401236 6A 06 push 0x6
00401238 68 74050116 push 0x16010574
0040123D 68 01000152 push 0x52010001
00401242 E8 C27D0000 call 00409009 ; jmp to <WH本地验.设置窗口组件内容>
00401247 83C4 18 add esp, 0x18
0040124A BB 06000000 mov ebx, 0x6
0040124F E8 B0FDFFFF call 00401004
00401254 68 01030080 push 0x80000301
00401259 6A 00 push 0x0
0040125B 6A 00 push 0x0
0040125D 68 04000080 push 0x80000004
00401262 6A 00 push 0x0
00401264 68 04D04800 push 0048D004 ; ASCII "验证成功"
00401269 6A 04 push 0x4
0040126B BB D0A44000 mov ebx, <信息框>
00401270 E8 8E7D0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
00401275 83C4 34 add esp, 0x34
00401278 E9 60020000 jmp <seg03>
0040127D E9 41020000 jmp <seg04>
00401282 >837D FC FF cmp dword ptr , -0x1
00401286 0F85 33000000 jnz <seg05>
0040128C BB 06000000 mov ebx, 0x6
00401291 E8 6EFDFFFF call 00401004
00401296 68 01030080 push 0x80000301
0040129B 6A 00 push 0x0
0040129D 6A 00 push 0x0
0040129F 68 04000080 push 0x80000004
004012A4 6A 00 push 0x0
004012A6 68 0DD04800 push 0048D00D ; ASCII "机器码或注册码不符合长度"
004012AB 6A 04 push 0x4
004012AD BB D0A44000 mov ebx, <信息框>
004012B2 E8 4C7D0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004012B7 83C4 34 add esp, 0x34
004012BA E9 04020000 jmp <seg04>
004012BF >837D FC FE cmp dword ptr , -0x2
004012C3 0F85 33000000 jnz <seg06>
004012C9 BB 06000000 mov ebx, 0x6
004012CE E8 31FDFFFF call 00401004
004012D3 68 01030080 push 0x80000301
004012D8 6A 00 push 0x0
004012DA 6A 00 push 0x0
004012DC 68 04000080 push 0x80000004
004012E1 6A 00 push 0x0
004012E3 68 26D04800 push 0048D026 ; ASCII "请检测网络"
004012E8 6A 04 push 0x4
004012EA BB D0A44000 mov ebx, <信息框>
004012EF E8 0F7D0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004012F4 83C4 34 add esp, 0x34
004012F7 E9 C7010000 jmp <seg04>
004012FC >837D FC FD cmp dword ptr , -0x3
00401300 0F85 33000000 jnz <seg07>
00401306 BB 06000000 mov ebx, 0x6
0040130B E8 F4FCFFFF call 00401004
00401310 68 01030080 push 0x80000301
00401315 6A 00 push 0x0
00401317 6A 00 push 0x0
00401319 68 04000080 push 0x80000004
0040131E 6A 00 push 0x0
00401320 68 31D04800 push 0048D031 ; ASCII "验证失败"
00401325 6A 04 push 0x4
00401327 BB D0A44000 mov ebx, <信息框>
0040132C E8 D27C0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
00401331 83C4 34 add esp, 0x34
00401334 E9 8A010000 jmp <seg04>
00401339 >837D FC FC cmp dword ptr , -0x4
0040133D 0F85 33000000 jnz <seg08>
00401343 BB 06000000 mov ebx, 0x6
00401348 E8 B7FCFFFF call 00401004
0040134D 68 01030080 push 0x80000301
00401352 6A 00 push 0x0
00401354 6A 00 push 0x0
00401356 68 04000080 push 0x80000004
0040135B 6A 00 push 0x0
0040135D 68 3AD04800 push 0048D03A ; ASCII "网络超时"
00401362 6A 04 push 0x4
00401364 BB D0A44000 mov ebx, <信息框>
00401369 E8 957C0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
0040136E 83C4 34 add esp, 0x34
00401371 E9 4D010000 jmp <seg04>
00401376 >837D FC FB cmp dword ptr , -0x5
0040137A 0F85 33000000 jnz <seg09>
00401380 BB 06000000 mov ebx, 0x6
00401385 E8 7AFCFFFF call 00401004
0040138A 68 01030080 push 0x80000301
0040138F 6A 00 push 0x0
00401391 6A 00 push 0x0
00401393 68 04000080 push 0x80000004
00401398 6A 00 push 0x0
0040139A 68 43D04800 push 0048D043 ; ASCII "注册码已过期"
0040139F 6A 04 push 0x4
004013A1 BB D0A44000 mov ebx, <信息框>
004013A6 E8 587C0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004013AB 83C4 34 add esp, 0x34
004013AE E9 10010000 jmp <seg04>
004013B3 >837D FC FA cmp dword ptr , -0x6
004013B7 0F85 33000000 jnz <seg10>
004013BD BB 06000000 mov ebx, 0x6
004013C2 E8 3DFCFFFF call 00401004
004013C7 68 01030080 push 0x80000301
004013CC 6A 00 push 0x0
004013CE 6A 00 push 0x0
004013D0 68 04000080 push 0x80000004
004013D5 6A 00 push 0x0
004013D7 68 50D04800 push 0048D050 ; ASCII "机器码不符合"
004013DC 6A 04 push 0x4
004013DE BB D0A44000 mov ebx, <信息框>
004013E3 E8 1B7C0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004013E8 83C4 34 add esp, 0x34
004013EB E9 D3000000 jmp <seg04>
004013F0 >837D FC F9 cmp dword ptr , -0x7
004013F4 0F85 33000000 jnz <seg11>
004013FA BB 06000000 mov ebx, 0x6
004013FF E8 00FCFFFF call 00401004
00401404 68 01030080 push 0x80000301
00401409 6A 00 push 0x0
0040140B 6A 00 push 0x0
0040140D 68 04000080 push 0x80000004
00401412 6A 00 push 0x0
00401414 68 5DD04800 push 0048D05D ; ASCII "禁止试用"
00401419 6A 04 push 0x4
0040141B BB D0A44000 mov ebx, <信息框>
00401420 E8 DE7B0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
00401425 83C4 34 add esp, 0x34
00401428 E9 96000000 jmp <seg04>
0040142D >68 01030080 push 0x80000301
00401432 6A 00 push 0x0
00401434 FF75 FC push dword ptr
00401437 6A 01 push 0x1
00401439 BB 30A34000 mov ebx, <到文本>
0040143E E8 C07B0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
00401443 83C4 10 add esp, 0x10
00401446 8945 F8 mov dword ptr , eax
00401449 FF75 F8 push dword ptr
0040144C 68 66D04800 push 0048D066 ; ASCII "错误返回值0x:"
00401451 B9 02000000 mov ecx, 0x2
00401456 E8 98FCFFFF call <文本相加>
0040145B 83C4 08 add esp, 0x8
0040145E 8945 F4 mov dword ptr , eax
00401461 8B5D F8 mov ebx, dword ptr
00401464 85DB test ebx, ebx
00401466 0F84 09000000 je <seg12>
0040146C 53 push ebx
0040146D E8 857B0000 call 00408FF7 ; jmp to <WH本地验.内存释放>
00401472 83C4 04 add esp, 0x4
00401475 >BB 06000000 mov ebx, 0x6
0040147A E8 85FBFFFF call 00401004
0040147F 68 01030080 push 0x80000301
00401484 6A 00 push 0x0
00401486 6A 00 push 0x0
00401488 68 04000080 push 0x80000004
0040148D 6A 00 push 0x0
0040148F 8B45 F4 mov eax, dword ptr
00401492 85C0 test eax, eax
00401494 0F85 05000000 jnz <seg13>
0040149A B8 74D04800 mov eax, 0048D074
0040149F >50 push eax
004014A0 6A 04 push 0x4
004014A2 BB D0A44000 mov ebx, <信息框>
004014A7 E8 577B0000 call 00409003 ; jmp to <WH本地验.核心库命令调用>
004014AC 83C4 34 add esp, 0x34
004014AF 8B5D F4 mov ebx, dword ptr
004014B2 85DB test ebx, ebx
004014B4 0F84 09000000 je <seg04>
004014BA 53 push ebx
004014BB E8 377B0000 call 00408FF7 ; jmp to <WH本地验.内存释放>
004014C0 83C4 04 add esp, 0x4
004014C3 >6A 00 push 0x0
004014C5 6A 00 push 0x0
004014C7 6A FF push -0x1
004014C9 6A 06 push 0x6
004014CB 68 35000116 push 0x16010035
004014D0 68 01000152 push 0x52010001
004014D5 E8 2F7B0000 call 00409009 ; jmp to <WH本地验.设置窗口组件内容>
004014DA 83C4 18 add esp, 0x18
004014DD >8BE5 mov esp, ebp
004014DF 5D pop ebp
004014E0 C3 retn
004011A2 E8 A5240000 call 0040364C <-就是验证的call了 直接让他返回0 就可以通过。
其他几个按钮就会禁止=假 了。
后面他有个解密数据的命令,因为没有一组正确注册码的原因,玩到后面解不开被加密的 PE文件。 他后面应该是把这个文件给内存加载了弹出破解成功的信息。就是对应的 初始化和开启HOME
其他几个验证功能按钮 就是读几个全局变量,该Patch的都Patch了。
PS:临时写的还原工具已经基本可以还原出全部指令了,但BUG肯定有,而且只针对此类程序有效。所以用出问题别找我,别找我,别找我。重要的话说三遍。 ^ _^ .
还原工具与视频:http://pan.baidu.com/s/1hr9Ht9i
回帖内容讨论归讨论 再次重申 5: 本版禁止点将,挑衅,侮辱 等言辞。 哈哈 分析倒是差不多 下次再次在吾爱发CM时 就不会让你标题打简单分析了
这个加密代码只是很简单的静态而且 复杂的加密思路已经有 但完全没时间写
但是方法用的好 你脱壳修复 也还是解密不出最终PE
给你个正版注册码 你能算出来也正常 我就算加你觉得很吊的VMP壳 也一样可以逆 只是时间问题
你说他垃圾 对于某些人来说 比VMP还难 你让一个破过VMP exe的人来脱这个壳未必他能脱
用最简单的方法 就是最好的方法 这个壳漏洞我知道 算出JMP跳转地址 差不多就可以完成脱离DLL的步骤了
我有个思路 代码模拟执行的思路 {:1_934:} 完成后 不会让你这么简单分析的
最后的最后 我肯定也知道你一定破不到验证 所以你要正版注册码破解?不存在滴,8字节长度的密钥 普通电脑可能要算几个月时间
chimaodeshu 发表于 2017-8-10 00:04
哈哈 分析倒是差不多 下次再次在吾爱发CM时 就不会让你标题打简单分析了
这个加密代码只是很简单的静态 ...
小兄弟你是真不知天高地厚吧 会逆vmp的完虐这种程度的加密 看到楼主的帖子,虽然我都没看懂但是我很感兴趣,但是无从下手,本人对计算机语言这方面0基础,想问问楼主如果想学习破解这些,就好比楼主作出这样的分析,需要学习什么?我现在无从下手,不知道先从什么开始再到什么,是不是要先学习语言java或者c或者c+那些先,楼主推荐我怎么学,先从哪再到哪,希望楼主回答我,谢谢您,本人今年270基础~ 八子节要多久? 这么无知的点评也好意思发出来 256的八次方 你给我用你电脑解个我看看 我就用一层加密 你都要解好久 无脑 支持一下
对了
师傅你看看你的排版。。乱套了 太难啦哈哈 xjun师傅就6 .. 糊里糊涂的哈哈哈 膜拜师傅 这操作我一年都学不会 厉害厉害 我先保存,抽空学习一下,呵呵!