13. 크랙미 네 번째 (파도콘)
본문 바로가기
Reversing & Cheat Engine

13. 크랙미 네 번째 (파도콘)

by boosting 2024. 2. 26.
728x90

이번엔 Thread

 

이 프로그램을 켜게 되면 여태껏 어떤 창이 떠서 동작을 할 수 있었던 것과는

조금 다른 현상을 마주하게 됩니다.

 

크랙미

 

분명 프로그램은 실행 중입니다만..

뭐 아무것도 창이 뜨지 않습니다. 어디선가 루프가 돌고 있거나 멈춰있다는 뜻입니다.

이런 경우엔 Cheat Engine으로는 무언가를 하기가 난감합니다.

 

이제는 다른 프로그램도 섞어 써야 할 때

 

우선 똑같이 엔진으로 프로세스는 잡아주시고 Process Hacker를 켜주세요.

Process Hacker는 네이버에 검색하시면 바로 나옵니다.

 

크랙미

 

밑에 이 프로세스를 더블 클릭 후 Threads 탭을 눌러주시면 4개의 Thread가 보이실 겁니다.

이 중 100860을 눌러주세요. 여기가 메인 Thread 인 것으로 추측이 됩니다.

 

크랙미

 

이렇게 스택이 나오실 텐데요.

Process Hacker의 장점은 디버깅이 걸려 있지 않더라도 스택을 살펴볼 수 있다는 장점입니다.

이렇게 멈춰있는 상태에서 스택 내용 볼 때 도움이 많이 될 거예요.

 

이 스택에서 WaitForMultipleObjects 함수가 호출된 것을 알 수 있습니다.

이 함수는 Thread 신호 상태를 기다리는 함수라고 보시면 되는데요.

제한 시간이 경과할 때까지 기다린다고 보시면 됩니다.

그러면 어떤 Thread 신호 상태를 기다리는지를 알아봐야 하는데요.

스택 중 11번째인 +0x1106 이 부분을 한 번 봅시다.

 

1823631B4B6E8AC922.exe+10AD - 8B 35 1C92E900        - mov esi,[1823631B4B6E8AC922.exe+12921C] { (75DBC8A0) }
1823631B4B6E8AC922.exe+10B3 - 83 C4 10              - add esp,10 { 16 }
1823631B4B6E8AC922.exe+10B6 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10B8 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10BA - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10BC - 68 0023D700           - push 1823631B4B6E8AC922.exe+2300 { (-291592007) }
1823631B4B6E8AC922.exe+10C1 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10C3 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10C5 - FF D6                 - call esi
1823631B4B6E8AC922.exe+10C7 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10C9 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10CB - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10CD - 68 2023D700           - push 1823631B4B6E8AC922.exe+2320 { (-291600199) }
1823631B4B6E8AC922.exe+10D2 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10D4 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10D6 - 89 44 24 24           - mov [esp+24],eax
1823631B4B6E8AC922.exe+10DA - FF D6                 - call esi
1823631B4B6E8AC922.exe+10DC - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10DE - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10E0 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10E2 - 68 4023D700           - push 1823631B4B6E8AC922.exe+2340 { (-291583815) }
1823631B4B6E8AC922.exe+10E7 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10E9 - 6A 00                 - push 00 { 0 }
1823631B4B6E8AC922.exe+10EB - 89 44 24 28           - mov [esp+28],eax
1823631B4B6E8AC922.exe+10EF - FF D6                 - call esi
1823631B4B6E8AC922.exe+10F1 - 6A FF                 - push -01 { 255 }
1823631B4B6E8AC922.exe+10F3 - 6A 01                 - push 01 { 1 }
1823631B4B6E8AC922.exe+10F5 - 8D 4C 24 14           - lea ecx,[esp+14]
1823631B4B6E8AC922.exe+10F9 - 51                    - push ecx
1823631B4B6E8AC922.exe+10FA - 6A 03                 - push 03 { 3 }
1823631B4B6E8AC922.exe+10FC - 89 44 24 24           - mov [esp+24],eax
1823631B4B6E8AC922.exe+1100 - FF 15 1C94E900        - call dword ptr [1823631B4B6E8AC922.exe+12941C] { ->->KERNELBASE.WaitForMultipleObjects }

1823631B4B6E8AC922.exe+1106 - B9 7C9DEE00           - mov ecx,1823631B4B6E8AC922.exe+179D7C { (74781193) }

 

바로 위를 보시면 WaitForMultipleObjects 함수 호출 하는 걸 볼 수 있고

위에 보면 push 하는 곳이 3곳이 있습니다.

 

1823631B4B6E8AC922.exe+2300

1823631B4B6E8AC922.exe+2320

1823631B4B6E8AC922.exe+2340

 

이렇게 3곳입니다.

그러면 아까 다시 Process Hacker에서 Threads 탭을 한 번 봅시다.

 

크랙미

 

2300, 2320, 2340

3개가 똑같음을 알 수 있습니다.

즉 이 Thread 3개가 종료가 되든 해야 Main Thread가 동작을 한다는 뜻이 되겠죠.

그러면 이 3개를 드래그하시고 우클릭 후 Delete 키를 눌러주세요.

무슨 영어가 뜨실 텐데 Terminate 그대로 누르시면 됩니다.

 

크랙미

 

이렇게 되면 1차 문제는 풀었다고 뜨는데 저 패스워드까지 맞춰야 되는 모양입니다.

문구 깨진 거 봐선 유니코드로 넣은 거 같은데 확인은 해봐야 할 거 같습니다.

다시 Process Hacker에서 Threads 탭으로 가봅시다.

 

크랙미

 

처음 Main Thread 볼 때와는 달리 구조가 바뀌어 있습니다.

아마 실행이 된 거겠죠.

 

1823631B4B6E8AC922.exe+1100 - FF 15 1C94E900        - call dword ptr [1823631B4B6E8AC922.exe+12941C] { ->->KERNELBASE.WaitForMultipleObjects }

1823631B4B6E8AC922.exe+1106 - B9 7C9DEE00           - mov ecx,1823631B4B6E8AC922.exe+179D7C { (74781193) }

 

이 뒷부분이 1106 여기 부분부터 봐야 할 거 같습니다.

ecx에 담는 게 문구인 거 같네요.

 

크랙미

 

 

1823631B4B6E8AC922.exe+179D7C 이 주소를 테이블에 추가하고 Unicode로 보게끔 설정 후

비교해 보니 문구가 똑같은 것을 확인할 수 있었습니다. 그러면 이걸 풀어주면 될 것입니다.

우선 179D7C 부분을 어셈블리 스캔을 해봅시다.

 

크랙미

 

이 빨간색 박스 6개가 보면 위에서 2300, 2320, 2340의 Thread 안에서

저 Unicode 주소 쪽에 장난질을 치고 있는 걸 확인할 수 있습니다.

그러면 저 장난질 치는 걸 어떻게든 해야 될 거 같은데요.

이게 Cheat Engine으로는 좀 작업하기가 힘든 과정이긴 합니다.

왜냐면 이미 저 함수들을 지나간 상태이기 때문에 동적인 프로그램 분석하는 데에

더 특화된 Cheat Engine으로는 힘듭니다.

 

크랙미

 

저 같은 경우는 API Monitor 프로그램을 이용해서

아예 lstrlenW를 사용할 거라 생각하고 지나가는 부분 전체를 다 스캔해서 풀어봤네요.

이 프로그램의 경우는 ollydbg로 접근을 했으면 오히려 빨리 풀었을 수도 있겠다 싶습니다.

 

리버싱 과정에는 하나의 프로그램으론 한계가 있다.

 

이렇게 오늘은 Cheat Engine 만으로는 꽤 한계가 엿 보이는 프로그램을 봤습니다.

이런 식으로 1개의 프로그램이 아닌 다양한 프로그램들을 사용하는 경우도 꽤 있기에

여러 프로그램들의 사용법 정도는 익혀두는 게 중요합니다.

 

여기서 나온 프로그램들은 크랙미 글이 어느 정도 끝나면 한 번 다뤄보도록 하겠습니다.

파일은 올려드릴 테니 Thread 부분만이라도 이해를 해보시는 게 좋을 거 같습니다.

 

1823631B4B6E8AC922.exe
1.80MB

 

728x90