拿一工作中常用的软件练手,非VIP账号有功能限制。点击VIP功能会随机弹出提示:
第一步,查壳:
嗯,VMP,头大,硬着头皮看看。
x64dbg载入,因为软件启动没有限制,只是VIP功能限制,所以F9让它运行起来。
随便点击一个VIP功能,看看弹出的提示,肯定不是消息,像一个窗口,用 bp CreateWindow、bp CreateWindowEx(A)下断,居然提示无效地址。
尝试用bp ShowWindow下断,居然成功。
然后F8单歩运行,软件一直在qtgui4.dll、qtcore4.dll和系统领空中转,最终回到了主程序的领空(有时候软件会异常终止,不知道咋回事,F8时不要太快):
0137FEFB | 9C | pushfd |
0137FEFC | 8D6424 28 | lea esp,dword ptr ss:[esp+28] |
0137FF00 | E9 C4DFFFFF | jmp cadreader.137DEC9 |
0137FF05 | A2 A69B8B45 | mov byte ptr ds:[458B9BA6],al |
0137FF0A | F0 | ??? |
0137FF0B | 8975 FC | mov dword ptr ss:[ebp-4],esi |
0137FF0E | F0:0FC130 | lock xadd dword ptr ds:[eax],esi |
0137FF12 | E9 32010000 | jmp cadreader.1380049 |
0137FF17 | 83F8 02 | cmp eax,2 | //非VIP账号,eax有时候是0,有时候是4
0137FF1A | 75 35 | jne cadreader.137FF51 | //非VIP账号,这里会跳
0137FF1C | 6A 04 | push 4 |
0137FF1E | E8 FD52A400 | call <JMP.&??2@YAPAXI@Z> |
0137FF23 | C700 02000000 | mov dword ptr ds:[eax],2 |
0137FF29 | 83C4 04 | add esp,4 |
0137FF2C | C745 FC FFFFFFFF | mov dword ptr ss:[ebp-4],FFFFFFFF |
0137FF33 | 8B55 08 | mov edx,dword ptr ss:[ebp+8] |
0137FF36 | 8902 | mov dword ptr ds:[edx],eax |
0137FF38 | 8B45 F0 | mov eax,dword ptr ss:[ebp-10] |
0137FF3B | 83C9 FF | or ecx,FFFFFFFF |
0137FF3E | F0:0FC108 | lock xadd dword ptr ds:[eax],ecx |
0137FF42 | 0F85 10010000 | jne cadreader.1380058 |
0137FF48 | 8B55 F0 | mov edx,dword ptr ss:[ebp-10] |
0137FF4B | 52 | push edx |
0137FF4C | E9 FE000000 | jmp cadreader.138004F |
0137FF51 | 83F8 03 | cmp eax,3 |
0137FF54 | 75 2B | jne cadreader.137FF81 | //非VIP账号,这里会跳
0137FF56 | 6A 04 | push 4 |
0137FF58 | E8 C352A400 | call <JMP.&??2@YAPAXI@Z> |
0137FF5D | 83C4 04 | add esp,4 |
0137FF60 | 837D E0 64 | cmp dword ptr ss:[ebp-20],64 | 64:'d'
0137FF64 | C745 FC FFFFFFFF | mov dword ptr ss:[ebp-4],FFFFFFFF |
0137FF6B | 75 10 | jne cadreader.137FF7D |
0137FF6D | 8B4D 08 | mov ecx,dword ptr ss:[ebp+8] |
0137FF70 | C700 03000000 | mov dword ptr ds:[eax],3 |
0137FF76 | 8901 | mov dword ptr ds:[ecx],eax |
0137FF78 | E9 C2000000 | jmp cadreader.138003F |
0137FF7D | 8918 | mov dword ptr ds:[eax],ebx |
0137FF7F | EB B2 | jmp cadreader.137FF33 |
0137FF81 | 83F8 04 | cmp eax,4 |
0137FF84 | 75 2A | jne cadreader.137FFB0 |
0137FF86 | 68 D0070000 | push 7D0 |
0137FF8B | 51 | push ecx |
0137FF8C | 8BC4 | mov eax,esp |
0137FF8E | 8965 D8 | mov dword ptr ss:[ebp-28],esp |
0137FF91 | 53 | push ebx |
0137FF92 | 68 509EFD01 | push cadreader.1FD9E50 | 1FD9E50:"Server illegal" //服务器未授权
0137FF97 | 50 | push eax |
0137FF98 | FF15 F02CFD01 | call dword ptr ds:[<&?tr@QObject@@SA?AV |
0137FF9E | 83C4 0C | add esp,C |
0137FFA1 | 53 | push ebx |
0137FFA2 | 8D4D BC | lea ecx,dword ptr ss:[ebp-44] |
0137FFA5 | E8 B66C1500 | call cadreader.14D6C60 |
0137FFAA | C645 FC 05 | mov byte ptr ss:[ebp-4],5 |
0137FFAE | EB 64 | jmp cadreader.1380014 |
0137FFB0 | 3BC3 | cmp eax,ebx |
0137FFB2 | 75 2A | jne cadreader.137FFDE |
0137FFB4 | 68 D0070000 | push 7D0 |
0137FFB9 | 51 | push ecx |
0137FFBA | 8BD4 | mov edx,esp |
0137FFBC | 8965 D8 | mov dword ptr ss:[ebp-28],esp |
0137FFBF | 53 | push ebx |
0137FFC0 | 68 389EFD01 | push cadreader.1FD9E38 | 1FD9E38:"Serve Internal Error" //服务器内部错误
0137FFC5 | 52 | push edx |
0137FFC6 | FF15 F02CFD01 | call dword ptr ds:[<&?tr@QObject@@SA?AV |
0137FFCC | 83C4 0C | add esp,C |
0137FFCF | 53 | push ebx |
0137FFD0 | 8D4D BC | lea ecx,dword ptr ss:[ebp-44] |
0137FFD3 | E8 886C1500 | call cadreader.14D6C60 |
0137FFD8 | C645 FC 06 | mov byte ptr ss:[ebp-4],6 |
0137FFDC | EB 36 | jmp cadreader.1380014 |
0137FFDE | 6A 04 | push 4 |
0137FFE0 | E8 3B52A400 | call <JMP.&??2@YAPAXI@Z> |
0137FFE5 | 8918 | mov dword ptr ds:[eax],ebx |
0137FFE7 | E9 3DFFFFFF | jmp cadreader.137FF29 |
0137FFEC | 68 D0070000 | push 7D0 |
0137FFF1 | 51 | push ecx |
0137FFF2 | 8BC4 | mov eax,esp |
0137FFF4 | 8965 D8 | mov dword ptr ss:[ebp-28],esp |
0137FFF7 | 53 | push ebx |
0137FFF8 | 68 0C9EFD01 | push cadreader.1FD9E0C | 1FD9E0C:"Network connection is failed, please retry"
0137FFFD | 50 | push eax |
0137FFFE | FF15 F02CFD01 | call dword ptr ds:[<&?tr@QObject@@SA?AV |
01380004 | 83C4 0C | add esp,C |
01380007 | 53 | push ebx |
01380008 | 8D4D BC | lea ecx,dword ptr ss:[ebp-44] |
0138000B | E8 506C1500 | call cadreader.14D6C60 |
01380010 | C645 FC 07 | mov byte ptr ss:[ebp-4],7 |
01380014 | 8D4D BC | lea ecx,dword ptr ss:[ebp-44] |
01380017 | E8 146C1500 | call cadreader.14D6C30 |
0138001C | 6A 04 | push 4 | //回到这里
0138001E | E8 FD51A400 | call <JMP.&??2@YAPAXI@Z> |
01380023 | 8B4D 08 | mov ecx,dword ptr ss:[ebp+8] |
01380026 | 8918 | mov dword ptr ds:[eax],ebx |
01380028 | 8901 | mov dword ptr ds:[ecx],eax |
0138002A | 83C4 04 | add esp,4 |
0138002D | 8D4D BC | lea ecx,dword ptr ss:[ebp-44] |
01380030 | 885D FC | mov byte ptr ss:[ebp-4],bl |
01380033 | E8 D86B1500 | call cadreader.14D6C10 |
01380038 | C745 FC FFFFFFFF | mov dword ptr ss:[ebp-4],FFFFFFFF |
0138003F | 8B55 F0 | mov edx,dword ptr ss:[ebp-10] |
01380042 | 83C8 FF | or eax,FFFFFFFF |
01380045 | F0:0FC102 | lock xadd dword ptr ds:[edx],eax |
01380049 | 75 0D | jne cadreader.1380058 |
0138004B | 8B4D F0 | mov ecx,dword ptr ss:[ebp-10] |
0138004E | 51 | push ecx |
0138004F | FF15 202DFD01 | call dword ptr ds:[<&?free@QString@@CAX |
01380055 | 83C4 04 | add esp,4 |
01380058 | 8B4D F4 | mov ecx,dword ptr ss:[ebp-C] |
0138005B | 64:890D 00000000 | mov dword ptr fs:[0],ecx |
01380062 | 59 | pop ecx |
01380063 | 5F | pop edi |
01380064 | 5E | pop esi |
01380065 | 5B | pop ebx |
01380066 | 8BE5 | mov esp,ebp |
01380068 | 5D | pop ebp |
01380069 | C3 | ret |
代码往上看,发现了熟悉的提示信息。
在0137FF1A处,可以把跳转nop掉,但又出现了另一个问题,在调试时修改,原来的提示信息没了,继续跳出要购买VIP的窗口。但用UE修改后运行,软件会弹出丢失组件的错误信息,关闭就退出了,应该是自校验的问题。
调试时发现是动态基址,用CFF修改后运行,也会弹出丢失组件的信息,同样会自校验。
本想继续跟下这个自校验,然后就进入了VMP的伪指令中,完全摸不着头脑,就没有然后了……
有没有大神把这个VMP的壳给脱了?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!