能力值:
( LV8,RANK:130 )
|
-
-
2 楼
原始字节码框架是:
sub esp, 0x1c
mov eax, dword ptr [0x403000]
xor eax, esp
mov dword ptr [esp+0x1c], eax
push edi
.......
mov ecx, dword ptr [esp+0x1c]
pop edi
xor ecx, esp
xor eax, eax
call 004011C7
add esp, 0x1c
retn
|
能力值:
( LV8,RANK:130 )
|
-
-
3 楼
最后是 retn 4, 怎么不能编辑
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
简单分析下这个虚拟机吧
1. 和VMP很相似,但是比VMP复杂很多
2. 寄存器随机变换,每次读写寄存器都会进行32次移位
3. VMP是通过NNA实现逻辑运算, 此虚拟机是NNA + NNR
4. 全程代码校验,不知道该不该这么叫,虚拟机引擎本身参与计算,所以下断点要小心。
5. 解析后的指令序列也乱序了,跳的晕头转向
|
能力值:
(RANK:550 )
|
-
-
5 楼
感谢参与 大问题没有 不过最好将答案规范一下 需要还原的是hash函数 不是main函数
另外请再比对一下输入输出
BTW:对虚拟机引擎的评价也很中肯到位
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
代码规范一下
unsigned char szData[1000] = {0};
unsigned int nHash = 0;
scanf( "%s", szData);//overflow
for ( int i=0; i<(int)strlen((char*)szData); i++ )
{
__asm{
pushad
mov eax, [nHash]
mov edx, [nHash]
mov cl, 3
shld eax, edx, cl
mov [nHash], eax
popad
}
nHash += szData[i];
nHash ^= 0x20141001;
nHash = ~nHash;
nHash += 0x20141007;
__asm
{
pushad
mov eax, [nHash]
mov edx, 0xCEBEA6DA
mul edx
mov [nHash], eax
popad
}
__asm{
pushad
mov eax, [nHash]
mov edx, [nHash]
mov cl, 0x7
shld eax, edx, cl
mov [nHash], eax
popad
}
}
nHash = ~nHash;
unsigned char Key1[12] = {0x83, 0x97, 0xA9, 0x99, 0xA7, 0xA9, 0x9C, 0x85, 0x9E, 0x5B, 0x00, 0x00};
unsigned char Key2[12] = {0x15, 0x30, 0x26, 0x25, 0x21, 0x15, 0x33, 0x27, 0x27, 0x2F, 0x00, 0x00};
for ( i=0; i<10; i++ )
{
__asm{
pushad
mov eax, [nHash]
mov edx, [nHash]
mov cl, 0x5
shld eax, edx, cl
mov [nHash], eax
popad
}
nHash ^= Key2[i];
nHash ^= 'A' + i;
nHash -= Key1[i];
nHash += '1' + i;
}
nHash ^= 0x19810304;
printf("%08X\n", nHash);
return 0;
|
能力值:
(RANK:350 )
|
-
-
7 楼
答案提交区,提交时间也是成绩计算一部分,因此发的帖不能编辑,若有错,可以跟帖把新答案付上。
附件只能上传,不能下载和删除。
若有新附件,请重新跟帖上传新附件。
|
能力值:
(RANK:350 )
|
-
-
8 楼
活动结束,答案移出来了。
具体参考活动发起帖:http://bbs.pediy.com/showthread.php?t=192742
|