Regripper_v3.0 Analysis (+ REGA)

Sooboon·2024년 5월 30일
0

Digital Forensic Study

목록 보기
4/4
post-thumbnail

Writer: 최원혁 (Sooboon)


INDEX

1. Regripper_v3.0

2. Regripper_v3.0 Decompile

3. REGA Decompile


1. Regripper_v3.0

  • Regripper는 Harlan Carvey에서 개발한 레지스트리 분석 도구로 오픈소스로 제공된다. (최신버전 3.0)
  • 한글 출력을 지원하지 않으며, 레지스트리 Hive을 자체적으로 수집하는 기능 또한 존재하지 않는다.
  • Regripper는 수집된 Windows가 영문판일 경우에, GUI 또는 CUI 환경에서 레지스트리의 내용 중 플러그인이 지원하는 세부적인 아티팩트를 찾고자 할 때 사용할 수 있는 도구로서 활용할 수 있다.

사용법은 따로 적지 않겠다. 원채 쉬우면서 구글링만으로 충분하기 때문이다.


RRR.png

Regripper는 위의 사진과 같이 txt의 형태로 뽑아준다. 그렇기에 일부 서브키 나 서브 키 전체의 내역이 필요하면 좋지만 특정 부분만을 원하기엔 불편한 부분이 많다. 또한 가독성 또한 매우 떨어진다.


2. Regripper_v3.0 Decompile

  • IDA를 통해 Regripper_v3.0.exe를 디컴파일 해보았다.

Regripper_v3.0 그래프 뷰 (1).png

Regripper_v3.0 그래프 뷰 (2).png

Regripper_v3.0 그래프 뷰 (3).png

위의 사진은 Regripper_v3.0.exe의 그래프 뷰이다.


int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // ebx
  HMODULE LibraryA; // eax
  HMODULE v5; // esi
  FARPROC RunPerl; // eax
  int v8; // edi
  const char *v9; // eax
  char FileName[260]; // [esp+8h] [ebp-104h] BYREF

  v3 = sub_401000(&argc, (int)&argv, FileName);
  if ( v3 )
    LibraryA = LoadLibraryA(FileName);
  else
    LibraryA = LoadLibraryA("p2x5124.dll");
  v5 = LibraryA;
  if ( !LibraryA )
  {
    printf("ERROR: LoadLibrary p2x5124.dll failed\n");
    return 1;
  }
  RunPerl = GetProcAddress(LibraryA, "RunPerl");
  dword_404160 = (int)RunPerl;
  if ( !RunPerl )
  {
    printf("ERROR: GetProcAddress p2x5124.dll failed\n");
    return 2;
  }
  v8 = ((int (__cdecl *)(int, const char **, const char **))RunPerl)(argc, argv, envp);
  FreeLibrary(v5);
  if ( v3 )
  {
    remove(FileName);
    v9 = (const char *)sub_401BD7();
    rmdir(v9);
  }
  return v8;
}
  • Regripper_v3.0.exe의 main 함수 코드이다.

Regripper_v3.0.exe가 perl로 작성된 코드이고 전체적인 코드 분석은 못하였기에 main만 먼저 보고 작성한다.

전체적은 흐름 분석은 차차 진행 할 예정이다. (+ REGA)


3. REGA Decompile

  • IDA를 통해 REGA.exe를 추가로 디컴파일 해보았다.

REGA 그래프 뷰.png

위의 사진은 REGA.exe의 그래프 뷰이다.


// positive sp value has been detected, the output may be wrong!
int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
{
  int v4; // ebx
  _DWORD **v5; // esi
  int v6; // edi
  int v7; // eax

  v4 = -1;
  v5 = (_DWORD **)sub_4C62CF();
  v6 = *(_DWORD *)(sub_4BACDF() + 4);
  if ( sub_4F189A(hInstance, hPrevInstance, lpCmdLine, nShowCmd)
    && (!v6 || (*(int (__thiscall **)(int))(*(_DWORD *)v6 + 172))(v6)) )
  {
    if ( ((int (__thiscall *)(_DWORD **))(*v5)[20])(v5) )
    {
      v7 = ((int (__thiscall *)(_DWORD **))(*v5)[21])(v5);
    }
    else
    {
      if ( v5[8] )
        (*(void (__thiscall **)(_DWORD *))(*v5[8] + 96))(v5[8]);
      v7 = ((int (__thiscall *)(_DWORD **))(*v5)[26])(v5);
    }
    v4 = v7;
  }
  sub_4E70ED();
  return v4;
}
  • REGA.exe의 main 함수 코드이다.

win API를 사용하기에 나타나는 특징 들을 볼 수가 있다.

win32 API이다 보니 DWORD를 볼 수 있다.
 
WORD는 CPU가 처리할 수 있는 하나의 단위이다. CPU는 어떤 연산을 진행하기 위해 레지스터라는 공간에 데이터를 가져오게 되고 연산을 진행하게 되는데, 한번에 처리할 수 있는 데이터의 크기는 CPU마다 다르다. 32 비트의 CPU, 64 비트의 CPU의 ~~비트는 바로 한번에 처리할 수 있는 양을 나타낸다. 
 
즉, CPU가 한번에 처리할 수 있는 데이터의 크기 단위를 WORD 라고 한다.

  • 자료형의 종류
DWORDunsigned long4 byte
boolchar1 byte
BOOLint4 byte
BYTEunsigned char1 byte
WORDunsigned short2 byte
UINTunsigned int4 byte

이것도 동일하게 REGA.exe가 양이 방대하고 전체적인 코드 분석은 못하였기에 main만 먼저 보고 작성한다.

전체적은 흐름 분석은 진행 중이다.

profile
디지털포렌식 정복기 '끝까지 처음처럼'

0개의 댓글