첫 번째 목표는 메시지 박스를 제거하는 것


메시지 박스가 나타나는 경우
두 부분 모두 메시지 박스가 나타나지 않도록 처리를 해줘야 합니다

디버거에서 업로드 후 디스어셈블 된 코드를 확인했습니다
EP 코드 위로 확인을 하다 보면 ThunRTMain 함수를 사용하고 있으며 Visual Basic으로 해당 프로그램이 생성된 것을 볼 수 있습니다
VB에서 메시지 박스를 이용하는 API는 MsgBox입니다
Search for - All intermodular calls 명령을 사용하여 프로그램에서 사용되는 API 호출 목록을 확인합니다

4번의 MsgBox 호출을 확인할 수 있습니다

해당 부분을 BP로 설정한 후 실행[F9]를 진행했습니다

메시지 박스가 호출되는 부분에서 멈췄습니다. 확인할 수 있는 문자열들이 위쪽에 파라미터로 있을 것이라고 생각하고 위로 이동했습니다

이전 프로그램 실행 도중 확인할 수 있는 문자열들이 파라미터로 사용되었습니다
계속해서 실행도중 프로그램 메시지 창이 발생했습니다

여기서 [Nag?] 버튼을 누르면 처음 브레이크 포인트로 잡았던 402CFE 주소의 MsgBox로 이동하는 것을 확인할 수 있었습니다
그러므로 Nag 메시지를 발생시키는 주소는 402CFE의 메시지 박스 API이며 해당 부분을 수정해주면 Nag 메시지는 수정이 가능할 것입니다
메세지 함수 Call 부분을 수정하는 방법입니다
402CFE 주소의 명령어를 바이트로 본다면 5바이트를 사용하고 있습니다
해당 부분을 5바이트에 맞춰서 명령어를 수정해줬습니다
CALL부분 후로 스택을 정리하는 부분이 없으니 해당 프로그램은 함수 호출 규약으로서 callee가 정리하는 방법으로 stdcall 방식입니다
그러므로 패치를 진행 시 CALL 후 함수를 정리하는 과정을 하지 않는다면 스택이 정리가 되지 않을 것입니다

해당 부분에 대해서 패치를 진행해줬습니다
패치를 위한 코드는 아래와 같습니다
ADD ESP, 14
NOP
NOP
0x14는 CALL 실행 전과 후의 스택이나 ESP 확인을 통해서 확인할 수 있습니다
이렇게 패치를 하면 스택을 정리하고 정상적으로 동작할 것이라고 생각했습니다

하지만 오류가 발생합니다

MsgBox()는 리턴 값으로 EAX를 이용합니다
EAX의 값은 [EBP-9C]에 저장하며 리턴 값으로 1(확인 버튼 클릭)이여야 정상적으로 동작합니다

정상적으로 확인 버튼을 눌렀을 때 상태는 아래와 같습니다

그러므로 다른 방법을 사용해야 합니다
메시지 박스 부분에서 위쪽으로 이동하다가 보면 함수 프레임 프롤로그를 확인할 수 있습니다

그러므로 A 라는 함수가 있을 때 해당 함수 내부에 rtcMsgBox() 함수가 존재한다는 것입니다
그러모르 A 함수를 호출하지 못하게 하거나 바로 리턴하도록 만들면 메시지 박스 함수가 호출되지 않아서 Neg 메시지가 사라질 것입니다
이제 파라미터의 개수를 획득하기 위해서 함수 시작 부분인 402C17에 BP를 걸고 다시 실행했습니다

함수 시작 코드에서 스택에 저장된 리턴 주소인 7401E5A9를 확인했습니다

7401E5A9 주소로 이동했습니다
해당 코드 영역은 MSVBVM50.dll 모듈 영역입니다


7401E5A7 에서 EAX를 CALL한 후 스택을 정리하는 어셈블리어 코드를 확인할 수 있습니다
이 때 EAX의 값을 확인하면 402656이라는 것을 볼 수 있습니다

402656으로 이동하여 확인하면 402C17주소로 JMP 하도록 되어 있습니다
그러므로 7401E5A7 주소의 CALL EAX 명령에 의해 402C17 함수가 호출되었습니다
CALL EAX 명령 호출 전과 후의 스택 주소를 확인하면 402C17 함수 파라미터의 개수를 확인할 수 있습니다
7401E5A7 스택 상태

402C17 스택 상태

결론적으로 4를 리턴하면 될것입니다

함수 프롤로그인 PUSH EBP, MOV EBP, ESP를 RETN 4로 어셈블 후 실행시켰습니다
이제 메시지 박스가 실행되지 않습니다
다음으로 Regcode를 찾는것이 목표입니다
일단 무작위 값을 대입해봅니다

abcd1234로 작성했고 오류 메시지 박스를 볼 수 있습니다
디버거에서 해당 부분의 문자열을 먼저 검색해봅니다

방금 확인한 문자열을 볼 수 있습니다
해당 부분으로 이동하여 살펴봤습니다

위 쪽을 살펴보면 vbaStrCmp() 함수를 호출하고 있는 것을 볼 수 있습니다
해당 API는 VB에서 문자열을 비교하는 함수입니다
그러므로 호출 이전에 비교할 문자를 스택에 PUSH 했을 것입니다
바로 위쪽에 두 개를 PUSH하고 있으며 아마도 [EBP-58]은 사용자 입력 문자를 넣을 것입니다
RegCode는 I'mlena151이라고 짐작할 수 있습니다
이제 대입을 해봤습니다

정확하게 맞췄습니다