Writer: 최원혁 (Sooboon)
사용법은 따로 적지 않겠다. 원채 쉬우면서 구글링만으로 충분하기 때문이다.
Regripper는 위의 사진과 같이 txt의 형태로 뽑아준다. 그렇기에 일부 서브키 나 서브 키 전체의 내역이 필요하면 좋지만 특정 부분만을 원하기엔 불편한 부분이 많다. 또한 가독성 또한 매우 떨어진다.
위의 사진은 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가 perl로 작성된 코드이고 전체적인 코드 분석은 못하였기에 main만 먼저 보고 작성한다.
전체적은 흐름 분석은 차차 진행 할 예정이다. (+ REGA)
위의 사진은 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;
}
win API를 사용하기에 나타나는 특징 들을 볼 수가 있다.
win32 API이다 보니 DWORD를 볼 수 있다.
WORD는 CPU가 처리할 수 있는 하나의 단위이다. CPU는 어떤 연산을 진행하기 위해 레지스터라는 공간에 데이터를 가져오게 되고 연산을 진행하게 되는데, 한번에 처리할 수 있는 데이터의 크기는 CPU마다 다르다. 32 비트의 CPU, 64 비트의 CPU의 ~~비트는 바로 한번에 처리할 수 있는 양을 나타낸다.
즉, CPU가 한번에 처리할 수 있는 데이터의 크기 단위를 WORD 라고 한다.
DWORD | unsigned long | 4 byte |
---|---|---|
bool | char | 1 byte |
BOOL | int | 4 byte |
BYTE | unsigned char | 1 byte |
WORD | unsigned short | 2 byte |
UINT | unsigned int | 4 byte |
이것도 동일하게 REGA.exe가 양이 방대하고 전체적인 코드 분석은 못하였기에 main만 먼저 보고 작성한다.
전체적은 흐름 분석은 진행 중이다.