能力值:
( LV13,RANK:260 )
|
-
-
9 楼
求bin,,,,,,,,
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
不多说了,贴上原码,大家继续努力
#include <windows.h>
#include <stdio.h>
__declspec(naked) int __stdcall
DeCode(int *input, int *output, int key1, int key2, int len)
{
__asm
{
push ebx
push ebp
push esi
push edi
mov ecx,dword ptr [esp+24h]
mov esi,dword ptr [esp+1Ch]
mov edi,dword ptr [esp+20h]
mov ebx,dword ptr [esp+14h]
mov ebp,dword ptr [esp+18h]
movd xmm0,esp
lea ebx,[ebx+ecx*4-4]
lea ebp,[ebp+ecx*4-4]
main_loop:
mov eax,dword ptr [ebx]
xor edx,edx
div esi
mov eax,edx
mov esp,edx
mul eax
div esi
mov eax,edx
mul esp
div esi
mov eax,edx
xor edx,edx
div edi
mov eax,edx
mov esp,edx
mul eax
div edi
mov eax,edx
mul esp
div edi
mov dword ptr [ebp],edx
sub ebx,4
sub ebp,4
dec ecx
jne main_loop
movd esp,xmm0
mov eax,edx
pop edi
pop esi
pop ebp
pop ebx
ret 20
}
}
int main(int argc, char* argv[])
{
static int data1[100] ={
3460252782,
4140273162, 2889576777, 2721531043, 4140951881, 628761624,
858139359, 3277364450, 3550291914, 1465502053, 87620679,
335782906, 3937827598, 429409994, 44091066, 3555553407,
1019249883, 1603862792, 3729487318, 472139452, 1165438393,
1164133342, 3830636316, 2514631860, 976854456, 3022753939,
431544676, 3685163505, 215560178, 1634964885, 976854456,
4135980964, 2820957603, 3108583232, 1121526665, 2281217956,
3523509127, 3135945024, 876100493, 2079190612, 2953658047,
3801531832, 1939824962, 2281217956, 3523509127, 2343527619,
938702165, 2222618836, 816870255, 333376284, 1572104085,
3451252135, 871811689, 2482742276, 2784154706, 3337250777,
3404966627,
1172085923, 364711231, 3516354369, 3349321698, 2276097040,
1986263438
};
int data2[100];
__int64 key;
int key1, key2;
char s[24];
while(1)
{
printf("\r输入密码:");
scanf_s("%s", s, 23);
key = _atoi64(s);
key1 = (int)key;
key2 = key>>32;
if (key1==0 || key2==0)
goto wrong;
__try
{
DeCode(data1, data2, key1, key2, 100);
if (*(char*)data2 != 0x78)
goto wrong;
*data2 = (int)MessageBoxW;
__asm
{
lea eax, data2
add eax, 4
call eax
}
break;
}
__except(1)
{
goto wrong;
}
wrong:
MessageBoxW(0, L"密码错误!", 0, MB_ICONHAND);
}
return 0;
}
|
能力值:
( LV13,RANK:260 )
|
-
-
14 楼
看到这句:
DeCode(data1, data2, key1, key2, 100);
有没有 第二组答案...... 我表示 我要膜拜了,这解密 找 key 我 等 菜菜很有困难...
|
能力值:
( LV11,RANK:188 )
|
-
-
16 楼
唔,晕死。本来准备回复另外一个帖子的,才发现已经被爆出来了。
to S大,LZ发的是 "小女孩和小男孩互相炫耀他们的玩具" FFBA793E:FC84210B
S大的F6D1E949从什么地方计算出来的?
我觉得这个暴力的枚举78结尾的话,还是有可能的。还没有测试没有确定,但之前一直在脑子里把第一个DWORD当成就是00000078。
本来想睡觉时候暴力跑一下78开始的 /:^|
LZ把字符串也放到这里面真可恶,不然有字符串的开始位置偏移就容易解开不少
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
我弄了半天都没弄出来,觉得很丢人,都不敢来这儿回帖了,但是刚才我突然看到S大大也在这里我觉得很自然了,能让S大大降临的cm又岂是我能搞定的,哈哈。
|
能力值:
( LV9,RANK:180 )
|
-
-
22 楼
x大想太多也太抬举我了, 这个cm大家都可以动动脑的
二个DWord的穷举若无法将其中一个DWord猜到极小的范围内, 则不建议穷举.
我数学很差, 以下是无关数学的猜法.
1. 看到78我直接联想到 12345678 这个数字的成份大一点, 不过这不重要.
2. 将密文排序后最大值为 F6D1E949, 此时我猜 key2 > F6D1E949, 此范围仍嫌太大
3. 我猜算法是2层的RSA (事后得知我猜错了)
4. 我还须要猜中一组 DWord 的明文 : 考虑到lz会避开正常的函数头写法
call eax 之前有这么一句:
89 B5 40 FE FF FF mov [ebp-1C0], esi ;MessageBoxW
赌一下明文里面有 call [ebp-1C0] 或 mov reg32, [ebp-1C0]
并且 FFFFFE40 这个值, 并刚好落在4的边界上
若赌中的话, 则 key2 > FFFFFE40, 并为二素数之积. (只有56个值符合)
(这点也被闪过了)
5. 因key2只剩56个, 所以此时已够我们穷举 key1 由 80000000~FFFFFFFF 奇数所有情况了.
6. 因范围已缩到很小了, 为避免遗失, 我们过滤时也只判断 if byte == 78
以上..几个小时可跑完, 符合的值不多. 解码后是错的.
因为我猜错了. 破解失败.
我也想听听x大的破法是什么? 跟数学相关的话也教一下吧.
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
穷举的范围是很大的
key1和key2是不是素数都没关系
就算key1和key2都大于0xff000000,还差2^48个数要检验
就算得到了几十万组能得到0x78的数据,也很难有一组是正确的
附上编码中用到的数据
0x1C69486B
0xFFBA793E
0xA8581607
0xFC84210B
y = ((x^ 0x1C69486B % 0xFFBA793E) ^ 0xA8581607 ) % 0xFC84210B
例如
3460252782 =
((0x12345678^ 0x1C69486B % 0xFFBA793E) ^ 0xA8581607 ) % 0xFC84210B
|