BLOG main image
분류 전체보기 (145)
궁시렁 (41)
컴쟁이의 연구실 (66)
리버싱 (21)
배워보자 (3)
좋은 곳 (10)
seyool님의 언팩미#1 들여다보기.
jz in reverse engineering
MS API 드래프트 제 1버전 공개
낚시광준초리의 Blog 세상(IT-Fo..
[Kernel] KeServiceDescriptorTa..
我好电脑,我是一名的程序设计员..
SSDT에 대한 고찰
::거듭나기::
불필요한 관심
^0^range.Net - 신은 불공평하다..
141,652 Visitors up to today!
Today 12 hit, Yesterday 22 hit
daisy rss
^0^range.net
'API 후킹 차단'에 해당되는 글 2건
2007/04/16 13:12

What Goes On Inside Windows 2000: Solving the Mysteries of the Loader
PE Crunch - CDC
Loading a DLL from Memory
Injective Code inside Import Table
Analysis of a win32 Userland Rootkit - 로딩된 모듈 숨기기
A Tool to view a LIB

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback Address :: http://0range.net/trackback/59 관련글 쓰기
Name
Password
Homepage
Secret
2007/01/16 12:26

오늘 아침 루트킷에 Opcode0x90이라는 사람이 쓴글을 보았다.
Shiled From DLL Injection이라는 흥미로운 제목으로 글을 올렸다.
글을 읽어보니 CreateThread가 호출되었을때 내부적으로 BaseThreadStartThunk()라는 Internal함수가
호출되는데 이 함수를 후킹하여 인자로 넘어온 lpThreadFunc주소를 검사하여
LoadLibrary, GetProcAddress, FreeLibrary함수주소와 일치한다면 DLL인젠션이라고 보는것이다.
이 방법을 사용하여 후킹을 차단하는데 성공률이 80%정도 된다고 글쓴이는 말하고 있다.

직접 해보니 정말로 잘 차단된다 :)
물론 DLL인젝션이 아닌 순수하게 Code Injection을 하면 못 차단하겠지만 그래도 웬만한
API후킹은 간단하게 차단할수 있으니 여러모로 유용하겠다.






참고:
http://www.rootkit.com/blog.php?newsid=640
http://www.codeproject.com/tips/stackdumper.asp
http://www.rootkit.com/board.php?thread=8934&did=edge640&disp=8934

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback Address :: http://0range.net/trackback/7 관련글 쓰기
Tracked from 삽질로그 | 2007/03/30 10:34 | DEL
요즘엔 다른 프로그램에 DLL을 넣을때 CreateRemoteThread를 많이 이용합니다.우선 간단하고. 사용법이 쉽다는것에 있죠. 그리고 현재 실행중인 프로세스에도 넣을수 있고요.하지만 프로그램에 다른 DLL이들어와서 의도치 않은 행동을 하거나 몇가지 문제가 좀 있죠.막는 방법엔 여러가지가 있습니다. 우선핸들이 필요하니까 커널에서 OpenProcess를 막거나 API후킹을하여서 CreateRemoteThread도 막아도 되겠죠.이 뒤의 글은 윈도..
BlogIcon chp | 2007/03/30 10:30 | PERMALINK | EDIT/DEL | REPLY
세상엔 역시 고수가 많군요 ㅠㅠ 저는 몇일전에 발견했던 방법인데;; 이미 발견한사람이 많았군요 ㅠ
seyool | 2007/04/02 09:38 | PERMALINK | EDIT/DEL
옷.. 저에게 첫 트랙백을 날려주셔서 감사합니다.
세상에는 정말 뛰어난 사람이 무척 많은것 같습니다.
chp님처럼 독학으로 알아내시는 분들도 계시고, ,,
저는 남이 발견한것을 따라하는 따라쟁이일뿐이지요.. ㅋㅋ
kkamagui | 2007/07/28 08:30 | PERMALINK | EDIT/DEL | REPLY
멋진 글입니다. @0@)/~ 퍼갈께요 @0@
BlogIcon seyool | 2007/08/02 18:38 | PERMALINK | EDIT/DEL
까마구이님.. 반갑습니다.
운영체제에 대해서 조예가 깊으신 분이 허접한 제
홈피에 와주셔서 영광입니다 ^^
RSS리더에 추가해서 자주 방문할게요~
BlogIcon naggingmachine | 2008/02/05 12:33 | PERMALINK | EDIT/DEL | REPLY
좋은 글 잘봤습니다. ^^ 여러모로 도움을 많이 얻고 있어요~
BlogIcon seyool | 2008/02/14 10:10 | PERMALINK | EDIT/DEL
debuglab.com 스터디 잘 참석하고 있습니다
제가 절대적을 도움을 받고 있지요 :-)
BlogIcon vbdream | 2008/12/01 18:58 | PERMALINK | EDIT/DEL | REPLY
재밌는 내용이네요...^^ 참고삼아... SetWindowsHookEx() 를 이용한 DLL 인젝션의 경우 user32.dll의 내장 함수 중 하나가 실행되는 모양이더군요~^^;
BlogIcon seyool | 2008/12/04 09:17 | PERMALINK | EDIT/DEL
dll 인젝 션 때문에 요즘 골치가 아픕니다
BlogIcon vbdream | 2008/12/04 17:17 | PERMALINK | EDIT/DEL
Dll 인젝션은 세 가지 방법중 하나로 보통 시도되던데요...

CreateRemoteThread-LoadLibrary 방법과, SetWindowsHookEx를 이용한 방법, 그리고 SetThreadContext를 이용해서 스레드의 레지스터를 강제로 바꾸는 방법도 있습니다.

우선,CreateRemoteThread()로 생성한 스레드는 BaseThreadStartThunk() 내장 함수가 실행될 것이고,

SetWindowsHookEx()로 Dll을 주입하는 경우에는 ClientLoadLibrary() 내장 함수가 호출됩니다.

위 두 방법은 유저 모드에서 차단할 수 있지만, 아쉽게도 컨텍스트를 이용한 것은 커널 레벨 후킹을 필요로 할 것 같네요... :-(
seyool | 2008/12/11 18:48 | PERMALINK | EDIT/DEL
네.. 멋지게 막을수있는 방법...
생각중이에요..
BlogIcon vbdream | 2008/12/13 15:27 | PERMALINK | EDIT/DEL
생각해보니, SetThreadConext와 Code Injection을 이용한 DLL 인젝션은 LoadLibraryA, LoadLibraryW, NTDLL.LdrLoadDll 과 같은 핵심적인 함수를 후킹한 후 caller address가 Private Memory인지 체크하는 방법( VirtualQuery() 이용 )이 있을 수 있겠네요...^^;
includex | 2008/12/15 23:27 | PERMALINK | EDIT/DEL | REPLY
우와~ 좋은 내용 감사히 잘보고 갑니다~ 근데 인젝션에서는 방법이 무수히 많아요. 일단 밑에 커널부분에서도 프로세스메모리 접근이 가능하다는데에 커널단에서는 거의 열였다구 보구요. 위에 에플단에서도 제가 아는 방법만 5가지가 넘네요. 무슨 이름인지는 모르지만 dll속여서 인젝션하는 방법, 레지등록으로 user32.dll로드시 같이 로드되는 방법, 디버그API를 이용한 OP코드 수정하는 방법, 위에서 말쓴하신 hook API사용하는 방법, remote...사용하는 방법, 컨텍스트이용한 방법.. 이중에 커널단을 제외하고는 대부분 방법이 프로세스 핸들을 구해야해여.. 차라리 모든 응용에서 방어하고자하는 응용의 핸들을 획득 하지 못하도록 하는게 더 효과적이지 않을까합니당.. 위에서 말씀해주신 방법은 오직 CreateRemoteThreadqk밖에 방어를 못할것 같네염... 핸들획득이랑 dll att를 막으시면 나름.... 아마...;; 대부분의 방법은 대충 막으실수 있어욤.. 대신.. 밑쪽은;;; 어쩔수 없져뭐..
BlogIcon vbdream | 2008/12/16 12:46 | PERMALINK | EDIT/DEL
커널단으로 내려가면 좋긴 하지만... 기존 보안 제품과 충돌할 여지가 있어서 좀 꺼려지는 편이죠;;
말씀해주신 방법은 디버거와 dll 속이는걸 제외하고 후킹으로 전부 차단할 수 있습니다. 디버거를 이용한 것은 anti-debugger 루틴을 삽입하면 되고(단 이 루틴을 제거하게 되면 계속 공방이 발생하겠죠? ^^), dll을 속이는것은 글쎄요...(애시당초 윈도우 dll만 쓰면 문제는 없을거라고 봅니다. 그리고 이렇게 되면 다른 app에서도 문제가 생길 가능성이 농후하죠.)
물론 말씀하신 것처럼 커널단으로 내려가면 못하는 것이 거의 없죠... 보안 제품과 충돌하는게 안좋을 뿐이지...
그래서 유저 모드에서 막는겁니다. (그리고 커널단에서 막는다고 하면 공격자도 커널단으로 내려가면 뚫릴수밖에 없고요...(참고적으로 Rustock 루트킷은 커널 레벨에서 KeAttachProcess/KeInsertQueueApc로 dll 인젝션을 하기 때문에 핸들을 막는것은 의미가 없습니다.) 그래서 완전 방어는 없다고 봅니다.)

그리고 핸들을 못 구하게 막는다고 하셨는데, 그렇게 할 경우에는 SetWindowsHookEx를 이용해서 dll을 주입시키면 손쉽게 우회됩니다.(뿐만 아니라 직접 KeAttachProcess/KeInsertQueueApc를 이용해서 주입해도 뚫리고요.) (직접 실험해보세요.)
이런 경우 까지 고려하면, SetWindowsHookEx API인 NtUserSetWindowsHookExAW를 서비스 or 코드를 후킹하는 것보다는 유저 모드에서 깔끔하게 막는것이 더 좋을 것 같기도 하네요.

위에서 말한것 말고도 AppInit_DLLs를 이용하거나 등등 방법은 정말 다양합니다. 애초에 ntoskrnl.exe를 패치해서 프로세스 생성시 바로 집어넣어버리는 기법도 존재할 수 있고요.

전에 Dll 인젝션을 거의 완벽하게 차단하고자 해서 간단하게 만들어놓은 DLL이 있습니다. 제 블로그에 있으니 한번 가서 구경해보세요.
includex | 2008/12/16 15:25 | PERMALINK | EDIT/DEL
전역일경우를 생각안했네요..ㅎㄷㄷ 그림님 블로그에 좋은 정보가 엄청 많군요.. 많이 배워갑니다~
Name
Password
Homepage
Secret
prev"" #1 next