首页
社区
课程
招聘
[旧帖] 一个对字节数组加解密代码求助 0.00雪花
发表于: 2017-2-8 09:47 2340

[旧帖] 一个对字节数组加解密代码求助 0.00雪花

2017-2-8 09:47
2340
初学IDA,有些看不懂,从dll文件中反汇编出来加密和解密的代码,a1估计是字节数组,另外a2和a3没看懂,请大神们帮看看

加密后的数组前几位如下:
byte[] str = { 0, 1, 35, 13, 76, 23, 0, 0,
                        -54, 0, -4, 1, 46, 2, -8, 2, 0, 0, 0, 0, 0, 0, 112, 1, 9, 0, 24, 1,
                        77, 0, 0, 0, 26, 0, 14, 0, 0, 0, 48, 2, -109, 6, -50, 7, 23, 8........}

下面是解密代码:
signed int __usercall sub_100010B0@<eax>(int a1@<eax>, int a2@<ecx>, int a3)
{
  int v3; // esi@1
  signed int result; // eax@2
  int v5; // edi@5
  int v6; // eax@5
  int v7; // esi@6
  int v8; // ebx@6
  int v9; // ecx@6
  unsigned __int8 v10; // al@7
  int v11; // [sp+4h] [bp-4h]@5

  v3 = a1;
  if ( a2 < 16 || *(_BYTE *)a1 || *(_BYTE *)(a1 + 1) != 1 )
  {
    result = -1;
  }
  else
  {
    v5 = *(_BYTE *)(a1 + 4) + ((*(_BYTE *)(a1 + 5) + ((*(_BYTE *)(a1 + 6) + (*(_BYTE *)(a1 + 7) << 8)) << 8)) << 8);
    v6 = *(_BYTE *)(a1 + 2) + (*(_BYTE *)(a1 + 3) << 8);
    v11 = *(_BYTE *)(v3 + 2) + (*(_BYTE *)(v3 + 3) << 8);
    if ( a2 < 2 * v5 + 8 )
      goto LABEL_14;
    v7 = v3 + 8;
    v8 = 0;
    v9 = 0;
    if ( v5 > 0 )
    {
      do
      {
        v10 = (*(_BYTE *)(v7 + 2 * v9) + ((unsigned int)*(_BYTE *)(v7 + 2 * v9 + 1) << 8))
            / ((unsigned int)(unsigned __int8)v9 + 1);
        *(_BYTE *)(++v9 + a3 - 1) = v10;
        v8 = (unsigned __int16)(v8 + v10);
      }
      while ( v9 < v5 );
      v6 = v11;
    }
    if ( v6 == v8 )
      result = v5;
    else
LABEL_14:
      result = -1;
  }
  return result;
}

下面是加密代码
signed int __usercall sub_10001030@<eax>(int a1@<edx>, int a2, signed int a3)
{
  __int16 v3; // ax@1
  signed int v4; // ebx@1
  signed int v5; // esi@1
  int v6; // edi@2
  int v7; // ecx@2

  *(_BYTE *)a1 = 0;
  *(_BYTE *)(a1 + 1) = 1;
  *(_BYTE *)(a1 + 5) = BYTE1(a3);
  *(_BYTE *)(a1 + 6) = a3 >> 16;
  *(_BYTE *)(a1 + 7) = BYTE3(a3);
  v3 = 0;
  v4 = 0;
  v5 = 8;
  for ( *(_BYTE *)(a1 + 4) = a3; v4 < a3; v5 += 2 )
  {
    v6 = *(_BYTE *)(v4 + a2);
    v7 = v6 * ((unsigned __int8)v4 + 1);
    *(_BYTE *)(a1 + v5) = v7;
    *(_BYTE *)(a1 + v5 + 1) = BYTE1(v7);
    ++v4;
    v3 += v6;
  }
  *(_BYTE *)(a1 + 2) = v3;
  *(_BYTE *)(a1 + 3) = HIBYTE(v3);
  return v5;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
不用看sub_10001030, 只看sub_100010B0, 可知a1,a2,a3含义

signed int __usercall sub_100010B0@<eax>(char* pSrc, int iLenSrc, char* pDst)
a1 is pSrc
a2 is iLenSrc
a3 is pDst

v9 is iIndex

sub_100010B0函数作用:
校验pSrc是否数据合规
讲pSrc经过运算后,按照字节赋值给pDst
并校验赋值(pSrc to pDst)是否正确.
2017-2-8 13:53
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上高手啊,我用上面解密的算法重新生成新文件,前面内容看了一下应该正确,但还是打不开,生成的是java的class文件,二进制的,不晓得哪里还有问题
2017-2-9 10:46
0
游客
登录 | 注册 方可回帖
返回