关于【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
又见曾师傅。 前排留名 虽然看不明白,但是感觉很厉害 看不明白{:301_998:} 好办法``````` 膜拜,据说曾师傅还未成年 {:1_931:} 看不明白..重点是要看明白那个绿色的字吗? {:17_1061:}曾师傅谈恋爱了, 楼主强大啊
页:
[1]
2