Zzh 发表于 2016-10-20 15:18

关于【2012CM大赛】某个代码虚拟化CrackMe的分析

本帖最后由 Zzh 于 2016-10-20 15:22 编辑

PS:已经是个老古董了,当时似乎没有什么人对这个自写代码虚拟机的CrackMe感兴趣,好像没有人贴文分析,所以现在自己补上来吧=。=
代码虚拟机入口、出口、handler(共有8个)分析

被虚拟化的两个关键函数的PCODE分析Func_Check(int nPassword)(Virtualization)VM_GetReg(ESP)VM_SetReg(EAX)VM_GetReg(EAX)VM_GetData(0xC) //Get constVM_Add(nil)VM_AddEbp(0x4)VM_GetSs(nil)//Get nPasswordVM_Not(nil)VM_GetData(0xFE34FC32) //Get const VM_Sub(nil)VM_SetReg(EAX)VM_SetReg(EBX)//Set $Result2VM_GetReg(EAX)VM_GetData(0x00333333)//Get constVM_Sub(nil)VM_SetReg(EAX)VM_SetReg(EAX)//Set $Result1
Func_GetAnotherKey() (Virtualization)VM_GetReg(ECX) //Get $Result1VM_SetReg(EAX)VM_GetReg(EAX)VM_GetData(0x00333333) //Get const VM_Add(nil)VM_SetReg(EAX)VM_SetReg(EAX)VM_GetReg(EAX)VM_GetData(0x28999529) //Get const VM_Add(nil)VM_AddEbp(nil)VM_GetData(0x00993221) //Get constVM_Add(nil)VM_AddEbp(nil)VM_SetReg(EAX)//Set $AnotherKey

上面两个关键函数连起来,分析还原,得到以下等价伪代码$Result2 = NOT($nPassword) - 0xFE34FC32$Result1 = $(EFLAGS of$Result2) - 0x00333333$AnotherKey = $Result1 +0x00333333 + 0x28999529 + 0x00993221根据cmp esi,dword ptr ss:以及下面的je不成立执行Func_PrintWrong推测出正确Key对应的$Result2应该被置为0反推出$nPassword = 30081997(0x01CB03CD)$Result1 = 0x246 - 0x00333333 = 0xFFCCCF13$AnotherKey = 0x2932C990

Sound 发表于 2016-10-20 15:35

又见曾师傅。

19931222 发表于 2016-10-20 15:42

前排留名

Dxy88852 发表于 2016-10-20 15:45

虽然看不明白,但是感觉很厉害

暴走 发表于 2016-10-20 17:27

看不明白{:301_998:}

空心 发表于 2016-10-20 17:33

好办法```````

索马里的海贼 发表于 2016-10-20 17:39

膜拜,据说曾师傅还未成年 {:1_931:}

yeyulang 发表于 2016-10-20 18:25

看不明白..重点是要看明白那个绿色的字吗?

Rookietp 发表于 2016-10-21 21:09

{:17_1061:}曾师傅谈恋爱了,

zjhero2006 发表于 2016-10-23 19:00

楼主强大啊
页: [1] 2
查看完整版本: 关于【2012CM大赛】某个代码虚拟化CrackMe的分析