卷土重来,CM2
基于前面的CM1换了一种写法,一定很有趣,你可以用任何方法破解,如果成功了务必贴出详细流程让大家都学习一下
这个是易语言写的用黑月编译,有部分无用的代码混淆视听用的,密码是明文可以追溯的不是一个校验值
本帖最后由 爱飞的猫 于 2024-7-1 01:02 编辑
用带 VM 的壳 + 混淆就没意思了啊…
应该是用 VMP (旧版) 或类似的壳套上,然后将这部分给虚拟化了。
去掉外层的花指令倒是不难:
```py
import re
rJunkCode = re.compile(rb'\xE8\x00\x00\x00\x00([\s\S])+?\x8F\x44\x24\xFC')
with open('CM2.exe', 'rb') as f:
cm2 = f.read()
def replacer(group: re.Match):
return b'\x90' * len(group.group(0))
# .VIP5:0046A000 ; Section 5. (virtual address 0006A000)
# .VIP5:0046A000 ; Virtual size : 00003B4F (15183.)
# .VIP5:0046A000 ; Section size in file : 00003C00 (15360.)
# .VIP5:0046A000 ; Offset to raw data for section: 00058000
# .VIP5:0046A000 ; Flags E0000000: Executable Readable Writable
# .VIP5:0046A000 ; Alignment : default
sec5 = cm2
sec5 = rJunkCode.sub(replacer, sec5)
cm2_dejunk = bytearray(cm2)
cm2_dejunk = sec5
with open('CM2.dejunk.exe', 'wb') as f:
f.write(cm2_dejunk)
```
---
然后就是虚拟化处理后的部分,粗略看了下至少有 32 个 Handler 要分析:
```text
;.VIP4:00466000 off_466000 dd offset loc_463000 ; DATA XREF: sub_4030DE+6A371↓o
; ...
;.VIP4:0046607C dd offset loc_463353
; (0x0046607C + 4 - 0x00466000) / 4 = 32 个 Handler 块
```
第一个 Handler 处理块,凭感觉应该是拷贝 12 字节,然后继续跳到虚拟机其它地方执行:
```asm
; 463000: handler 0
push ebp
mov ebp, esp
sub esp, 3Ch
mov dword ptr , 0
push 0x466404
push eax
push ecx
push edx
push ebx
push ebp
push esi
push edi
pushf
push 0
mov esi, ; vm_inst
mov ebx,
add esi, ebx
mov ebp, esp
sub esp, 200h
mov eax, esp
add eax, 0F0h
cmp ebp, eax
jge loc_46D3F2
mov eax, esp
mov esp, ebp
sub esp, 0F0h
; memcpy(esp, eax, 0x0C)
push esi
push edi
push ecx
mov esi, eax
mov edi, esp
add edi, 0Ch
rep movsb
pop ecx
pop edi
pop esi
loc_46D3F2:
movzx eax, byte ptr ; eax = dword * 4 + ebx] + ebx
shl eax, 2
lea esi, ; inc esi
add eax, offset off_466000 ; 跳到下一个 vm handler?
add eax, ebx
mov eax,
add eax, ebx
jmp eax
```
如果真要分析的话,估计得全部看一遍,分析虚拟机字节码对应的指令,然后再破解了。
因为我没对抗过 VM 虚拟机的壳,就不继续看了。
记录 VM 访问:
```text
地址=0046D45A
模块/标签/异常=cm2.exe
状态=已禁用
反汇编=mov eax,dword ptr ds:
命中=0
摘要=暂停条件(0), 日志("eax: {eax}")
```
分析日志/对比,`dword` (即 `004632B8`) 在按下按钮的时候会执行(这个 Handler 应该是加载字符串)。可能刚好在判断之前,也可能已经判断完了 :) 本帖最后由 czyr 于 2024-7-1 02:36 编辑
爱飞的猫 发表于 2024-7-1 00:51
用带 VM 的壳 + 混淆就没意思了啊…
应该是用 VMP (旧版) 或类似的壳套上,然后将这部分给虚拟化了 ...
照你这样分析的话,那我防破解的目的就达到了呀。没有vm是扛不住的。vm只是第一招,第二招我这里弄了个蜜罐,一般破解的人都是从按钮事件下手,分析那个按钮事件下面的代码完全就是浪费时间,没有任何作用。当你花了大量的时间去分析完了那个按钮下面的所有代码,你会发现你得不到任何信息。核心都在线程里面,当然代码也都vm了,如果不vm的话,一个对比特征码就可以定位了不好玩,当然你会说放在线程里面不也一样吗,接下来就是第三招了,对线程进行一些特殊处理。让别人摸不着北,对于新手来说这一步就难倒一大片了,有意思的就是第三招,你去看看吧 从00404C06往下只找到一个1702556|0|1,不知道是啥
前面几个call全部跟进去看了没找到有用的信息
蹲一个大佬解密{:301_999:}
你好,再见 发表于 2024-6-30 17:57
从00404C06往下只找到一个1702556|0|1,不知道是啥
前面几个call全部跟进去看了没找到有用的信息
蹲一个 ...
成功带偏,你看到的这里只不过是自绘信息窗口的流程而已 密码是肯定有的,长度是6位,三天无人解出就给正确密码 不明觉厉!! 本帖最后由 OPQ 于 2024-7-1 17:21 编辑
我是看不懂,破解的是什么情况?还是加密的工具,就问一下 本帖最后由 凉游浅笔深画眉 于 2024-7-2 11:24 编辑
密码:119818
按钮事件里只是读取是否正确的标志,没有实际算法。
算法在线程里,每隔100毫秒读取一次编辑框内容。
到整数(编辑框_注册码.内容)==119818
上面分析都是我猜的,毕竟VM了,完全看不懂。
页:
[1]
2