이번엔 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 부분만이라도 이해를 해보시는 게 좋을 거 같습니다.
'Reversing & Cheat Engine' 카테고리의 다른 글
15. 간단한 게임 치트 도전 - 총알무한 (2) | 2024.02.29 |
---|---|
14. 크랙미 다섯 번째 (0) | 2024.02.27 |
12. 크랙미 세 번째 (파도콘) (0) | 2024.02.26 |
11. 크랙미 두 번째 (0) | 2024.02.25 |
10. 리버싱의 꽃 후킹(Hooking) (0) | 2024.02.24 |