苏紫方璇 发表于 2018-10-5 21:32

算法超级简单的CM

突发奇想搞了个算法超级简单的CM,真的超级简单哟。没有任何技术含量。
不过呢,个人感觉虽然超级简单,但是找对方法才好破。

另外说下这个CM只能运行在64位系统,在win7和win10测试过了可以运行,其他未知。

附含有重要信息的成功图



希望各位大牛破掉的同时,简述下破解方法呀。。。

苏紫方璇 发表于 2018-10-7 11:16

whyida 发表于 2018-10-7 11:00
关键函数伪代码,功力不够没看出来,return 0x2244669ADF46 - ((a * 2) ^ 0x128855678);建议放源代码, ...
CM主要算法放在x64代码中,使用开源的wow64ext调用
源码:

whyida 发表于 2018-10-7 11:00

苏紫方璇 发表于 2018-10-6 21:45
0x008C1FFC 里的核心算法代码其实就一句return 0x2244669ADF46 - ((a * 2) ^ 0x128855678);
只不过我做 ...

关键函数伪代码,功力不够没看出来,return 0x2244669ADF46 - ((a * 2) ^ 0x128855678);建议放源代码,大家学习一下。
__int64 __cdecl sub_401000(int a1, int a2, __int64 a3, char a4)
{
int v5; // ecx
_QWORD *v6; // edx
int v7; //
__int64 v8; //
__int64 v9; //
__int64 v10; //
__int64 v11; //
__int64 v12; //
__int64 v13; //
__int64 v14; //
int v15; //
int *v16; //

if ( Wow64Process )
{
    v5 = a2;
    v6 = &a3;
    if ( a2 <= 0 )
    {
      v14 = 0i64;
    }
    else
    {
      v6 = &a4;
      v5 = a2 - 1;
      v14 = a3;
    }
    if ( v5 <= 0 )
    {
      v13 = 0i64;
    }
    else
    {
      --v5;
      ++v6;
      v13 = *(v6 - 1);
    }
    if ( v5 <= 0 )
    {
      v12 = 0i64;
    }
    else
    {
      --v5;
      ++v6;
      v12 = *(v6 - 1);
    }
    if ( v5 <= 0 )
    {
      v11 = 0i64;
    }
    else
    {
      --v5;
      ++v6;
      v11 = *(v6 - 1);
    }
    v8 = (signed int)v6;
    v9 = 0i64;
    v10 = v5;
    v15 = 0;
    LOWORD(v15) = __FS__;
    v16 = &v7;
    JUMPOUT(4333, 4198637);
}
return 0i64;
}

whyida 发表于 2018-10-6 21:23

0xA6B9C9B3 ^ 0xA6ABFDE5=0x123456,edx=0 .
008C1FFC         | E8 3FFEFFFF         | call cm.8C1E40                         |
008C2001         | 314424 08             | xor dword ptr ss:,eax         |
008C2005         | 8D4424 08             | lea eax,dword ptr ss:         |
008C2009         | 315424 0C             | xor dword ptr ss:,edx         |
008C1FFC 计算eax,edx .好像只能暴力算号。

友人 发表于 2018-10-6 00:40

感谢分享

13925622740 发表于 2018-10-6 07:24

感谢分享。

RadishHuang 发表于 2018-10-6 08:31


感谢分享。

SeriousSnow 发表于 2018-10-6 10:21

难受。。就大概知道,判断输入长度是否大于0x10 一个分支。然后 最后是有个大整数A A ^= FUN(XXXXX) 最后 printf("%s",A) ....小白问下ida那些很多函数 , 作者自己写的我有些还大概能看看。很多函数都是进去就一个函数,或者莫名很长一个函数,或者直接返回一个值。。。。看的莫名其妙的。。这玩意有点好的教程不?还有比如易语言很多按钮事件这些都不能f5。。。小白真心求教

BeneficialWeb 发表于 2018-10-6 11:31

呜呜呜~,我可以直接改内存吗{:1_907:}:wwqwq

smile1110 发表于 2018-10-6 12:07

我要爆破它,(*^__^*) 嘻嘻……

灰灰。 发表于 2018-10-6 16:17

密匙:1122a706fe44
符合运算结果eax=0x123456,edx=0,所以估计是对的吧

没什么方法,猜的

凉游浅笔深画眉 发表于 2018-10-6 17:47

本帖最后由 凉游浅笔深画眉 于 2018-10-6 18:18 编辑

貌似有点难度,大数运算看不懂。。



凉游浅笔深画眉 发表于 2018-10-6 18:17

本帖最后由 凉游浅笔深画眉 于 2018-10-6 18:26 编辑

灰灰。 发表于 2018-10-6 16:17
密匙:1122a706fe44
符合运算结果eax=0x123456,edx=0,所以估计是对的吧


暴力跑的

这题有无数解:

1.11220xa706fe44

2.FFE1122a706fe44

3.FFE1122a706fe44

3.FFF1122a706fe44

以及相似解:
4.FFFF22a2a706fe44

应该是__int64 高位为0,低位0x123456

但是其实只需要满足edx的dl位是0就行了。
页: [1] 2 3
查看完整版本: 算法超级简单的CM