패치(크랙)

2015. 4. 4. 09:30Security ★ Development/Reversing

반응형

Key4.exe라는 파일을 크랙해보도록 하겠습니다.

Key4는 위와 같이 두 입력란이 있고 아무거나 입력했을때 아래와 같은 창을 띄웁니다.


어셈블리 코드를 보면 다음과 같은 구간이 있습니다.  

CMP EAX, ESI를 통해 두 메시지박스 중 하나를 띄워줍니다.

단순히 성공했다는 메시지를 띄우는것이 목적이라면 JMZ명령어를 수정해 줄 수 있습니다.

EAX와 ESI의 값을 같게 수정해줘도 되지만 JMZ명령어를 없애줘도 됩니다.

위와 같이 JMZ명령이 있던 부분을 NOP로 채웠습니다.  그럼 점프가 발생하지 않고 바로 아래의 Great, 메시지를 출력하도록 할 수 있습니다.

OllyDbg는 이렇게 변경된 파일을 실제 프로그램으로 생성하는 기능이 있습니다.  디버거에서만 변경사항을 확인해보지 않고 실제 변경 사항이 적용된 (악성)파일을 만들 수 있다는 것이됩니다.


그런데 보통 프로그램을 크랙한다는 것은 실행프로그램을 변조하기보다는 아이디, 패스워드 혹은 라이센스 키값을 구하는 것이 목적일 때가 많습니다.  Key4 프로그램은 단순히 성공 메시지를 띄우는 것이 아니라 두 에디트 박스에 들어갈 올바른 값을 구하는게 목적이라고 할 수 있습니다.

위 어셈블리 코드에서 CMP EAX, ESI를 보면 해당 위치에서 어떤 두 값이 동일해야 성공 메시지를 띄워줍니다.  


에디트에 모두 입력하고 OK 버튼을 눌렀을 때 모습입니다.  ffwefewfwe와 wefwefwefewf라는 두 문자열이 들어간 것을 볼 수 있습니다.  004012D8 부분을 보면 값이 0이 아니면 004012F6으로 점프하라고 되어있습니다.  이 부분이 String="ffwefewfwe가 들어있는 부분입니다.


ESI는 00401339에서 호출이 있기 전에 값을 스택에 저장하고 이용합니다.  CALL을 통해 EAX에 값이 저장되고 이 값을 ESI와 비교한다고 볼 수 있습니다.

먼저 ESI가 어떻게 채워지는지 보겠습니다.

바로 위에 lstrlenA 함수가 있는데 문자열의 길이를 ECX에 저장하고 EAX의 값은 1로 초기화합니다.

그리고 loop문에 들어가게 됩니다.  첫번째 텍스트 상자의 입력 문자열은 qnfw3174입니다.

00303F는 문자열이 들어있는 주소이고 EDX의 값을 아래에서 이용하는데 40351F에서 EAX의 값을 더한 값을 이용합니다.  EAX는 loop문 전에 1로 초기화 되고 안에서는 4로 초기화됩니다.  이 과정을 문자열의 길이만큼 수행합니다.

다음은 EAX값입니다.

여기서는 30(아스키 값 '0')을 빼고 10(0A)를 곱해주는 연산을 합니다.  즉 문자열을 숫자로 변경하는 작업을 합니다.

그래서 위 변경된 ESI값이 숫자로 바꾼 EAX의 값과 맞으면 OK사인이 나오는 것입니다.  ESI를 변경해주는 알고리즘을 코드로 옮겨 아이디에 해당하는 키를 생성하는 keygen을 만들어줄 수 있습니다.