首页
社区
课程
招聘
[旧帖] [原创]求码文:清理飓风对虚拟机的检测 0.00雪花
发表于: 2010-1-7 04:35 1814

[旧帖] [原创]求码文:清理飓风对虚拟机的检测 0.00雪花

2010-1-7 04:35
1814
一直是步兵,颇为不爽。拿一篇菜鸟文求码,希望能够有机会向老大们学习!
飓风在虚拟机中不能播放,因此翻录不易。

如果能在虚拟机中播放,则可以无视其他检测进行翻录。
OD用插件隐藏好,内存断点法到了伪OEP处,此处并非OEP,而是外壳加密程序的一个进入点

0046EED0 55 PUSH EBP//停在这里 观察知 应该是个Delphi程序
0046EED1 8BEC MOV EBP,ESP
0046EED3 83C4 F0 ADD ESP,-10
0046EED6 53 PUSH EBX
0046EED7 B8 68EC4600 MOV EAX,111111.0046EC68 ; L
0046EEDC E8 DB7AF9FF CALL 111111.004069BC
0046EEE1 8B1D 70034700 MOV EBX,DWORD PTR DS:[470370] ; 111111.00471BE4
0046EEE7 8B03 MOV EAX,DWORD PTR DS:[EBX]
0046EEE9 E8 42DAFEFF CALL 111111.0045C930
0046EEEE 8B03 MOV EAX,DWORD PTR DS:[EBX]
0046EEF0 BA 48EF4600 MOV EDX,111111.0046EF48 ; Play
0046EEF5 E8 46D6FEFF CALL 111111.0045C540
0046EEFA 8B0D 84044700 MOV ECX,DWORD PTR DS:[470484] ; 111111.00471D54
0046EF00 8B03 MOV EAX,DWORD PTR DS:[EBX]
0046EF02 8B15 2CC04600 MOV EDX,DWORD PTR DS:[46C02C] ; 111111.0046C078
0046EF08 E8 3BDAFEFF CALL 111111.0045C948
0046EF0D 8B0D C4044700 MOV ECX,DWORD PTR DS:[4704C4] ; 111111.00471C74
0046EF13 8B03 MOV EAX,DWORD PTR DS:[EBX]
0046EF15 8B15 AC934600 MOV EDX,DWORD PTR DS:[4693AC] ; 111111.004693F8
0046EF1B E8 28DAFEFF CALL 111111.0045C948
0046EF20 8B0D 28034700 MOV ECX,DWORD PTR DS:[470328] ; 111111.00471D4C
0046EF26 8B03 MOV EAX,DWORD PTR DS:[EBX]
0046EF28 8B15 6CBE4600 MOV EDX,DWORD PTR DS:[46BE6C] ; 111111.0046BEB8
0046EF2E E8 15DAFEFF CALL 111111.0045C948
0046EF33 8B03 MOV EAX,DWORD PTR DS:[EBX]
0046EF35 E8 8EDAFEFF CALL 111111.0045C9C8
0046EF3A 5B POP EBX

然后Ctrl+G输入46d0fd,F2下断,F9运行,F2取消断点
来到这里:

0046D0FD E8 46F3FFFF CALL 111111.0046C448 ; 检验虚拟机的call 1
0046D102 85C0 TEST EAX,EAX ; eax=0 表示不在虚拟机 eax=1 表示在虚拟机
0046D104 74 16 JE SHORT 111111.0046D11C
//此处改成JMP
0046D106 B8 94D64600 MOV EAX,111111.0046D694
0046D10B E8 F8FAFBFF CALL 111111.0042CC08
0046D110 A1 70034700 MOV EAX,DWORD PTR DS:[470370]
0046D115 8B00 MOV EAX,DWORD PTR DS:[EAX]
0046D117 E8 98F9FEFF CALL 111111.0045CAB4
0046D11C E8 D3F3FFFF CALL 111111.0046C4F4 ; 另一个检测call 2
0046D121 84C0 TEST AL,AL
0046D123 75 09 JNZ SHORT 111111.0046D12E ; 另一关键跳
//虚拟机此处改成JZ
0046D125 E8 7EF3FFFF CALL 111111.0046C4A8 ;这个也是侦测虚拟机的call 检测call 3
0046D12A 84C0 TEST AL,AL
0046D12C 74 16 JE SHORT 111111.0046D144 ; 应该跳过下面的call
//改成JMp
//自动跳过下面的call
0046D12E B8 B4D64600 MOV EAX,111111.0046D6B4
0046D133 E8 D0FAFBFF CALL 111111.0042CC08 ;

在0046D0FD处F7进入

看到:
0046C448 55 PUSH EBP
0046C449 8BEC MOV EBP,ESP
0046C44B 51 PUSH ECX
0046C44C 53 PUSH EBX
0046C44D 56 PUSH ESI
0046C44E 57 PUSH EDI
0046C44F 33C0 XOR EAX,EAX
0046C451 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0046C454 33C0 XOR EAX,EAX
0046C456 55 PUSH EBP
0046C457 68 90C44600 PUSH 111111.0046C490
0046C45C 64:FF30 PUSH DWORD PTR FS:[EAX]
0046C45F 64:8920 MOV DWORD PTR FS:[EAX],ESP
0046C462 B8 68584D56 MOV EAX,564D5868 ; eax=544D5868 检测虚拟机必须条件
0046C467 BB 00000000 MOV EBX,0
0046C46C B9 0A000000 MOV ECX,0A ; 10号调用 检测在虚拟机中否
0046C471 BA 58560000 MOV EDX,5658 ; 5658端口
0046C476 ED IN EAX,DX ; I/O 命令
0046C477 81FB 68584D56 CMP EBX,564D5868 ; 虚拟机中运行到此句 EBX=564D5868
0046C47D 75 07 JNZ SHORT 111111.0046C486 ; 虚拟机中不跳
0046C47F C745 FC 0100000>MOV DWORD PTR SS:[EBP-4],1 ; temp=1
0046C486 33C0 XOR EAX,EAX
0046C488 5A POP EDX
0046C489 59 POP ECX
0046C48A 59 POP ECX
0046C48B 64:8910 MOV DWORD PTR FS:[EAX],EDX ; SEH链
0046C48E EB 0F JMP SHORT 111111.0046C49F
0046C490 ^ E9 DF7AF9FF JMP 111111.00403F74
0046C495 33C0 XOR EAX,EAX
0046C497 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0046C49A E8 3D7EF9FF CALL 111111.004042DC
0046C49F 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; eax为返回值 1 为检测到了
0046C4A2 5F POP EDI
0046C4A3 5E POP ESI
0046C4A4 5B POP EBX
0046C4A5 59 POP ECX
0046C4A6 5D POP EBP
0046C4A7 C3 RETN
此处是利用VMware的一个后门,详情可查阅看雪精华帖:http://bbs.pediy.com/showthread.php?threadid=2429
在0046D11C处F7:
0046C4F4 55 PUSH EBP
0046C4F5 8BEC MOV EBP,ESP
0046C4F7 51 PUSH ECX
0046C4F8 53 PUSH EBX
0046C4F9 56 PUSH ESI
0046C4FA 57 PUSH EDI
0046C4FB C645 FF 00 MOV BYTE PTR SS:[EBP-1],0
0046C4FF 33C0 XOR EAX,EAX
0046C501 55 PUSH EBP
0046C502 68 37C54600 PUSH 111111.0046C537
0046C507 64:FF30 PUSH DWORD PTR FS:[EAX]
0046C50A 64:8920 MOV DWORD PTR FS:[EAX],ESP
0046C50D 52 PUSH EDX
0046C50E 51 PUSH ECX
0046C50F 53 PUSH EBX
0046C510 B8 68584D56 MOV EAX,564D5868
0046C515 B9 0A000000 MOV ECX,0A
0046C51A BA 58560000 MOV EDX,5658
0046C51F ED IN EAX,DX ; I/O 命令
0046C520 81FB 68584D56 CMP EBX,564D5868
0046C526 0F9445 FF SETE BYTE PTR SS:[EBP-1]
0046C52A 5B POP EBX
0046C52B 59 POP ECX
0046C52C 5A POP EDX
0046C52D 33C0 XOR EAX,EAX
0046C52F 5A POP EDX
0046C530 59 POP ECX
0046C531 59 POP ECX
0046C532 64:8910 MOV DWORD PTR FS:[EAX],EDX
0046C535 EB 0A JMP SHORT 111111.0046C541
0046C537 ^ E9 387AF9FF JMP 111111.00403F74
0046C53C E8 9B7DF9FF CALL 111111.004042DC
0046C541 8A45 FF MOV AL,BYTE PTR SS:[EBP-1]
0046C544 5F POP EDI
0046C545 5E POP ESI
0046C546 5B POP EBX
0046C547 59 POP ECX
0046C548 5D POP EBP
0046C549 C3 RETN
几乎完全相同的代码,不知道作者意图是干嘛,以为这样可以迷惑攻击者?
回去,NOP(不推荐)或者JZ下面的那个跳转,然后在0046D125处F7
0046C4A8 55 PUSH EBP
0046C4A9 8BEC MOV EBP,ESP
0046C4AB 51 PUSH ECX
0046C4AC 53 PUSH EBX
0046C4AD 56 PUSH ESI
0046C4AE 57 PUSH EDI
0046C4AF C645 FF 00 MOV BYTE PTR SS:[EBP-1],0
0046C4B3 33C0 XOR EAX,EAX
0046C4B5 55 PUSH EBP
0046C4B6 68 E1C44600 PUSH 111111.0046C4E1
0046C4BB 64:FF30 PUSH DWORD PTR FS:[EAX]
0046C4BE 64:8920 MOV DWORD PTR FS:[EAX],ESP
0046C4C1 53 PUSH EBX
0046C4C2 BB 00000000 MOV EBX,0
0046C4C7 B8 01000000 MOV EAX,1
0046C4CC 0F3F ??? ; 未知命令
0046C4CE 07 POP ES ; 段寄存器更改
0046C4CF 0B85 DB0F9445 OR EAX,DWORD PTR SS:[EBP+45940FDB]
0046C4D5 FF5B 33 CALL FAR FWORD PTR DS:[EBX+33] ; 远调用
0046C4D8 C05A 59 59 RCR BYTE PTR DS:[EDX+59],59 ; 移位常量超出 1..31 的范围
0046C4DC 64:8910 MOV DWORD PTR FS:[EAX],EDX
0046C4DF EB 0A JMP SHORT 111111.0046C4EB
0046C4E1 ^ E9 8E7AF9FF JMP 111111.00403F74
0046C4E6 E8 F17DF9FF CALL 111111.004042DC
0046C4EB 8A45 FF MOV AL,BYTE PTR SS:[EBP-1]
0046C4EE 5F POP EDI
0046C4EF 5E POP ESI
0046C4F0 5B POP EBX
0046C4F1 59 POP ECX
0046C4F2 5D POP EBP
0046C4F3 C3 RETN
代码可分析的不多,值得注意的是0046C4CC语句,此处的OF3F 没有显示
是因为虚拟机不支持,详细请看SyserDebug的代码,非常详细。在这里斗胆转载如下:
标 题: 答复
作 者: SyserDebug
时 间: 2007-04-19 13:39
详细信息:

bool VMWareTest()
{
BYTE PortValue1,PortValue2;
__try
{
__asm
{
pushad
pushfd
xor ebx,ebx
mov ecx,0xa
mov eax, 'VMXh' ; EAX=magic
mov dx, 'VX' ; DX=magic
in eax, dx ; specially processed io cmd
cmp ebx, 'VMXh' ; also eax/ecx modified (maybe vmw/os ver?)
jne local_001
mov gInVMWARE,1
local_001:
popfd
popad
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
gInVMWARE=false;
}
return gInVMWARE;
}

bool VirtualPCTest()
{
__try
{
__asm
{
pushad
mov ebx, 0 // Flag
mov eax, 1 // VPC function number
__emit 0Fh
__emit 3Fh//Vmware不支持这个
__emit 07h
__emit 0Bh
test ebx, ebx
jnz local_001
mov gInVirtualPC,1
local_001:
popad
}

}
__except(EXCEPTION_EXECUTE_HANDLER)
{
gInVirtualPC=false;
}
if(gInVirtualPC)
DbgPrint("Syser : Host machine is VirtualPC !\n");
return gInVirtualPC;
}


F9运行,即出现注册画面。但是由于上述代码异常,使得程序进入SEH链,颇为不爽。
可以修改0F 3F 07 0B统一为90 90 90 90即可使此检测无效。
希望此文能够让翻录的站长更加勤奋,为我们小菜提供免费的教程!

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
膜拜一下!!!
2010-1-7 05:03
0
雪    币: 178
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害啊,能写下天狼星加密的么
2010-1-8 08:49
0
游客
登录 | 注册 方可回帖
返回
//