안녕하세요 pgnsc입니다.
이번엔 크랙을 하지 않고 키 파일이 있어야 합니다.
바로 시작합니다
// Keyfile
// Crackme
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
폴더에 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로 만들어주면 성공
와 같이 되는데, 인증이 성공할시 폼이 나오면서 인증을 성공했다고 하면 성공이다.
2012.11.21
Babylon's KeygenMe - 풀이 및 Keygen source. (0) | 2012.11.25 |
---|---|
이름모를 Crackme 풀이 키젠포함 (0) | 2012.11.24 |
Duelist's Crackme 1 Keygen (2) | 2012.11.21 |
Lafarge's Crackme v0.2 키젠 (1) | 2012.10.31 |
UPX, Olly-dbg 로 직접 언패킹 하기 (11) | 2012.09.16 |