본문 바로가기

Reverse engineering/올리디버그사용법

네이트온 멀티로드 하는 방법 (다중실행 리버싱)

네이트온은 XP 버젼과 , Vista 버젼이 있죠?

 

XP버젼은   로더와 , 메인파일이 있고,

VIsta버젼은  메인파일 하나만 있습니다.

 

제가 쓰는 운영체제가 비스타라서  ,  이 글에서는 비스타용 NateOn만 다룹니다.

XP용 네이트온도 "메인파일"  수정을  이 방법대로 하면 되는것으로 확인되었습니다.

 

일단 비스타 네이트온이  XP버젼에 비해서 접근이 쉽다고는 하나,

다중실행에 관여하는 함수들을 모르면  힘듭니다.

 

 

보통 다중실행에 관여하는 함수로는

 

 

CreateMutex → GetLastError → CMP Register,0B7 →  ExitProcess

CreateEvent → GetLastError → CMP Register,0B7 → ExitProcess

CreateSemaphore → GetLastError → CMP Register,0B7 → ExitProcess

Findwindow → ExitProcess

 

이정도가  대표적으로 가장 많이 쓰이는 루틴입니다.

 

위 내용을 염두에 두고,

 

일단 비스타버젼  네이트온을 Ollydbg로 불러와봅시다.

 

네이트온에 다중실행방지에 관여하는 함수가 어떤것이 쓰여져있는지 알아보기 위해서 , 일단 함수를 찾아봐야합니다.

마우스 오른쪽버튼 후 ,  Search for - All intermodulars Call  으로 가봅시다.

 

 

 

 

 

intermodulars call 화면상에서  찾을 함수 이름을 바로 입력합니다.

(찾는 방법은 intermodulars call 창에서  키보드 자판의 영어로 바로 함수이름을 타이핑 하면 됩니다.)

 

위에서 언급한대로 ,

 

아래 진하게 표시되어있는 네가지의 함수를 찾아봅시다.

 

 

 

CreateMutex → GetLastError → CMP Register,0B7 →  ExitProcess

CreateEvent → GetLastError → CMP Register,0B7 → ExitProcess

CreateSemaphore → GetLastError → CMP Register,0B7 → ExitProcess

Findwindow → ExitProcess

 

 

 

 

 

Createmutex 라고 입력했는데,   해당 함수가 안나오네요.

 

 

 

 

 

 

 

 

 

 

 

Createevent  역시  없군요.

 

 

 

 

 

 

CreateSemaphore도    콜 화면에선 찾을수가 없네요.

 

 

 

 

 

 

 

Findwindow 함수도 찾을수가 없군요.....

 

 

 

 

그럼 이대로 정녕 포기하고 끝내야할까요?

 

 

 

 

 

 

 

 

CreateMutex → GetLastError → CMP Register,0B7 →  ExitProcess

CreateEvent → GetLastError → CMP Register,0B7 → ExitProcess

CreateSemaphore → GetLastError → CMP Register,0B7 → ExitProcess

Findwindow → ExitProcess

 

위 함수중에서  1차적으로 쓰여지는 함수를 모두 찾을수 없었으니,

이번에는    GetLastError 함수를 찾아봅시다.

 

보통 뮤텍스를 생성하는 함수 다음에는  GetLastError 함수가 무조건 따라붙기 마련입니다.

 

ExitProcess는 종료함수니깐 제외해야겠죠.

 

 

 

 

 

 

 

오 검색되었군요.   아주 많이 쓰여지고 있습니다.

 

그렇다면 이제   

CreateMutex → GetLastError → CMP Register,0B7 →  ExitProcess

CreateEvent → GetLastError → CMP Register,0B7 → ExitProcess

CreateSemaphore → GetLastError → CMP Register,0B7 → ExitProcess

Findwindow → ExitProcess

 

에서  Findwindow를 제외한  나머지 루틴이 분명히  네이트온 내부에서 쓰여지고 있음을 염두에 두고 있어야합니다.

 

그렇다면 , 디스어셈블된 내용중,   이렇게 이어지는 부분을 찾으면 되겠죠.

 

CALL CreateMutex 또는  CreateEvent 또는 CreateSemaphore

CALL GetLastError

CMP Register,0B7

JNZ  프로그램 실행 루틴  (점프를 안한다면  종료 , 점프를 하면 실행)

 

 

이제  저 수많은  GetLastError 함수중 ,  어떤것이   다중실행 방지에 관여하는지를 알아보기위해서,

브레이크 포인트를 걸어봅시다.

 

 

 

 

 

 

 

Set breakpoint on every call to GetLastError 를 누릅니다.

 

 

 

 

그 후에   CPU 메인 쓰레드  창으로 와서 ,    F9키를  눌러서 ,  실행시켜봅시다.

 

 

 

0075DE08  |.  FF35 F022A400  PUSH DWORD PTR DS:[A422F0]                    ; /pModule = "kernel32.dll"
0075DE0E  |.  FF15 20C28F00  CALL DWORD PTR DS:[<&KERNEL32.GetModuleHandle>; \GetModuleHandleA
0075DE14  |.  68 78799600    PUSH NateOnMa.00967978                        ; /Arg2 = 00967978 ASCII "GetFileAttributesW"
0075DE19  |.  50             PUSH EAX                                      ; |Arg1
0075DE1A  |.  A3 F422A400    MOV DWORD PTR DS:[A422F4],EAX                 ; |
0075DE1F  |.  E8 28FCFFFF    CALL NateOnMa.0075DA4C                        ; \NateOnMa.0075DA4C
0075DE24  |.  85C0           TEST EAX,EAX
0075DE26  |.  74 22          JE SHORT NateOnMa.0075DE4A
0075DE28  |.  68 7C7F9600    PUSH NateOnMa.00967F7C                        ;  UNICODE "???.???"
0075DE2D  |.  FFD0           CALL EAX
0075DE2F  |.  83F8 FF        CMP EAX,-1
0075DE32  |.  75 16          JNZ SHORT NateOnMa.0075DE4A
0075DE34  |.  FF15 A0C38F00  CALL DWORD PTR DS:[<&KERNEL32.GetLastError>]  ; [GetLastError
0075DE3A  |.  83F8 7B        CMP EAX,7B

0075DE3D  |.  75 0B          JNZ SHORT NateOnMa.0075DE4A

 

첫번째로 브레이크포인트가 걸린부분입니다.

우리가 찾아볼 부분은    GetLastError 다음에    특정 레지스터와  , 0B7을 비교하는 부분을 찾으면 됩니다.

윗 부분은 7B와 EAX 레지스터를 비교하고있네요.

해당사항이 아닙니다.

 

이렇게 해당사항이 아닌부분은  브레이크포인트를 풀어주고 , 계속 넘어갑시다.

우리는 0B7과 비교하는 부분을 찾으면 됩니다.

 

이 부분의 GetLastError에 브레이크포인트를 풀고 ,  다시 F9를 눌러서 계속 진행해봅시다.

 

(브레이크포인트를 푸는 방법은 , 빨간색으로 브레이크가 걸린부분에서 F2키를 눌러주면 풀립니다.)

 

 

 

 

 

해당사항이 아닌부분을 브레이크포인트 풀어주면서 계속 오다보니,

오우 ,  드디어 우리가 원하는 부분이 나왔네요.

윗 부분에 보면  ASCII  kernel32.CreateSemphoreW   가 있음을 볼수 있습니다.

 

이로써 ,  CreateSemaphore 함수가  다중실행 방지에 관여하고 있음을 확실히 알수있게 되었습니다.

CreateMutex → GetLastError → CMP Register,0B7 →  ExitProcess

CreateEvent → GetLastError → CMP Register,0B7 → ExitProcess

CreateSemaphore → GetLastError → CMP Register,0B7 → ExitProcess

Findwindow → ExitProcess

 

 

위 화면을 보면 ,     세마포어 함수 위쪽에   유니코드 문자열로  어떠한   클래스 이름이 있는것을 확인할 수 있습니다.

저 클래스가  네이트온 비스타버젼 고유의 클래스이며 ,  단 한개 존재합니다.

저 클래스를  세마포어가  입력받은뒤에 , 현재  저것과 동일한  또다른 클래스가 존재하는지 확인하게 됩니다.

존재한다면 , 세마포어 함수는   이미 존재한다는것을 GetLastError 함수에 알려주게되고,

GetLastError 는   0B7이라는 값을 반환합니다.

 

그 후에  CMP EAX,0B7 부분에서 서로 0B7,0B7 같게되면 ,   JNZ 부분에서 점프하지않고  , 그대로 아래로 내려오면서 ,

IsWindowVisible  함수 루틴으로 가게되고 ,   현재 실행되어있는 네이트온창이  맨 앞으로 띄워지는것이죠.

 

그러므로 우리는  저기서    JNZ 부분을  바꿔주어서 , 무조건 실행루틴으로 가게 하는 방법과,

CMP EAX,0B7 부분에서    0B7과 비교를 하지 않게끔    다른 값으로 바꿔주면됩니다.

 

 

 

 

 

 

 

 

 

 

이제 변경한 내용을 저장하고 실행해봅시다.

 

 

아주 잘 되네요.

 

이상이었습니다.
출처 : http://sone.tistory.com/21