首页
社区
课程
招聘
求助大侠们, 这个是啥算法?
发表于: 2016-1-6 11:13 4612

求助大侠们, 这个是啥算法?

2016-1-6 11:13
4612
unsigned char byte_40E80C [0x0100] =
{
     0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
                0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e,
                0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e,
                0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e,
                0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e,
                0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe,
                0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde,
                0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe,
                0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05,
                0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25,
                0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45,
                0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65,
                0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85,
                0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5,
                0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5,
                0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5
                };
  
int __cdecl sub_403450(int a1)
{

  int result;
  byte v1;
  byte v2;
  byte v3;
  byte v4;
  byte v6;

  v1 = *(BYTE *)a1;
  v2 = *(BYTE *)(a1 + 1);
  v3 = *(BYTE *)(a1 + 2);
  v4 = *(BYTE *)(a1 + 3);

  v6 = v1 ^ v2 ^ v3 ^ v4;

  BYTE k1=byte_40E80C[byte_40E80C[byte_40E80C[v6]]];

  *(BYTE *)(result + 0) = v1  ^ v6 ^ byte_40E80C[byte_40E80C[v1 ^ v3]] ^ byte_40E80C[v1 ^ v2] ^ k1;
  *(BYTE *)(result + 1) = v2  ^ v6 ^ byte_40E80C[byte_40E80C[v2 ^ v4]] ^ byte_40E80C[v2 ^ v3] ^ k1;
  *(BYTE *)(result + 2) = v3  ^ v6 ^ byte_40E80C[byte_40E80C[v1 ^ v3]] ^ byte_40E80C[v3 ^ v4] ^ k1;
  *(BYTE *)(result + 3) = v4  ^ v6 ^ byte_40E80C[byte_40E80C[v2 ^ v4]] ^ byte_40E80C[v4 ^ v1] ^ k1;

}
能不能,算法可逆?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=lhglhg;1410256]unsigned char byte_40E80C [0x0100] =
{
     0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
                0x20,...[/QUOTE]

全是异或,就这段代码而言,加密过程太简单了(逆向暂时还没想)
要不要把这段代码翻译成C语言给你看?
2016-1-6 11:18
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
有点眉目,等我吃完饭,话说有密文没有啊,用于测试
2016-1-6 11:38
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=lhglhg;1410256]unsigned char byte_40E80C [0x0100] =
{
     0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
                0x20,...[/QUOTE]

这个函数调用之前对a1肯定有处理,因为a1的值不是随意提供的,如果是0x11111111这种8位全相等的数加密结果和明文是完全一样的,现在没有规则,分析就遇到瓶颈了
上边的那个表是用0xb1和偶数异或产生的(上半部分是固定的偶数下半部分是生成的)

这个算法是楼主自己写的?
2016-1-6 13:53
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
这个是从软件调试中发现的。就是没法逆回去这个算法。

已知result  ,如何反推a1 ? 就4字节
2016-1-6 20:31
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
这个表好像是AES 运算中的 一个表格
2016-1-6 20:32
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
4E F8 A9 A6   <== a1
8E 3F 00 08   <==result
2016-1-6 20:41
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
8
不会是AES的,看起来不像,应该是自己的算法
今天下午卡在 byte_40E80C[v1 ^ v2]这里的 v1^v2这里,
因为我猜测a1的四个字节不能是随便给定的,现在你给了一对明文和密文我再看看
2016-1-6 21:08
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
9
在进这个sub_403450(int a1)函数之前对a1的处理很重要,代码肯定规定了组成a1四个字节的规则,有可能的话把代码贴出来看看
2016-1-6 21:11
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
a1 是随意的
2016-1-6 21:32
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
11
int __cdecl sub_403450(char *a1)
{
        char result[4];
        char v1,v2,v3,v4,v6;
        v1 =a1[0];
        v2 =a1[1];
        v3 =a1[2];
        v4 =a1[3];

        v6 = v1 ^ v2 ^ v3 ^ v4;

        char k1 = byte_40E80C[byte_40E80C[byte_40E80C[v6]]];
        result[0]= v1  ^ v6 ^ byte_40E80C[byte_40E80C[v1 ^ v3]] ^ byte_40E80C[v1 ^ v2] ^ k1;
        result[1] = v2  ^ v6 ^ byte_40E80C[byte_40E80C[v2 ^ v4]] ^ byte_40E80C[v2 ^ v3] ^ k1;
        result[2] = v3  ^ v6 ^ byte_40E80C[byte_40E80C[v1 ^ v3]] ^ byte_40E80C[v3 ^ v4] ^ k1;
        result[3] = v4  ^ v6 ^ byte_40E80C[byte_40E80C[v2 ^ v4]] ^ byte_40E80C[v4 ^ v1] ^ k1;
       
        return *(int*)result;
}

result[0]^result[1]^result[2]^result[3]=v1^v2^v3^v4^
                        v6^v6^v6^v6^
                        ^ byte_40E80C[byte_40E80C[v1 ^ v3]] ^
                        ^ byte_40E80C[byte_40E80C[v2 ^ v4]] ^
                        ^ byte_40E80C[byte_40E80C[v1 ^ v3]] ^
                        ^ byte_40E80C[byte_40E80C[v2 ^ v4]] ^
                        ^ byte_40E80C[v1 ^ v2] ^
                        ^ byte_40E80C[v2 ^ v3] ^
                        ^ byte_40E80C[v3 ^ v4] ^
                        ^ byte_40E80C[v4 ^ v1] ^ k1 ^k1 ^ k1 ^k1
根据异或的特性,去掉成对出现的结果就是
result[0]^result[1]^result[2]^result[3]=
             v1 ^ v2 ^ v3 ^ v4 ^ byte_40E80C[v1 ^ v2] ^ byte_40E80C[v2 ^ v3]^
                                 byte_40E80C[v3 ^ v4]^ byte_40E80C[v4 ^ v1]

根据已知的算法随便测试可以测得(其实刚开始是猜的,后来随便输了个数测试了一下)
byte_40E80C[v1 ^ v2] ^ byte_40E80C[v2 ^ v3]^byte_40E80C[v3 ^ v4]^ byte_40E80C[v4 ^ v1] === 0
(上边这个是猜的,测试证明确实是这样)
result[0]^result[1]^result[2]^result[3] === v1 ^ v2 ^ v3 ^ v4

目前就想到这里,先睡觉了......
2016-1-6 22:35
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
12
我想你的算法和aes有点关系 mixcolum
这里高手实在太多,不敢班门弄斧
#byte_40E80C[] is multiplying by 2 lookup table
def xtime(n):
    temp = n << 1
    if(n & 0x80):
        temp ^= 0x1b
        temp%=0x100
    return temp

byte_40E80C=[]   
for i in range(256):
    v=xtime(i)
    byte_40E80C.append(v)
    if i%16==0:
        print '\n'
    print '0x%02x' %v,

'''
0x00 0x02 0x04 0x06 0x08 0x0a 0x0c 0x0e 0x10 0x12 0x14 0x16 0x18 0x1a 0x1c 0x1e

0x20 0x22 0x24 0x26 0x28 0x2a 0x2c 0x2e 0x30 0x32 0x34 0x36 0x38 0x3a 0x3c 0x3e

0x40 0x42 0x44 0x46 0x48 0x4a 0x4c 0x4e 0x50 0x52 0x54 0x56 0x58 0x5a 0x5c 0x5e

0x60 0x62 0x64 0x66 0x68 0x6a 0x6c 0x6e 0x70 0x72 0x74 0x76 0x78 0x7a 0x7c 0x7e

0x80 0x82 0x84 0x86 0x88 0x8a 0x8c 0x8e 0x90 0x92 0x94 0x96 0x98 0x9a 0x9c 0x9e

0xa0 0xa2 0xa4 0xa6 0xa8 0xaa 0xac 0xae 0xb0 0xb2 0xb4 0xb6 0xb8 0xba 0xbc 0xbe

0xc0 0xc2 0xc4 0xc6 0xc8 0xca 0xcc 0xce 0xd0 0xd2 0xd4 0xd6 0xd8 0xda 0xdc 0xde

0xe0 0xe2 0xe4 0xe6 0xe8 0xea 0xec 0xee 0xf0 0xf2 0xf4 0xf6 0xf8 0xfa 0xfc 0xfe

0x1b 0x19 0x1f 0x1d 0x13 0x11 0x17 0x15 0x0b 0x09 0x0f 0x0d 0x03 0x01 0x07 0x05

0x3b 0x39 0x3f 0x3d 0x33 0x31 0x37 0x35 0x2b 0x29 0x2f 0x2d 0x23 0x21 0x27 0x25

0x5b 0x59 0x5f 0x5d 0x53 0x51 0x57 0x55 0x4b 0x49 0x4f 0x4d 0x43 0x41 0x47 0x45

0x7b 0x79 0x7f 0x7d 0x73 0x71 0x77 0x75 0x6b 0x69 0x6f 0x6d 0x63 0x61 0x67 0x65

0x9b 0x99 0x9f 0x9d 0x93 0x91 0x97 0x95 0x8b 0x89 0x8f 0x8d 0x83 0x81 0x87 0x85

0xbb 0xb9 0xbf 0xbd 0xb3 0xb1 0xb7 0xb5 0xab 0xa9 0xaf 0xad 0xa3 0xa1 0xa7 0xa5

0xdb 0xd9 0xdf 0xdd 0xd3 0xd1 0xd7 0xd5 0xcb 0xc9 0xcf 0xcd 0xc3 0xc1 0xc7 0xc5

0xfb 0xf9 0xff 0xfd 0xf3 0xf1 0xf7 0xf5 0xeb 0xe9 0xef 0xed 0xe3 0xe1 0xe7 0xe5
'''
2016-1-6 23:26
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=天易love;1410408]我想你的算法和aes有点关系 mixcolum
这里高手实在太多,不敢班门弄斧
#byte_40E80C[] is multiplying by 2 lookup table
def xtime(n):
    temp = n << 1
    if(n & ...[/QUOTE]

好吧,学习了,原来这是AES的一部分

之前我根据观察和计算推算出上边的那个表和0xb1有很大关系,现在一看果然是的,但是现在不是产生表啊,.....
2016-1-7 07:57
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
关键是如何逆推算法?
2016-1-7 08:39
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
15
提示到这种程度,还不开窍。列变换的原理都不懂,那就不要搞下去了,大概都不知道什么叫列变换。
2016-1-7 08:39
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
16
好吧,我等菜鸟太愚笨了,
如果是AES的话,这个函数就是列混合算法的一部分,应该在一个循环里被调用四次的,你先看看是不是在循环里调用
我找了一段AES代码,.release后IDA我发现和楼主的代码很不一样啊,
建议楼主先确定是不是AES的列混合算法,如果是的话,网上有现成的逆列混合算法,可以先测试输入输出

还有一种方法是在代码中找解密函数....好了,菜鸟已黔驴技穷,无能为力了
2016-1-7 11:16
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
谢谢了!!
2016-1-7 14:09
0
游客
登录 | 注册 方可回帖
返回
//