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
'Reverse engineering > 올리디버그사용법' 카테고리의 다른 글
어셈명령어 (2) | 2009.02.04 |
---|---|
VB함수정리 (0) | 2009.02.04 |
ttf_욕설검색 제거강좌 (0) | 2009.02.04 |
ollydbg_브레이크포인트에_대한_동영상_강좌 (1) | 2009.02.04 |
욕제거 강좌 (0) | 2009.02.04 |
HideOD + Phantom 설정에(themida) (0) | 2009.02.03 |
올리디버그를 시작하기전에 개념을 정립해보자 꼭! (0) | 2009.01.26 |