posted by 블르샤이닝 2012. 10. 30. 11:44
728x90

아무생각없이 뭐지하고 읽다가...읽다보니 재밌군... 확실히 나도 기초가 약하긴 한것같다. 이제는 확실히 무슨뜻인지 알기에 cw의 개념을 익혀두려고 자료를 남긴다. 그나저나 옛날분들도 공대삘 ㅋㅋㅋㅋㅋ 2007년도인데 멋지다 ㅎㅎ 난 군대 제대했을때네 ㅋㅋ

원본 : http://powerhacker.net/forums/viewtopic.php?t=137

---------------------------------------------------------------------------------------------------

[질문]detour 후킹이 왜 한프로세스에만 영향을 미칠까요?

운영자들: amesianx, powerhacker


답변 게시글

13 개의 게시글 • 1개 중 2 페이지 • 12

[질문]detour 후킹이 왜 한프로세스에만 영향을 미칠까요?

글쓴이: hooker » (화) 02 06, 2007 7:27 pm


안녕하세요.. 

그동안 detour 라이브러리를 별 생각없이 사용해왔는데 갑자기 궁금한게 있어서 질문드립니다. 


제가 알기론 해당 dll을 임포트하는 모든 프로세스들이 그 dll의 코드를 공유하는 걸로 아는데요. 

즉, kernel32.dll을 임포트하는 모든 프로세스가 각각 자신의 virtual address space에 kernel32.dll의 코드를 로드하는게 아니라 kernel32.dll은 한번만 메모리에 로드되고 모든 프로세스가 이 로드된 kernel32.dll의 코드를 공유해서 사용하는 걸로 압니다. 


그렇다면 detour 라이브러리로 kernel32.dll의 lstrcpyA 함수의 프롤로그를 jmp 인스트럭션으로 덮어씌웠다면 이 lstrcpyA api를 사용하는 모든 프로세스가 영향을 받아야(즉, 후킹이 되야) 할텐데 실제론 내가 후킹한 프로세스만 후킹되쟎아요? 

이거 예전에도 고민해봤던 문제인거 같은데 알쏭달쏭하네요. 

기초부터 다시 공부해야할듯 싶네요.  

그럼 답변 부탁드립니다.

hooker

 

상위

...

글쓴이: amesianx » (수) 02 07, 2007 6:06 am


답변입니다. 코드영역이 공유되는게 아닌것은 확실합니다. KERNEL32.DLL 은 


일반 DLL 과 같이 프로세스 공간의 제약을 받고 있습니다. 즉, 별도에서 돌고있습니다. 


같은 공간이 아닙니다. 시스템 DLL 이라고해서 같은 코드를 공유한다고 생각했던거 


자체가 우리들의 무지였습니다. 저도 여태 그렇게만 치부하고 생각해왔었지만 확인해본결과 


그냥 고정적인 주소만 갖고있다뿐이지 일반적인 DLL 과 똑같이 프로세스 공간제약을 받습니다. 


전역적인 DLL 공간 메모리 공유는 아닙니다.. 독립이죠.. 


자세한 내용은 질문하신거 답변드릴려고 실시한 실험보고서를 자료실에 올려놓겠습니다. 


P.S: 고정관념이란거 참 무섭습니다. 그리고 책이란것도 무섭구요.. 책에 공유된다고 나와있으니 

무턱대고 그렇게만 믿고 코드영역도 공유될거라 생각했던게 이리 사람을 혼란스럽게 하다니.. 

책을 하나 보더라도 제대로된 책을 봐야지요... 대충 멋대로 개념갖고 설명하는 책 봐야 더 고생만 

하게 되더군요...


amesianx

운영자


 

전체글: 1611

가입일: (토) 10 07, 2006 3:20 am

상위

...

글쓴이: amesianx » (수) 02 07, 2007 11:03 am


이제 커널단 공부를 시작했으니까... 


자세한 내용은 계속 올려드리겠습니다. 


단지, 현재로써는 이미지는 다르지만 KERNEL32.DLL 이 시스템의 고정주소에 로드된다는 점 


때문에 항상 주소가 같으므로 공유된다고 한것 같습니다. 그 이상이하의 의미도 아닌듯.. 


치트엔진에서 KERNEL32.DLL 을 수정하길래 가능한가 의심을 해본적이 있고 위험한 짓을 


한다고 생각했었는데 전혀 위험한게 아니었습니다. 그냥 뻑날까봐 겁만내고 만지지 않았던게 


잘못이었었던 것 같습니다. KERNEL32.DLL 역시 맘대로 후킹해서 사용하면 됩니다.. 


Detours 를 사용하면서도 후킹을 거는것에 대해서 그다지 심각하게 생각하지 않았다가 실험하면서 


많이 느꼈네요.. 앞으로도 핵심질문 많이 부탁드립니다. ^^; 덕분에 많은 발전이... 


이제 커널로 가야하는 것 같은 생각이.. 유저단에서는 좀 더 심오한 작동테스트에 대해서 분석하는게 


한계가 느껴지네요.. 고난의 시작이... T.T


amesianx

운영자


 

전체글: 1611

가입일: (토) 10 07, 2006 3:20 am

상위

...

글쓴이: hooker » (수) 02 07, 2007 3:54 pm


답변 주실려고 직접 실험까지 해주셔서 정말 감사드립니다.^^ 



예전에 후킹 공부할때 메모해뒀던걸 찾았네요.(이때 고민했던 문제를 또 고민하다니 정말 돌머리인가 봅니다ㅠ.ㅠ) 


제가 착각하고 있던게.. 


9x에선 dll들이 로드되는 영역이 따로 있어서 dll의 api를 후킹하면 이 api를 사용하는 모든 프로세스가 후킹되게 되는데.. 


nt에선 자신이 임포트하는 dll의 코드들을 자신의 프로세스 주소공간에 로드(복사)하므로 후킹하더라도 다른 프로세스엔 영향을 안미치게 되네요. 



그리고 운영자님이 오해하고 계신건지 아님 제가 잘못 이해한건지는 모르겠지만 일반 dll과 시스템 dll을 구별해서 설명하시는데 제가 알기론 Windows상에서 모든 dll은 같은 개념으로 알고 있습니다. 


단지 kernel32.dll은 win32 응용프로그램이라면 모두 사용하므로 재배치에 따른 오버헤드를 없앨려고 항상 같은 베이스 주소에 로드하고 나머지 dll들도 불가피하게 재배치해야할 필요성이 없다면 같은 베이스 주소에 로더가 로드해줍니다. 


즉, 자신이 만든 dll이라도 다른 dll이 이미 로드되 있는 주소를 피한다면 혹은 피하도록 rebasing을 했다면 항상 같은 베이스에 로드됩니다. 



다시 한번 답변 감사드리구요. 

혹시 제가 잘못 알고 있는 부분이나 더 자세히 알고 계신 부분 있으시면 추가 설명 부탁드립니다. 

좋은 하루 되세요.^^

hooker

 

상위

...

글쓴이: amesianx » (수) 02 07, 2007 5:48 pm


네.. 제가 윈98 때만 생각하고 많이 게을렀나봅니다. 


분명히 그때는 책이나 문서에 hooker 님이 말씀하신 것처럼 설명되어 있었거든요.. 


그 개념때문에 아직까지 다들 혼란을 겪는듯 하군요..(전 커널 개발자가 아니니까요.. ^^) 


테스트 해본 바로도 그렇지만 일반 DLL 과 시스템 DLL 이란 차이가 크게 있어보이지 않아보이네요.. 


정리해보면... 


[그럼 지금까지 내용을 모두 합쳐서 아는대로 적어볼까요] 

------------------------------------------------------------------- 

일반 DLL : 주로 하드에서 로딩되고 같은 프로세스의 메모리공간에 이미 로딩되어 있을때만 하드에서 로딩을 안하고 로딩된 놈을 사용. 

일반 DLL : 베이스 주소가 충돌을 피한다면 고정주소, 아니라면 재배치가 발생. 


시스템 DLL : 시스템 영역에 이미 로딩되어져 있다가 사용자 프로세스의 공간으로 매번 맵핑된다(? 이것이 공유의 의미..? 부하는 없나..) 

시스템 DLL : 매번 고정주소가 정해져 있다.(시스템 DLL 이니까 부하를 줄일려는 의도..? 호출주소때문에? 그렇다면 맵핑이나 재배치나.. 

복사는 똑같은데 부하정도는?) 


시스템 DLL 은 실제로 한개의 프로그램을 대상으로 볼때는 그냥 베이스 주소가 고정되어있는 

DLL 정도의 차이밖에 느낄수 있는 차이가 없어보인다.(후킹할때의 실질적 차이?) 

----------------------------------------------------------------- 


어떤게 맞는지는 모르겠으나 KERNEL32.DLL 이 시스템 영역으로 로딩된 뒤에 사용자 메모리로 매번 맵핑이 된다는 


것은 원본을 공유한다는 의미이겠죠..? 그럼 원본을 바꿔버리는 수밖에 없겠군요... 그래서 커널단으로 간단 소린가 


보군요.. 이제서야 커널단으로 가서 공부해야할 의미를 찾았네요.. 유저단은 이것으로 빠빠2 해야겠네요.. 


그래도 마지막으로 한번 유저단에서 커널단으로 안가고 시스템을 주무를 수 있는 방법을 한번 연구해보고 긴 여행을 


시작해야 겠습니다. 마지막 시도.. KERNEL32.DLL 을 직접 바꿔버리면 부팅시에 적용이 되는가.. 안되는가... 어떻게 


쉽게 KERNEL32.DLL 을 바꿀수 있을 것인가.. 정도가 되겠네요... (윈도우는 시스템 DLL 이 변조되면 경고가 뜨죠.. 


윈도우 CD 를 넣으라고.. 복구해야 한다고.. ^^; 이것만 건너뛰면... 쩝.. 가능할진 모르겠군요..) 


좋은 말씀 감사하구요.. 언제나 즐핵하세요.. 화이링.. ^^


amesianx

운영자


 

전체글: 1611

가입일: (토) 10 07, 2006 3:20 am

상위

...

글쓴이: somma » (수) 02 07, 2007 7:14 pm


win 98 이나 nt 나 dll 을 사용하는 방식은 동일하다고 생각하시면 됩니다. 

예를 들어 kernel32.dll 의 경우 0x7c800000 이 image base 라고 가정해 보지요. 

98이든 xp 든 이 kernel32.dll 이 뿐만 아니라 모든 dll 들은 항상 공유됩니다. 

그리고, kernel32.dll 이나 ntdll, gdi32.dll, advapi 등등의 ms dll 들은 내부적으로 이름에 따른 기준 주소 배정 규칙이 정해져 있습니다. 

msdn 어딘가에 있는데 정확한 주소는 잘 기억이..쿨럭... 

암튼 그렇습니다. 

그래서 ms 에서 배포하는 dll 들은 동일한 주소 공간을 사용하지 않으므로 재배치가 필요하지 않습니다. 

암튼 문제는.. 모든 프로세스들이 dll 을 공유하는데 detour 를 박았을때 왜 다른 프로세스에 영향을 미치지 않느냐.. 이건데요 

98에서는 영향을 미칩니다. 그러나 nt 계열에서는 해당 프로세스만 영향을 받습니다. 

이유는 Copy - on - Write 라는 것 때문입니다. 

98에서는 COW 를 지원하지 않았습니다만 nt 계열에선 이걸 지원하죠. 

즉 dll 의 코드를 수정하려고 해당 메모리에 access 하는 순간 해당 메모리 주소에 대한 페이지를 하나 생성해서 새로 생성한 페이지에 Write 를 수행하게 하는거죠. 

다른 프로세스들은 원본 코드 영역을 계속 참조하게 되고요, 타겟 프로세스는 복사된, 즉 수정된 페이지를 참조하게 됩니다. 

그래서 타켓 프로세스는 훅이 되고, 나머지 프로세스들은 그대로인 것입니다. 


CR0 레지스터의 WP 비트를 통해 이걸 구현한다고 합니다  

http://somma.egloos.com/2131561 

여기에 보면 WP 비트를 이용하는 코드가 쬐금 있습니다. ^__^;;

somma

 

상위

...

글쓴이: amesianx » (수) 02 07, 2007 10:09 pm


아하~ 


궁금한 점이 싹~ 풀려버렸네요... 


감사합니다... 


꽉 막혔던게 확 넘어가는 기분이네요.. ㅎㅎㅎ 


그런데 CR0 를 다룰려면... 후킹루틴에 삽입한다고 그냥 될것 같진 않은데.. 


그냥 후킹루틴에 박아넣어도 가능할까요..? 


아니면 Ring0 의 권한을 얻어야 하거나 그런거 아니겠죠..?


amesianx

운영자


 

전체글: 1611

가입일: (토) 10 07, 2006 3:20 am

상위

....

글쓴이: Ph.Friend » (수) 02 07, 2007 10:57 pm


소마님 나이스샷 ^^(미감님 그림표현...) 


제가 알고있던 개념이 COW였군요 후...확실히 이번일 


계기로 많은걸 정립하게 되었습니다 



이거 CR0이라... 


정덕영님의 책의 힘을 다시 빌려야겠습니다 


허허허 -_-; 


간단하게 메모리 영역을 표시하자면 

win2000과 윈도우 nt의메모리 

0xffffffff~0x8000000 : nt의 핵심과 커널 디바이스 드라이버등의시스템이 올라오며 win9x계열과 달리 

전혀 쓰거나 건들수없다 

0x7fffffff~0x7fff0000 : 건들수도없고 쓰이지도 않은영역 ?? 

0x7fffefff~0x00010000 : win32 프로세스영역 

0x0000ffff~0x00000000 :걍 건들수 없는영역 -_-; 건드려봐야 건질게 없대요.. 


즉 두영역으로 압축할수있겟네요

Ph.Friend

 

상위

...

글쓴이: amesianx » (목) 02 08, 2007 2:24 am


아이구 머리야.. ㅡ.ㅡ; 


공부해도 끝이없군요.. 


좋지도 않은 머리 요새 자꾸 버벅대네요.. 


부하가 걸려옵니다... 


ㅎㅎㅎ 


이러다 뇌졸중으로 쓰러지는거 아닌가... -_-; 


요새 몇일 무리했더니 심장도 아프고 머리도 아프고.. 


죽것네요.. 삽질도 머리가 좋아야 해먹지 노가다뛰듯이 


악으로 버티니까 몸이 급격히 쇄약해지네요... 


아.. 목적지는 분명한데 갈길이 참 멀게만 느껴지는군요.. 


언제 또 커널을 파란말인가.. -_-;


amesianx

운영자


 

전체글: 1611

가입일: (토) 10 07, 2006 3:20 am

상위

...

글쓴이: somma » (목) 02 08, 2007 11:13 am


cr0 레지스터를 이용한 코드.. (제 블로그에..)는 커널 레벨에서만 사용가능합니다. 

사실 디바이스를 위한 드라이버(usb 나 기타...)가 아닌경우 드라이버프로그래밍.. 그다지 어렵지 않습니다. 

단지.. 

프로그래밍 환경이 많이 다르기 때문에 필요한 기반 지식과 제약환경이 좀 있다는거죠.. 

(쿨럭..그래서 어려운 거긴 하지만...) 


http://somma.egloos.com/2710282 

전에 내부 교육용 자료를 만들다가.. 블로그에 함께 올린내용인데...도움이 될 수 있을것같네요.  

계속 하려고 했는데 귀찮아서 못하겠더군요. -_-;;

728x90

'시스템 해킹' 카테고리의 다른 글

GetLogicalDrives 값  (0) 2013.08.05
시스템 정보를 보여주는 툴  (0) 2013.02.12
windows 8 의 보안기능  (0) 2012.09.12
WRITING A BOOTLOADER  (0) 2012.05.03
윈도우 시스템파일들.  (0) 2012.04.25