0

実行ファイルから暗号方式を取得しようとしています。開梱し、IDA Pro で分析を開始しました。

まったく理解できないコードに遭遇しました。以下はasmコードブロックです。

___:00A11B6F 008                 mov     eax, [ebp+DecryptedBytes]
___:00A11B72 008                 push    eax
___:00A11B73 00C                 push    100h
___:00A11B78 010                 push    offset CI_StrCmp
___:00A11B7D 014                 mov     ecx, [ebp+LengthValueOfBytes]
___:00A11B80 014                 push    ecx
___:00A11B81 018                 mov     edx, [ebp+Bytes]
___:00A11B84 018                 add     edx, 4
___:00A11B87 018                 push    edx
___:00A11B88 01C                 call    rijndaelDecrypt

そして、これの疑似コードは次のとおりです。

*(_DWORD *)DecryptResult = rijndaelDecrypt(Bytes + 4, LengthValueOfBytes, (int)CI_StrCmp, 0x100u, DecryptedBytes);

CI_StrCmp は、大文字と小文字を区別しない文字列比較関数です。rijndaelDecrypt 関数は、この引数の 16 バイトを読み取ります。鍵だと思います。

以下はrijndaelDecrypt関数です。

void *__cdecl rijndaelDecrypt(int Bytes, unsigned int Length, int Key, unsigned int BitSize, int a5)
{
  void *DecryptedBytes; // ebx@1
  void *result; // eax@5
  unsigned int v7; // [sp+Ch] [bp-118h]@2
  unsigned int v8; // [sp+10h] [bp-114h]@2
  unsigned int v9; // [sp+14h] [bp-110h]@2
  unsigned int v10; // [sp+18h] [bp-10Ch]@2
  char v11; // [sp+1Ch] [bp-108h]@1

  DecryptedBytes = malloc_2(Length);
  memset(&v11, 0, 0x108u);
  if ( (signed int)BitSize >= 16 )
  {
    v7 = *(_DWORD *)Key;
    v8 = *(_DWORD *)(Key + 4);
    v9 = *(_DWORD *)(Key + 8);
    v10 = *(_DWORD *)(Key + 12);
  }
  else
  {
    v7 = 0x12121212u;
    v8 = 0x12121212u;
    v9 = 0x12121212u;
    v10 = 0x12121212u;
    memcpy(&v7, (const void *)Key, BitSize);
  }
  if ( rijndaelSetupDecrypt((int)&v7, 16, (int)&v11) == 1 )
  {
    sub_A125B0(Bytes, Length, DecryptedBytes, (int)&v11, a5);
    result = DecryptedBytes;
  }
  else
  {
    result = 0;
  }
  return result;
}

私の質問は、プロシージャのオフセットを別のプロシージャに送信することの意味は何ですか。私には意味がありません。

ps 下手な英語で申し訳ありません。

4

2 に答える 2

0

「プロシージャのオフセットを送信する」とは、このステートメントを意味しますpush offset CI_StrCmp

StrCmp 関数のアドレスを Decrypt ルーチンに渡しているので、Decrypt はそれを呼び出すことができます。

Decrypt の関数プロトタイプは次のようになると思います...

DWORD rijndaelDecrypt (const void *pData, size_t SizeOfData, int CmpFuncAddress, int Value, DWORD *pDecryptCount);

より正確には、このようにする必要があります...

typedef int COMPARE_FUNCTION (const char *, const char *);
DWORD rijndaelDecrypt (const void *pData, size_t SizeOfData, COMPARE_FUNCTION *, int Value, DWORD *pDecryptCount);
于 2013-02-27T20:38:40.487 に答える
0

わかりました...彼らはCL_StrCmp(1)の実際のコードをキー(2)として使用して復号化を行います。コードは著作権で保護されているため、独自のプログラムでデータを復号化するには、コードを含める必要がありますCL_StrCmp。したがって、著作権を侵害しています-IEは法律を破っています。

(1) 関数の実際のコンパイル済み命令。

(2) 公開\秘密鍵を考えます。

于 2013-02-27T20:53:13.350 に答える