중복실행 방지
지금 이 문서에서 크랙하는 MSN 7.5 버전은 영문 버전을 대상으로 합니다.
MSN 크랙은 생각보다 상당히 쉽습니다.
일반적으로 상용 프로그램같은 경우 디버깅을 힘들게 하기 위해서 실행파일 헤더에 변경을 가하고 압축을 한다던가
안티 디버깅 코드를 삽입한다거나 하는데 이런것이 전혀없기 때문입니다.
단지 프로그램에 용량이 커서 디스 어셈블리 된 코드가 너무 양이 많아
복잡해보이는 점 빼고 말입니다.
참고로 크랙시 원본파일은 백업하실 필요 없습니다.
어차피 코드 수정 후 다른 이름으로 저장 할 것 이기 때문에..
우선적으로 크랙하기전에 다음과 같은 상황을 숙지하셔야 합니다.
이전 문서에서 푼 크랙미보다 코드가 상당히 길고 복잡합니다.
일일이 한 줄씩 코드를 해석하시면 안됩니다.
대충 코드를 읽어나가면서 다중 실행을 막는 루틴을 찾으셔야 합니다.
다중 실행을 막는 가장 간단한 방법으로는
FindWindow API 함수가 있습니다.
FindWindow 함수를 통해서 나의 윈도우와 동일한 클래스와 제목을 찾아서 있다면
그 프로그램을 활성화하고 종료합니다.
만약에 찾지 못 했다면 내 프로그램이 실행중이지 않은 것으로 간주하고 프로그램을 정상적으로
실행시킵니다.
이 방법은 상당한 문제점이 있으므로 거의 사용하지 않습니다.
또 한가지 방법으로는 뮤텍스를 이용한 방법입니다.
CreateMutex(nil, True, '안녕');
if (GetLastError = ERROR_ALREADY_EXISTS) then
// 애플리케이션 종료 코드
CreateMutex 세번째 인자를 통해서 중복 실행을 검사하게 됩니다.
일반적으로 뮤텍스가 가장 쓸만한 것 같습니다.
( 물론 저는 않 써봤습니다................................ )
다시 한 번 크랙을 하기전에 또 생각해볼 차례입니다.
MSN 이 실행되면 아마 우선적으로 MSN 이 이미 실행중인가 점검하게 될 겁니다. ( 물론 그 전에 다른 작업을 하기도 하겠죠 )
그리고 이미 실행중이라면 그 MSN 을 활성화 상태로 만들고 프로그램을 종료합니다.
하지만 MSN 이 실행중이 아니라면 MSN 을 정상적으로 실행하게 될 겁니다.
우리가 해야 할 것은 MSN 이 실행중인지 점검하는 루틴을 알아내야 합니다.
그 부분은 CMP 명령어를 쓸 가능성이 매우 높겠죠.
우선 올리디비거로 열어봅시다.
올리 디버거로 여는데에도 이전 보다 조금 시간이 걸립니다.
그리고 다음고 같이 테스트합니다.
MSN 을 이미실행한 상태와 실행하지 않았을 상태에서 Step over 와 브레이크 포인트를 이용해서
MSN 을 코드 한줄 한줄씩 실행해봅니다.
MSN 을 이미 실행한 상태에서는 이 코드가 실행되지 않았는데 MSN 을 실행하지 않은 상태에서는
이 코드가 실행되었다면 그 부분을 집중 공략하세요.
그 부분 근처에 MSN 실행여부 점검 루틴이 있을 가능성이 매우 높습니다.
완전 노가다입니다.
노가다 끝에 찾아낸 루틴부분 입니다.
005580C9 |> 68 FC494100 PUSH msnmsgr.004149FC ; /EventName = "MSNMSGR"
005580CE |. 53 PUSH EBX ; |InitiallySignaled
005580CF |. 6A 01 PUSH 1 ; |ManualReset = TRUE
005580D1 |. 53 PUSH EBX ; |pSecurity
005580D2 |. FF15 58134000 CALL DWORD PTR DS:[<&KERNEL32.CreateEven>; \CreateEventA
005580D8 |. 3BC3 CMP EAX,EBX
005580DA |. 8B7D F0 MOV EDI,DWORD PTR SS:[EBP-10]
005580DD |. 8947 28 MOV DWORD PTR DS:[EDI+28],EAX
005580E0 |. 0F84 CD010000 JE msnmsgr.005582B3
005580E6 |. FF15 74144000 CALL DWORD PTR DS:[<&KERNEL32.GetLastErr>; [GetLastError
005580EC |. 3D B7000000 CMP EAX,0B7
005580F1 0F85 B5010000 JNZ msnmsgr.005582AC
바로 이 부분입니다.
CreateEvent API 함수 사용시 4 번째 인자에 문자열을 통해서 MSN 의 중복 실행을 방지하는 것을 알 수 있습니다.
마지막에 JNZ 명령어를 통해서 프로그램을 계속 실행 할 것인가 실행하지 않을 것인가를 결정하게 됩니다.
005580F1 0F85 B5010000 JNZ msnmsgr.005582AC
바로 밑에 부분은 MSN 을 활성화시키고 자기자신을 종료시키게 됩니다.
따라서 비교문 후에 JNZ 부분을 JMP 명령어로 바꾸면 됩니다.
그리고 크랙 된 코드로 프로그램을 저장하시면 되겠습니다.
저장하는 방법은 수정 된 코드를 마우스로 드래그 해서 선택 후에 이전 문서에서처럼 저장하시면 됩니다.
실행결과는 다음과 같습니다.
Microsoft Office OneNote 2007을 사용하여 작성했습니다.
모든 노트 및 정보를 한 곳에서 볼 수 있습니다.