sweetchip's blog


안녕하세요 pgnsc입니다.


이번엔 크랙을 하지 않고 키 파일이 있어야 합니다.


바로 시작합니다


// Keyfile

due-cm2.dat

// Crackme

due-cm2.exe


Keyfile_Hexcode

43 43 43 43 43 43 43 01 01 C8 C8 22 00 00 00 00 00 00 00


이번엔 약간 분석하는 시간이 20분정도 소요되었습니다


초보의 한계이죠 ㅠ-ㅠ




0040105C . 6A 00 PUSH 0 ; |/hTemplateFile = NULL

0040105E . 68 6F214000 PUSH due-cm2.0040216F ; ||Attributes = READONLY|HIDDEN|SYSTEM|ARCHIVE|TEMPORARY|402048

00401063 . 6A 03 PUSH 3 ; ||Mode = OPEN_EXISTING

00401065 . 6A 00 PUSH 0 ; ||pSecurity = NULL

00401067 . 6A 03 PUSH 3 ; ||ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE

00401069 . 68 000000C0 PUSH C0000000 ; ||Access = GENERIC_READ|GENERIC_WRITE

0040106E . 68 79204000 PUSH due-cm2.00402079 ; ||FileName = "due-cm2.dat"

00401073 . E8 0B020000 CALL ; |\CreateFileA


폴더에 due-cm2.dat 이 있는지 검사 하는 루틴


키파일이 없다면 없다고 메세지가 뜨고


있다면 키 인증 과정이 시작됩니다.


처음 파일 검사키 인증 4단계에 걸쳐 진행됩니다.


004010B8 . 833D 73214000>CMP DWORD PTR DS:[402173],12

004010BF . 7C 36 JL SHORT due-cm2.004010F7


0x12보다 용량이 작다면 키파일이 잘못되었다고 하는 곳으로 날려버리는 루틴


이제 키 인증 루틴입니다.


004010C1 > /8A83 1A214000 MOV AL,BYTE PTR DS:[EBX 40211A] // 한글자씩 받아옴

004010C7 . |3C 00 CMP AL,0

004010C9 . |74 08 JE SHORT due-cm2.004010D3

004010CB . |3C 01 CMP AL,1 // 바이트코드와 1과 비교

004010CD . |75 01 JNZ SHORT due-cm2.004010D0 // 1이 아니면 004010D0 로 점프

004010CF . |46 INC ESI

004010D0 > |43 INC EBX

004010D1 .^\EB EE JMP SHORT due-cm2.004010C1

004010D3 > \83FE 02 CMP ESI,2 // 1단계의 최종검사

004010D6 . /7C 1F JL SHORT due-cm2.004010F7 // Esi가 2보다 적을시 실패


이 루틴의 목적은 esi를 2 이상으로 만들어야 합니다.

=> 바이트코드가 01 일때만 esi를 더하게 되니 최소 01이 2번 들어가야 한다.


004010D8 . 33F6 XOR ESI,ESI // esi 초기화

004010DA . 33DB XOR EBX,EBX // ebx 초기화

004010DC > 8A83 1A214000 MOV AL,BYTE PTR DS:[EBX 40211A]

004010E2 . 3C 00 CMP AL,0

004010E4 . 74 09 JE SHORT due-cm2.004010EF

004010E6 . 3C 01 CMP AL,1

004010E8 . 74 05 JE SHORT due-cm2.004010EF

004010EA . 03F0 ADD ESI,EAX

004010EC . 43 INC EBX

004010ED .^ EB ED JMP SHORT due-cm2.004010DC

004010EF > 81FE D5010000 CMP ESI,1D5 // 2단계의 최종검사

004010F5 . 74 1D JE SHORT due-cm2.00401114 // 0x1D5와 같다면 성공


이 루틴의 목적은 esi가 0x1D5 [10진수로 467] 가 되야 다음 단계로 넘어갑니다.

=> 바이트코드가 00 과 01이 아닐때만 eax값과 esi 값을 더한다. 0x1D5 더해서 만들고 01이나 00으로 루프를 탈출한다


00401114 > \33F6 XOR ESI,ESI

00401116 > 43 INC EBX

00401117 . 8A83 1A214000 MOV AL,BYTE PTR DS:[EBX 40211A]

0040111D . 3C 00 CMP AL,0

0040111F . 74 18 JE SHORT due-cm2.00401139

00401121 . 3C 01 CMP AL,1 // 바이트코드가 01일시

00401123 . 74 14 JE SHORT due-cm2.00401139 // 다음 루틴으로

00401125 . 83FE 0F CMP ESI,0F

00401128 . 73 0F JNB SHORT due-cm2.00401139

0040112A . 3286 1A214000 XOR AL,BYTE PTR DS:[ESI 40211A]

00401130 . 8986 60214000 MOV DWORD PTR DS:[ESI 402160],EAX

00401136 . 46 INC ESI

00401137 .^ EB DD JMP SHORT due-cm2.00401116


=>이루틴은 그냥 최종검사부분이 없으므로 바이트 코드를 01로 하여 빠져나올수 있다.


00401139 > \43 INC EBX

0040113A . 33F6 XOR ESI,ESI

0040113C > 8A83 1A214000 MOV AL,BYTE PTR DS:[EBX 40211A]

00401142 . 3C 00 CMP AL,0

00401144 . 74 09 JE SHORT due-cm2.0040114F

00401146 . 3C 01 CMP AL,1

00401148 .^ 74 F2 JE SHORT due-cm2.0040113C

0040114A . 03F0 ADD ESI,EAX

0040114C . 43 INC EBX

0040114D .^ EB ED JMP SHORT due-cm2.0040113C

0040114F > 81FE B2010000 CMP ESI,1B2

00401155 .^ 75 A0 JNZ SHORT due-cm2.004010F7


대망의 마지막 루틴은 최종값이 0x1B2 로 되야한다. 자잘한 설명은 위와 비슷하니 생략

=> 2번째와 마찬가지로 0과 1이 아닐때 esi와 eax를 더한다. 0x1b2로 만들어주면 성공


총 코드를 완성해보면 [헥스코드]

43 43 43 43 43 43 43 01 01 C8 C8 22 00 00 00 00 00 00 00

와 같이 되는데, 인증이 성공할시 폼이 나오면서 인증을 성공했다고 하면 성공이다.


2012.11.21


신고

댓글 0