이 글이 문제가 될 경우, 요청에 따라 삭제 또는 비공개 처리될 수 있습니다.
디아블로 2는 옛날에 굉장히 인기있었던 게임이다.
우리 삼촌도 조폭 네크 로 배틀넷을 휩쓸고 다니셨던 게임이기에 나도 애착이 있다. (물론 내가 플레이하진 않았다)
대신 나는 디아3 초창기부터 했던 유저였으며.. 모든 직업 만렙 보유중이다.
이전 민속놀이 뜯어보기 (1) - 스타크래프트 CD-Key 크랙하기와 같이 CD-Key 루틴은 금방 찾을 수 있었다. (Back to user 기능 활용)
루틴은 총 3단계. 인 줄 알았으나..........
1. 문자열 길이 체크 -> 이건 넘어가겠다.
2. 반복문으로 돌면서 특정 값에 EAX를 더한 주소를 참조해 값을 가져온다. 이때 이 값은 17보다 같거나 작아야 한다. (두 번째 검증루틴)
3. 마지막으로 CD키 검증 루틴을 거친다. (아직 분석 안함, 다만 숫자 또는 문자 검증 루틴은 존재함)
3. 세번째 검증 루틴
4. 네번째 검증 루틴
5. 다섯번째 검증 루틴 (최종)
2단계부터 시작하겠다.
Back to user를 사용하고 콜스택을 뒤져보면 굉장히 빠르게 찾을 수 있다.
C언어로 대충 작성해보자면..
char cdkey[16] = "~~~~~~~~";
int i = 0;
int check(int a, int b, int cdkey) {
char temp = cdkey & 0xFF;
return *(0x44878C + temp);
}
while(cdkey[i] != NULL) {
if(check(?, ?, cdkey[i]) > 17) {
break; // go to Error
}
i++;
}
참고로 0x44878C 부터의 값을 보면..
이렇게 되어있다. 그런데 잘 살펴보면 0xFF가 대부분인 것을 확인할 수 있다.
그렇기 때문에, CD Key에 들어갈 각 문자를 잘 생각해서, 0xFF를 피해야 한다는 말이 되겠다.
참고로 나는 123213123213213 이러한 문자를 CD Key 입력 란에 넣어두었었는데, 당연히! 안되었다.
왜냐하면 숫자 1은 ASCII로 변환하면 0x31이다. 위 check 함수에서 연산한 결과에 의하면 EAX 레지스터의 값은 FF로 set된다. (의사코드에선 리턴값이 ) 그렇기 때문에 유효하지 않음으로 바로 넘어가는 것이다.
실제로 인터넷에서 찾아볼 수 있는 디아블로 2 시디키에는 숫자 1이 들어가지 않는다. 매우 놀랍지 않은가?
CD-Key의 각 자리에 어떤 문자 또는 숫자가 들어가야하는지 그러면 한 번 계산해보자.
IDAPython을 쓰면 굉장히 편했을 것 같은데.. 난 사실 IDAPython을 잘 사용할 줄 모른다. 이건 나중에 블로그에서 포스팅을 해보도록 하는 걸로 하고..
파이썬으로 간단하게 스크립트를 짜서 돌려보았다.
확인해보니 아래 사진과 같이 특정 문자만 CD-Key에 들어갈 수 있는 조건인 듯 하다. 물론 3번째 페이즈를 분석하지 않아 확실하진 않다.
이 두 번째 인증 과정에서 사용되는 요놈은 중간 중간 자주 등장한다. 일찍 분석한게 차라리 나을지도 모른다......
그런데 두 번째 인증 과정에서는 앞서 작성한 코드처럼 참조한 값이 17보다 같거나 작은지를 확인해야 통과를 하기 때문에, 두 번째 인증 과정에서는
2, 4, 6, 7, 8, B, C, D, E, F, G, H, J, K, M, N, P 까지만 허용이 된다고 볼 수 있겠다.
즉, 위 문자만 쓰면 두 번째 인증 과정은 클리어이다.
'리버싱 > 소소한 재미' 카테고리의 다른 글
민속놀이 뜯어보기(1) - (스타크래프트 CD-Key 알고리즘 분석하기) (0) | 2020.07.17 |
---|