2012년 8월 15일 수요일

스타크래프트 시디키 알고리즘 분석 [2]




스타크래프트 오리지널 설치 파일을 리버싱 해서 분석한 내용을 정리한 글입니다.
아직 리버싱을 배우는 단계라 설명과 리버싱 과정에 부족함이 많습니다.
저작권문제가 있을시 삭제하겠습니다.


1. 스타크래프트 시디키 알고리즘 분석 [1]에 이어서 설명하겠습니다.



2. 스타크래프트 시디키 알고리즘 분석 [1]에서 찾은 코드 위를 JMP와 call 중심으로 분석하고

레지스터를 확인해 보면 아래 그림과 같이 EAX 레지스터에 여러분이 입력하신

시디키가 보이는 것을 확인하실 수 있을겁니다.

또한 명령어 코멘트를 보면 ASCII 문자로도 입력하신 시디키가 설치 프로그램에서

사용되고 있다는 것을 아실 수 있습니다.

아래의 코멘트 중 '//'로 시작하는 코멘트는 제가 따로 입력한 코멘트 입니다.



3. 각각의 call 들을 확인하다 보면 아래 그림과 같이 주소 0040F792 에서

알고리즘으로 추측되는 함수를 call 한다는 것을 확인하실 수 있습니다.

여기까지 오는데에는 약간 시간이 걸리실 수 있으며, 꼼꼼하게 확인 하셔야

저 알고리즘 call을 확인 하실 수 있습니다.

귀찮으시더라도 배운다는 마음가짐으로 꾸준히 리버싱을 하시기 바랍니다.



4. 위의 명령어에서 F7 키를 눌러 함수로 들어가면

아래에 선택된 명령어들을 확인 하실 수 있습니다.

알고리즘이 시작되기 전에 스택에 여러가지 함수를 부르고 저장하는 과정을 거치며



5. 조금 내려오시면 시디키 길이를 비교하는 CMP가 나옵니다.

아래의 그림은 제가 임의로 시디키 자릿수를 13자리에서 12자리만 입력한 경우

자릿수가 일치하지 않아 점프가 일어나지 않는 경우를 보여줍니다.

이경우 바로 에러 발생 코드로 넘어가게 됩니다.



6. 그리고 몇가지 레지스터를 PUSH하는 과정이 지나면

몇가지 레지스터를 초기화 하면서 시작하는 알고리즘을 확인하실 수 있습니다.

다시한번 강조하지만 위의  추측 확인 과정을 모두 직접 해 보셔야 리버싱 실력이 늡니다.



7. 이제 여러분이 하셔야 하는 것인 어셈블리를 분석하는 것 입니다.

어셈블리가 무엇을하고 알고리즘이 어떻게 진행되는지에 대한 코멘트는

아래 사진을 통해 보실 수 있습니다.



제가 위의 알고리즘을 나름 정리한 건데, 보시는것처럼 알고리즘이 지극히 단순합니다.

간단히 요약하면 시디키 13자리중 앞의 12자리가 마지막 자릿수를 확인하는

알고리즘임을 알 수 있습니다.

다시말해, 앞의 12자리는 임의의 수를 넣고,

마지막 자릿수만 0부터 9까지의 숫자로 바꾸면 시디키를 만들 수 있습니다.

마지막 자릿수를 비교하고, 점프하는 부분을 바꿔주시면

어떤 수를 넣든 항상 시디키를 인증해 주는 설치파일을 만들 수도 있습니다.




이 과정을 모두 거치시고 알고리즘을 이해하셨다면 여러분은

시디키 생성 프로그램도 만드실 수 있을 겁니다.

전체 코드는 올리지 않게겠지만, 제가 짠 코드의 핵심 알고리즘 부분만 남기며 글을 마치겠습니다.

부족한 점이 있다면 댓글로 지적해 주시면 감사하겠습니다.

또한 저작권 문제가 있을 시 삭제하겠습니다.

=============================

void generator() {

int eax=3, edx=0, edi, lastnumber;
int serial[12];

for(int i = 0; i < 12; i++)
serial[i] = rand()%10;

for(int i = 0; i < 12; i++) {
edi = eax ^ (eax * 2);
eax += edi;
}
lastnumber  = eax % 10;
}


=============================



댓글 3개: