<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>#44u61l5f</title>
		<link>http://dual5651.hacktizen.com/tc/</link>
		<description>슬픔 메아리쳐, 난 너무도 약했어..</description>
		<language>ko</language>
		<pubDate>Sun, 20 Mar 2011 20:29:18 +0900</pubDate>
		<generator>Textcube 1.7.6 : Staccato</generator>
		<image>
		<title>#44u61l5f</title>
		<url>http://dual5651.hacktizen.com/tc/attach/1/1137195556.jpg</url>
		<link>http://dual5651.hacktizen.com/tc/</link>
		<width>163</width>
		<height>176</height>
		<description>슬픔 메아리쳐, 난 너무도 약했어..</description>
		</image>
		<item>
			<title>Anti Game hacking 프로그램의 구현.</title>
			<link>http://dual5651.hacktizen.com/tc/entry/Anti-Game-hacking-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4-%EA%B0%96%EC%B6%94%EC%96%B4%EC%95%BC%ED%95%A0-%EA%B8%B0%EB%8A%A5%EB%93%A4</link>
			<description>&lt;FONT size=3&gt;&lt;STRONG&gt;&lt;br /&gt;Anti Game hacking 프로그램의 구현.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;작성자 : Dual5651 (&lt;A href=&quot;mailto:dual@null2root.org&quot;&gt;dual@null2root.org&lt;/A&gt;) in &lt;FONT color=#000000&gt;&lt;STRONG&gt;Null@Root&lt;br /&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;소개&lt;br /&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;&amp;nbsp;이번 글에서는 그 시점에서 알게된 Anti GH 프로그램이 갖추어야할 기능이 무엇&lt;br /&gt;이며, 그 기능의 구현에 필요한 코드와 그 기능의 존재하는 약점등에 대해서 다루어 &lt;br /&gt;보고자 합니다. 이 글의 구성은 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;STRONG&gt;1. Anti Game Hacking 프로그램에 필요한 기능들.&lt;br /&gt;2. Anti Game Hacking Program 구현에 필요한 코드들.&lt;br /&gt;&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;1. Anti Game Hacking 프로그램에 필요한 기능들.&lt;br /&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;&amp;nbsp;Anti GH 프로그램은 어떤 기능들이 필요할까요?&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;1. (Binary /Data File) Packing / Encrypting&lt;br /&gt;&lt;br /&gt;2. GH Program Detecting&lt;br /&gt;&lt;br /&gt;3. AutoPlay Blocking&lt;br /&gt;&lt;br /&gt;4. Message Hooking Blocking&lt;br /&gt;&lt;br /&gt;5. Unauthorized memory access Blocking&lt;br /&gt;&lt;br /&gt;6. Debugging Blocking&lt;br /&gt;&lt;br /&gt;7. SpeedHack Blocking&lt;br /&gt;&lt;br /&gt;8. Integrity Checking&lt;br /&gt;&lt;/STRONG&gt;&lt;br /&gt;&lt;STRONG&gt;9. System descriptor restoring&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;첫번째로 필요한 기능으로써, &lt;STRONG&gt;실행파일 및 데이터 파일의 압축 또는 암호화&lt;/STRONG&gt;를 &lt;br /&gt;들 수 있습니다. 이 부분에 대해선 다른 의견을 가지고 있는 분들도 많은거 같습니다. &lt;br /&gt;이런 분들의 주장에 근거로는 패킹 및 인크라입팅에 의존하면, 프로그램 자체의 &lt;br /&gt;Secure Coding이 약해지고, 대부분 이러한 패킹 및 인크라입팅은 범용적으로 &lt;br /&gt;사용되는 상용프로그램일 가능성이 높음으로, 풀릴(뚫릴 - 그만큼 공략하는 사람도 &lt;br /&gt;많기 때문에) 가능성도 높으며, 이로 인한 결과는 상상이상으로 치명적일 것이기 &lt;br /&gt;떄문입니다. 그럼에도 불구하고, 최근 실행파일의 패킹을 하지 않은 프로그램을 &lt;br /&gt;더 찾기 힘들만큼 많이 사용되어 지고 있으며, 또 어느정도 첫번째&amp;nbsp; 방어선으로써 &lt;br /&gt;기대되어 지는 기능을 하여주고 있습니다.&lt;br /&gt;&lt;br /&gt;그렇다면 게임의 데이터 파일들에 대한 패킹 및 인크라입팅은 왜 필요한 것일까요?&lt;br /&gt;최근 Anti GH 프로그램의 도입으로 Memory Hacking이 힘들어지자, 최근 공격자들은&lt;br /&gt;게임의 데이터파일을 조작하는 방식의(고전적이라면 고전적인 방법의) 해킹을 다시&lt;br /&gt;시도하기 시작하였습니다. 실제 2007년도 국내의 어떤 게임에서는 해당 방식에 의한&lt;br /&gt;GH이 이루어지기도 하였습니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;두번째로 필요한 기능으로써, &lt;STRONG&gt;게임해킹 프로그램의 감지&lt;/STRONG&gt;를 들 수 있습니다.&lt;br /&gt;최근 가장 많이 쓰이는 GH방식으로 Memory Hacking이 있습니다. &lt;br /&gt;이러한 MH(Memory Hacking)은 공격자 입장에서 Generic Game Hacking Tool &lt;br /&gt;(ex: CheatEngine,Tsearch and so on...)로 우선 대상 Game에 대한 분석을 하고&lt;br /&gt;그 후 그 게임만을 대상으로 하는 게임 트레이너가 나오게 됩니다.&lt;br /&gt;즉, 범용 게임 해킹툴의 완전한 차단은 특정 게임 대상 트레이너의 제작을 막는 방법&lt;br /&gt;이기도 합니다. 물런 이는 반드시 그러한 것은 아니며, 거의 근접한 %의 역활을 할 수&lt;br /&gt;있습니다. 감지하는 방법으로써는 첫번째로 패턴 매칭이 있습니다.&lt;br /&gt;패턴 매칭이란 특정한 GH 프로그램에서 발견되는 문자열이나, 코드배열등을&lt;br /&gt;Anti GH프로그램에서 모든 프로세스에서 찾아 보고, 있다면 GH 프로그램으로&lt;br /&gt;간주하는 방식입니다. 두번째로 Finding Named Object기법이 있습니다.&lt;br /&gt;예를들어,&lt;br /&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE,NULL,&lt;br /&gt;&amp;nbsp; PAGE_READWRITE,0,dwSize,&quot;DUALMEM&quot;);&lt;/DIV&gt;
&lt;P&gt;의 경우 처럼, GH 프로그램이 사용되는 시스템 전역에 공유되는 파일맵의 이름이라던지,&lt;br /&gt;GH 프로그램의 창이름, 클레스 이름, 프로세스 이름, 로드되는 드라이버 이름, 뮤텍스,&lt;br /&gt;레지스트리 키등등의 요소등을 검사해보는 방법입니다. 이러한 요소를 확인하는 방법은&lt;br /&gt;sysinternals의 Process Explorer를 이용하여 해당 GH프로그램이 가지고 있는 핸들등&lt;br /&gt;을 통해서 확인하여 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;세번째로 필요한 기능으로써, &lt;STRONG&gt;자동 플레이 차단&lt;/STRONG&gt;을 들 수 있습니다.&lt;br /&gt;최근 메모리 해킹보다 더 큰 문제로 대두되고 있는 것이, 자동플레이 문제 입니다.&lt;br /&gt;과거에는 &#039;작업장&#039;이라는 이름으로, 빈곤한 국가에서 아동 및 청소년의 노동력을&lt;br /&gt;착취하여 지속적인 게임 플레이를 통한 아이템 획득하여, 이를 판매, 이익을 얻는&lt;br /&gt;방식의 범죄가 존재한 반면, 최근에는 이러한 노동력 착취가 아닌, 자동으로&lt;br /&gt;게임을 플레이 해주는 프로그램 및 하드웨어를 이용하여 자동적으로 플레이 하여,&lt;br /&gt;아이템을 획득, 이를 판매하여, 이익을 얻는 방식으로 변모하였습니다.&lt;br /&gt;&lt;br /&gt;최근 단순한 메크로 방식의 자동 플레이 보다 진화된 형태의 두가지 자동 플레이 &lt;br /&gt;방식이 등장하였는데,&amp;nbsp; 첫번쨰로 게임 클라이언트와 서버와의 통신 프로토콜등을&lt;br /&gt;분석하여 게임 클라이언트와 똑같은 기능을 하는 클라이언트를 만들어(UI는 없는)&lt;br /&gt;해당 클라이언트에 AI를 붙이어 자동적으로 사냥하게 하는 것입니다.&lt;br /&gt;이 방식으로 접근하게 될 경우, Anti GH프로그램은 올바른 역활을 할 수 없게 되며,&lt;br /&gt;서버측의 입장에서도 올바른 클라이언트와 공격자에 의해 만들어진 오토 플레이용&lt;br /&gt;클라이언트를 분간하는 것도 현재로선, 명확한 방법은 존재하지 않습니다.&lt;br /&gt;또 이 방식의 공격은 2차적인 피해를 낮기도 하는데, 이런 오토 플레이로써 기능을&lt;br /&gt;하다가, 후에는 &#039;프리 서버&#039;라는 이름으로 판매되어, 실제 게임의 플레이어 수를&lt;br /&gt;줄이고, 저작권을 침해하는 범죄가 2차적으로 이어집니다.&lt;br /&gt;두번쨰로 하드웨어 방식의 오토 플레이 입니다. 이는 실제 사용자에 의해 이뤄지는&lt;br /&gt;올바른 입력과 분간하는 것이 힘듭니다. 이를 분간하기 위한 방법으로써, 행동&lt;br /&gt;패턴 기반의 감지방법이나, WMI등을 이용, 하드웨어의 ID를 확인하여 오토 플레이용&lt;br /&gt;하드웨어를 감지하는 방법등이 사용되어 지고 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;네번쨰로 필요한 기능으로써,&lt;STRONG&gt; 메시지 후킹 차단&lt;/STRONG&gt;을 들 수 있습니다.&lt;br /&gt;공격자는 메시지 후킹을 사용자의 키입력등을 가로 챌 목적으로 사용합니다.&lt;br /&gt;게임의 경우, 키 입력을 가로채어, 아이디와 패스워드등을 알아낸 후,&lt;br /&gt;접속하여 아이템등을 빼가는 등의 범죄에 사용되어 집니다.&lt;br /&gt;현재 존재하는 대부분의 Anti GH 프로그램등은 대부분 기본적으로 유저레벨단의&lt;br /&gt;메시지 후킹을 차단하고 있으며, 이로 인해 최근에는 키로거들도 유저레벨에서&lt;br /&gt;메시지 후킹을 하는 방식이 아닌, 커널레벨에서 필터 드라이버등으로써 키로거&lt;br /&gt;기능을 수행하고 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;다섯번쨰로 필요한 기능으로써, &lt;STRONG&gt;허용되지 않은 메모리 접근차단&lt;/STRONG&gt;을 들 수 있습니다.&lt;br /&gt;매시각각 생겨나는 GH 프로그램에 대응한다는 것은 참 힘든일이며,&lt;br /&gt;Private한 GH 프로그램에 대해선 대응하기가 힘들다는 이유에서 이 방법은 Anti GH에&lt;br /&gt;큰 도움이 되는 방법입니다. 게임 및 보호 프로그램의 프로세스에 허용되지 않은&lt;br /&gt;접근을 차단함으로써, Private한 GH 프로그램도 견제할 수 있게 됩니다.&lt;br /&gt;이를 수행하기 위해서 유저레벨에서는 각 프로세스에 Dll을 삽입하여, API를 후킹하게&lt;br /&gt;하고, 커널레벨에서는 NtOpenProcess(), NtRead/WriteVirtualMemory()등의 함수를&lt;br /&gt;후킹하여 프로세스로의 접근을 차단합니다. 그러나 최근 GH 프로그램도 이런 후킹에&lt;br /&gt;대응하기 위하여, 기존의 API를 호출하는 것이 아닌, Pesudo 코드를 사용함으로써,&lt;br /&gt;위에서 말했던 API들로는 충분치 않아, 최근에는 KeAttachProcess() 같은 프로세스&lt;br /&gt;메모리 전환 계열 함수도 후킹대상에 포함되고 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;여섯번쨰로 필요한 기능으로써, &lt;STRONG&gt;디버깅 차단&lt;/STRONG&gt;을 들 수 있습니다.&lt;br /&gt;게임을 디버거에게 내준다는 것은, 알몸을 보여주는 것과 같습니다.&lt;br /&gt;그럼으로, 디버거는 어떻게든 차단해야 하는 존재입니다. 디버거를 감지하는 &lt;br /&gt;방법으로는 우선 앞에서 말했던 요소들을 혼합함으로써 이루어 질 수 있습니다.&lt;br /&gt;디버거들이 사용하는 API(DebugActiveProcess)같은 프로세스들을 후킹하는&lt;br /&gt;것도 중요하며, 유명한 범용 디버거가 있는지 정기적으로 확인하여, 이들의&lt;br /&gt;창이름, 클레스 이름, 프로세스 이름등 Anti GH프로그램의 두번쨰 기능에서&lt;br /&gt;거론한 요소들로 감지할 수 있으며, 디버거 역시 유저레벨 디버거의 경우&lt;br /&gt;다섯번째 기능으로 차단되며, 커널레벨 디버거의 경우는 반드시 두번쨰 기능을&lt;br /&gt;이용하여 차단되어져야 합니다. 유명한 커널레벨 디버거로써는 SoftIce와&lt;br /&gt;syser가 있으며, 필수적인 차단리스트 입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;일곱번째로 필요한 기능으로써, &lt;STRONG&gt;스피드 핵 차단&lt;/STRONG&gt;을 들 수 있습니다.&lt;br /&gt;공격자 입장에서 생각하기에는 단순히 스피드 핵을 차단하는 이유가 공정성 때문&lt;br /&gt;이라고 생각할지 모르겠지만, 실제적으로 스피드 핵을 차단하는 이유는 공정성&lt;br /&gt;그 이상의 이유가 있습니다. 스피드 핵을 사용할 경우 특정한 기능을 수행하는&lt;br /&gt;루틴의 반복시간에 Gap이 짧아 짐으로써, (Delay시간의 감소) 서버로 유입되는&lt;br /&gt;패킷량 역시 증가되게 됩니다. 만약, 스피드를 정상적인 속도에 10배로 하였다면,&lt;br /&gt;서버로 보내는 패킷량도 10배에 근접하게 된다고 보시면 됩니다. 즉 반드시&lt;br /&gt;차단해야 합니다. 스피드 핵은 두종류가 있는데, 첫번쨰는 GetTickCount() ,&lt;br /&gt;timeGetTime(),QueryPerformanceCounter()등의 시간관련 함수를 후킹하는&lt;br /&gt;방식이 있습니다. 이는 프로세스로의 메모리 접근을 차단함으로써 해결할 수&lt;br /&gt;있는 문제입니다. (사실 메모리 접근을 하지 않고 후킹을 할 수도 있습니다.&lt;br /&gt;-CopyOnWrite 관련) 두번쨰는 시스템의 PIT자체를 줄임으로써, 시스템 시간&lt;br /&gt;전체를 빠르게 돌아가게 하는 방법이 있습니다. 이는 시스템 내부적으론 감지가&lt;br /&gt;힘들게 되며, 서버와의 연동체크를 통해서 감지하는 방법이 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;여덟번째로 필요한 기능으로써, &lt;STRONG&gt;무결성 검사&lt;/STRONG&gt;를 들 수 있습니다.&lt;br /&gt;무결성 검사를 하는 이유로는, 만약 게임프로세스 및 보호 프로세스가 패킹이&lt;br /&gt;해제되거나, 변조된 상태에서 실행된다면, Anti GH은 정상적인 기능을 수행할 수&lt;br /&gt;없게 됩니다. 무결성 검사는 보호 프로세스가 시작될떄에, 게임 파일 및 보호 &lt;br /&gt;프로세스 자체 파일들에 대하여 우선적으로 이루어져야 하며, &lt;br /&gt;실행 중에도 코드섹션에 대하여 정기적으로 이루어져야 합니다.&lt;br /&gt;이렇게 검사를 수행할 경우, 만약 다섯번쨰 기능이 우회되여, 게임의 메모리나,&lt;br /&gt;게임의 데이터 파일등이 수정되었다고 하여도, 이를 감지할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;아홉번째로 필요한 기능으로써, &lt;STRONG&gt;시스템 디스크립터 복구&lt;/STRONG&gt;를 들 수 있습니다.&lt;br /&gt;게임이 시작하기전 시스템의 중요한 디스크립터들(ex: ssdt, idt, and so on)을&lt;br /&gt;복구 하여둠으로써, 꺠끗한 환경에서 게임이 돌아가도록 해야 합니다.&lt;br /&gt;이 작업이 수행되어 지지 않으면, Anti GH 프로그램은 올바른 작동을 할 수 없을&lt;br /&gt;수도 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;2. Anti Game Hacking Program 구현에 필요한 코드들.&lt;br /&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;&amp;nbsp;앞에서는 안티 게임 해킹 프로그램이 갖추어야할 기능들에 대해서 알아 보았습니다.&lt;br /&gt;이번에는 이러한 기능들을 구현하기 위해서 알아야 할 점 및 코드에 대해서 다루어&lt;br /&gt;보도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;첫번째로 &lt;STRONG&gt;실행파일 및 데이터 파일의 압축 또는 암호화&lt;/STRONG&gt;의 경우 코드의 길이가&lt;br /&gt;짧은편이 아님으로, 관련 링크로 대신하도록 하겠습니다.&lt;br /&gt;&lt;A href=&quot;http://dual5651.hacktizen.com/tt/entry/Make-your-owner-PE-Protector-Part-1-Your-first-EXE-Protector&quot;&gt;http://dual5651.hacktizen.com/tt/entry/Make-your-owner-PE-Protector-Part-1-Your-&lt;br /&gt;first-EXE-Protector&lt;/A&gt;&lt;br /&gt;참고 적으로 최근의 게임 EXE 패킹은 더미다 패커가 인기를 끌고 있고,&lt;br /&gt;드라이버의 경우 Code Virtualizer가 인기를 끌고 있습니다.&lt;br /&gt;&lt;br /&gt;두번쨰로 &lt;STRONG&gt;게임해킹 프로그램의 감지&lt;/STRONG&gt;의 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;프로세스 메모리 영역의 패턴 검사 :&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL PatternSearchFromAllProcesses()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char StringDataBase[][30] = {&quot;CheatEngine&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;AutoPlay&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;GameHack&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Memory Search&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;TSearch&quot;};&lt;br /&gt;&amp;nbsp;char szProcess[MAX_PATH] = {0,};&lt;br /&gt;&amp;nbsp;DWORD ProcessesID[1024];&lt;br /&gt;&amp;nbsp;char WarningString[MAX_PATH] = &quot;게임 해킹 프로그램 발견 되었습니다.\n게임이 종료 됩니다.\n&quot;;&lt;br /&gt;&amp;nbsp;MEMORY_BASIC_INFORMATION struct_mbi;&lt;br /&gt;&amp;nbsp;SYSTEM_INFO struct_si;&lt;br /&gt;&amp;nbsp;HMODULE hMod;&lt;br /&gt;&amp;nbsp;DWORD dbNeeded,dbNeeded2;&lt;br /&gt;&amp;nbsp;HANDLE hProcess;&lt;br /&gt;&amp;nbsp;LPVOID newbuf;&lt;br /&gt;&amp;nbsp;LPVOID p;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ULONG ret;&lt;br /&gt;&amp;nbsp;int cnt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;GetSystemInfo(&amp;amp;struct_si); //Getting Information to get max,min address&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;printf(&quot;StartAdr : 0x%x, EndAdr : 0x%x\n&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp;struct_si.lpMinimumApplicationAddress,&lt;br /&gt;&amp;nbsp; &amp;nbsp;struct_si.lpMaximumApplicationAddress);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;for(cnt=0; ;cnt++) &amp;nbsp; &amp;nbsp;//Counting Pattern&lt;br /&gt;&amp;nbsp; if(!StringDataBase[cnt][0])&lt;br /&gt;&amp;nbsp; &amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;EnumProcesses(ProcessesID,sizeof(ProcessesID),&amp;amp;dbNeeded); //Get Processes IDs.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;for(int i = 0; i &amp;lt; dbNeeded / sizeof(DWORD); i++)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; if((ProcessesID[i] == GetCurrentProcessId()) || ProcessesID[i] == 4) continue; //Do not scan by self&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; hProcess = OpenProcess(PROCESS_VM_READ|PROCESS_QUERY_INFORMATION,FALSE,ProcessesID[i]);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; if(hProcess)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;EnumProcessModules(hProcess,&amp;amp;hMod,sizeof(hMod),&amp;amp;dbNeeded2);&lt;br /&gt;&amp;nbsp; &amp;nbsp;GetModuleBaseName(hProcess,hMod,szProcess,sizeof(szProcess)); //Get Module Name&lt;br /&gt;&amp;nbsp; &amp;nbsp;p = struct_si.lpMinimumApplicationAddress;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;do&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; VirtualQueryEx(hProcess,p,&amp;amp;struct_mbi, sizeof(struct_mbi));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; newbuf = malloc(struct_mbi.RegionSize); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //Sometimes regionSize makes me crazy!!!&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(newbuf)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ReadProcessMemory(hProcess,p,newbuf,struct_mbi.RegionSize,&amp;amp;ret);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if(ret)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(DWORD i = (DWORD)newbuf; i &amp;lt;= (DWORD)newbuf+(DWORD)struct_mbi.RegionSize; i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; for(int j = 0; j &amp;lt; cnt; j++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!strnicmp((char *)StringDataBase[j],(char *)i,strlen((char *)StringDataBase[j])))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strcat(WarningString,szProcess);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strcat(WarningString,&quot;프로세스를 종료하신후 다시 실행하여 주세요.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MessageBox(NULL,WarningString,&quot;해킹 프로그램 발견&quot;,MB_ICONSTOP);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CloseHandle(hProcess);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExitProcess(-1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; free(newbuf);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *((PDWORD)&amp;amp;p) += (DWORD)struct_mbi.RegionSize;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }while(p &amp;lt; struct_si.lpMaximumApplicationAddress);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; CloseHandle(hProcess);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;return TRUE;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;실제로 실행해보면 알 수 있지만, ReadProcessMemory()를 수행하는 것은 꾀 시간을&lt;br /&gt;많이 소요하는 작업입니다. 이렇게 하는 것보다는 Dll을 모든 프로세스에 인젝션 시키신 후,&lt;br /&gt;각 프로세스에 인젝션된 Dll에서 메모리 검사를 하게되면, 같은 프로세스 영역 내임으로,&lt;br /&gt;ReadProcessMemory()도 필요 없으며, 분할처리가 가능해져, 그 속도 역시 빨라 집니다.&lt;br /&gt;Dll을 인젝션 하는 방식의 코드는 별도로 코드를 첨부하도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;Finding Named Object기법의 경우는 창이름 이나 클레스 이름은 EnumWindow 함수를&lt;br /&gt;돌면서 GetWindowText(), GetClassName()함수를 이용하여 구하여 비교하는 방식을&lt;br /&gt;쓰면 됩니다. 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;char szWindowDataBase[][30] = {&quot;CheatEngine&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;AutoPlay&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;GameHack&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;Memory Search&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;TSearch&quot;};&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;char szClassDataBase[][30] = {&quot;CheatEngine&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;AutoPlay&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;GameHack&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;Memory Search&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;TSearch&quot;};&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;int cnt,cnt2;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL CALLBACK EnumWinProc(HWND hwnd,LPARAM lparam) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp; char szWindow[255];&lt;br /&gt;&amp;nbsp;&amp;nbsp; char szClass[255];&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; if(GetParent(hwnd)) return TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp; GetWindowText(hwnd,szWindow,255);&lt;br /&gt;&amp;nbsp;&amp;nbsp; GetClassName(hwnd,szClass,255);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; cnt; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; if(!strnicmp(szWindowDataBase[i],szWindow,strlen(szWindowDataBase[i])))&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; MessageBox(NULL,&quot;게임 해킹 프로그램 발견 되었습니다.\n게임이 종료 됩니다.\n&quot;,&quot;해킹 프로그램 발견&quot;,MB_ICONSTOP);&lt;br /&gt;&amp;nbsp; ExitProcess(-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; cnt; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; if(!strnicmp(szClassDataBase[i],szClass,strlen(szClassDataBase[i])))&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; MessageBox(NULL,&quot;게임 해킹 프로그램 발견 되었습니다.\n게임이 종료 됩니다.\n&quot;,&quot;해킹 프로그램 발견&quot;,MB_ICONSTOP);&lt;br /&gt;&amp;nbsp; ExitProcess(-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; return TRUE;&lt;br /&gt;} &lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL FindBadWindowOrClass()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(cnt = 0; ;cnt++) &amp;nbsp;&amp;nbsp; //Counting Pattern&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(!szWindowDataBase[cnt][0])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; for(cnt2 = 0; ;cnt2++) &amp;nbsp;&amp;nbsp; //Counting Pattern&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(!szWindowDataBase[cnt2][0])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;EnumWindows(EnumWinProc,NULL);&lt;br /&gt;&amp;nbsp;return TRUE;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;프로세스 이름의 경우 EnumWindow 콜백에서 GetThreadProcessId() 함수를 한 후,&lt;br /&gt;OpenProcess() 하여주고, GetModuleBaseName()함수를 이용하여 프로세스 이름을&lt;br /&gt;구하여 확인시켜 주는 방식으로 진행하여 주면 됩니다. 이 코드는 패턴 검사의 코드를&lt;br /&gt;조금 수정하면 됨으로 따로 올리진 않겠습니다. 그 나머지 요소는 GH 프로그램이&lt;br /&gt;사용하고 있는 요소들을 어떻게 확인하는지 Process Explorer를 이용한 예제를 보여드&lt;br /&gt;리 겠습니다. &lt;/P&gt;
&lt;P&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1361199520.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;308&quot; width=&quot;450&quot; /&gt;&lt;/div&gt; &lt;/P&gt;
&lt;P&gt;먼저 위와 같이 Lower panel view를 Handles로 해줍니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1268225109.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;455&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;/P&gt;TSearch에서 사용중인 핸들 목록을 볼 수 있는데요.&lt;br /&gt;위 그림에서 보면, TSearch는 3가지의 독특한 Event를 만드는 것을 알 수 있습니다.&lt;br /&gt;즉, 다음 3가지 중 하나를 선택하여 해당 이벤트가 존재하는지를 확인한다면,&lt;br /&gt;TSearch의 실행여부를 확인할 수 있습니다. 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL CheckByEventName()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char szEventDataBase[][30] = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;User stopped search&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Debugger Loaded&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;TSearch.ServerLoaded&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp;HANDLE hEvent;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; for(int cnt = 0; ;cnt++) &amp;nbsp;&amp;nbsp; //Counting Pattern&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(!szEventDataBase[cnt][0])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; for(int i = 0; i &amp;lt; cnt; i++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;if(OpenEvent(EVENT_ALL_ACCESS,FALSE,szEventDataBase[i]))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; MessageBox(NULL,&quot;게임 해킹 프로그램 발견 되었습니다.\n게임이 종료 됩니다.\n&quot;,&quot;해킹 프로그램 발견&quot;,MB_ICONSTOP);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ExitProcess(-1);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; return TRUE;&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;뮤텍스를 이용한 확인 방법의 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL CheckByMutexName()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char szMutexDataBase[][30] = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;TSearch&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;CheatEngine&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;GameHack&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp;HANDLE hEvent;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; for(int cnt = 0; ;cnt++) &amp;nbsp;&amp;nbsp; //Counting Pattern&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(!szMutexDataBase[cnt][0])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; for(int i = 0; i &amp;lt; cnt; i++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;CreateMutex(NULL,FALSE,szMutexDataBase[i]);&lt;br /&gt;&amp;nbsp;if(GetLastError() == ERROR_ALREADY_EXISTS)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; MessageBox(NULL,&quot;게임 해킹 프로그램 발견 되었습니다.\n게임이 종료 됩니다.\n&quot;,&quot;해킹 프로그램 발견&quot;,MB_ICONSTOP);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ExitProcess(-1);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; return TRUE;&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;파일맵을 이용한 방법의 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL CheckByFileMapName()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char szFileMapDataBase[][30] = {&quot;DUALMEM&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;TSearch&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;CheatEngine&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;GameHack&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp;HANDLE hFileMap;&lt;br /&gt;&amp;nbsp;LPVOID pMapFile; &lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; for(int cnt = 0; ;cnt++) &amp;nbsp;&amp;nbsp; //Counting Pattern&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(!szFileMapDataBase[cnt][0])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; for(int i = 0; i &amp;lt; cnt; i++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE,NULL,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; PAGE_READWRITE,0,1,szFileMapDataBase[i]);&lt;br /&gt;&amp;nbsp;if(GetLastError() == ERROR_ALREADY_EXISTS)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; MessageBox(NULL,&quot;게임 해킹 프로그램 발견 되었습니다.\n게임이 종료 됩니다.\n&quot;,&quot;해킹 프로그램 발견&quot;,MB_ICONSTOP);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ExitProcess(-1);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; return TRUE;&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;레지스트리, 파일로 확인하는 방법은 어떤 레지스트리나 파일을 쓰는지는 Process&lt;br /&gt;Explorer를 확인하는 것으로 동일하고, 확인은 레지스트리나 파일을 열 떄,&lt;br /&gt;이미 존재하는지 여부만 확인해주면 됨으로 별도의 코드는 첨부하지 않겠습니다.&lt;br /&gt;윈도우즈에 로드되어 있는 드라이버의 목록은 ntdll.dll의&lt;br /&gt;ZwQuerySystemInformation() 를 이용하여 구할 수 있습니다.&lt;br /&gt;&lt;br /&gt;참고적으로 위의 핸들목록을 출력하는 기능은 정덕영님의 저서 &#039;Windows 구조와&lt;br /&gt;원리 그리고 Codes&#039;에 나온 코드인 ListHandles라는 코드도 똑같은 기능을 합니다.&lt;br /&gt;코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;#include &quot;stdafx.h&quot;&lt;br /&gt;#include &quot;windows.h&quot;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &quot;nativeAPI.h&quot;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL EnablePrivilege(PCSTR name)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};&lt;br /&gt;&amp;nbsp; &amp;nbsp; LookupPrivilegeValue(0, name, &amp;amp;priv.Privileges[0].Luid);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; HANDLE hToken;&lt;br /&gt;&amp;nbsp; &amp;nbsp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &amp;amp;hToken);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; AdjustTokenPrivileges(hToken, FALSE, &amp;amp;priv, sizeof priv, 0, 0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; BOOL rv = GetLastError() == ERROR_SUCCESS;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; CloseHandle(hToken);&lt;br /&gt;&amp;nbsp; &amp;nbsp; return rv;&lt;br /&gt;}&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; ULONG pid;&lt;br /&gt;&amp;nbsp;HANDLE hProcess, hCurrentProcess;&lt;br /&gt;&amp;nbsp;SYSTEM_HANDLE_INFORMATION&amp;nbsp; *aHandles;&lt;br /&gt;&amp;nbsp;ULONG&amp;nbsp; nHandles, nCount;&lt;br /&gt;&amp;nbsp;ULONG&amp;nbsp; *pULONG;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;//1. Parameter parsing&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (argc == 1) &lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; printf(&quot;HELP : ListHandles PID\n&quot;);&lt;br /&gt;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;pid = strtoul(argv[1], 0, 0);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;//2. Get process handle&lt;br /&gt;&amp;nbsp; &amp;nbsp; EnablePrivilege(SE_DEBUG_NAME);&lt;br /&gt;&amp;nbsp; &amp;nbsp; hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid);&lt;br /&gt;&amp;nbsp;hCurrentProcess = GetCurrentProcess();&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;//3. Get Handle&#039;s Information&lt;br /&gt;&amp;nbsp; &amp;nbsp; nCount = 100;&lt;br /&gt;&amp;nbsp; &amp;nbsp; pULONG = (PULONG)malloc(nCount * sizeof(SYSTEM_HANDLE_INFORMATION) + sizeof(ULONG));&lt;br /&gt;&amp;nbsp; &amp;nbsp; while (ZwQuerySystemInformation(SystemHandleInformation, pULONG, &lt;br /&gt;&amp;nbsp; &amp;nbsp; nCount * sizeof(SYSTEM_HANDLE_INFORMATION)+ sizeof(ULONG)&lt;br /&gt;&amp;nbsp; &amp;nbsp; , 0) == STATUS_INFO_LENGTH_MISMATCH)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; free(pULONG);&lt;br /&gt;&amp;nbsp; nCount += 50;&lt;br /&gt;&amp;nbsp; pULONG = (PULONG)malloc(nCount * sizeof(SYSTEM_HANDLE_INFORMATION) + sizeof(ULONG));&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;nHandles = *pULONG;&lt;br /&gt;&amp;nbsp;aHandles = (PSYSTEM_HANDLE_INFORMATION)(pULONG + 1);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;//4. Print Handle&#039;s Information&lt;br /&gt;&amp;nbsp;printf(&quot;Process ID : %x\n&quot;, pid);&lt;br /&gt;&amp;nbsp; &amp;nbsp; for (ULONG i = 0; i &amp;lt; nHandles; i++) &lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (aHandles[i].ProcessId == pid) &lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;HANDLE hObject;&lt;br /&gt;&amp;nbsp; &amp;nbsp;OBJECT_BASIC_INFORMATION obi;&lt;br /&gt;&amp;nbsp; &amp;nbsp;POBJECT_TYPE_INFORMATION pOti;&lt;br /&gt;&amp;nbsp; &amp;nbsp;POBJECT_NAME_INFORMATION pOni;&lt;br /&gt;&amp;nbsp; &amp;nbsp;ULONG nTypeName, nObjectName, n;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp;if(DuplicateHandle(hProcess, (HANDLE)aHandles[i].Handle,&lt;br /&gt;&amp;nbsp; &amp;nbsp; hCurrentProcess, &amp;amp;hObject, 0, 0, DUPLICATE_SAME_ACCESS) == FALSE)&lt;br /&gt;&amp;nbsp; &amp;nbsp; continue;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ZwQueryObject(hObject, ObjectBasicInformation, &amp;amp;obi, sizeof(obi), &amp;amp;n);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;%p %04hx %3lx %3ld %4ld &quot;, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; aHandles[i].Object, aHandles[i].Handle, obi.Attributes,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; obi.HandleCount - 1, obi.PointerCount - 2);&lt;br /&gt;&amp;nbsp; &amp;nbsp;//Object Type&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nTypeName = obi.TypeInformationLength + 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pOti = (POBJECT_TYPE_INFORMATION)malloc(nTypeName);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ZwQueryObject(hObject, ObjectTypeInformation, pOti, nTypeName, &amp;amp;nTypeName);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;%-14.*ws &quot;, pOti-&amp;gt;Name.Length / 2, pOti-&amp;gt;Name.Buffer);&lt;br /&gt;&amp;nbsp; &amp;nbsp;//Object Name&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nObjectName = obi.NameInformationLength == 0 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ? MAX_PATH * sizeof (WCHAR) : obi.NameInformationLength;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; pOni = (POBJECT_NAME_INFORMATION)malloc(nObjectName);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, pOni,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nObjectName, &amp;amp;nObjectName)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;%.*ws&quot;, pOni-&amp;gt;Name.Length / 2, pOni-&amp;gt;Name.Buffer);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;free(pOni); free(pOti); CloseHandle(hObject);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; free(aHandles);&lt;br /&gt;&amp;nbsp; &amp;nbsp; CloseHandle(hProcess);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;세번쨰로 &lt;STRONG&gt;자동 플레이 차단&lt;/STRONG&gt;은 에플리케이션 방식의 오토플레이라면 유저레벨에서&lt;br /&gt;막는방법과 커널레벨에서 막는 방법으로 나뉠 수 있습니다. 사실 후킹하는 시점이&lt;br /&gt;다를 뿐, 실제적으로 차단해야할 API들은 같습니다. 유저레벨에서는 모든 프로세스에&lt;br /&gt;Dll을 인젝션 한 후, 해당 Dll에서 GetPixel(), PostMessageA(), PostMessageW(), &lt;br /&gt;SendInput(), SendMessageA(), SendMessageW(), SetCursorPos(), keybd_event(),&lt;br /&gt;mouse_event() 등의 함수를 차단하여 주어야 합니다. &lt;br /&gt;커널레벨에서는 KeServiceDescriptorTableShadow에 있는 SendInput(), &lt;br /&gt;NtUserQueryWindow(), NtUserBuildHwndList(), NtUserFindWindowEx(), &lt;br /&gt;NtUserGetForegroundWindow(), GetDC(), GetWindowDC() 등의 함수를 후킹해서 &lt;br /&gt;처리해 주어야 합니다. &amp;nbsp;그래픽 관련 함수를 후킹하는 이유는 최근 오토플레이들은&lt;br /&gt;단순한 메크로가 아닌, 픽셀 정보를 읽어온 후, 그에 interact하여 작동하는 방식을&lt;br /&gt;많이 취하기 떄문입니다. 위의 함수들을 모두 후킹하여 처리하여 주면, 에플리케이션&lt;br /&gt;방식의 메크로는 거의 차단된다고 보시면 됩니다. (커널레벨에서의 irp 발생 및&lt;br /&gt;pesudo 코드 사용등 예외는 존재합니다.) &lt;br /&gt;&lt;br /&gt;네번쨰로 &lt;STRONG&gt;메시지 후킹 차단&lt;/STRONG&gt;은 커널단에서 비교적 강력하게 구현될 수 있는데,&lt;br /&gt;메시지 후킹은 SetWindowHookEx()를 이용해서 이루어 지는데, 운영체제 내에서는&lt;br /&gt;다음과 같은 구조체로 관리 되어 집니다. &lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;#define CWINHOOKS &amp;nbsp; &amp;nbsp; &amp;nbsp; (WH_MAX - WH_MIN + 1)&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct tagPROCESSINFO * PPROCESSINFO;&lt;br /&gt;typedef struct tagDESKTOP * PDESKTOP;&lt;br /&gt;typedef struct tagDESKTOPINFO * PDESKTOPINFO;&lt;br /&gt;typedef struct tagTHREADINFO * PTHREADINFO;&lt;br /&gt;typedef struct tagHOOK * PHOOK;&lt;br /&gt;typedef HWND * PWND;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct _HEAD {&lt;br /&gt;// &amp;nbsp;&amp;nbsp; KHANDLE h;&lt;br /&gt;&amp;nbsp;DWORD &amp;nbsp; h;&lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD &amp;nbsp; cLockObj;&lt;br /&gt;} HEAD, *PHEAD;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct _THROBJHEAD {&lt;br /&gt;&amp;nbsp; &amp;nbsp; HEAD a;&lt;br /&gt;&amp;nbsp; &amp;nbsp; PTHREADINFO pti;&lt;br /&gt;} THROBJHEAD, *PTHROBJHEAD;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct _DESKHEAD {&lt;br /&gt;&amp;nbsp; &amp;nbsp; PDESKTOP rpdesk;&lt;br /&gt;// &amp;nbsp;&amp;nbsp; KPBYTE &amp;nbsp; pSelf;&lt;br /&gt;&amp;nbsp;PVOID &amp;nbsp;&amp;nbsp; pSelf;&lt;br /&gt;} DESKHEAD, *PDESKHEAD;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct _THRDESKHEAD {&lt;br /&gt;&amp;nbsp; &amp;nbsp; THROBJHEAD a;&lt;br /&gt;&amp;nbsp; &amp;nbsp; DESKHEAD b;&lt;br /&gt;} THRDESKHEAD, *PTHRDESKHEAD;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct tagHOOK { &amp;nbsp; /* hk */&lt;br /&gt;&amp;nbsp; &amp;nbsp; THRDESKHEAD &amp;nbsp; &amp;nbsp; head;&lt;br /&gt;&amp;nbsp; &amp;nbsp; PHOOK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; phkNext;&lt;br /&gt;&amp;nbsp; &amp;nbsp; int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; iHook; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // WH_xxx hook type&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; offPfn;&lt;br /&gt;&amp;nbsp; &amp;nbsp; UINT &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; flags; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // HF_xxx flags&lt;br /&gt;&amp;nbsp; &amp;nbsp; int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ihmod;&lt;br /&gt;&amp;nbsp; &amp;nbsp; PTHREADINFO &amp;nbsp; &amp;nbsp; ptiHooked; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Thread hooked.&lt;br /&gt;&amp;nbsp; &amp;nbsp; PDESKTOP &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; rpdesk; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Global hook pdesk. Only used when &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //&amp;nbsp; hook is locked and owner is destroyed&lt;br /&gt;} HOOK;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct tagDESKTOPINFO {&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; PVOID&amp;nbsp; pvDesktopBase; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // For handle validation&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID&amp;nbsp; pvDesktopLimit; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ???&lt;br /&gt;&amp;nbsp; &amp;nbsp; PWND &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; spwnd; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Desktop window&lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fsHooks; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Deskop global hooks&lt;br /&gt;&amp;nbsp; &amp;nbsp; PHOOK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aphkStart[CWINHOOKS + 1];&amp;nbsp; // List of hooks&lt;br /&gt;&amp;nbsp; &amp;nbsp; PWND &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; spwndShell; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Shell window&lt;br /&gt;&amp;nbsp; &amp;nbsp; PPROCESSINFO&amp;nbsp; ppiShellProcess; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Shell Process&lt;br /&gt;&amp;nbsp; &amp;nbsp; PWND &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; spwndBkGnd; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Shell background window&lt;br /&gt;&amp;nbsp; &amp;nbsp; PWND &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; spwndTaskman; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Task-Manager window&lt;br /&gt;&amp;nbsp; &amp;nbsp; PWND &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; spwndProgman; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Program-Manager window&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pvwplShellHook; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // see (De)RegisterShellHookWindow&lt;br /&gt;&amp;nbsp; &amp;nbsp; int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cntMBox; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // ???&lt;br /&gt;} DESKTOPINFO;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct _CLIENT_ID&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;HANDLE UniqueProcess;&lt;br /&gt;&amp;nbsp;HANDLE UniqueThread;&lt;br /&gt;} CLIENT_ID;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;#pragma packed(1)&lt;br /&gt;typedef struct tagTHREADINFO {&lt;br /&gt;&amp;nbsp;struct W32THREAD // dt win32k!_W32THREAD -r&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; PVOID pEThread;&lt;br /&gt;&amp;nbsp; unsigned long RefCount;&lt;br /&gt;&amp;nbsp; PVOID ptlW32;&lt;br /&gt;&amp;nbsp; PVOID pgdiDcattr;&lt;br /&gt;&amp;nbsp; PVOID pgdiBrushAttr;&lt;br /&gt;&amp;nbsp; PVOID pUMPDObjs;&lt;br /&gt;&amp;nbsp; PVOID pUMPDHeaps;&lt;br /&gt;&amp;nbsp; unsigned long dwEngAcquireCount;&lt;br /&gt;&amp;nbsp; PVOID pSemTable;&lt;br /&gt;&amp;nbsp; PVOID pUMPDObj;&lt;br /&gt;&amp;nbsp;} W32THREAD;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;//***************************************** begin: USER specific fields&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; PVOID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ptl; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Listhead for thread lock list&lt;br /&gt;&amp;nbsp;// end :: 0x2c :: start&lt;br /&gt;&amp;nbsp; &amp;nbsp; PPROCESSINFO &amp;nbsp;&amp;nbsp; ppi; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // process info struct for this thread&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; pq; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // keyboard and mouse input queue&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spklActive; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // active keyboard layout for this thread&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pcti; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Info that must be visible from client&lt;br /&gt;&amp;nbsp; &amp;nbsp; PDESKTOP &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; rpdesk;&lt;br /&gt;&amp;nbsp; &amp;nbsp; PDESKTOPINFO &amp;nbsp;&amp;nbsp; pDeskInfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Desktop info visible to client&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;// ....omitted....&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;} THREADINFO, *PTHREADINFO;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;typedef struct _TEB&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; NT_TIB Tib; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 00h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID EnvironmentPointer; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 1Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; CLIENT_ID Cid; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 20h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID ActiveRpcInfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 28h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID ThreadLocalStoragePointer; &amp;nbsp;&amp;nbsp; // 2Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID Peb; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 30h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD LastErrorValue; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 34h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD CountOfOwnedCriticalSections; // 38h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID CsrClientThread; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 3Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; PTHREADINFO Win32ThreadInfo; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 40h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD Win32ClientInfo[0x1F]; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 44h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID WOW32Reserved; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // C0h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD CurrentLocale; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // C4h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD FpSoftwareStatusRegister; &amp;nbsp; &amp;nbsp; // C8h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID SystemReserved1[0x36]; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // CCh&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID Spare1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 1A4h&lt;br /&gt;&amp;nbsp;&amp;nbsp; LONG ExceptionCode; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 1A8h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD SpareBytes1[0x28]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 1ACh&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID SystemReserved2[0xA]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 1D4h&lt;br /&gt;// &amp;nbsp; GDI_TEB_BATCH GdiTebBatch; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 1FCh&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD gdiRgn; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6DCh&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD gdiPen; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6E0h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD gdiBrush; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6E4h&lt;br /&gt;&amp;nbsp;&amp;nbsp; CLIENT_ID RealClientId; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6E8h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID GdiCachedProcessHandle; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6F0h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD GdiClientPID; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6F4h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD GdiClientTID; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 6F8h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID GdiThreadLocaleInfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 6FCh&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID UserReserved[5]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 700h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glDispatchTable[0x118]; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 714h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD glReserved1[0x1A]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // B74h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glReserved2; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // BDCh&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glSectionInfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // BE0h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glSection; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // BE4h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glTable; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // BE8h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glCurrentRC; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // BECh&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID glContext; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // BF0h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD LastStatusValue; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // BF4h&lt;br /&gt;&amp;nbsp;&amp;nbsp; UNICODE_STRING StaticUnicodeString; // BF8h&lt;br /&gt;&amp;nbsp;&amp;nbsp; WCHAR StaticUnicodeBuffer[0x105]; &amp;nbsp; // C00h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID DeallocationStack; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // E0Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID TlsSlots[0x40]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // E10h&lt;br /&gt;&amp;nbsp;&amp;nbsp; LIST_ENTRY TlsLinks; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F10h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID Vdm; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F18h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID ReservedForNtRpc; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // F1Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID DbgSsReserved[0x2]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // F20h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD HardErrorDisabled; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F28h&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID Instrumentation[0x10]; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F2Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID WinSockData; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F6Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD GdiBatchCount; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F70h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD Spare2; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // F74h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD Spare3; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // F78h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD Spare4; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // F7Ch&lt;br /&gt;&amp;nbsp;&amp;nbsp; PVOID ReservedForOle; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // F80h&lt;br /&gt;&amp;nbsp;&amp;nbsp; DWORD WaitingOnLoaderLock; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // F84h&lt;br /&gt;} TEB, *PTEB;&lt;br /&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;TEB의 Win32ThreadInfo 구조체의 pDeskInfo에 aphkStart라는 배열이&lt;br /&gt;훅을 관리하는데, 즉 이 배열을 주기적으로 0으로 초기화 시킴으로써 설치된 훅을 &lt;br /&gt;제거할수도 있으며 메시지 후킹을 차단할수도 있습니다.&lt;br /&gt;&lt;br /&gt;다섯번쨰로 필요한 기능으로써, &lt;STRONG&gt;허용되지 않은 메모리 접근차단&lt;/STRONG&gt;은 유저레벨에서는&lt;br /&gt;각 프로세스에 Dll을 인젝션 한 후, NtOpenProcess(), NtProtectVirtualMemory(),&lt;br /&gt;NtReadVirtualMemory(), NtWriteVirtualMemory(), ZwOpenProcess(), ZwProtect&lt;br /&gt;VirtualMemory(), ZwReadVirtualMemory(), ZwWriteVirtualMemory(), &lt;br /&gt;OpenProcess(), ReadProcessMemory(), VirtualProtect(), VirtualProtectEx(),&lt;br /&gt;WriteProcessMemory(), GetWindowThreadProcessId()등의 API를 후킹하여&lt;br /&gt;주어야 합니다. 유저레벨에서의 후킹코드는 앞에서 다뤘던 코드에 조금의 수정을&lt;br /&gt;가하면 되는 것임으로, 생략하도록 하겠습니다. 커널레벨에서의 후킹코드들은&lt;br /&gt;다음과 같습니다.&lt;br /&gt;&lt;br /&gt;ZwOpenProcess Hook : &lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #e4e4e4&quot;&gt;NTSTATUS NewZwOpenProcess( &lt;br /&gt;&amp;nbsp; &amp;nbsp; OUT PHANDLE ProcessHandle,&lt;br /&gt;&amp;nbsp; &amp;nbsp; IN ACCESS_MASK DesiredAccess,&lt;br /&gt;&amp;nbsp; &amp;nbsp; IN POBJECT_ATTRIBUTES ObjectAttributes,&lt;br /&gt;&amp;nbsp; &amp;nbsp; IN PCLIENT_ID ClientId OPTIONAL&lt;br /&gt;) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; NTSTATUS rc; &lt;br /&gt;&amp;nbsp; &amp;nbsp; NTSTATUS rc2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; CHAR Caller_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; PEPROCESS Process;&lt;br /&gt;&amp;nbsp; &amp;nbsp; char *nameptr;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; GetProcessName( Caller_Process_Name );&amp;nbsp; //Get Process Name&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; rc = ((ZWOPENPROCESS)(OldZwOpenProcess)) ( &lt;br /&gt;&amp;nbsp; &amp;nbsp;ProcessHandle,&lt;br /&gt;&amp;nbsp; &amp;nbsp;DesiredAccess,&lt;br /&gt;&amp;nbsp; &amp;nbsp;ObjectAttributes,&lt;br /&gt;&amp;nbsp; &amp;nbsp;ClientId OPTIONAL);&amp;nbsp; &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;if(DesiredAccess == PROCESS_ALL_ACCESS)&lt;br /&gt;&amp;nbsp;{&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; if(NT_SUCCESS(rc)) &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;rc2 = ObReferenceObjectByHandle( &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *ProcessHandle,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; PROCESS_ALL_ACCESS,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; NULL,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; KernelMode,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (void *)&amp;amp;Process,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; NULL);&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(NT_SUCCESS(rc2))&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp; &amp;nbsp; strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN); &lt;br /&gt;&amp;nbsp; &amp;nbsp; Target_Process_Name[NT_PROCNAMELEN] = 0; &lt;br /&gt;&amp;nbsp; &amp;nbsp; if(!strncmp(Target_Process_Name,MYPROCESS,strlen(MYPROCESS)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ObDereferenceObject(Process);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ZwClose(ProcessHandle); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;rc = STATUS_INVALID_HANDLE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ProcessHandle = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; return rc;&lt;br /&gt;} &lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;ZwOpenProcess() 함수를 후킹하고 있다가, 만약 핸들을 오픈하고자 하는 프로세스가,&lt;br /&gt;보호하는 프로세스라면 핸들을 닫고 잘못된 핸들이라고 값을 리턴합니다.&lt;br /&gt;&lt;br /&gt;ZwWriteVirtualMemory Hook : &lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;NTSTATUS NTAPI NewZwWriteVirtualMemory(&lt;br /&gt;&amp;nbsp;IN HANDLE hProcess,&lt;br /&gt;&amp;nbsp;IN PVOID BaseAddress,&lt;br /&gt;&amp;nbsp;IN PVOID Buffer,&lt;br /&gt;&amp;nbsp;IN ULONG BytesToWrite,&lt;br /&gt;&amp;nbsp;OUT PULONG BytesWritten&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;NTSTATUS rc;&lt;br /&gt;&amp;nbsp;NTSTATUS rc2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHAR Attack_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp;CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp;PEPROCESS Process;&lt;br /&gt;&amp;nbsp;char *nameptr;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;GetProcessName( Caller_Process_Name ); &lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;rc2 = ObReferenceObjectByHandle(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;hProcess,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PROCESS_ALL_ACCESS,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NULL,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;KernelMode,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(void *)&amp;amp;Process,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NULL);&lt;br /&gt;&amp;nbsp;if(NT_SUCCESS(rc2))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp; strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; ObDefreferenceObject(Process);&lt;br /&gt;&amp;nbsp; if(!strncmp(Target_Process_Name,MYPROCESS,strlen(MYPROCESS)))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;return STATUS_UNSUCCESSFUL;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;rc = ((ZWWRITEVIRTUALMEMORY)(OldZwWriteVirtualMemory)) ( &lt;br /&gt;&amp;nbsp; hProcess,&lt;br /&gt;&amp;nbsp; BaseAddress,&lt;br /&gt;&amp;nbsp; Buffer,&lt;br /&gt;&amp;nbsp; BytesToWrite,&lt;br /&gt;&amp;nbsp; BytesWritten); &lt;br /&gt;&amp;nbsp;return rc;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;ZwReadVirtualMemory Hook : &lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;NTSTATUS NTAPI NewZwReadVirtualMemory(&lt;br /&gt;&amp;nbsp;IN HANDLE hProcess,&lt;br /&gt;&amp;nbsp;IN PVOID BaseAddress,&lt;br /&gt;&amp;nbsp;OUT PVOID Buffer,&lt;br /&gt;&amp;nbsp;IN ULONG BytesToRead,&lt;br /&gt;&amp;nbsp;OUT PULONG BytesRead&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;NTSTATUS rc;&lt;br /&gt;&amp;nbsp; NTSTATUS rc2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHAR Caller_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp;CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp;PEPROCESS Process;&lt;br /&gt;&amp;nbsp;char *nameptr;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;GetProcessName( Caller_Process_Name );&amp;nbsp; &lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;rc2 = ObReferenceObjectByHandle(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;hProcess,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PROCESS_ALL_ACCESS,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NULL,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;KernelMode,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(void *)&amp;amp;Process,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NULL);&lt;br /&gt;&amp;nbsp;if(NT_SUCCESS(rc2))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp; strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; ObDefreferenceObject(Process);&lt;br /&gt;&amp;nbsp; if(!strncmp(Target_Process_Name,MYPROCESS,strlen(MYPROCESS)))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return STATUS_INVALID_HANDLE;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;rc = ((ZWREADVIRTUALMEMORY)(OldZwReadVirtualMemory)) ( &lt;br /&gt;&amp;nbsp; &amp;nbsp;hProcess,&lt;br /&gt;&amp;nbsp; &amp;nbsp;BaseAddress,&lt;br /&gt;&amp;nbsp; &amp;nbsp;Buffer,&lt;br /&gt;&amp;nbsp; &amp;nbsp;BytesToRead,&lt;br /&gt;&amp;nbsp; &amp;nbsp;BytesRead); &lt;br /&gt;&amp;nbsp;return rc;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;여섯번쨰로 &lt;STRONG&gt;디버깅 차단&lt;/STRONG&gt;은 코드에 안티 디버깅 루틴을 삽입과 후킹을 사용합니다.&lt;br /&gt;안티 디버깅 루틴을 먼저 다루어 보면, &lt;br /&gt;첫번쨰로 IsDebuggerPresent() 함수를 이용한 방법이 있는데,&lt;br /&gt;IsDebuggerPresent()함수는 kernel32.dll에 의해 export되어지는 함수로써,&lt;br /&gt;해당 함수를 호출한 프로세스가 디버깅 당하는 중이면 TRUE(1)을,&lt;br /&gt;아닐 경우는 FALSE(0)을 반환하는 함수이다. 즉 이 함수를 주기적으로 호출하여&lt;br /&gt;줌으로써 디버깅 여부를 확인할 수 있다. 코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;if(IsDebuggerPresent())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; OutputDebugString(&quot;Debugeed!!&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; //디버깅 당하는 중일떄의 어떠한 처리&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;두번쨰 방법으로 PEB 구조체의 BeingDebuggged 값을 직접 조작하는 방법이 있다.&lt;br /&gt;IsDebuggerPresent()함수는 내부적으로, PEB의 BeingDebugged값을 읽어서 리턴&lt;br /&gt;하여 주는 함수입니다. 즉 IsDebuggerPresent()함수를 호출하지 않고, 직접&lt;br /&gt;PEB의 BeingDebugged의 값을 읽어와도 결과는 같다는 소리입니다.&lt;br /&gt;다음은 PEB의 BeingDebugged의 값을 읽어오는 함수 입니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL Pesudo_IsDebuggerPresent()&lt;br /&gt;{&lt;br /&gt;BOOL Retval = 0;&lt;br /&gt;&amp;nbsp; __asm&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; push eax&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax,dword ptr fs:{0x18]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax,dword ptr ds:[eax+0x30]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; movzx eax,byte ptr ds:[eax+0x2]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mov Retval,eax&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; pop eax&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return Retval;&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;세번쨰 방법으로 CheckRemoteDebuggerPresent() 함수를 이용하는 방법이 있습니다.&lt;br /&gt;이 함수는 함수를 호출하는 프로세스 자신외에도, 타 프로세스에도 사용이 가능합니다.&lt;br /&gt;다음과 같이 사용합니다. &lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL CheckDebugger(HANDLE hProcess) 
&lt;P&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; BOOL Retval = 0;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; CheckRemoteDebuggerPresent(hProcess,&amp;amp;Retval);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return Retval;&lt;br /&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;* CheckRemoteDebuggerPresent()는 NTAPI의 ZwQueryInformationProcess()로&lt;br /&gt;연결됩니다. ZwQueryInformationProcess()는 다음과 같은 호출 인자를 갖는 함수입니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;NTSTATUS NTAPI ZwQueryInformationProcess(HANDLE ProcessHandle,&lt;br /&gt;&amp;nbsp; &amp;nbsp; PROCESSINFOCLASS ProcessInformationClass,&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID ProcessInformation,&lt;br /&gt;&amp;nbsp; &amp;nbsp; ULONG ProcessInformationLength,&lt;br /&gt;&amp;nbsp; &amp;nbsp; PULONG ReturnLength);&lt;/DIV&gt;
&lt;P&gt;첫번쨰는 질의 하고자 하는 대상 프로세스의 핸들.&lt;br /&gt;두번쨰는 질의 하고자 하는 내용(디버깅 여부는 ProcessDebugPort)&lt;br /&gt;세번쨰는 결과&lt;br /&gt;네번쨰는 길이&lt;br /&gt;다섯번쨰는 실반환 길이이다.&lt;br /&gt;해당 함수를 직접 호출하는 것도 하나의 방법이 될 수 있을 것입니다.&lt;br /&gt;&lt;br /&gt;네번쨰 방법으로 NtGlobalFlag의 값을 확인하는 방법이 있다.&lt;br /&gt;디버거가 프로세스를 디버깅 할때는, 셋되어 지는 Flag들이 있는데, NtGlobalFlag는&lt;br /&gt;그 중 하나이다. 코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;BOOL CheckNtGlobalFlag()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; BOOL Retval = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; __asm&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push eax &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax,dword ptr fs:[0x30]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov eax,0x68&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; mov eax,dword ptr ds:[eax]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp eax,0x70&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pop eax&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jne NotDebuged&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov Retval,1&lt;br /&gt;NotDebugged : &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nop&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; return Retval;&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;다섯번쨰 방법으로 Heap flags를 이용하는 방법이 있습니다. Heap의 상태가 디버그&lt;br /&gt;되지 않고 있는 평소 상태와 다른지를 확인하는 것은 강력한 안티디버그 메소드가 될&lt;br /&gt;수 있습니다. 예를들면, 힙 해더에 있는 ForceFlags(오프셋 0x10)은 디버거의 존재&lt;br /&gt;여부를 확인하기 위해 쓰일 수 있습니다.대략적인 코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;mov eax, fs:[30h] &lt;br /&gt;mov eax, [eax+18h] ;process heap &lt;br /&gt;mov eax, [eax+10h] ;heap flags &lt;br /&gt;test eax, eax &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;여섯번쨰 방법으로 UnhandledExceptionFilter를 이용하는 방법이 있습니다. &lt;br /&gt;SEH 핸들러의 주소로 디버거가 없을시 실행할 코드로 넣어주고, &lt;br /&gt;고의적으로 예외를 발생시키어, 디버거가 있는지 없는지를 확인하여 주는&lt;br /&gt;방법입니다. (디버거가 존재함으로, SEH 핸들러로 넘어 가지 않고, 다음 명령을&lt;br /&gt;실행 시키게 되는점을 이용) 코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;push @not_debugged &lt;br /&gt;call SetUnhandledExceptionFilter &lt;br /&gt;xor eax, eax &lt;br /&gt;mov eax, dword [eax] ; trigger exception &lt;br /&gt;;program terminated if debugged &lt;br /&gt;;... &lt;br /&gt;@not_debugged: &lt;br /&gt;;process the exception &lt;br /&gt;;continue the execution &lt;br /&gt;;...&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;일곱번째로 NtSetInformationThread를 이용하는 방법이 있습니다. ThreadInformationClass 가 0x11 (ThreadHideFromDebugger 상수)로 지정되고 &lt;br /&gt;호출되면, 스레드는 디버거로부터 분리 될 것입니다. (ThreadHideFromDebugger는&lt;br /&gt;ETHREAD의 필드중에 하나죠.) 코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;Example: &lt;br /&gt;push 0 &lt;br /&gt;push 0 &lt;br /&gt;push 11h ;ThreadHideFromDebugger &lt;br /&gt;push -2 &lt;br /&gt;call NtSetInformationThread &lt;br /&gt;;thread detached if debugged &lt;br /&gt;;...&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;여덟번쨰로 kernel32!CloseHandle and NtClose 를 이용하는 방법이 있습니다.&lt;br /&gt;프로세스가 디버그될 떄, ZwClose() 를 잘못된 핸들을 주고 호출하는 것은&lt;br /&gt;STATUS_INVALID_HANDLE(0xC0000008) 예외를 발생 시킵니다.&lt;br /&gt;디버깅 당하고 있다면, CloseHandle()를 호출하는 다음줄의 코드를 발생시킬 것이고,&lt;br /&gt;디버깅 되고 있지 않다면, SEH핸들러가 호출될 것임을 이용한 방법입니다.&lt;br /&gt;코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;push offset @not_debugged &lt;br /&gt;push dword fs:[0] &lt;br /&gt;mov fs:[0], esp &lt;br /&gt;push 1234h ;invalid handle &lt;br /&gt;call CloseHandle &lt;br /&gt;; if fall here, process is debugged &lt;br /&gt;;... &lt;br /&gt;@not_debugged: &lt;br /&gt;;...&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;아홉번쨰로 OutputDebugStringA를 이용하는 간단한 방법도 있습니다. &lt;br /&gt;OutputDebugString()함수가 성공적으로 수행되는지, 안되는지 (리턴값)을 확인하는 &lt;br /&gt;방법입니다. 코드는 다음과 같습니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;xor eax, eax &lt;br /&gt;push offset szHello &lt;br /&gt;call OutputDebugStringA &lt;br /&gt;cmp eax, 1 &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;/DIV&gt;
&lt;P&gt;앞서 말한 방법들을 모두 TLS Callback으로써 등록하여 작동시킬수도 있습니다.&lt;br /&gt;TLS Callback은 스텔스하게 안티 디버그 코드를 실행시킬 수 있는 방법으로 사용될 &lt;br /&gt;수 있는데, 단지 안티 디버그 코드를 프로그램에 넣어놓고, 헥스 에디터등을 이용하여&lt;br /&gt;PE해더의 Thread Local Storage entry (PE optional header에서 10번째 디렉토리 엔트리 &lt;br /&gt;에 있는) 의 값을 코드의 주소로 바꾸어줌으로써, 안티 디버그 코드가 프로그램의&lt;br /&gt;엔트리 포인트가 실행되기전에, 실행 되도록 만들어 줄 수 있습니다.&lt;br /&gt;&lt;br /&gt;열번째 방법으로 커널레벨에서 확인하는 방법으로써, &amp;nbsp;보호하고자 하는 프로세스의&lt;br /&gt;EPROCESS에 debug port의 값을 확인하는 방법이 있습니다. debug port의 값은 &lt;br /&gt;디버깅 되고 있지 않을떄는 0이며, 디버깅 될때에는 0이 아닙니다. 이 점을 이용해서&lt;br /&gt;디버깅 여부를 확인하고 싶은 프로세스의 EPROCESS 스트럭쳐의 debug port값을&lt;br /&gt;확인하는 것은 아주 강력한 안티 디버그 방법으로서 사용될 수 있습니다.&lt;br /&gt;이 밖에도 훨씬 많은 안티 디버깅 방법들이 존재하며,&lt;br /&gt;나머지 목록및 더 자세한 설명은 다음페이지를 참조하시기 바랍니다.&lt;br /&gt;&lt;A href=&quot;http://dual5651.hacktizen.com/tt/entry/Windows-Anti-Debug-Reference&quot;&gt;http://dual5651.hacktizen.com/tt/entry/Windows-Anti-Debug-Reference&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;이렇게 많은 안티 디버깅 루틴이 존재하지만, 안티 디버깅 루틴만으로 충분한 것은&lt;br /&gt;아닙니다. 위에서 말했듯이, 후킹 역시 중요한 부분을 차지 합니다.&lt;br /&gt;DebugActiveProcess() 같은 함수를 필수적으로 후킹해 주어서 디버거가 붙는&lt;br /&gt;자체를 차단해 주어야 합니다. 또 게임을 바로 실행시키는 방식이 아닌,&lt;br /&gt;로더를 거치는 방식을 사용하여, CreateProcess()에 DEBUG_ONLY_THIS_PROCESS&lt;br /&gt;같은 옵션을 가지고 임으로 사용되는 것을 막아주어야 합니다.&lt;br /&gt;&lt;br /&gt;여덟번쨰로 필요한 기능인 &lt;STRONG&gt;무결성 검사&lt;/STRONG&gt;의 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;#include &quot;stdafx.h&quot;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;int a;&lt;br /&gt;&amp;nbsp;DWORD checksum = 0xE1E4CDE2;&lt;br /&gt;&amp;nbsp;__asm&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; pushad&lt;br /&gt;&amp;nbsp; pushfd&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; mov esi,offset StartAddressOfCheck&lt;br /&gt;&amp;nbsp; mov ecx,offset EndAddressOfCheck&lt;br /&gt;&amp;nbsp; sub ecx,offset StartAddressOfCheck&lt;br /&gt;&amp;nbsp; xor eax,eax&lt;br /&gt;&amp;nbsp; xor ebx,ebx&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; Check_Loop:&lt;br /&gt;&amp;nbsp; &amp;nbsp; mov ebx, [esi]&lt;br /&gt;&amp;nbsp; &amp;nbsp; add eax,ebx&lt;br /&gt;&amp;nbsp; &amp;nbsp; rol eax,1&lt;br /&gt;&amp;nbsp; &amp;nbsp; inc esi&lt;br /&gt;&amp;nbsp; &amp;nbsp; loop Check_Loop&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; cmp eax,checksum&lt;br /&gt;&amp;nbsp; &amp;nbsp; jne EndAddressOfCheck //코드 조작 감지&lt;br /&gt;&amp;nbsp; &amp;nbsp; popfd&lt;br /&gt;&amp;nbsp; &amp;nbsp; popad&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;StartAddressOfCheck:&lt;br /&gt;&amp;nbsp;a = 5;&lt;br /&gt;&amp;nbsp;if(a &amp;gt; 10)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; MessageBox(NULL,&quot;You beat this program!!&quot;,&quot;Congratulation&quot;,64);&lt;br /&gt;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; MessageBox(NULL,&quot;a 변수의 값이 10보다 작습니다.&quot;,&quot;ashole!&quot;,MB_ICONWARNING);&lt;br /&gt;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;EndAddressOfCheck:&lt;br /&gt;&amp;nbsp;__asm&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; popfd&lt;br /&gt;&amp;nbsp; popad&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;MessageBox(NULL,&quot;You can`t beat this program sxxker!!&quot;,&quot;Cracker!!&quot;,MB_ICONWARNING);&lt;br /&gt;&amp;nbsp;return 0;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;StartAddressOfCheck 로 부터 EndAddressOfCheck 까지의 명령어들의 합산값을 &lt;br /&gt;미리 계산하여 두고, 프로그램을 실행할 떄에, 그값이 기존의 값과 같은지 여부를&lt;br /&gt;확인하여 변조되었는지를 확인하는 방법입니다. 이 확인하는 루틴을 별도의 스레드를&lt;br /&gt;만들어 와일을 돌리거나, 타이머를 이용하는 방법으로, 코드의 지속적인 감시도 가능합니다.&lt;br /&gt;단, 명령코드의 합산은 현재 코드가 존재하는 주소에 의해서도 영향을 받기 떄문에,&lt;br /&gt;컴파일 모드가 디버그 인지, 릴리즈 인지, StartAddressOfCheck앞에 새로운 코드나&lt;br /&gt;문자열등 StartAddressOfCheck의 주소에 영향을 줄 수 있는 변수가 있으면, 새롭게&lt;br /&gt;checksum 값을 계산하여 상수값으로 주어야 합니다. 다소 귀찮은 면이 있지만,&lt;br /&gt;프로그램을 안전하게 보호하는데 한 역활을 할 수 있습니다. 위의 코드는 프로세스에&lt;br /&gt;대한 검사이지만, 파일에 대해서도 쉽게 적용할 수 있을 것입니다. (ReadFile())&lt;br /&gt;또, 조금만 생각해보면, 게임에 무결성 체크 코드를 넣지 않아도, Anti GH 프로그램에서&lt;br /&gt;ReadProcessMemory()함수를 이용하여 체크할수도 있을 것입니다.&lt;br /&gt;&lt;br /&gt;아홉번쨰로 필요한 기능인 &lt;STRONG&gt;시스템 디스크립터&lt;/STRONG&gt; &lt;STRONG&gt;복구&lt;/STRONG&gt;이 의미하는 것은 Rootkit에&lt;br /&gt;의해 변조되어 있을, 디스크립터들(ex: SSDT, IDT, and so on..)을 의미 합니다.&lt;br /&gt;SSDT 나 IDT의 변조여부는 어떻게 확인하는가? 원리는 간단합니다.&lt;br /&gt;SSDT나 IDT는 기본적으로 ntoskrnl.exe의 메모리 영역에 속함으로,&lt;br /&gt;각 모듈들의 시작주소와 끝주소들을 구해놓고, 만약 백터나 디스패쳐의 주소가&lt;br /&gt;ntoskrnl.exe의 시작주소와 끝주소 사이에 있지 않다면, 이는 변조된 것으로&lt;br /&gt;판단하면 됩니다. 코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;PMODULE_LIST GetListOfModules(PNTSTATUS pns)&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;{&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; ULONG ul_NeededSize;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; ULONG *pul_ModuleListAddress = NULL;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; NTSTATUS &amp;nbsp; &amp;nbsp; ns;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; PMODULE_LIST pml = NULL;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; // Call it the first time to determine the size required&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; // to store the information.&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; ZwQuerySystemInformation(SystemModuleInformation,&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;amp;ul_NeededSize,&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0,&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;amp;ul_NeededSize);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; pul_ModuleListAddress = (ULONG *) ExAllocatePool(PagedPool, ul_NeededSize);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; if (!pul_ModuleListAddress) // ExAllocatePool failed.&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (pns != NULL)&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *pns = STATUS_INSUFFICIENT_RESOURCES;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (PMODULE_LIST) pul_ModuleListAddress;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; ns = ZwQuerySystemInformation(SystemModuleInformation,&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pul_ModuleListAddress,&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ul_NeededSize,&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; if (ns != STATUS_SUCCESS)// ZwQuerySystemInformation failed.&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Free allocated paged kernel memory.&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ExFreePool((PVOID) pul_ModuleListAddress);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (pns != NULL)&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; *pns = ns;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return NULL;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; pml = (PMODULE_LIST) pul_ModuleListAddress;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; if (pns != NULL)&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; *pns = ns;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; return pml;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;}&lt;br /&gt;&lt;br /&gt;..................&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; g_pml = GetListOfModules(&amp;amp;ns);&lt;br /&gt;&amp;nbsp;&amp;nbsp; if(!g_pml)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; DbgPrint(&quot;Get Failed&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for(count = 0; count &amp;lt; g_pml-&amp;gt;d_Modules; count++)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; if(!_stricmp(&quot;ntoskrnl.exe&quot;,g_pml-&amp;gt;a_Modules[count].a_bPath+g_pml-&amp;gt;a_Modules[count].w_NameOffset))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;g_NTOSKRNL.Base = (ULONG)g_pml-&amp;gt;a_Modules[count].pBase;&lt;br /&gt;&amp;nbsp; &amp;nbsp;g_NTOSKRNL.End = ((ULONG)g_pml-&amp;gt;a_Modules[count].pBase + g_pml-&amp;gt;a_Modules[count].d_Size);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;위의 코드로 ntoskrnl.exe의 시작주소와 끝주소를 알 수 있으며, SSDT와 IDT를&lt;br /&gt;끝번호까지 돌면서, ntoskrnl.exe에 속하는지만 확인하여 주면 됩니다.&lt;br /&gt;만약, 이런식으로 루프를 돌다가 변조된 것이 발견되면 어떻게 복구해야할까요?&lt;br /&gt;그것에 대해서는 &lt;br /&gt;&lt;A href=&quot;http://dual5651.hacktizen.com/tt/entry/SSDT-후킹-무력화에-대한&quot;&gt;http://dual5651.hacktizen.com/tt/entry/SSDT-후킹-무력화에-대한&lt;/A&gt;&lt;U&gt;&lt;FONT color=#0000ff&gt;-연구&lt;/FONT&gt;&lt;/U&gt;&lt;br /&gt;의 SSDT Restore에 대해서 읽어보시고, 코드를 참조하시면 됩니다.&lt;br /&gt;&lt;br /&gt;목차에는 없지만 최근 많이 사용되고 있는 프로세스 숨기기에 대해서도 간단히&lt;br /&gt;다루어 보겠습니다. 첫번째로 사용할 수 있는 방법으로서 커널단에서&lt;br /&gt;ZwQuerySystemInformation() 이라는 함수를 후킹하는 방법이 있습니다.&lt;br /&gt;코드는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;NTSTATUS NTAPI NewZwQuerySystemInformation(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IN ULONG SystemInformationClass,&lt;br /&gt;&amp;nbsp; &amp;nbsp;IN PVOID SystemInformation,&lt;br /&gt;&amp;nbsp; &amp;nbsp;IN ULONG SystemInformationLength,&lt;br /&gt;&amp;nbsp; &amp;nbsp;OUT PULONG ReturnLength&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;NTSTATUS rc;&lt;br /&gt;&amp;nbsp;CHAR Attack_Process_Name[PROCNAMELEN];&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;GetProcessName( Attack_Process_Name );&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;rc = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (&lt;br /&gt;&amp;nbsp; &amp;nbsp;SystemInformationClass,&lt;br /&gt;&amp;nbsp; &amp;nbsp;SystemInformation,&lt;br /&gt;&amp;nbsp; &amp;nbsp;SystemInformationLength,&lt;br /&gt;&amp;nbsp; &amp;nbsp;ReturnLength );&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;if( NT_SUCCESS( rc ) &amp;amp;&amp;amp; strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1)) &lt;br /&gt;&amp;nbsp;{&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; if(5 == SystemInformationClass)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;&lt;br /&gt;&amp;nbsp; &amp;nbsp;struct _SYSTEM_PROCESSES *prev = NULL;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp;while(curr)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; ANSI_STRING process_name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ANSI_STRING ANSI_Enemy_Name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; UNICODE_STRING Enemy_Name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RtlUnicodeStringToAnsiString( &amp;amp;process_name, &amp;amp;(curr-&amp;gt;ProcessName), TRUE);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if( (255 &amp;gt; process_name.Length) &amp;amp;&amp;amp; (0 &amp;lt; process_name.Length) )&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if(0 == strncmp( process_name.Buffer, ProcessName, NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //DbgPrint(&quot;[Alarm] ProcessScan Detected\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //DbgPrint(&quot;Called by %s\n&quot;,Attack_Process_Name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(prev)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(curr-&amp;gt;NextEntryDelta)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prev-&amp;gt;NextEntryDelta += curr-&amp;gt;NextEntryDelta;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prev-&amp;gt;NextEntryDelta = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(curr-&amp;gt;NextEntryDelta)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(char *)SystemInformation += curr-&amp;gt;NextEntryDelta;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SystemInformation = NULL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; RtlFreeAnsiString(&amp;amp;process_name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; prev = curr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(curr-&amp;gt;NextEntryDelta) ((char *)curr += curr-&amp;gt;NextEntryDelta);&lt;br /&gt;&amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;curr = NULL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;return rc;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;NtUserQueryWindow(), NtUserBuildHwndList(), NtUserFindWindowEx(),&lt;br /&gt;NtUserGetForegroundWindow() 라는 함수들은 창의 핸들과 관련이 있는 함수들입니다.&lt;br /&gt;창의 핸들을 획득하는 것을 차단하기 위해 위의 함수들을 후킹하는 코드 입니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;UINT_PTR NewNtUserQueryWindow(IN ULONG WindowHandle,IN ULONG TypeInformation)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; ULONG WindowHandleProcessID;&lt;br /&gt;&amp;nbsp; &amp;nbsp; CHAR Attack_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; PEPROCESS Process;&lt;br /&gt;&amp;nbsp; &amp;nbsp; char *nameptr;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GetProcessName(Attack_Process_Name);&lt;br /&gt;&amp;nbsp;if(strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; WindowHandleProcessID = ((NTUSERQUERYWINDOW)(WINDOWSERVICEIDX(483)))(WindowHandle,0);&lt;br /&gt;&amp;nbsp; if(PsLookupProcessByProcessId((HANDLE)WindowHandleProcessID,&amp;amp;Process) == STATUS_SUCCESS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;ObDereferenceObject(Process);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp; &amp;nbsp;strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; &amp;nbsp;Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(!strncmp(Target_Process_Name,ProcessName,NT_PROCNAMELEN-1) || WindowHandleProcessID == SaruenProcessID)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;br /&gt;&amp;nbsp;return OldNtUserQueryWindow(WindowHandle,TypeInformation);&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;NTSTATUS NewNtUserBuildHwndList(IN HDESK hdesk, IN HWND hwndNext, IN ULONG fEnumChildren, IN DWORD idThread, IN UINT cHwndMax, OUT HWND *phwndFirst, OUT ULONG* pcHwndNeeded)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;NTSTATUS result;&lt;br /&gt;&amp;nbsp; &amp;nbsp; CHAR Attack_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp;CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp;ULONG ProcessID;&lt;br /&gt;&amp;nbsp;PEPROCESS Process;&lt;br /&gt;&amp;nbsp;char *nameptr;&lt;br /&gt;&amp;nbsp;ULONG i = 0,j;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; GetProcessName(Attack_Process_Name);&lt;br /&gt;&amp;nbsp;if(strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; if(fEnumChildren == 1)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;ProcessID = OldNtUserQueryWindow((ULONG)hwndNext,0);&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(PsLookupProcessByProcessId((HANDLE)ProcessID,&amp;amp;Process) == STATUS_SUCCESS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; ObDereferenceObject(Process);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; &amp;nbsp; Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(!strncmp(Target_Process_Name,ProcessName,NT_PROCNAMELEN-1) || ProcessID == SaruenProcessID)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return STATUS_UNSUCCESSFUL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; result=((NTUSERBUILDHWNDLIST)(WINDOWSERVICEIDX(312)))(hdesk,hwndNext,fEnumChildren,idThread,cHwndMax,phwndFirst,pcHwndNeeded);&lt;br /&gt;&amp;nbsp; if (result == STATUS_SUCCESS)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;while (i&amp;lt;*pcHwndNeeded)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; ProcessID=OldNtUserQueryWindow((ULONG)phwndFirst[i],0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(PsLookupProcessByProcessId((HANDLE)ProcessID,&amp;amp;Process) == STATUS_SUCCESS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ObDereferenceObject(Process);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if(!strncmp(Target_Process_Name,ProcessName,NT_PROCNAMELEN))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; for (j=i; j&amp;lt;(*pcHwndNeeded)-1; j++) &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; phwndFirst[j]=phwndFirst[j+1]; &lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; phwndFirst[*pcHwndNeeded-1]=0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (*pcHwndNeeded)--;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; continue;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; i++;&lt;br /&gt;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return result;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;return OldNtUserBuildHwndList(hdesk,hwndNext,fEnumChildren,idThread,cHwndMax,phwndFirst,pcHwndNeeded);&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;ULONG NewNtUserFindWindowEx(IN HWND hwndParent, IN HWND hwndChild, IN PUNICODE_STRING pstrClassName OPTIONAL, IN PUNICODE_STRING pstrWindowName OPTIONAL, IN DWORD dwType)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;ULONG result;&lt;br /&gt;&amp;nbsp;ULONG ProcessID;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PEPROCESS Process;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *nameptr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHAR Attack_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GetProcessName(Attack_Process_Name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;result=OldNtUserFindWindowEx(hwndParent,hwndChild,pstrClassName,pstrWindowName,dwType);&lt;br /&gt;&amp;nbsp; &amp;nbsp;return result;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; result = ((NTUSERFINDWINDOWEX)(WINDOWSERVICEIDX(378)))(hwndParent,hwndChild,pstrClassName,pstrWindowName,dwType);&lt;br /&gt;&amp;nbsp; if(strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ProcessID = OldNtUserQueryWindow(result,0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if(PsLookupProcessByProcessId((HANDLE)ProcessID,&amp;amp;Process) == STATUS_SUCCESS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp;&amp;nbsp; strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; if(!strncmp(Target_Process_Name,ProcessName,NT_PROCNAMELEN-1) || ProcessID == SaruenProcessID)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;result=0;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; ObDereferenceObject(Process);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;return result;&lt;br /&gt;}&lt;/DIV&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;ULONG NewNtUserGetForegroundWindow(VOID)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;ULONG result;&lt;br /&gt;&amp;nbsp;ULONG ProcessID;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PEPROCESS Process;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *nameptr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHAR Attack_Process_Name[PROCNAMELEN]; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHAR Target_Process_Name[PROCNAMELEN]; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GetProcessName(Attack_Process_Name);&lt;br /&gt;&amp;nbsp; if(!strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;result=OldNtUserGetForegroundWindow();&lt;br /&gt;&amp;nbsp; &amp;nbsp;return result;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; result = ((NTUSERGETFOREGROUNDWINDOW)(WINDOWSERVICEIDX(404)))();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(strncmp(Attack_Process_Name,ProcessName,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ProcessID = OldNtUserQueryWindow(result,0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if(PsLookupProcessByProcessId((HANDLE)ProcessID,&amp;amp;Process) == STATUS_SUCCESS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; nameptr = (PCHAR)Process + gProcessNameOffset;&lt;br /&gt;&amp;nbsp;&amp;nbsp; strncpy(Target_Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; Target_Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; if(!strncmp(Target_Process_Name,ProcessName,NT_PROCNAMELEN-1) || ProcessID == SaruenProcessID)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;result=LastForegroundWindow;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;LastForegroundWindow=result;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; ObDereferenceObject(Process);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;return result;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;두번쨰로 사용할 수 있는게 DKOM입니다. DKOM은 예외경우가 많이 발생할 수 있음으로,&lt;br /&gt;필드 프로그램에서 사용할 떄에는, 신중에 신중을 고려하여야 할 부분입니다.&lt;br /&gt;&lt;br /&gt;첫번째로 가장 많이 알려진 DKOM적 방법인 EPROCESS LINK를 끊는 방법입니다.&lt;br /&gt;먼저 숨기고자 하는 프로세스 이름으로 EPROCESS를 찾는 함수 입니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;PEPROCESS&lt;br /&gt;FindProcessByName(char *Name)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;PLIST_ENTRY start_plist,plist_hTable = NULL;&lt;br /&gt;&amp;nbsp;ULONG *d_pid;&lt;br /&gt;&amp;nbsp;PEPROCESS eproc;&lt;br /&gt;&amp;nbsp;char *nameptr;&lt;br /&gt;&amp;nbsp;CHAR Process_Name[NT_PROCNAMELEN];&lt;br /&gt;&amp;nbsp;NTSTATUS rc;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;plist_hTable = (PLIST_ENTRY)((*(ULONG*)&lt;br /&gt;&amp;nbsp; ((ULONG)PsInitialSystemProcess + 0xC4)) + 0x1C);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;start_plist = plist_hTable;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;br /&gt;&amp;nbsp;do &lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; d_pid = (ULONG*)(((ULONG)plist_hTable + 0x8)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 0x1C);&lt;br /&gt;&amp;nbsp; rc = PsLookupProcessByProcessId((HANDLE)*d_pid,&amp;amp;eproc);&lt;br /&gt;&amp;nbsp; if(eproc &amp;amp;&amp;amp; NT_SUCCESS(rc))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;nameptr = (PCHAR)eproc + gProcessNameOffset;&lt;br /&gt;&amp;nbsp; &amp;nbsp;strncpy(Process_Name, nameptr, NT_PROCNAMELEN);&lt;br /&gt;&amp;nbsp; &amp;nbsp;Process_Name[NT_PROCNAMELEN] = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;ObDereferenceObject(eproc);&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(!strncmp(Process_Name,Name,NT_PROCNAMELEN-1))&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return eproc;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;// DbgPrint(&quot;%s\n&quot;,Process_Name);&lt;br /&gt;&amp;nbsp; plist_hTable = plist_hTable-&amp;gt;Flink; &amp;nbsp; &lt;br /&gt;&amp;nbsp;}while(start_plist != plist_hTable);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;return 0;&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;그후에는 다음과 같은 코드로 숨킬 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;PEPROCESS MyProcess;&lt;br /&gt;PLIST_ENTRY plist_active_procs;&lt;br /&gt;&lt;br /&gt;MyProcess = FindProcessByName(ProcessName);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(MyProcess)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;plist_active_procs = (LIST_ENTRY *)((DWORD)MyProcess + 0x88);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*((DWORD *)plist_active_procs-&amp;gt;Blink) = (DWORD)plist_active_procs-&amp;gt;Flink;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*((DWORD *)plist_active_procs-&amp;gt;Flink+1) = (DWORD)plist_active_procs-&amp;gt;Blink;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;plist_active_procs-&amp;gt;Flink = (LIST_ENTRY *) &amp;amp;(plist_active_procs-&amp;gt;Flink);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;plist_active_procs-&amp;gt;Blink = (LIST_ENTRY *) &amp;amp;(plist_active_procs-&amp;gt;Flink);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;위의 코드에 다음과 같은 한줄을 붙여넣음으로서, 보호하고자 하는 프로세스의&lt;br /&gt;PID를 0으로 만들어 접근이 불가능하게 할 수도 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;*((DWORD*)((DWORD)MyProcess+0x84)) = 0;&lt;/DIV&gt;
&lt;P&gt;csrss.exe 에서 핸들을 지우는 코드 입니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;PEPROCESS gpeproc_csrss;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; gpeproc_csrss = (PEPROCESS)FindProcessByName(&quot;csrss.exe&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(!gpeproc_csrss) gpeproc_csrss = (PEPROCESS)FindProcessByName&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (&quot;CSRSS.EXE&quot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(gpeproc_csrss) EraseHandle((PEPROCESS)gpeproc_csrss, (PVOID)MyProcess);&lt;/DIV&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;void EraseHandle(PEPROCESS eproc, PVOID tarHandle)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;PTABLE_ENTRY &amp;nbsp; orig_tableEntry, p_tableEntry, *pp_tableEntry, **ppp_tableEntry;&lt;br /&gt;&amp;nbsp;int a, b, c;&lt;br /&gt;&amp;nbsp;int i_numHandles, i_hperPage, i_numTables; &lt;br /&gt;&amp;nbsp;int i_handle;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;//DbgPrint(&quot;Hiding %x from %s process handle table.\n&quot;, tarHandle, (DWORD)eproc+gul_ProcessNameOffset);&lt;br /&gt;&amp;nbsp;i_numHandles = *(int*)((*(PDWORD)((DWORD) eproc + 0xC4)) + 0x3C);&lt;br /&gt;&amp;nbsp;orig_tableEntry = (PTABLE_ENTRY)*(PDWORD)((*(PDWORD)((DWORD) eproc + 0xC4)));&lt;br /&gt;&amp;nbsp;i_numTables = ((DWORD)orig_tableEntry &amp;amp; 3);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;i_hperPage = PAGE_SIZE/sizeof(TABLE_ENTRY); &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;if (i_numTables == 0)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; //DbgPrint(&quot;Found a single level handle table.\n&quot;);&lt;br /&gt;&amp;nbsp; p_tableEntry = (PTABLE_ENTRY)((DWORD)orig_tableEntry &amp;amp; 0xfffffff8);&lt;br /&gt;&amp;nbsp; for (a = 0; a &amp;lt; i_hperPage; a++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;if (((p_tableEntry[a].object ^ 0x80000000) &amp;amp; 0xfffffff8) == ((DWORD)tarHandle - 0x18))&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //DbgPrint(&quot;Handle = %x Object Header %x Security %x\n&quot;, a*4, ((p_tableEntry[a].object | 0x80000000) &amp;amp; 0xfffffff8), p_tableEntry[a].security);&lt;br /&gt;&amp;nbsp; &amp;nbsp; p_tableEntry[a].object = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; p_tableEntry[a].security = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else if (i_numTables == 1)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; //DbgPrint(&quot;Found a two level handle table.\n&quot;);&lt;br /&gt;&amp;nbsp; pp_tableEntry = (PPTABLE_ENTRY)((DWORD)orig_tableEntry &amp;amp; 0xfffffff8);&lt;br /&gt;&amp;nbsp; for (a = 0; a &amp;lt; i_hperPage; a++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;if (pp_tableEntry[a] == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp;for (b = 0; b &amp;lt; i_hperPage; b++)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (((pp_tableEntry[a][b].object ^ 0x80000000) &amp;amp; 0xfffffff8) == ((DWORD)tarHandle - 0x18))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;//DbgPrint(&quot;Handle = %x Object Header %x Security %x\n&quot;, ((a*512)+b)*4, ((pp_tableEntry[a][b].object | 0x80000000) &amp;amp; 0xfffffff8), pp_tableEntry[a][b].security);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pp_tableEntry[a][b].object = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pp_tableEntry[a][b].security = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else if (i_numTables == 2)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; //DbgPrint(&quot;Found a three level handle table.\n&quot;);&lt;br /&gt;&amp;nbsp; ppp_tableEntry = (PPPTABLE_ENTRY)((DWORD)orig_tableEntry &amp;amp; 0xfffffff8);&lt;br /&gt;&amp;nbsp; for (a = 0; a &amp;lt; i_hperPage; a++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;if (ppp_tableEntry[a] == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp;for (b = 0; b &amp;lt; i_hperPage; b++)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (ppp_tableEntry[a][b] == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; for (c = 0; c &amp;lt; i_hperPage; c++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (((ppp_tableEntry[a][b][c].object ^ 0x80000000) &amp;amp; 0xfffffff8) == ((DWORD)tarHandle - 0x18))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //DbgPrint(&quot;Handle = %x Object Header %x Security %x\n&quot;, ((a*512)+(b*256)+c)*4, ((ppp_tableEntry[a][b][c].object | 0x80000000) &amp;amp; 0xfffffff8), ppp_tableEntry[a][b][c].security);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ppp_tableEntry[a][b][c].object = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ppp_tableEntry[a][b][c].security = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;PspCidTable에서 오브젝트를 지우는 함수 입니다.&lt;br /&gt;&lt;br /&gt;먼저 다음과 같이 PspCidTable을 지우는 함수를 먼저 호출 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;DWORD gcid_table;&lt;br /&gt;&lt;br /&gt;gcid_table = GetPspCidTable();&lt;br /&gt;&lt;br /&gt;DWORD&lt;br /&gt;GetPspCidTable()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; PVOID pPspCidTable = NULL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ULONG i;&lt;br /&gt;&amp;nbsp; &amp;nbsp; UNICODE_STRING&amp;nbsp; usPsLookup;&lt;br /&gt;&amp;nbsp; &amp;nbsp; PUCHAR Buff;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; RtlInitUnicodeString( &amp;amp;usPsLookup, L&quot;PsLookupProcessByProcessId&quot; );&lt;br /&gt;&amp;nbsp; &amp;nbsp; Buff = MmGetSystemRoutineAddress( &amp;amp;usPsLookup );&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; if( Buff != NULL )&lt;br /&gt;&amp;nbsp; &amp;nbsp; { &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for( i = 0; i &amp;lt; 0x40; i++, Buff++ )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( *(PUSHORT)(Buff) == 0x35ff &amp;amp;&amp;amp; *((PUCHAR)Buff+6) == 0xe8 )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pPspCidTable = (PVOID)(*(PULONG)(Buff+2));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; return (DWORD)pPspCidTable ? *(DWORD*)pPspCidTable : (DWORD)NULL;&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;EraseObjectFromPspCidTable(gcid_table, (PVOID)MyProcess, 0,*((DWORD*)((DWORD)MyProcess+0x84)), 0 );&lt;/DIV&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;void EraseObjectFromPspCidTable(DWORD handle_table, PVOID tarHandle, enum ObjectType obj_type, DWORD pid, DWORD tid)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;PTABLE_ENTRY &amp;nbsp; orig_tableEntry, p_tableEntry, *pp_tableEntry, **ppp_tableEntry;&lt;br /&gt;&amp;nbsp;int a, b, c;&lt;br /&gt;&amp;nbsp;int i_numHandles, i_hperPage, i_numTables; &lt;br /&gt;&amp;nbsp;int i_handle;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;i_numHandles = *(int*)(handle_table + 0x3c);&lt;br /&gt;&amp;nbsp;orig_tableEntry = (PTABLE_ENTRY)*(PDWORD)(handle_table + 0);&lt;br /&gt;&amp;nbsp;i_numTables = ((DWORD)orig_tableEntry &amp;amp; 3);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;i_hperPage = PAGE_SIZE/sizeof(TABLE_ENTRY); &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;if (i_numTables == 0)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &lt;br /&gt;// &amp;nbsp; DbgPrint(&quot;Found a single level handle table.\n&quot;);&lt;br /&gt;&amp;nbsp; p_tableEntry = (PTABLE_ENTRY)((DWORD)orig_tableEntry &amp;amp; 0xfffffff8);&lt;br /&gt;&amp;nbsp; for (a = 0; a &amp;lt; i_hperPage; a++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;if (((p_tableEntry[a].object | 0x80000000) &amp;amp; 0xfffffff8) == ((DWORD)tarHandle))&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;// &amp;nbsp; &amp;nbsp; DbgPrint(&quot;[%d]\n&quot;,a);&lt;br /&gt;// &amp;nbsp; &amp;nbsp; DbgPrint(&quot;Handle = %x Object %x Security %x\n&quot;, a*4, ((p_tableEntry[a].object | 0x80000000) &amp;amp; 0xfffffff8), p_tableEntry[a].security);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;// &amp;nbsp; &amp;nbsp; add_index(&amp;amp;g_PspCidTableList, SINGLE_LEVEL,obj_type,(DWORD)tarHandle,pid,tid, a,0, 0, p_tableEntry[a].object, p_tableEntry[a].security);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; p_tableEntry[a].object = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; p_tableEntry[a].security = ((PHANDLE_TABLE)handle_table)-&amp;gt;FirstFree;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ((PHANDLE_TABLE)handle_table)-&amp;gt;FirstFree = (ULONG)( (tid!=0) ? tid : pid );&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else if (i_numTables == 1)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;// &amp;nbsp; DbgPrint(&quot;Found a two level handle table.\n&quot;);&lt;br /&gt;&amp;nbsp; pp_tableEntry = (PPTABLE_ENTRY)((DWORD)orig_tableEntry &amp;amp; 0xfffffff8);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; for (a = 0; a &amp;lt; i_hperPage; a++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;if (pp_tableEntry[a] == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp;for (b = 0; b &amp;lt; i_hperPage; b++)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //DbgPrint(&quot;Comparing %x to %x\n&quot;, ((pp_tableEntry[a][b].object | 0x80000000) &amp;amp; 0xfffffff8), tarHandle);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (((pp_tableEntry[a][b].object | 0x80000000) &amp;amp; 0xfffffff8) == ((DWORD)tarHandle))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;DbgPrint(&quot;[%d][%d]\n&quot;,a,b);&lt;br /&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;DbgPrint(&quot;Handle = %x Object %x Security %x\n&quot;, ((a*512)+b)*4, ((pp_tableEntry[a][b].object | 0x80000000) &amp;amp; 0xfffffff8), pp_tableEntry[a][b].security);&lt;br /&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;add_index(&amp;amp;g_PspCidTableList, DOUBLE_LEVEL,obj_type,(DWORD)tarHandle, pid,tid,&amp;nbsp; a,b, 0, pp_tableEntry[a][b].object, pp_tableEntry[a][b].security);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pp_tableEntry[a][b].object = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pp_tableEntry[a][b].security = ((PHANDLE_TABLE)handle_table)-&amp;gt;FirstFree;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;((PHANDLE_TABLE)handle_table)-&amp;gt;FirstFree = (ULONG)( (tid!=0) ? tid : pid );&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else if (i_numTables == 2)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;// &amp;nbsp; DbgPrint(&quot;Found a three level handle table.\n&quot;);&lt;br /&gt;&amp;nbsp; ppp_tableEntry = (PPPTABLE_ENTRY)((DWORD)orig_tableEntry &amp;amp; 0xfffffff8);&lt;br /&gt;&amp;nbsp; for (a = 0; a &amp;lt; i_hperPage; a++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;if (ppp_tableEntry[a] == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp;for (b = 0; b &amp;lt; i_hperPage; b++)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (ppp_tableEntry[a][b] == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; for (c = 0; c &amp;lt; i_hperPage; c++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (((ppp_tableEntry[a][b][c].object | 0x80000000) &amp;amp; 0xfffffff8) == ((DWORD)tarHandle))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp; DbgPrint(&quot;Handle = %x Object %x Security %x\n&quot;, ((a*512)+(b*256)+c)*4, ((ppp_tableEntry[a][b][c].object | 0x80000000) &amp;amp; 0xfffffff8), ppp_tableEntry[a][b][c].security);&lt;br /&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp; add_index(&amp;amp;g_PspCidTableList, TRIPLE_LEVEL,obj_type, (DWORD)tarHandle, pid,tid,&amp;nbsp; a,b, c, ppp_tableEntry[a][b][c].object, ppp_tableEntry[a][b][c].security);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ppp_tableEntry[a][b][c].object = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ppp_tableEntry[a][b][c].security = ((PHANDLE_TABLE)handle_table)-&amp;gt;FirstFree;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ((PHANDLE_TABLE)handle_table)-&amp;gt;FirstFree = (ULONG)( (tid!=0) ? tid : pid );&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/DIV&gt;
&lt;P&gt;HandleListEntry 해제하는 코드 입니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;UnHookHandleListEntry((PEPROCESS)MyProcess);&lt;br /&gt;&lt;br /&gt;void UnHookHandleListEntry(PEPROCESS eproc)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;PLIST_ENTRY plist_hTable = NULL;&lt;br /&gt;&amp;nbsp;plist_hTable = (PLIST_ENTRY)((*(PDWORD)((DWORD) eproc + 0xc4)) +&amp;nbsp; 0x1c);&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;//DbgPrint(&quot;Unhooking the handle table of Process: %s\n&quot;, (DWORD)eproc+gul_ProcessNameOffset);&lt;br /&gt;&amp;nbsp;*((DWORD *)plist_hTable-&amp;gt;Blink) = (DWORD) plist_hTable-&amp;gt;Flink;&lt;br /&gt;&amp;nbsp;*((DWORD *)plist_hTable-&amp;gt;Flink+1) = (DWORD) plist_hTable-&amp;gt;Blink;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;//plist_hTable-&amp;gt;Flink = (LIST_ENTRY *) &amp;amp;(plist_hTable-&amp;gt;Flink); // Change the current LIST_ENTRY&lt;br /&gt;&amp;nbsp;//plist_hTable-&amp;gt;Blink = (LIST_ENTRY *) &amp;amp;(plist_hTable-&amp;gt;Flink); // so we don&#039;t point to crap&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;}&lt;/DIV&gt;
&lt;P&gt;프로세스에 속해 있는 스레드를 숨기는 코드 입니다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;if(gpeproc_csrss) HideThreadsInTargetProcess((PEPROCESS)MyProcess, gpeproc_csrss);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void HideThreadsInTargetProcess(PEPROCESS eproc, PEPROCESS target_eproc)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;PETHREAD start, walk;&lt;br /&gt;&amp;nbsp;DWORD check1, check2;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;if (eproc == NULL)&lt;br /&gt;&amp;nbsp; return;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;check1 = *(DWORD *)((DWORD)eproc + 0x50);&lt;br /&gt;&amp;nbsp;check2 = ((DWORD)eproc + 0x50);&lt;br /&gt;&amp;nbsp;// If check1 points back to the EPROCESS, there are no threads in the process.&lt;br /&gt;&amp;nbsp;// It must be exiting.&lt;br /&gt;&amp;nbsp;if (check1 == check2)&lt;br /&gt;&amp;nbsp; return;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;start = *(PETHREAD *)((DWORD)eproc + 0x50);&lt;br /&gt;&amp;nbsp;start = (PETHREAD)((DWORD)start - 0x1b0);&lt;br /&gt;&amp;nbsp;walk = start;&lt;br /&gt;&amp;nbsp;do&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; EraseHandle(target_eproc, walk);&lt;br /&gt;&amp;nbsp; walk = *(PETHREAD *)((DWORD)walk + 0x1b0);&lt;br /&gt;&amp;nbsp; walk = (PETHREAD)((DWORD)walk - 0x1b0);&lt;br /&gt;&amp;nbsp;}while (walk != start);&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;지금 소개한 프로세스 숨기는 코드들만 사용하여도, 충분히 강력한 효과를 내실 수 있&lt;br /&gt;을 것입니다. 하지만 꼭 명심하시기 바랍니다. DKOM을 사용할떄는 충분한 필드 테스트가&lt;br /&gt;선행되어져야 한다는 것을...&lt;br /&gt;&lt;br /&gt;여담이지만, 사실 이 글의 제목은 &#039;Anti Game hacking 프로그램이 갖추어야할 기능들과 &lt;br /&gt;약점들.&#039; 이었는데요. 글을 쓰다보니 -_-;; 필요한 기능과 코드만 다루어도 글의 길이가&lt;br /&gt;꾀 길더군요. 그래서 두편으로 나누기로 결정을 하였습니다. 그럼 다음편에서는&lt;br /&gt;Anti GH 프로그램의 약점과 그 대안에 대해서 알아보도록 하겠습니다.&lt;br /&gt;이 글에서 잘못된 부분은 &lt;A href=&quot;mailto:dual@null2root.org&quot;&gt;dual@null2root.org&lt;/A&gt; 로 알려주시거나, 이 글에 리플을 달아&lt;br /&gt;주셔도 감사하겠습니다. 그럼 이만 (__)...&lt;br /&gt;&lt;br /&gt;프로세스에서 메모리 패턴 검사 : &lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://dual5651.hacktizen.com/tc/attachment/1054726553.zip&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; SearchMemory.zip&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;윈도우,클레스 목록에서 검사 : &lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://dual5651.hacktizen.com/tc/attachment/1115096516.zip&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; SearchWindow.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;이벤트,뮤텍스,파일맵 이름 검사 : &lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://dual5651.hacktizen.com/tc/attachment/1224212485.zip&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; EventCheck.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;CRC 검사 : &lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://dual5651.hacktizen.com/tc/attachment/1353763427.zip&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; CRC_Check.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;참고 문헌 (?)&lt;br /&gt;- 추후 추가 예정.</description>
			<category>GameHacking</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/312</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/Anti-Game-hacking-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4-%EA%B0%96%EC%B6%94%EC%96%B4%EC%95%BC%ED%95%A0-%EA%B8%B0%EB%8A%A5%EB%93%A4#entry312comment</comments>
			<pubDate>Sun, 02 Dec 2007 12:58:38 +0900</pubDate>
		</item>
		<item>
			<title>CAIN을 이용한 SSL 스니핑 방법.</title>
			<link>http://dual5651.hacktizen.com/tc/entry/CAIN%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-SSL-%EC%8A%A4%EB%8B%88%ED%95%91-%EB%B0%A9%EB%B2%95</link>
			<description>&lt;A href=&quot;http://blog.naver.com/kodoi486/70024323339&quot;&gt;http://blog.naver.com/kodoi486/70024323339&lt;/A&gt;&lt;br /&gt;좋네요 -_-!! 아이디도 필이 확오네요................ㅋㅋ(자갈치아주매........)</description>
			<category>Network</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/311</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/CAIN%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-SSL-%EC%8A%A4%EB%8B%88%ED%95%91-%EB%B0%A9%EB%B2%95#entry311comment</comments>
			<pubDate>Sat, 01 Dec 2007 19:18:25 +0900</pubDate>
		</item>
		<item>
			<title>File CRC Check 검사기법 우회하기 - Target : GomEncoder</title>
			<link>http://dual5651.hacktizen.com/tc/entry/File-CRC-Check-%EA%B2%80%EC%82%AC-%EC%9A%B0%ED%9A%8C%ED%95%98%EA%B8%B0-Target-GomEncoder</link>
			<description>&lt;P&gt;Long time no see!&lt;br /&gt;Dual입니다. :0&lt;br /&gt;아주 오~~랜만에 활동시작 겸 RE에 관한 글을 써보고자 합니다.&lt;br /&gt;주제는? File CRC Check 검사 우회하기(?) 입니다.&lt;br /&gt;대상은 GomEncoder로 잡았는데요, 별 다른 이유가 있는 것은 아닙니다.&lt;br /&gt;그런데 GomEnc가 CRC 체크를 하는 이유는 모르겠습니다(바이러스에 의한 손상검사?)&lt;br /&gt;아시는 분은 댓글 좀 알려주세요. ;0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;먼저 한번 생각해 보죠.&lt;br /&gt;저번에 간단히 프로세스의 CRC체크를 우회(?)하는 방법에 대해서 다루었었습니다. &lt;br /&gt;다른 프로세스의 메모리에 CRC 체크를 하는 경우에는 메모리 관련 API들을 후킹했었죠. &lt;br /&gt;이번엔 File이니, 파일관련 API에 브레이크 포인트를 걸고 접근하면 된다는 건 &lt;br /&gt;간단하게 파악할 수 있는 요소입니다.&lt;br /&gt;&lt;br /&gt;파일관련 API라면? 아무래도 파일의 핸들을 얻기 위한 CreateFile() 이라던지,&lt;br /&gt;파일을 읽어오기 위한 ReadFile() 등이 있겠죠..?&lt;br /&gt;물런 훨씬 다양한 방법으로 파일을 읽어올수도 있겠습니다만,&lt;br /&gt;많은 Win32에플리케이션 제작자들은 해당 API를 많이 사용합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1196566084.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;452&quot; width=&quot;424&quot; /&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&lt;br /&gt;음.. 네 먼저 곰인코더라는 바탕화면에 있는 빠른실행은GomEnc.exe라는 실행파일로&lt;br /&gt;연결 되있네요. 하지만 사실은 이것은 버젼확인과 CRC체크등을 하는 런쳐일뿐,&lt;br /&gt;실제 알맹이(?)는 GomEncMain.exe입니다.&lt;br /&gt;&lt;br /&gt;이제 PEID로 GomEnc.exe 와 GomEncMain.exe의 패킹 여부를 알아 보도록 하죠. &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1032113289.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;239&quot; width=&quot;424&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1104479152.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;241&quot; width=&quot;424&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;런쳐님께선 패킹이 안되있으시고, 알맹이(?)님께서는 y0da로 패킹이 되게시네요.&lt;br /&gt;사실GomEncMain.exe의 패킹여부는 그닥 중요하지 않겠네요.&lt;br /&gt;왜냐면 오늘 글에서는 GomEnc.exe를 공략하는 거니까요. ;0&lt;br /&gt;&lt;br /&gt;GomEnc.exe는 패킹도 되어 있지 않으니 한번 올리디버거로 열어서 ReadFile과&lt;br /&gt;CreateFile에 BP(브레이크 포인트)를 잡아 보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1272833844.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;340&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;(클릭해서 보세요)&lt;br /&gt;&lt;br /&gt;0013BE90 &amp;nbsp; 0013FB10&amp;nbsp; |FileName =&lt;br /&gt;&amp;nbsp;&quot;C:\Program Files\GRETECH\GomEncoder\GomEncMain.exe&quot;&lt;br /&gt;0013BE94 &amp;nbsp; 80000000&amp;nbsp; |Access = GENERIC_READ&lt;br /&gt;0013BE98 &amp;nbsp; 00000001&amp;nbsp; |ShareMode = FILE_SHARE_READ&lt;br /&gt;0013BE9C &amp;nbsp; 00000000&amp;nbsp; |pSecurity = NULL&lt;br /&gt;0013BEA0 &amp;nbsp; 00000003&amp;nbsp; |Mode = OPEN_EXISTING&lt;br /&gt;0013BEA4 &amp;nbsp; 08000000&amp;nbsp; |Attributes = SEQUENTIAL_SCAN&lt;br /&gt;0013BEA8 &amp;nbsp; 00000000&amp;nbsp; \hTemplateFile = NULL&lt;/P&gt;
&lt;P&gt;핸들을 열어오는 대상이 GomEncMain.exe니, 올바르게 접근해 온 모양입니다.&lt;br /&gt;&lt;br /&gt;0013BE98 &amp;nbsp; 00000090 |FileHandle&lt;br /&gt;0013BE9C &amp;nbsp; 0013BEB8 |Buffer&lt;br /&gt;0013BEA0 &amp;nbsp; 00001000 |nNumberOfBytes&lt;br /&gt;0013BEA4 &amp;nbsp; 0013CEBC |lpNumberOfBytesRead&lt;br /&gt;0013BEA8 &amp;nbsp; 00000000 |lpOverlapped&lt;br /&gt;&lt;br /&gt;자, 여기서 CRC값을 계산해내는 코드를 찾기 위해서 중요한 값이 무엇일까요?&lt;br /&gt;답은 Buffer의 주소입니다. 그곳에 읽어온 값이 저장될 것이고, 프로그램 내에서는&lt;br /&gt;그 곳에 저장된 값들을 가지고 계산을 할 것임으로, 결국 그 메모리에 ReadAccess&lt;br /&gt;하는 코드를 찾으면, 그곳이 바로 CRC값을 계산해네는 곳이 되겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1202865095.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;340&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;(클릭해서 보세요)&lt;br /&gt;&lt;br /&gt;음 MZ가 있는 것으로 보아, 파일의 처음부터 1000바이트 씩 읽어오는군요.&lt;br /&gt;&lt;br /&gt;가장 앞에 &#039;M&#039;에 하드웨어 브레이크 포인트를 걸겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1030462574.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;342&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;/P&gt;(클릭해서 보세요)&lt;br /&gt;&lt;br /&gt;이제 디버기를 run 시키면, 다음과 같은 코드에 와있게 됩니다.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;0040102B &amp;nbsp;&amp;nbsp; 0FB61A &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX]&lt;br /&gt;0040102E &amp;nbsp;&amp;nbsp; 8BF0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV ESI,EAX&lt;br /&gt;00401030 &amp;nbsp;&amp;nbsp; 836D 10 08 &amp;nbsp; &amp;nbsp;&amp;nbsp; SUB DWORD PTR SS:[EBP+10],8&lt;br /&gt;00401034 &amp;nbsp;&amp;nbsp; 23F1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND ESI,ECX&lt;br /&gt;00401036 &amp;nbsp;&amp;nbsp; 33F3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EBX&lt;br /&gt;00401038 &amp;nbsp;&amp;nbsp; 8BD8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV EBX,EAX&lt;br /&gt;0040103A &amp;nbsp;&amp;nbsp; C1EB 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR EBX,8&lt;br /&gt;0040103D &amp;nbsp;&amp;nbsp; 8B04B5 90204000 MOV EAX,DWORD PTR DS:[ESI*4+402090]&lt;br /&gt;00401044 &amp;nbsp;&amp;nbsp; 33C3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,EBX&lt;br /&gt;00401046 &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;00401047 &amp;nbsp;&amp;nbsp; 8BF0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV ESI,EAX&lt;br /&gt;00401049 &amp;nbsp;&amp;nbsp; 0FB61A &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX]&lt;br /&gt;0040104C &amp;nbsp;&amp;nbsp; 23F1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND ESI,ECX&lt;br /&gt;0040104E &amp;nbsp;&amp;nbsp; 33F3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EBX&lt;br /&gt;00401050 &amp;nbsp;&amp;nbsp; 0FB65A 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX+1]&lt;br /&gt;00401054 &amp;nbsp;&amp;nbsp; 8B34B5 90204000 MOV ESI,DWORD PTR DS:[ESI*4+402090]&lt;br /&gt;0040105B &amp;nbsp;&amp;nbsp; C1E8 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR EAX,8&lt;br /&gt;0040105E &amp;nbsp;&amp;nbsp; 33F0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EAX&lt;br /&gt;00401060 &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;00401061 &amp;nbsp;&amp;nbsp; 8BC6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV EAX,ESI&lt;br /&gt;00401063 &amp;nbsp;&amp;nbsp; 23C1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND EAX,ECX&lt;br /&gt;00401065 &amp;nbsp;&amp;nbsp; 33C3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,EBX&lt;br /&gt;00401067 &amp;nbsp;&amp;nbsp; 0FB65A 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX+1]&lt;br /&gt;0040106B &amp;nbsp;&amp;nbsp; 8B0485 90204000 MOV EAX,DWORD PTR DS:[EAX*4+402090]&lt;br /&gt;00401072 &amp;nbsp;&amp;nbsp; C1EE 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR ESI,8&lt;br /&gt;00401075 &amp;nbsp;&amp;nbsp; 33C6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,ESI&lt;br /&gt;00401077 &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;00401078 &amp;nbsp;&amp;nbsp; 8BF0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV ESI,EAX&lt;br /&gt;0040107A &amp;nbsp;&amp;nbsp; 23F1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND ESI,ECX&lt;br /&gt;0040107C &amp;nbsp;&amp;nbsp; 33F3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EBX&lt;br /&gt;0040107E &amp;nbsp;&amp;nbsp; 0FB65A 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX+1]&lt;br /&gt;00401082 &amp;nbsp;&amp;nbsp; 8B34B5 90204000 MOV ESI,DWORD PTR DS:[ESI*4+402090]&lt;br /&gt;00401089 &amp;nbsp;&amp;nbsp; C1E8 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR EAX,8&lt;br /&gt;0040108C &amp;nbsp;&amp;nbsp; 33F0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EAX&lt;br /&gt;0040108E &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;0040108F &amp;nbsp;&amp;nbsp; 8BC6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV EAX,ESI&lt;br /&gt;00401091 &amp;nbsp;&amp;nbsp; 23C1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND EAX,ECX&lt;br /&gt;00401093 &amp;nbsp;&amp;nbsp; 33C3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,EBX&lt;br /&gt;00401095 &amp;nbsp;&amp;nbsp; 0FB65A 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX+1]&lt;br /&gt;00401099 &amp;nbsp;&amp;nbsp; 8B0485 90204000 MOV EAX,DWORD PTR DS:[EAX*4+402090]&lt;br /&gt;004010A0 &amp;nbsp;&amp;nbsp; C1EE 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR ESI,8&lt;br /&gt;004010A3 &amp;nbsp;&amp;nbsp; 33C6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,ESI&lt;br /&gt;004010A5 &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;004010A6 &amp;nbsp;&amp;nbsp; 8BF0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV ESI,EAX&lt;br /&gt;004010A8 &amp;nbsp;&amp;nbsp; 23F1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND ESI,ECX&lt;br /&gt;004010AA &amp;nbsp;&amp;nbsp; 33F3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EBX&lt;br /&gt;004010AC &amp;nbsp;&amp;nbsp; 0FB65A 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX+1]&lt;br /&gt;004010B0 &amp;nbsp;&amp;nbsp; 8B34B5 90204000 MOV ESI,DWORD PTR DS:[ESI*4+402090]&lt;br /&gt;004010B7 &amp;nbsp;&amp;nbsp; C1E8 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR EAX,8&lt;br /&gt;004010BA &amp;nbsp;&amp;nbsp; 33F0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EAX&lt;br /&gt;004010BC &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;004010BD &amp;nbsp;&amp;nbsp; 8BC6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV EAX,ESI&lt;br /&gt;004010BF &amp;nbsp;&amp;nbsp; 23C1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND EAX,ECX&lt;br /&gt;004010C1 &amp;nbsp;&amp;nbsp; 33C3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,EBX&lt;br /&gt;004010C3 &amp;nbsp;&amp;nbsp; 0FB65A 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOVZX EBX,BYTE PTR DS:[EDX+1]&lt;br /&gt;004010C7 &amp;nbsp;&amp;nbsp; 8B0485 90204000 MOV EAX,DWORD PTR DS:[EAX*4+402090]&lt;br /&gt;004010CE &amp;nbsp;&amp;nbsp; C1EE 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR ESI,8&lt;br /&gt;004010D1 &amp;nbsp;&amp;nbsp; 33C6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,ESI&lt;br /&gt;004010D3 &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;004010D4 &amp;nbsp;&amp;nbsp; 8BF0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOV ESI,EAX&lt;br /&gt;004010D6 &amp;nbsp;&amp;nbsp; 23F1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AND ESI,ECX&lt;br /&gt;004010D8 &amp;nbsp;&amp;nbsp; 33F3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR ESI,EBX&lt;br /&gt;004010DA &amp;nbsp;&amp;nbsp; C1E8 08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SHR EAX,8&lt;br /&gt;004010DD &amp;nbsp;&amp;nbsp; 8B34B5 90204000 MOV ESI,DWORD PTR DS:[ESI*4+402090]&lt;br /&gt;004010E4 &amp;nbsp;&amp;nbsp; 33C6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; XOR EAX,ESI&lt;br /&gt;004010E6 &amp;nbsp;&amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INC EDX&lt;br /&gt;004010E7 &amp;nbsp;&amp;nbsp; 4F &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; DEC EDI&lt;br /&gt;004010E8&amp;nbsp; ^ 0F85 3DFFFFFF &amp;nbsp; JNZ GomEnc.0040102B&lt;/DIV&gt;&lt;br /&gt;드디어!! CRC 체크 루틴에 도달한 것이죠.&lt;br /&gt;&lt;br /&gt;이후의 File Check를 우회하는 방법은 프로세스에서 하는 방식과 같습니다.&lt;br /&gt;프로세스 내에 메모리를 할당하고 원본의 내용을 카피한 후, 그 내용으로&lt;br /&gt;베이스 어드레스를 바꾸어 주면 됩니다. 이 경우에는 edx가 베이스 인데요,&lt;br /&gt;edx에 할당한 메모리 주소를 줘도 됩니다. &lt;br /&gt;정말 쉽죠? :) &lt;br /&gt;&amp;nbsp;&lt;br /&gt;간단하게 해당 주소에 BP를 건 후, BP가 걸리면 EDX레지스터의 값을&lt;br /&gt;대상 프로세스에 메모리를 할당하고, 거기에 .bak파일을 열어서 복사해 넣은&lt;br /&gt;주소로 옮겨서 CRC체크를 우회하는 코드를 만들어 봤습니다.&lt;br /&gt;-_-; 소스를 보시면서 원리를 참고 하시는게 더 도움이 되는 분이 많겠죠.&lt;br /&gt;&lt;br /&gt;간단한 테스트를 해보겠습니다.&lt;br /&gt;&lt;br /&gt;먼저 다음과 같이 .bak 파일을 만들었습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1291529708.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;396&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;그리고 GomEncMain.exe 의 내용을 다음과 같이 바꿔봤습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1348630857.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;289&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;먼저 CRC 체크 우회기를 키기 전에, GomEnc.exe를 그냥 실행시켜 봤습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1041075360.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;304&quot; width=&quot;417&quot; /&gt;&lt;/div&gt;&lt;br /&gt;이제 우회기를 키고 한번 해보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1254875536.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;198&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1400477914.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;319&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;WoW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;&lt;br /&gt;소스 다운로드 : &lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://dual5651.hacktizen.com/tc/attachment/1213982742.zip&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; CRC.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------&lt;br /&gt;그 외의 GomEnc의 CRC 체크를 우회하기 위한 방법들로는,&lt;br /&gt;CreateFile을 할때 파일명을 GomEncMain.bak 로 주고,&lt;br /&gt;GomEncMain.exe를 해당 파일명으로 복사해준 후,&lt;br /&gt;GomEncMain.exe는 마음껏 수정해줘도 되는 방법이 있겠고,&lt;br /&gt;GomEnc.ini에 저장되있는 CRC값을 변조된 GomEncMain.exe의&lt;br /&gt;CRC값으로 바꿔주는 방법도 있고 하지만,&lt;br /&gt;이런건 아무래도 이 경우에만 쓸 수 있는 꼼수겠죠 -_-;&lt;br /&gt;여담이지만... 곰인코더에서 GPL 를 쓴다면, 곰인코더를 상용화해서 사용하기&lt;br /&gt;위해서는 소스공개를 해야되는 것 아닌지요? -_-;&lt;br /&gt;그리고, 무료버젼에서의 유일한 단점인 워터마크를 사용자가 컨트롤 할 수 있도록&lt;br /&gt;해놓은 점이 사실상 이해가 잘 가지를 않네요..&lt;br /&gt;setting.ini&lt;br /&gt;[WATERMARK]&lt;br /&gt;START_TIME&lt;br /&gt;END_TIME&lt;br /&gt;POS_X&lt;br /&gt;POS_Y&lt;br /&gt;MARGIN_X&lt;br /&gt;MARGIN_Y&lt;br /&gt;&lt;br /&gt;개선되어져야 할 부분들 같습니다..</description>
			<category>Reverse Engineering</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/310</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/File-CRC-Check-%EA%B2%80%EC%82%AC-%EC%9A%B0%ED%9A%8C%ED%95%98%EA%B8%B0-Target-GomEncoder#entry310comment</comments>
			<pubDate>Fri, 30 Nov 2007 23:03:30 +0900</pubDate>
		</item>
		<item>
			<title>루트킷 한글판 등장</title>
			<link>http://dual5651.hacktizen.com/tc/entry/%EB%A3%A8%ED%8A%B8%ED%82%B7-%ED%95%9C%EA%B8%80%ED%8C%90-%EB%93%B1%EC%9E%A5</link>
			<description>&lt;P align=left&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1019414651.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;393&quot; width=&quot;300&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;IMG id=userImg5308152 style=&quot;WIDTH: 68px; HEIGHT: 18px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/intro_t.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(5308152)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;IMG id=userImg1669721 style=&quot;WIDTH: 1px; HEIGHT: 8px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(1669721)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV id=bodyDescription&gt;루트킷은 해커들이 공격하고자 하는 시스템에 지속적이면서 탐지되지 않은 채로 교묘히 접근할 수 있는 최고의 백도어라고 할 수 있다. 루트킷에 관한 최고의 전문가 두 명이 최초로 종합적인 루트킷 가이드를 집필했다. 루트킷이 무엇이고 어떻게 작동하며 제작하는지, 어떻게 루트킷을 탐지하는지 등에 대해 차례로 설명한다.&lt;/DIV&gt;
&lt;P align=left&gt;&lt;IMG id=userImg6989803 style=&quot;WIDTH: 1px; HEIGHT: 35px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(6989803)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;!-- 저자 소개 시작 --&gt;&lt;IMG id=userImg5313930 style=&quot;WIDTH: 84px; HEIGHT: 18px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/author_t.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(5313930)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;br /&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=&quot;100%&quot; border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style=&quot;PADDING-LEFT: 12px&quot;&gt;&lt;B&gt;그렉 호글런드&lt;/B&gt; - 소프트웨어 보안 분야의 개척자 역할을 수행해 왔다. 그는 현재 소프트웨어 보안 검증 서비스를 선도적으로 제공하는 기업인 HBGray 사의 CEO이다. 그렉은 최초의 네트워크 보안 취약점 스캐너(포춘 500대 기업의 절반 이상에 설치되었다) 중 하나를 제작한 후 최초의 윈도우NT 기반 루트킷을 작성하고 그것을 문서화했다. 또한 블랙 햇, RSA와 그 밖의 보안 컨퍼런스의 단골 발표자로도 활동하고 있고, 베스트셀러인 &amp;lt;Exploiting Software: How to Break Code&amp;gt;(Addison-Wesley, 2004)의 공동 저자이기도 하다.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;제임스 버틀러&lt;/B&gt; - HBGray의 기술 이사인 제임스 버틀러는 커널 프로그래밍과 루트킷 개발 분야의 최고 전문가 중 한명으로 손꼽히며, 호스트 기반 침입 탐지 시스템에 대한 폭넓은 경험을 갖췄다. 루트킷 탐지와 포렌식 시스템을 위한 VICE 프로그램의 개발자로, 과거 Enterasys의 보안 소프트웨어 선임 엔지니어 및 미국국가안전보장국의 컴퓨터 과학자로 재직한 바 있다. 또한 블랙 햇 보안 컨퍼런스의 단골 발표자이자 트레이너이며 매릴랜드 볼티모어 카운티 대학에서 컴퓨터공학 석사 학위를 취득했다. 그의 논문으로는 &#039;IEEE Information Assurance Workshop&#039;, &#039;Phrack, USENIX ;login:&#039;, &#039;Information Management and Computer Security&#039; 등이 있다.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;윤근용&lt;/B&gt; - 시스템 프로그래머로서 시스템에 대한 다양한 분야에 관심이 많으며 특히 보안 분야에 대한 관심이 높아 다년간 보안 업무에 종사하고 있다. 바이러스 보안 업체를 거쳐 현재는 NHN에서 보안 관련 프로젝트를 수행하고 있다. 역서로는 &amp;lt;웹 애플리케이션 해킹 대작전&amp;gt;(에이콘출판, 2007), &amp;lt;실전해킹 절대내공&amp;gt;(에이콘출판, 2007)이 있다.&lt;br /&gt;&lt;IMG id=userImg334721 style=&quot;WIDTH: 1px; HEIGHT: 10px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(334721)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;!-- 저자의 말 --&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=&quot;100%&quot; border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;IMG id=userImg5794649 style=&quot;WIDTH: 76px; HEIGHT: 17px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/author_comment.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(5794649)&quot;,200)&#039; name=cafeuserimg&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;TABLE cellSpacing=1 cellPadding=7 width=&quot;100%&quot; bgColor=#dddddd border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD bgColor=#ffffff&gt;몇 년 전부터 우리는 협력해서 &#039;Offensive Aspects of Rootkit Technology&#039;라는 교육을 제공해 왔다. 그 교육은 원래 하루 교육이었으나 지금은 수백 페이지의 설명과 예제 코드를 다루는 교육으로 확대되었으며, 그 교육에서 사용되는 교재를 기반으로 이 책이 저술되었다. 현재 우리는 블랙 햇(the Black Hat) 보안 컨퍼런스에서 한 해에 몇 번씩 루트킷 교육을 제공하고 있다. 물론 비공개적으로 교육을 제공하기도 한다. 우리는 교육을 어느 정도 함께 제공해 오면서 우리의 관계를 좀더 긴밀히 할 필요가 있다고 판단했으며 그에 따라 지금은 HBGray 사에서 같이 일하고 있다. HBGray에서 우리는 매우 복잡한 루트킷 문제와 매일 씨름하며, 오늘날 윈도우 사용자들에게 닥친 위협과 미래에 위협이 될 수 있는 것들을 다루기 위해 우리의 경험을 바탕으로 이 책을 저술했다.&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;IMG id=userImg2587614 style=&quot;WIDTH: 1px; HEIGHT: 35px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(2587614)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;!-- 추천글시작--&gt;&lt;IMG id=userImg3566481 style=&quot;HEIGHT: 18px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/command_t.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(3566481)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;IMG id=userImg5703389 style=&quot;WIDTH: 1px; HEIGHT: 8px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(5703389)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=&quot;100%&quot; bgColor=#f5f5f5 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style=&quot;PADDING-LEFT: 12px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px&quot;&gt;사이버 보안 종사자가 루트킷의 위협을 이해하기 위해 꼭 읽어야 할 필독서. - &lt;FONT color=#639a9c&gt;마크 루시노비치 (윈도우 IT 프로, Windows &amp;amp; .NET Magazine 편집자)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;루트킷을 주제로 한 서적은 이 책이 유일하다. 윈도우 보안 연구자나 보안 프로그래머의 흥미를 끌기에 충분하다. 최신 기술을 매우 상세히 설명하며, 책에 실린 기술 정보도 무척 훌륭하다. 또한 콘텐츠의 기술적인 수준이 높고 많은 시간을 투자한 구체적인 구현 예도 매우 멋지다. 정말 탁월한 책이다. - &lt;FONT color=#639a9c&gt;토니 보츠 (보안 컨설턴트 겸 엑스티빅스 사의 CEO)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;윈도우 보안 분야 관련자라면 반드시 읽어야 할 책이다. 보안 전문가, 윈도우 시스템 관리자, 윈도우 시스템 프로그래머라면 루트킷 개발자들이 사용하는 기술에 대해 관심이 많을 것이다. IT와 보안 전문가들이 최신 이메일 바이러스나 그 달의 보안 패치 설치 여부만을 걱정하고 있을 때, 호글런드와 버틀러는 윈도우 운영체제을 위협하는 은닉성 높은 루트킷에 눈을 뜨게 해줬다. 여러분이 맡고 있는 네트워크나 시스템 공격을 제대로 방어하려면 무엇보다도 공격에 사용되는 기술을 파악해 둬야 한다. - &lt;FONT color=#639a9c&gt;제니퍼 콜드 (보안 컨설턴트, 저자 겸 강사)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;누군가에게 점령당한다는 것은 정말 최악의 사건이다. 루트킷에 대한 최초의 서적이자 호글런드와 버틀러가 저술한 이 책을 읽으면 점령 당한다는 것이 무엇을 의미하는지 알게 될 것이다. 루트킷은 악의적인 해킹 툴인 디컴파일러, 디스어셈블러, 오류 삽입 엔진, 커널 디버거, 페이로드 수집기, 커버리지 툴, 실행 흐름 분석 툴 등의 정점에 위치해 있다. 이 책은 공격자가 루트킷을 어떻게 감쪽같이 숨기는지를 설명한다. - &lt;FONT color=#639a9c&gt;게리 맥그로 (박사, 씨지털 사의 CTO)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;저자들은 윈도우 API 파괴와 루트킷 제작에 있어서 최고의 전문가다. 이 두 대가는 루트킷에 대한 베일을 벗기고 루트킷 정보를 어둠의 세상 밖으로 이끌어 내기 위해 힘을 합쳐 노력하고 있다. 윈도우 시스템 보안이나 포렌식 분석에 관심 있는 사람이라면 반드시 읽어야 할 책이다. - &lt;FONT color=#639a9c&gt;할랜 카비 (&amp;lt;Windows Forensics and Incident Recovery&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;IMG id=userImg4842976 style=&quot;WIDTH: 1px; HEIGHT: 35px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(4842976)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;!-- 차례 시작 --&gt;&lt;IMG id=userImg3026395 style=&quot;WIDTH: 43px; HEIGHT: 18px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/content_t.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(3026395)&quot;,200)&#039; name=cafeuserimg&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;IMG id=userImg295204 style=&quot;WIDTH: 1px; HEIGHT: 8px&quot; onclick=popview(this) src=&quot;http://www.aladdin.co.kr/img/book/trans.gif&quot; onload=&#039;setTimeout(&quot;resizeImage(295204)&quot;,200)&#039; name=cafeuserimg&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV id=contents_short style=&quot;PADDING-LEFT: 12px&quot;&gt;
&lt;P&gt;1장 흔적을 남기지 말라 ... 23&lt;br /&gt;공격자의 동기 이해 ... 24&lt;br /&gt;은닉의 역할 ... 24&lt;br /&gt;은닉이 필요 없는 경우 ... 25&lt;br /&gt;루트킷이란? ... 26&lt;br /&gt;왜 루트킷이 존재하는가? ... 26&lt;br /&gt;원격 명령 실행과 제어 ... 27&lt;br /&gt;소프트웨어 감청 ... 27&lt;br /&gt;루트킷의 합법적인 이용 ... 28&lt;br /&gt;루트킷의 역사 ... 29&lt;br /&gt;루트킷은 어떻게 동작하는가? ... 30&lt;br /&gt;패치 ... 30&lt;br /&gt;이스터 에그 ... 31&lt;br /&gt;스파이웨어 ... 31&lt;br /&gt;소스 코드 조작 ... 31&lt;br /&gt;소프트웨어 변경의 합법성 ... 32&lt;br /&gt;무엇이 루트킷이 아닌가? ... 32&lt;br /&gt;루트킷은 공격툴이 아니다 ... 33&lt;br /&gt;루트킷은 바이러스가 아니다 ... 34&lt;br /&gt;루트킷과 소프트웨어 공격 ... 35&lt;br /&gt;왜 공격 코드가 여전히 문제인가? ... 37&lt;br /&gt;공격을 위한 루트킷 기술 ... 38&lt;br /&gt;HIPS ... 38&lt;br /&gt;NIDS ... 39&lt;br /&gt;IDS/IPS 우회하기 ... 40&lt;br /&gt;포렌식 툴 우회하기 ... 40&lt;br /&gt;결론 ... 41&lt;/P&gt;
&lt;P&gt;2장 커널 조작 ... 43&lt;br /&gt;커널의 중요 요소 ... 44&lt;br /&gt;루트킷 설계 ... 45&lt;br /&gt;커널 레벨 코드 소개 ... 48&lt;br /&gt;윈도우 디바이스 드라이버 개발 ... 49&lt;br /&gt;Device Driver Development Kit ... 49&lt;br /&gt;빌드 환경 ... 50&lt;br /&gt;파일 ... 50&lt;br /&gt;Build 툴 ... 52&lt;br /&gt;언로드 루틴 ... 53&lt;br /&gt;드라이버 로드, 언로드 ... 54&lt;br /&gt;디버그 메시지 로그하기 ... 54&lt;br /&gt;유저 모드와 커널 모드 요소를 모두 포함하는 루트킷 ... 55&lt;br /&gt;IPR ... 56&lt;br /&gt;파일 핸들 생성 ... 60&lt;br /&gt;심볼릭 링크 추가 ... 61&lt;br /&gt;루트킷 로딩 ... 63&lt;br /&gt;드라이버 로드를 위한 비정상적인 방법 ... 63&lt;br /&gt;드라이버 로드를 위한 정상적인 방법 ... 65&lt;br /&gt;리소스에서 .sys 파일 추출하기 ... 67&lt;br /&gt;재부팅시 자동 시작 ... 69&lt;br /&gt;결론 ... 71&lt;/P&gt;
&lt;P&gt;3장 하드웨어 레벨의 지식 ... 73&lt;br /&gt;링 제로 ... 74&lt;br /&gt;테이블, 테이블 그리고 또 테이블 ... 76&lt;br /&gt;메모리 페이지 ... 77&lt;br /&gt;메모리 접근 검사 ... 78&lt;br /&gt;페이징과 주소 변환 ... 79&lt;br /&gt;페이지 테이블 ... 81&lt;br /&gt;페이지-디렉토리 엔트리 ... 83&lt;br /&gt;페이지-테이블 엔트리 ... 83&lt;br /&gt;페이지 테이블의 읽기 전용 속성 ... 84&lt;br /&gt;멀티 프로세스와 멀티 페이지 디렉토리 ... 84&lt;br /&gt;프로세스와 스레드 ... 85&lt;br /&gt;메모리 디스크립터 테이블 ... 86&lt;br /&gt;글로벌 디스크립터 테이블 ... 87&lt;br /&gt;로컬 디스크립터 테이블 ... 87&lt;br /&gt;코드 세그먼트 ... 87&lt;br /&gt;콜 게이트 ... 87&lt;br /&gt;인터럽트 디스크립터 테이블 ... 88&lt;br /&gt;다른 형태의 게이트 ... 91&lt;br /&gt;시스템 서비스 디스패치 테이블 ... 91&lt;br /&gt;컨트롤 레지스터 ... 92&lt;br /&gt;컨트롤 레지스터 0 ... 92&lt;br /&gt;그 밖의 컨트롤러 레지스터들 ... 93&lt;br /&gt;EFlags 레지스터 ... 93&lt;br /&gt;멀티 프로세서 시스템 ... 93&lt;br /&gt;결론 ... 95&lt;/P&gt;
&lt;P&gt;4장 전통적인 후킹 기술 ... 97&lt;br /&gt;애플리케이션 레벨의 후킹 ... 97&lt;br /&gt;임포트 어드레스 테이블 후킹 ... 99&lt;br /&gt;인라인 함수 후킹 ... 100&lt;br /&gt;사용자 프로세스 영역으로 DLL 인젝션하기 ... 103&lt;br /&gt;커널 후킹 ... 108&lt;br /&gt;시스템 서비스 디스크립터 테이블 후킹 ... 109&lt;br /&gt;인터럽트 디스크립터 테이블 후킹 ... 118&lt;br /&gt;디바이스 드라이버 오브젝트의 Major Function 후킹 ... 123&lt;br /&gt;하이브리드 후킹 ... 133&lt;br /&gt;프로세스의 주소 공간으로 진입하기 ... 134&lt;br /&gt;후킹을 위한 메모리 공간 ... 138&lt;br /&gt;결론 ... 140&lt;/P&gt;
&lt;P&gt;5장 런타임 패치 ... 141&lt;br /&gt;우회 패치 ... 142&lt;br /&gt;MigBot을 이용한 실행 흐름 변경 ... 143&lt;br /&gt;함수의 바이트 코드 검사 ... 145&lt;br /&gt;원래의 명령어 바이트 ... 146&lt;br /&gt;NonPagedPool 메모리 이용 ... 149&lt;br /&gt;런타임 주소 결정 ... 149&lt;br /&gt;점프 템플릿 ... 153&lt;br /&gt;인터럽트 후킹 예제 ... 154&lt;br /&gt;기타 유사한 방법들 ... 161&lt;br /&gt;결론 ... 162&lt;/P&gt;
&lt;P&gt;6장 계층 드라이버 ... 163&lt;br /&gt;키보드 스니퍼 ... 164&lt;br /&gt;IRP와 스택 로케이션 ... 166&lt;br /&gt;KLOG 루트킷 ... 169&lt;br /&gt;파일 필터 드라이버 ... 183&lt;br /&gt;결론 ... 197&lt;/P&gt;
&lt;P&gt;7장 커널 오브젝트 직접 변경 ... 199&lt;br /&gt;DKOM의 장점과 단점 ... 200&lt;br /&gt;운영체제 버전 판단하기 ... 202&lt;br /&gt;유저 모드에서 운영체제 버전 판단 ... 202&lt;br /&gt;커널 모드에서 운영체제 버전 판단 ... 204&lt;br /&gt;레지스트리를 이용한 운영체제 버전 판단 ... 204&lt;br /&gt;유저 모드 프로세스에서 디바이스 드라이버로의 통신 ... 206&lt;br /&gt;DKOM을 이용한 은닉 ... 210&lt;br /&gt;프로세스 은닉 ... 210&lt;br /&gt;디바이스 드라이버 은닉 ... 216&lt;br /&gt;동기화 이슈 ... 220&lt;br /&gt;DKOM을 이용한 토큰의 권한과 그룹 변경 ... 224&lt;br /&gt;프로세스 토큰 변경 ... 225&lt;br /&gt;윈도우 이벤트 뷰어 속이기 ... 239&lt;br /&gt;결론 ... 241&lt;/P&gt;
&lt;P&gt;8장 하드웨어 조작 ... 243&lt;br /&gt;왜 하드웨어인가? ... 245&lt;br /&gt;펌웨어 변경 ... 246&lt;br /&gt;하드웨어 접근 ... 247&lt;br /&gt;하드웨어 주소 지정 ... 247&lt;br /&gt;하드웨어 접근은 RAM에 접근하는 것과 다르다 ... 248&lt;br /&gt;타이밍 ... 249&lt;br /&gt;I/O 버스 ... 249&lt;br /&gt;BIOS에 접근 ... 251&lt;br /&gt;PCI, PCMCIA 디바이스 접근 ... 252&lt;br /&gt;예 : 키보드 컨트롤러 접근 ... 252&lt;br /&gt;8259 키보드 컨트롤러 ... 253&lt;br /&gt;키보드 LED 변경 ... 253&lt;br /&gt;하드 리부팅 ... 260&lt;br /&gt;키보드 모니터링 ... 260&lt;br /&gt;마이크로코드 업데이트 ... 267&lt;br /&gt;결론 ... 268&lt;/P&gt;
&lt;P&gt;9장 은닉 채널 ... 269&lt;br /&gt;원격 명령 및 제어 그리고 데이터 빼내기 ... 270&lt;br /&gt;TCP/IP 프로토콜 위장 ... 271&lt;br /&gt;트래픽 패턴의 인지 ... 272&lt;br /&gt;데이터를 있는 그대로 전송하지 말라 ... 273&lt;br /&gt;시간을 이용하라 ... 274&lt;br /&gt;DNS 패킷 안에 숨겨라 ... 274&lt;br /&gt;아스키 문자 숨기기 ... 274&lt;br /&gt;다른 TCP/IP 채널 이용 ... 275&lt;br /&gt;TDI를 이용한 루트킷 ... 276&lt;br /&gt;어드레스 스트럭처 생성 ... 277&lt;br /&gt;로컬 어드레스 오브젝트 생성 ... 279&lt;br /&gt;TDI 엔드 포인트 생성 ... 283&lt;br /&gt;엔드 포인트와 로컬 어드레스 연결 ... 286&lt;br /&gt;리모트 서버로 연결 - TCP 핸드쉐이크 전송 ... 288&lt;br /&gt;리모트 서버로 데이터 전송 ... 290&lt;br /&gt;네트워크 패킷 변경 ... 293&lt;br /&gt;윈도우XP에서의 로우 소켓 구현 ... 293&lt;br /&gt;인터페이스에 바인딩 ... 294&lt;br /&gt;로우 소켓 스니핑 ... 295&lt;br /&gt;로우 소켓을 이용한 무차별적인 스니핑 ... 296&lt;br /&gt;로우 소켓을 이용한 패킷 전송 ... 297&lt;br /&gt;소스 포트, 주소 위조 ... 297&lt;br /&gt;바운싱 패킷 ... 298&lt;br /&gt;NDIS를 이용한 루트킷 ... 299&lt;br /&gt;프로토콜 등록 ... 299&lt;br /&gt;프로토콜 드라이버 콜백 ... 304&lt;br /&gt;패킷 전체 이동 ... 309&lt;br /&gt;호스트 에뮬레이션 ... 317&lt;br /&gt;자체 MAC 주소 생성 ... 317&lt;br /&gt;ARP 처리 ... 317&lt;br /&gt;IP 게이트웨이 ... 320&lt;br /&gt;패킷 전송 ... 320&lt;br /&gt;결론 ... 325&lt;/P&gt;
&lt;P&gt;10장 루트킷 탐지 ... 327&lt;br /&gt;존재 탐지 ... 328&lt;br /&gt;출입문 보호 ... 328&lt;br /&gt;메모리 스캐닝 ... 331&lt;br /&gt;후킹 탐지 ... 331&lt;br /&gt;행동 탐지 ... 341&lt;br /&gt;숨겨진 파일과 레지스트리 키 탐지 ... 341&lt;br /&gt;숨겨진 프로세스 탐지 ... 342&lt;br /&gt;결론 ... 345&lt;/P&gt;&lt;/DIV&gt;</description>
			<category>헛소리</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/309</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/%EB%A3%A8%ED%8A%B8%ED%82%B7-%ED%95%9C%EA%B8%80%ED%8C%90-%EB%93%B1%EC%9E%A5#entry309comment</comments>
			<pubDate>Tue, 27 Nov 2007 19:02:50 +0900</pubDate>
		</item>
		<item>
			<title>-_- 웹파일 업로드 취약점에 대한 고찰에 결과.</title>
			<link>http://dual5651.hacktizen.com/tc/entry/%EC%9B%B9%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0%EC%97%90-%EA%B2%B0%EA%B3%BC</link>
			<description>&lt;P&gt;다운로드 : &lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://dual5651.hacktizen.com/tc/attachment/1115753829.zip&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; test.zip&lt;/a&gt;&lt;/div&gt;웹파일 업로드 문제점, 이젠 거의(?) 찾아볼 수 없는 문제점이 되었죠.&lt;br /&gt;(그래서 사실 아직 많기도 한..)&lt;br /&gt;-_-;;; ㅋㅋ 재가 웹파일업로드 문제점을 테스트 할떄 쓰는 파일입니다.&lt;br /&gt;누군가에겐 도움이 되겠죠 -_-; (PHP 대상)&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;</description>
			<category>헛소리</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/308</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/%EC%9B%B9%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0%EC%97%90-%EA%B2%B0%EA%B3%BC#entry308comment</comments>
			<pubDate>Sun, 25 Nov 2007 13:07:32 +0900</pubDate>
		</item>
		<item>
			<title>POC 2007 사진들?ㅎㅎ</title>
			<link>http://dual5651.hacktizen.com/tc/entry/POC-2007-%ED%9B%84%EA%B8%B0</link>
			<description>아 정말 오랜만에 글을 올려봅니다. ㅎㅎ&lt;br /&gt;엇그제 POC에 다녀왔는데요~&lt;br /&gt;간단하게 한번 후기를 작성해 보고자 합니다. ㅎㅎ&lt;br /&gt;사진의 출처는 SP사이트 입니다. ㅎㅎ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1341333536.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;오옹 스텝및 발표자분들이 열심히 준비하고 게시군요 ㅋㅋ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1270871047.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;현장의 모습이네요. (사진으로 보니깐 넓어 보이네요)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1096116651.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;입구의 모습입니다. 입구에서 등록 및 무선 통역기를 받을 수 있었습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1219988467.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;675&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;- - &amp;lt;=== ㅎㅎㅎ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1295447885.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;674&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;ㅎㅎ 유리바다님&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1013389695.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;675&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;wow ~&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1228562940.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;왼쪽분이 일본분 발표자 인가 그러셨는데 그런데 ㅋㅋ 상태가 점차 안좋아 지시죵&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1112130003.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;675&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;진행을 맡으신 루시도 세븐님?ㅎㅎ;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1024001533.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;SnoopSpy의 GilGil님 이십니다 ㅎㅎ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1395944874.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;저 가운데 분의 정체는 뭐죠?ㅎㅎ; 머리가 중국무협영화의 스타일?ㅎㅎ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1006871258.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;675&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;왼쪽은 싱가포르 syscan의 운영자 토마스, 오른쪽은 이뮤니티의 세일즈 맨 이십니다. ㅎㅎ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1340547286.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;675&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1313185902.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1313566314.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;열심히 듣는 사람들의 모습?ㅎㅎ;&#039;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1107010653.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;명함 사세욤~~&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1223388860.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;번쩍~ 번쩍~ 라스트 플레이스의 아트라스(?) 라는 닉을 쓰시는 리더라고 들었습니다. ㅎㅎ&lt;br /&gt;이름이 뭐냐고 물으시길래, 발음좀 굴려서 마이네미즈 샤뮤엘 쿠 라고 했지요 ㅎㅎ&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1409358609.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;299&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;마지막으로 연회때 사진 입니다. ㅎㅎ; 색깔 보정좀 했는데 -_-너무 밝아졌네요.</description>
			<category>헛소리</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/307</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/POC-2007-%ED%9B%84%EA%B8%B0#entry307comment</comments>
			<pubDate>Mon, 19 Nov 2007 09:30:22 +0900</pubDate>
		</item>
		<item>
			<title>CRC(Cyclic Redundancy Check) bypassing?</title>
			<link>http://dual5651.hacktizen.com/tc/entry/CRCCyclic-Redundancy-Check-bypassing</link>
			<description>&lt;P&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1126054684.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;300&quot; width=&quot;400&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;CRC 체크를 우회하는 방법에 대해 질문하는 분들이 종종 있더군요.&lt;br /&gt;-_-; 너무 엉터리라서 저에게 핵토파스칼 킥을 날릴분들이 많을지도 모르겠지만,&lt;br /&gt;간단히 한번 말해보도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;재가 처음에 CRC 체크를 우회하는 것에 대해서 생각을 해볼 때,&lt;br /&gt;첫번쨰 생각한 것은 &lt;STRONG&gt;Shadow Walker Protect&lt;/STRONG&gt; 였습니다.&lt;br /&gt;-_-;; 해당 프로젝트가 무엇인지에 대한 설명은 넘어가도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;그러나 Shadow Walker Project는 소요되는 시간과 코드량에 비해&lt;br /&gt;위험성이 다소 있기 때문에 결국 쓰지 않았죠. (절떄 귀찮아서가 아닐껍니다.)&lt;br /&gt;&lt;br /&gt;두번째 생각한 것은 CRC체크 루틴을 찾아서 수정한다 였는데,&lt;br /&gt;-_- 음.. 얼마 안되서 인터넷에 나오더군요. (그걸 구현하다니 성실한 녀석들)&lt;br /&gt;&lt;br /&gt;그렇다면 CRC 체크 루틴은 어떻게 찾을 수 있는 걸까요?&lt;br /&gt;&lt;br /&gt;이 대답은 두가지로 나뉘어 집니다.&lt;br /&gt;왜냐하면 CRC체크 루틴은 해당 프로그램 내에서 이루어질 수도 있고,&lt;br /&gt;외부 프로그램에 의해서 이루어질수도 있기 떄문입니다.&lt;br /&gt;&lt;br /&gt;먼저 내부 프로그램에 의한 CRC체크 루틴을 찾는 방법에 대해서 말해보자면,&lt;br /&gt;프로그램 내에서 CRC체크 루틴은 대략 어떤 모습을 가지고 있을까요? -_-?&lt;br /&gt;정말 간단하게 생각해보자면 다음과 같다고 볼 수 있겠죠.&lt;br /&gt;&lt;br /&gt;for(int i = EntryPoint; i &amp;lt;= SizeOfImage; i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;&amp;nbsp; checksum += memory[i];&lt;br /&gt;....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-_-;; 재밌는게 보이죠?&lt;br /&gt;모든 메모리의 변조여부를 체크하기 위해서는 모든 메모리에 접근해서 읽어와야&lt;br /&gt;합니다. 즉 Read가 발생하죠... (여기서 감이 오죠)&lt;br /&gt;&lt;br /&gt;우리에겐 INTEL이 주신 축복인.. Hardware BreakPoint라는 친구가 있죠.&lt;br /&gt;이 친구가 도와주면 우리는 특정한 메모리 주소에 Write or Read|Write or Excute가&lt;br /&gt;발생했을때와 그 읽기 또는 읽기쓰기 또는 실행을 시도한 주소가 어딘지 알 수 있죠.&lt;br /&gt;-_-; 읽기또는쓰기를 시도한 메모리 주소가 바로 CRC체크루틴이 있는 곳이겠죠..?&lt;br /&gt;(Haredware BreakPoint에 대해선 다음글에서 말하고 있네요 : &lt;A href=&quot;http://dual5651.hacktizen.com/tt/entry/BreakBreak-BreakPoint&quot; target=_blank&gt;링크&lt;/A&gt;)&lt;br /&gt;&lt;br /&gt;체크루틴을 찾았으면 다음에 할일은 검사에 걸리지 않도록 하는 일입니다.&lt;br /&gt;이것도 역시 아주 간단한데요.&lt;br /&gt;-_-; 음.. 위에서 간단히 설명을 위해 사용했던 코드는 다음과 같이도 표시됩니다.&lt;br /&gt;&lt;br /&gt;for(int i = EntryPoint; i &amp;lt;= SizeOfImage; i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;&amp;nbsp; checksum += *(BaseAddress + i);&lt;br /&gt;....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;결국 memory라는 BaseAddress를 기반으로 i값만큼 떨어진 오프셋에 있는 값을&lt;br /&gt;한개씩 확인하는 거죠. 이걸 기반으로 CRC 체크 루틴을 우회할 수 있는 간단한&lt;br /&gt;아이디어를 생각해 낼 수 있는 겁니다.&lt;br /&gt;&lt;br /&gt;CRC체크 루틴이 원하는 Original Memory들을 덤프하여 둔 후,&lt;br /&gt;해당 프로세스 내에 다시 메모리를 할당하여 대상 메모리에 덤프해둔 메모리를 복사하면,&lt;br /&gt;기존의 공간과 똑같은 메모리 구조를 가지고 있게 됩니다.&lt;br /&gt;그 후 찾아낸 CRC체크 루틴에서 사용하는 BaseAddress를 할당한 메모리 주소로&lt;br /&gt;바꿔주게 되면 우리가 본래 내용을 변조하여도 언제나 덤프해둔 메모리의 내용만&lt;br /&gt;검사할 것이기 때문에 감지를 우회할 수 있게 됩니다.&lt;br /&gt;이를 간단하게 그림으로 표시해봤습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;P&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1216850107.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;300&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
&lt;P&gt;위는 기존의 메모리 상태이고, 체크루틴의 BaseAddress를 바꾼 후는 : &lt;br /&gt;&lt;/P&gt;&lt;br /&gt;
&lt;P&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1023997133.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;300&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;정말 쉽죠..? (이런말 하다가 죽은 미술가가 한명 있죠..)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그렇다면 외부 프로그램에 의해 검사되는 방식은 어떨까요? 그것도 정말 쉬운데요.&lt;br /&gt;외부 프로세스에서 타 프로세스의 메모리로 접근하기 위해서는 유저레벨에서는&lt;br /&gt;ReadProcessMemory() 라는 API를 사용합니다.&lt;br /&gt;음.. 아마도 인자값이 ReadProcessMemory(hProcess,BaseAddress,buffer,len,&amp;amp;ret);&lt;br /&gt;식으로 썻었던거 같은데요..&lt;br /&gt;커널단에서 ReadProcessMemory()라는 API는 ZwReadVirtualMemory()라는 함수로&lt;br /&gt;연결이 되고, ZwReadVritualMemory함수를 후킹하는 다음과 같은 형식의 코드를&lt;br /&gt;작성함으로써 앞에서 사용했던 방법과 동일하게 돌파가 가능하겠죠.&lt;br /&gt;&lt;br /&gt;if((BaseAddress =&amp;gt; CRCStartAddress) &amp;amp;&amp;amp; (BaseAddress &amp;lt;= CRCEndAddress))&lt;/P&gt;
&lt;P&gt;{ &lt;/P&gt;
&lt;P&gt;..........&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; BaseAddress = DumpedMemory;&lt;/P&gt;
&lt;P&gt;..........&lt;/P&gt;
&lt;P&gt;}&lt;br /&gt;내부에서의 검사루틴 돌파법을 이해했다면 두번쨰 방법의 이해는 누워서 호떡먹기보다&lt;br /&gt;쉬울겁니다. -_-/&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1230655595.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;550&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;/P&gt;</description>
			<category>Programming</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/306</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/CRCCyclic-Redundancy-Check-bypassing#entry306comment</comments>
			<pubDate>Wed, 17 Oct 2007 18:43:25 +0900</pubDate>
		</item>
		<item>
			<title>이번년도 참가예정 국내 보안 컨퍼런스 소개.</title>
			<link>http://dual5651.hacktizen.com/tc/entry/%EC%9D%B4%EB%B2%88%EB%85%84%EB%8F%84-%EC%B0%B8%EA%B0%80%EC%98%88%EC%A0%95-%EA%B5%AD%EB%82%B4-%EB%B3%B4%EC%95%88-%EC%BB%A8%ED%8D%BC%EB%9F%B0%EC%8A%A4-%EC%86%8C%EA%B0%9C</link>
			<description>&lt;P&gt;1. POC (Power Of Community)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1095269479.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;205&quot; width=&quot;205&quot; /&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;주소 : &lt;A href=&quot;http://www.powerofcommunity.net&quot;&gt;http://www.powerofcommunity.net&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;소개 : 2006년도 부터 열리기 시작한 국제 컨퍼런스인 POC는 SecurityProof의&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 운영자인 Vangelis의 주도하에 다음과 같은 모토를 기반으로 열립니다.&lt;br /&gt;&lt;br /&gt;- Hacker Should be free.&lt;br /&gt;- We hack for security.&lt;br /&gt;- We should trust Power of community.&lt;br /&gt;&lt;br /&gt;성격 : 이론이나 단순한 프로젝트의 성격에 대한 논의 보다는 실제적인 공격이&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;어떻게 이루어지는지의 방법론과 시현을 보다 강조하는 성격을 가지고 있습니다.&lt;br /&gt;&lt;br /&gt;열리는 날짜 : 11월 15 ~ 16일&lt;br /&gt;&lt;br /&gt;장소 : 양재에 위치한 서울 교육 문화 회관&lt;br /&gt;&lt;br /&gt;일정 : &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 첫날 - 11월 15일&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;TABLE class=MsoNormalTable style=&quot;WIDTH: 486.75pt; mso-cellspacing: 0cm; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt&quot; cellSpacing=0 cellPadding=0 width=649 border=1&gt;
&lt;TBODY&gt;
&lt;TR style=&quot;HEIGHT: 20.25pt; mso-yfti-irow: 1&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt; HEIGHT: 20.25pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;B&gt;&lt;FONT face=굴림&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;08:00&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=굴림&gt;~&lt;?XML:NAMESPACE PREFIX = ST1 /&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;9&quot; Minute=&quot;0&quot;&gt;09:00&lt;/ST1:TIME&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;B&gt;&lt;FONT face=굴림&gt;&lt;?XML:NAMESPACE PREFIX = O /&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt; HEIGHT: 20.25pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; COLOR: #ff3333; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Registration - 등록&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 2&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;B&gt;&lt;FONT face=굴림&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;9&quot; Minute=&quot;30&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;09:30&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=굴림&gt;~&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;10&quot; Minute=&quot;30&quot;&gt;10:30&lt;/ST1:TIME&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;B&gt;&lt;FONT face=굴림&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Casper&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, Forensics and Anti-Forensics - 포렌식과 안티 포렌식&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;HEIGHT: 21pt; mso-yfti-irow: 3&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt; HEIGHT: 21pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;B&gt;&lt;FONT face=굴림&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;11&quot; Minute=&quot;0&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;11:00&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=굴림&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;12&quot; Minute=&quot;0&quot;&gt;12:00&lt;/ST1:TIME&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;B&gt;&lt;FONT face=굴림&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt; HEIGHT: 21pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Silverbug&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, How to Hack Your Cell Phones? - 핸드폰 해킹&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 4&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;12&quot; Minute=&quot;0&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;12:00&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;13&quot; Minute=&quot;0&quot;&gt;13:00&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; COLOR: #ff3333; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Lunch - 점심시간 (따로 제공되지는 않습니다.)&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 5&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;13&quot; Minute=&quot;0&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;13:00&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;14&quot; Minute=&quot;10&quot;&gt;14:10&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Xpl017Elz&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;,Updating.... (미정)&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 6&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;14&quot; Minute=&quot;20&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;14:20&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;15&quot; Minute=&quot;30&quot;&gt;15:30&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Daiki Fukumori&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, Attacking Web 2.0 - Web 2.0 에서의 해킹&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 7&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;15&quot; Minute=&quot;40&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;15:40&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;16&quot; Minute=&quot;50&quot;&gt;16:50&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Dave Aitel&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, Writing Exploits Using Immunity Debugger &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; - 이뮤니티 디버거를 이용한 익스플로잇 작성&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 8&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;17&quot; Minute=&quot;0&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;17:00&lt;/SPAN&gt;&lt;/ST1:TIME&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;18&quot; Minute=&quot;10&quot;&gt;18:10&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;B&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Grugq&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, Hacking Sucks: Presentation the Hash Hacking Harness&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 둘째날 - 11월 16일&lt;br /&gt;&lt;br /&gt;
&lt;TABLE class=MsoNormalTable style=&quot;WIDTH: 486.75pt; mso-cellspacing: 0cm; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt&quot; cellSpacing=0 cellPadding=0 width=649 border=1&gt;
&lt;TBODY&gt;
&lt;TR style=&quot;mso-yfti-irow: 12&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;09:10&lt;/SPAN&gt;&lt;/B&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;10&quot; Minute=&quot;0&quot;&gt;10:10&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;ST1:PERSONNAME w:st=&quot;on&quot;&gt;&lt;?XML:NAMESPACE PREFIX = ST2 /&gt;&lt;ST2:SN w:st=&quot;on&quot;&gt;&lt;B&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;AmesianX&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:PERSONNAME&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;How to Implement COM Monitor - 1 - COM 후킹&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 13&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;10&quot; Minute=&quot;10&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;10:20&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;11&quot; Minute=&quot;10&quot;&gt;11:10&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;AmesianX&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;How to Implement COM Monitor - 2 - &quot;&quot;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 14&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;11&quot; Minute=&quot;20&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;11:20&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;12&quot; Minute=&quot;30&quot;&gt;12:30&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Hendrik&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, Hacking VoIP Routers - VoIP 라우터 해킹&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 15&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;12&quot; Minute=&quot;30&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;12:30&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;13&quot; Minute=&quot;30&quot;&gt;13:30&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; COLOR: #ff3333; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Lunch - 점심시간(따로 제공되지는 않습니다)&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 16&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;14&quot; Minute=&quot;0&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;14:00&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;15&quot; Minute=&quot;10&quot;&gt;15:10&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;@tlas&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, VulnCatcher: Fun with Vtrace and Programmatic Debugging&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;- Defcon CTF 1위팀인 &lt;A href=&quot;mailto:1st@place&quot;&gt;1st@place&lt;/A&gt;팀의 리더에 발표&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 17&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;15&quot; Minute=&quot;30&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;15:30&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;16&quot; Minute=&quot;40&quot;&gt;16:40&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Linzi&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, Another Idosyncratic Attack&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 18&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;16&quot; Minute=&quot;50&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;16:50&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;18&quot; Minute=&quot;0&quot;&gt;18:00&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;GilGil&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;, SnoopSpy2(Advanced Network Hacking and Security Tool) Project&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;- POC2006에서 voIP Sniffer를 발표한 GilGil님의 SSL MITM시현예상&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 19&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;18&quot; Minute=&quot;0&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;18:00&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;18&quot; Minute=&quot;30&quot;&gt;18:30&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; COLOR: #ff3333; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Closing Ceremony - 폐회&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;mso-yfti-irow: 20; mso-yfti-lastrow: yes&quot;&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BACKGROUND: white; PADDING-BOTTOM: 3.75pt; WIDTH: 94.5pt; PADDING-TOP: 3.75pt&quot; width=126&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=center&gt;&lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;19&quot; Minute=&quot;0&quot;&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;19:00&lt;/SPAN&gt;&lt;/B&gt;&lt;/ST1:TIME&gt;&lt;B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt; ~ &lt;ST1:TIME w:st=&quot;on&quot; o:ls=&quot;trans&quot; Hour=&quot;21&quot; Minute=&quot;0&quot;&gt;21:00&lt;/ST1:TIME&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; WIDTH: 372.75pt; PADDING-TOP: 3.75pt&quot; width=497&gt;
&lt;P class=MsoNormal style=&quot;WORD-BREAK: keep-all; TEXT-AUTOSPACE: ideograph-numeric; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan&quot; align=left&gt;&lt;B&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;Dinner Party for Speakers, Guests, Participants, and Staffs&lt;br /&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림; mso-font-kerning: 0pt&quot;&gt;&lt;O:P&gt;- 디너 파티 (* 등록시에 디너파티도 등록을 해야 참가 가능)&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/O:P&gt;&lt;/ST2:SN&gt;&lt;br /&gt;지원되는 통역언어 : 한국어, 영어, 중국어, 일본어 (번역기의 체널별 선택)&lt;br /&gt;&lt;br /&gt;등록 : 
&lt;P class=main_content&gt;* 조기 등록 : 9월 1 ~ 30일&lt;/P&gt;
&lt;P class=main_content&gt;* 후기 등록 : 10월 1일 ~ 11월 10일&lt;/P&gt;
&lt;P class=main_content&gt;* 현장 등록 : 11월 15 ~ 16 &lt;/P&gt;&lt;br /&gt;
&lt;TABLE style=&quot;BORDER-COLLAPSE: collapse&quot; cellSpacing=0 width=629&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=151 bgColor=#999999&gt;
&lt;P align=center&gt;&lt;B&gt;&lt;FONT face=Arial&gt;구분&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=176 bgColor=#999999&gt;
&lt;P align=center&gt;&lt;B&gt;&lt;FONT face=Arial&gt;날짜&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=292 bgColor=#999999&gt;
&lt;P align=center&gt;&lt;B&gt;&lt;FONT face=Arial&gt;요금&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=151&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;조기&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=176&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;9월 1 ~ 30일&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=292&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face=굴림체 size=2&gt;\&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;150,000 (학생 - &lt;/FONT&gt;&lt;FONT face=굴림체 size=2&gt;\&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;50,000)&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=151&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;후기&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=176&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;10월 1 ~ 11월 10일&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=292&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face=굴림체 size=2&gt;\&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;200,000(학생 - &lt;/FONT&gt;&lt;FONT face=굴림체 size=2&gt;\&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;100,000)&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=151&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;현장&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=176&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;11월 15 ~ 16일&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style=&quot;BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid&quot; width=292&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face=굴림체 size=2&gt;\&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;300,000(학생 - &lt;/FONT&gt;&lt;FONT face=굴림체 size=2&gt;\&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;150,000)&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;----------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;2. AVAR (Association of anti-Virus Asia Researchers&lt;STRONG&gt;)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1351931826.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;123&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/STRONG&gt;주소 : &lt;A href=&quot;http://www.aavar.org/avar2007/&quot;&gt;http://www.aavar.org/avar2007/&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;소개 : 98년 6월 안철수, 안철수 연구소 이사회 의장과 무라카미 세이지&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; JCSR회장이 아시아 지역의 안티바이러스 분야 협력 증진을 위해 창립한 비영리 조직.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;성격 : 세계 보안 및 바이러스 백신 전문가, 각국 정부 관계자등 주요인사들이 많이 참가하며,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;전문가들의 전문가를 위한 악성코드에 대한 논의, 대책 강구, 중국발 해킹, 실행파일&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;압축기반의 바이러스에 대한 대책, 온라인 게임보안등 다양한 주제로 이루어짐.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; * 전문가들의 컨퍼런스이기 떄문에 등록금액이 비쌈.&lt;br /&gt;&lt;br /&gt;열리는 날짜 : 11월 28-30일&lt;br /&gt;&lt;br /&gt;장소 : 서울 프라자 호텔&lt;br /&gt;&lt;br /&gt;일정 : &lt;br /&gt;&lt;br /&gt;첫날 -&amp;nbsp; 11월 28일&lt;br /&gt;&lt;br /&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=580 border=0&gt;
&lt;TBODY&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD width=120 height=22&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#0b2775&gt;시간&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD width=460 height=18&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#0b2775&gt;세션&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#d3deed&gt;
&lt;TD colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;16:00 ~ 19:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;등록&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;19:00 ~ 21:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Cocktail Reception - ?!&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;둘째날 - 11월 29일 &lt;br /&gt;&lt;br /&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=580 border=0&gt;
&lt;TBODY&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD width=120 height=22&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#0b2775&gt;시간&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD width=460 bgColor=#f3f6fa height=18&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#0b2775&gt;세션&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#d3deed&gt;
&lt;TD colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;08:30 ~ 09:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;등록&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=60&gt;
&lt;DIV align=center&gt;09:00 ~ 09:20&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;환영겢회사&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Seiji Murakami, Chairman of AVAR/ Charles Ahn. The host of AVAR 2007/&lt;br /&gt;Byung-Jo Suh, Director General of MIC&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;09:20 ~ 10:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Keynote Speech; Security-From Ocean’s Eleven to Seven-Eleven&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Vincent Weafer - Symantec Corp.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;10:00 ~ 10:20&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD bgColor=#f3f6fa&gt;Coffee Break&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;10:20 ~ 11:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;The Name of The Game&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Igor Muttik - McAfee&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;11:00 ~ 11:40&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Hackers are storming:New Attack in Online Game Security Area&lt;br /&gt;&lt;/STRONG&gt;&lt;FONT color=#0b2775&gt;DeokYoung Jung, Howoong Lee - AhnLab&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=60&gt;
&lt;DIV align=center&gt;11:40 ~ 12:20&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Predicting Hurricanes: Contributing Factors in rise of “False&lt;br /&gt;Positives&quot;&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Mario Vuksan - Bit9, Inc.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;12:20 ~ 13:40&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD height=40&gt;Lunch(Luncheon Speech)&lt;br /&gt;&lt;FONT color=#0b2775&gt;CDNetworks&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;13:30 ~ 14:10&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Conventional and Advanced Generic Detections&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Itshak(Tsahi) Carmona - CA, Inc.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;14:10 ~ 14:50&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;The Cybercrime: Fact, reasons, trends&lt;br /&gt;&lt;/STRONG&gt;&lt;FONT color=#0b2775&gt;Eugene Kaspersky - Kaspersky Lab&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=60&gt;
&lt;DIV align=center&gt;14:50 ~ 15:30&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Life after Signatures - Pattern analysis application for detecting &lt;br /&gt;server-side polymorphic malware before system penetration&lt;br /&gt;&lt;/STRONG&gt;&lt;FONT color=#0b2775&gt;Amir Lev - Commtouch&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;15:30 ~ 15:45&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Coffee Break&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;15:45 ~ 16:25&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Testing, Testing: Anti-Malware Evaluation for the Enterprise&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;David Harley &amp;amp; Andrew Lee - ESET LLC&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=60&gt;
&lt;DIV align=center&gt;16:25 ~ 17:05&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Nature of Anti-Malware Testing and Certification Programs Life and&lt;br /&gt;times of testing Anti-virus Products&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Andrew Hayter - ICSA Labs&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;17:05 ~ 17:45&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Testing of &quot;Dynamic Detection&quot;&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Maik Morgenstern &amp;amp; Andreas Marx - AV-Test. org.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;19:00 ~ 22:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Banquet&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;셋째날 - 11월 30일&lt;br /&gt;&lt;br /&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=580 border=0&gt;
&lt;TBODY&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD width=120 height=22&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#0b2775&gt;시간&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD width=460 bgColor=#f3f6fa height=18&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#0b2775&gt;세션&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#d3deed&gt;
&lt;TD colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;08:30 ~ 08:50&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;등록&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;08:50 ~ 09:30&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Design of X86 Emulator for Generic Unpacking&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Chandra Prakash - Sunbelt Software&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;09:30 ~ 10:10&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Anti-unpacker Tricks in Malicious Code&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Tan, Xiaodong - Websense Inc.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#ffffff&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;10:10 ~ 10:50&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD height=25&gt;&lt;STRONG&gt;Zero-Hour-Analysis System&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Shigeru Ishii - IPA, Japan&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;10:50 ~ 11:10&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Coffee Break&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;11:10 ~ 11:50&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Myth and Truth about Windows Vista Security&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Hongseok Kim - Microsoft&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;11:50 ~ 12:30&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Understanding and Teaching Heuristics&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Randy Abrams - ESET LLC&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;12:30 ~ 13:40&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD height=25&gt;Lunch(Luncheon Speech)&lt;br /&gt;&lt;FONT color=#0b2775&gt;New Technology Wave Inc.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;13:40 ~ 14:20&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Is Hong Kong&#039;s new Anti-Spam Law Effective?&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Allan Dyer - Yui Kee Computing Ltd.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;14:20 ~ 15:00&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Research &amp;amp; Defense on Password-stealing Trojans in China&lt;br /&gt;&lt;/STRONG&gt;&lt;FONT color=#0b2775&gt;Ritchie Chen - Kingsoft&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;15:00 ~ 15:40&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;KrCERT Botnet Mitigation&lt;br /&gt;&lt;/STRONG&gt;&lt;FONT color=#0b2775&gt;Dong-Ryun Lee - KISA, Korea&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgColor=#f3f6fa&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;15:40 ~ 15:55&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Coffee Break&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=40&gt;
&lt;DIV align=center&gt;15:55 ~ 16:35&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Find out the “Bad guys” on the Symbian&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT color=#0b2775&gt;Jie Zhang - Fortinet, Inc.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;16:35 ~ 17:35&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Panel Discussion&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;17:35 ~ 17:50&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;Closing Ceremony&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e8e8e8 colSpan=2&gt;&lt;IMG height=1 src=&quot;http://www.aavar.org/avar2007/img/space.gif&quot; width=1&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=25&gt;
&lt;DIV align=center&gt;17:50 ~ 18:20&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD&gt;AVAR Members meeting&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;등록 : &lt;br /&gt;&lt;br /&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=580 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top height=70&gt;
&lt;DIV align=center&gt;
&lt;TABLE cellSpacing=1 cellPadding=0 width=554 bgColor=#cccccc border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width=183 bgColor=#6699cc&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#ffffff&gt;조기 등록&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD width=183 bgColor=#6699cc&gt;
&lt;DIV align=center&gt;&lt;STRONG&gt;&lt;FONT color=#ffffff&gt;총 요금&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#f1f5fa height=20&gt;
&lt;DIV align=center&gt;AVAR 회원&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD bgColor=#f1f5fa&gt;
&lt;DIV align=center&gt;KRW 540,000&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD bgColor=#f1f5fa&gt;
&lt;DIV align=center&gt;KRW 585,000&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD bgColor=#e3ecf4 height=20&gt;
&lt;DIV align=center&gt;비회원&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD bgColor=#e3ecf4&gt;
&lt;DIV align=center&gt;KRW 600,000&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD bgColor=#e3ecf4&gt;
&lt;DIV align=center&gt;KRW 650,000&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=20&gt;* &lt;STRONG&gt;조기등록 기간 :&lt;/STRONG&gt;&amp;nbsp;10월 31일 2007년&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD height=156&gt;
&lt;DIV align=center&gt;&lt;IMG height=146 src=&quot;https://avar2007.ahnlab.com/img/eng_img02_02.gif&quot; width=564&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;등록 요금이 포함하는 것?&lt;br /&gt;- 28일의 칵테일 접대&lt;br /&gt;- 컨퍼런스 세션 참가&lt;br /&gt;- 컨퍼런스 내용에 대한 하드커피본과 CD-ROM 포맷.&lt;br /&gt;- 목요일, 11월 29일 그리고 금요일, 11월 30일에 제공되는 점심 그리고 &amp;nbsp;중간 회복(?).&lt;br /&gt;- 목요일 11월 29일에 제공되는 연회&lt;br /&gt;- 양말과 티셔치 그리고 기타.&lt;br /&gt;&lt;br /&gt;* KRW가 Korea Won이라면 일반인은 65만원이네요.&lt;br /&gt;-.- 확실한건 일찍일어나는 새가 되지 못하면 두개다 아주 비싸죠~&lt;br /&gt;&lt;br /&gt;* 주의할 점이랄까요..&lt;br /&gt;메인 스폰서로서 ncsc(국가사이버안전센터)가 있습니다,&lt;br /&gt;많이들 아시다시피 ncsc는 nis(국가정보원)의 소속기관이죠.&lt;br /&gt;나쁜 짓 많이 해서 캥기는거 있는 분들은 -,.-;;</description>
			<category>헛소리</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/304</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/%EC%9D%B4%EB%B2%88%EB%85%84%EB%8F%84-%EC%B0%B8%EA%B0%80%EC%98%88%EC%A0%95-%EA%B5%AD%EB%82%B4-%EB%B3%B4%EC%95%88-%EC%BB%A8%ED%8D%BC%EB%9F%B0%EC%8A%A4-%EC%86%8C%EA%B0%9C#entry304comment</comments>
			<pubDate>Sat, 13 Oct 2007 14:44:21 +0900</pubDate>
		</item>
		<item>
			<title>.net Application 공략 하기</title>
			<link>http://dual5651.hacktizen.com/tc/entry/net-Application-%EA%B3%B5%EB%9E%B5-%ED%95%98%EA%B8%B0</link>
			<description>&lt;P&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1214461962.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;276&quot; width=&quot;338&quot; /&gt;&lt;/div&gt;&lt;br /&gt;위와 같이 텍스트 박스 한개와 버튼 한개로 이루어진 .net 프로그램이 하나 존재합니다.&lt;br /&gt;이 프로그램을 OllyDebugger로 Open 하거나 Attach 하여 함수 목록을 보면&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1293708906.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;305&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;사용하는 함수 목록이 보이지 않습니다. -_-;&lt;br /&gt;&lt;br /&gt;PEID로 패커 및 컴파일러 타입을 알아 보았습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1117595926.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;240&quot; width=&quot;420&quot; /&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;C# 또는 Basic 으로 만들어진 .NET Application이라 그랬던 거군요 -_-;ㅋ&lt;br /&gt;&lt;br /&gt;이런 .NET Application은 Reflector 라는 프로그램으로 공략할 수 있습니다.&lt;br /&gt;-_-;; 음.. 디컴파일러(?) 정도의 기능을 제공하여 줍니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1217189545.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;483&quot; width=&quot;423&quot; /&gt;&lt;/div&gt;&lt;br /&gt;우선 위와같이 대상 프로그램을 로드해왔습니다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1086629038.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;279&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;-_-; Go to member~&lt;br /&gt;&lt;br /&gt;클릭할떄 어떻게 되는지 궁금함으로 via_click 을 클릭했습니다.&lt;br /&gt;&lt;br /&gt;다음과 같은 코드가 via_click의 코드군요.&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;
&lt;TABLE style=&quot;MARGIN-BOTTOM: 0px&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style=&quot;PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px&quot; vAlign=top colSpan=2&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT color=#1000a0&gt;private&lt;/FONT&gt;: &lt;/FONT&gt;&lt;A title=System.Void href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Void&quot;&gt;&lt;FONT color=#006018 size=2&gt;void&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* &lt;B&gt;&lt;A class=bold href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/vla_Click(Object,System.EventArgs)&quot;&gt;&lt;FONT color=#000000&gt;vla_Click&lt;/FONT&gt;&lt;/A&gt;&lt;/B&gt;(&lt;/FONT&gt;&lt;A title=System.Object href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object&quot;&gt;&lt;FONT color=#006018 size=2&gt;Object&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* sender, &lt;/FONT&gt;&lt;A title=System.EventArgs href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.EventArgs&quot;&gt;&lt;FONT color=#006018 size=2&gt;EventArgs&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* e)
{
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* numArray &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; [] = &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;new&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;*[&lt;FONT color=#800000&gt;12&lt;/FONT&gt;];
    &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.VariantType href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType&quot;&gt;&lt;FONT color=#006018 size=2&gt;VariantType&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* type = *&lt;FONT color=#1000a0&gt;static_cast&lt;/FONT&gt;&amp;lt;&lt;FONT color=#1000a0&gt;__box&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.VariantType href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType&quot;&gt;&lt;FONT color=#006018 size=2&gt;VariantType&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;*&amp;gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.Conversions href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.Conversions&quot;&gt;&lt;FONT color=#006018 size=2&gt;Conversions&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Int32 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToInteger&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=app14.My.MyProject href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.My.MyProject&quot;&gt;&lt;FONT color=#006018 size=2&gt;MyProject&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MyComputer app14.My.MyProject.Computer { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.My.MyProject/property:Computer:app14.My.MyComputer&quot;&gt;&lt;FONT color=#006018 size=2&gt;Computer&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;RegistryProxy Microsoft.VisualBasic.Devices.ServerComputer.Registry { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Devices.ServerComputer/property:Registry:Microsoft.VisualBasic.MyServices.RegistryProxy&quot;&gt;&lt;FONT color=#006018 size=2&gt;Registry&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;Object Microsoft.VisualBasic.MyServices.RegistryProxy.GetValue(String __gc* , String __gc* , Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;GetValue&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;FONT color=#800000&gt;S&quot;HKEY_CURRENT_USER\\valid&quot;&lt;/FONT&gt;, &lt;FONT color=#800000&gt;S&quot;&quot;&lt;/FONT&gt;, &lt;FONT color=#800000&gt;0&lt;/FONT&gt;)));
    &lt;/FONT&gt;&lt;A title=System.Decimal href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Decimal&quot;&gt;&lt;FONT color=#006018 size=2&gt;Decimal&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* num = ((((*&lt;FONT color=#1000a0&gt;static_cast&lt;/FONT&gt;&amp;lt;&lt;FONT color=#1000a0&gt;__box&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Double href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Double&quot;&gt;&lt;FONT color=#006018 size=2&gt;Double&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;*&amp;gt;(&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;) + &lt;FONT color=#800000&gt;1.5&lt;/FONT&gt;) * *&lt;FONT color=#1000a0&gt;static_cast&lt;/FONT&gt;&amp;lt;&lt;FONT color=#1000a0&gt;__box&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Double href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Double&quot;&gt;&lt;FONT color=#006018 size=2&gt;Double&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;*&amp;gt;(&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;)) + &lt;FONT color=#800000&gt;0.025&lt;/FONT&gt;));
    &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; (&lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; == &lt;FONT color=#800000&gt;S&quot;somerandomvl&quot;&lt;/FONT&gt;)
    {
        &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Interaction href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Interaction&quot;&gt;&lt;FONT color=#006018 size=2&gt;Interaction&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MsgBoxResult Microsoft.VisualBasic.Interaction.MsgBox(Object __gc* , MsgBoxStyle __gc* , Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;MsgBox&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=System.Runtime.CompilerServices.RuntimeHelpers href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Runtime.CompilerServices.RuntimeHelpers&quot;&gt;&lt;FONT color=#006018 size=2&gt;RuntimeHelpers&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;GetObjectValue&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandDecrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.Conversions href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.Conversions&quot;&gt;&lt;FONT color=#006018 size=2&gt;Conversions&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToString&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandEncrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandEncrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;FONT color=#800000&gt;S&quot;ydXX!if not txt is blah youfailed&quot;&lt;/FONT&gt;)))), &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.MsgBoxStyle href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.MsgBoxStyle&quot;&gt;&lt;FONT color=#006018 size=2&gt;MsgBoxStyle&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MsgBoxStyle Microsoft.VisualBasic.MsgBoxStyle.Exclamation;&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.MsgBoxStyle/Exclamation&quot;&gt;&lt;FONT color=#006018 size=2&gt;Exclamation&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;S&quot;585mfg9gf&quot;&lt;/FONT&gt;);
    }
    &lt;FONT color=#1000a0&gt;else&lt;/FONT&gt;
    {
        &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Interaction href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Interaction&quot;&gt;&lt;FONT color=#006018 size=2&gt;Interaction&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MsgBoxResult Microsoft.VisualBasic.Interaction.MsgBox(Object __gc* , MsgBoxStyle __gc* , Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;MsgBox&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=System.Runtime.CompilerServices.RuntimeHelpers href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Runtime.CompilerServices.RuntimeHelpers&quot;&gt;&lt;FONT color=#006018 size=2&gt;RuntimeHelpers&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;GetObjectValue&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandDecrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;FONT color=#800000&gt;S&quot;ydXX!if not txt is blah youfailed&quot;&lt;/FONT&gt;)), &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.MsgBoxStyle href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.MsgBoxStyle&quot;&gt;&lt;FONT color=#006018 size=2&gt;MsgBoxStyle&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MsgBoxStyle Microsoft.VisualBasic.MsgBoxStyle.Exclamation;&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.MsgBoxStyle/Exclamation&quot;&gt;&lt;FONT color=#006018 size=2&gt;Exclamation&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;S&quot;585mfg9gf&quot;&lt;/FONT&gt;);
    }
    &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; (&lt;/FONT&gt;&lt;A title=System.Convert href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Convert&quot;&gt;&lt;FONT color=#006018 size=2&gt;Convert&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Double System.Convert.ToDouble(Decimal __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToDouble&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;Decimal __gc* num // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;num&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;) == (((*&lt;FONT color=#1000a0&gt;static_cast&lt;/FONT&gt;&amp;lt;&lt;FONT color=#1000a0&gt;__box&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Double href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Double&quot;&gt;&lt;FONT color=#006018 size=2&gt;Double&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;*&amp;gt;(&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;) + &lt;FONT color=#800000&gt;1.5&lt;/FONT&gt;) * *&lt;FONT color=#1000a0&gt;static_cast&lt;/FONT&gt;&amp;lt;&lt;FONT color=#1000a0&gt;__box&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Double href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Double&quot;&gt;&lt;FONT color=#006018 size=2&gt;Double&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;*&amp;gt;(&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;)) + &lt;FONT color=#800000&gt;0.025&lt;/FONT&gt;))
    {
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; == &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.VariantType href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType&quot;&gt;&lt;FONT color=#006018 size=2&gt;VariantType&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;VariantType Microsoft.VisualBasic.VariantType.Empty;&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType/Empty&quot;&gt;&lt;FONT color=#006018 size=2&gt;Empty&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;) | (&lt;/FONT&gt;&lt;A title=app14.My.MyProject href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.My.MyProject&quot;&gt;&lt;FONT color=#006018 size=2&gt;MyProject&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MyApplication app14.My.MyProject.Application { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.My.MyProject/property:Application:app14.My.MyApplication&quot;&gt;&lt;FONT color=#006018 size=2&gt;Application&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;AssemblyInfo Microsoft.VisualBasic.ApplicationServices.ApplicationBase.Info { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.ApplicationServices.ApplicationBase/property:Info:Microsoft.VisualBasic.ApplicationServices.AssemblyInfo&quot;&gt;&lt;FONT color=#006018 size=2&gt;Info&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.ApplicationServices.AssemblyInfo.DirectoryPath { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.ApplicationServices.AssemblyInfo/property:DirectoryPath:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;DirectoryPath&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;Int32 System.String.Length { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:1.0.5000.0:b77a5c561934e089/System.String/property:Length:Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Length&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Int32.ToString();&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToString&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;()-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;Int32 System.String.Length { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:1.0.5000.0:b77a5c561934e089/System.String/property:Length:Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Length&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; == &lt;FONT color=#800000&gt;0x1ca&lt;/FONT&gt;))
        {
            &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Interaction href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Interaction&quot;&gt;&lt;FONT color=#006018 size=2&gt;Interaction&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MsgBoxResult Microsoft.VisualBasic.Interaction.MsgBox(Object __gc* , MsgBoxStyle __gc* , Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;MsgBox&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;FONT color=#800000&gt;S&quot;nope&quot;&lt;/FONT&gt;, &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.MsgBoxStyle href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.MsgBoxStyle&quot;&gt;&lt;FONT color=#006018 size=2&gt;MsgBoxStyle&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;MsgBoxStyle Microsoft.VisualBasic.MsgBoxStyle.Information;&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.MsgBoxStyle/Information&quot;&gt;&lt;FONT color=#006018 size=2&gt;Information&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;S&quot;sorry&quot;&lt;/FONT&gt;);
        }
        &lt;FONT color=#1000a0&gt;else&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((((&lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; != &lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;) &amp;amp; &lt;FONT color=#800000&gt;false&lt;/FONT&gt;) | &lt;FONT color=#800000&gt;false&lt;/FONT&gt;) | (&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; == &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.VariantType href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType&quot;&gt;&lt;FONT color=#006018 size=2&gt;VariantType&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;VariantType Microsoft.VisualBasic.VariantType.Null;&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType/Null&quot;&gt;&lt;FONT color=#006018 size=2&gt;Null&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;))
        {
            &lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.Conversions href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.Conversions&quot;&gt;&lt;FONT color=#006018 size=2&gt;Conversions&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToString&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandDecrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;FONT color=#800000&gt;S&quot;fm`{f}kpwrn&quot;&lt;/FONT&gt;));
        }
    }
}&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;TABLE style=&quot;MARGIN-BOTTOM: 0px&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;
&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;음 -_-; 두가지 함수가 존재하는군요.&lt;br /&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandEncrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandEncrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;&amp;nbsp;와 &lt;/FONT&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandDecrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;&amp;nbsp;네요~&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;
&lt;TABLE style=&quot;MARGIN-BOTTOM: 0px&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style=&quot;PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px&quot; vAlign=top colSpan=2&gt;&lt;PRE&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute.StandardModuleAttribute(); href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute/.ctor()&quot;&gt;&lt;FONT color=#006018 size=2&gt;StandardModule&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;]
&lt;FONT color=#1000a0&gt;private&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;sealed&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;class&lt;/FONT&gt; &lt;B&gt;&lt;A class=bold href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#000000&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;/B&gt;
{
    &lt;FONT color=#808080&gt;// Methods&lt;/FONT&gt;
    &lt;FONT color=#1000a0&gt;public&lt;/FONT&gt;: &lt;FONT color=#1000a0&gt;static&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Object href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object&quot;&gt;&lt;FONT color=#006018 size=2&gt;Object&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* &lt;B&gt;&lt;A class=bold href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt/ParseandDecrypt(String):Object&quot;&gt;&lt;FONT color=#000000&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;/B&gt;(&lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* stringd);
    &lt;FONT color=#1000a0&gt;public&lt;/FONT&gt;: &lt;FONT color=#1000a0&gt;static&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Object href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object&quot;&gt;&lt;FONT color=#006018 size=2&gt;Object&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* &lt;B&gt;&lt;A class=bold href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt/ParseandEncrypt(String):Object&quot;&gt;&lt;FONT color=#000000&gt;ParseandEncrypt&lt;/FONT&gt;&lt;/A&gt;&lt;/B&gt;(&lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* stringd);
};
&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;TABLE style=&quot;MARGIN-BOTTOM: 0px&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style=&quot;PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px&quot; vAlign=top colSpan=2&gt;&lt;PRE&gt;&lt;A href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Command=1&quot;&gt;&lt;B&gt;&lt;FONT color=#006018 size=2&gt;Expand Methods&lt;/FONT&gt;&lt;/B&gt;&lt;/A&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT size=2&gt;음 -_-; 두 함수를 디스어셈블~!&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT color=#1000a0&gt;public&lt;/FONT&gt;: &lt;FONT color=#1000a0&gt;static&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Object href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object&quot;&gt;&lt;FONT color=#006018 size=2&gt;Object&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* &lt;B&gt;&lt;A class=bold href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt/ParseandDecrypt(String):Object&quot;&gt;&lt;FONT color=#000000&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;/B&gt;(&lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* stringd)
{
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* numArray &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; [] = &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;new&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;*[&lt;FONT color=#800000&gt;0x80&lt;/FONT&gt;];
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* index = &lt;FONT color=#800000&gt;0&lt;/FONT&gt;;
    &lt;FONT color=#1000a0&gt;do&lt;/FONT&gt;
    {
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; % &lt;FONT color=#800000&gt;2&lt;/FONT&gt;) == &lt;FONT color=#800000&gt;0&lt;/FONT&gt;)
        {
            &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;] = (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; - &lt;FONT color=#800000&gt;3&lt;/FONT&gt;);
        }
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; % &lt;FONT color=#800000&gt;2&lt;/FONT&gt;) == &lt;FONT color=#800000&gt;1&lt;/FONT&gt;)
        {
            &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;] = (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; + &lt;FONT color=#800000&gt;4&lt;/FONT&gt;);
        }
        &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;++;
    }
    &lt;FONT color=#1000a0&gt;while&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;lt;= &lt;FONT color=#800000&gt;0x7f&lt;/FONT&gt;));
    &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;FONT color=#800000&gt;0&lt;/FONT&gt;;
    &lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* str2 = &lt;FONT color=#800000&gt;S&quot;&quot;&lt;/FONT&gt;;
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* length = &lt;/FONT&gt;&lt;A title=&quot;String __gc* stringd; // Parameter&quot;&gt;&lt;FONT color=#006018 size=2&gt;stringd&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;Int32 System.String.Length { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:1.0.5000.0:b77a5c561934e089/System.String/property:Length:Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Length&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;;
    &lt;FONT color=#1000a0&gt;for&lt;/FONT&gt; (&lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* i = &lt;FONT color=#800000&gt;1&lt;/FONT&gt;; (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;lt;= &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* length // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;length&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;); &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;++)
    {
        &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* charCode = (&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Int32 Microsoft.VisualBasic.Strings.Asc(String __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Asc&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.Strings.Mid(String __gc* , Int32 __gc* , Int32 __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Mid&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;String __gc* stringd; // Parameter&quot;&gt;&lt;FONT color=#006018 size=2&gt;stringd&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;1&lt;/FONT&gt;)) - &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;]);
        &lt;/FONT&gt;&lt;A title=&quot;String __gc* str2 // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;str2&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String System.String.Concat(String __gc* , String __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Concat&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;String __gc* str2 // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;str2&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.Conversions href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.Conversions&quot;&gt;&lt;FONT color=#006018 size=2&gt;Conversions&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Char __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToString&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Char Microsoft.VisualBasic.Strings.Chr(Int32 __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Chr&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* charCode // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;charCode&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;)));
        &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;++;
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;gt; &lt;FONT color=#800000&gt;0x7f&lt;/FONT&gt;)
        {
            &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;FONT color=#800000&gt;0&lt;/FONT&gt;;
        }
    }
    &lt;FONT color=#1000a0&gt;return&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=&quot;String __gc* str2 // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;str2&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;;
}&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;/FONT&gt;&lt;TABLE style=&quot;MARGIN-BOTTOM: 0px&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD style=&quot;PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px&quot; vAlign=top colSpan=2&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT color=#1000a0&gt;public&lt;/FONT&gt;: &lt;FONT color=#1000a0&gt;static&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Object href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object&quot;&gt;&lt;FONT color=#006018 size=2&gt;Object&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* &lt;B&gt;&lt;A class=bold href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt/ParseandEncrypt(String):Object&quot;&gt;&lt;FONT color=#000000&gt;ParseandEncrypt&lt;/FONT&gt;&lt;/A&gt;&lt;/B&gt;(&lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* stringd)
{
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* numArray &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; [] = &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;new&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;*[&lt;FONT color=#800000&gt;0x80&lt;/FONT&gt;];
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* index = &lt;FONT color=#800000&gt;0&lt;/FONT&gt;;
    &lt;FONT color=#1000a0&gt;do&lt;/FONT&gt;
    {
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; % &lt;FONT color=#800000&gt;2&lt;/FONT&gt;) == &lt;FONT color=#800000&gt;0&lt;/FONT&gt;)
        {
            &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;] = (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; - &lt;FONT color=#800000&gt;3&lt;/FONT&gt;);
        }
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; % &lt;FONT color=#800000&gt;2&lt;/FONT&gt;) == &lt;FONT color=#800000&gt;1&lt;/FONT&gt;)
        {
            &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;] = (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; + &lt;FONT color=#800000&gt;4&lt;/FONT&gt;);
        }
        &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;++;
    }
    &lt;FONT color=#1000a0&gt;while&lt;/FONT&gt; ((&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;lt;= &lt;FONT color=#800000&gt;0x7f&lt;/FONT&gt;));
    &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;FONT color=#800000&gt;0&lt;/FONT&gt;;
    &lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* str2 = &lt;FONT color=#800000&gt;S&quot;&quot;&lt;/FONT&gt;;
    &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* length = &lt;/FONT&gt;&lt;A title=&quot;String __gc* stringd; // Parameter&quot;&gt;&lt;FONT color=#006018 size=2&gt;stringd&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;Int32 System.String.Length { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:1.0.5000.0:b77a5c561934e089/System.String/property:Length:Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Length&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;;
    &lt;FONT color=#1000a0&gt;for&lt;/FONT&gt; (&lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* i = &lt;FONT color=#800000&gt;1&lt;/FONT&gt;; (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;lt;= &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* length // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;length&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;); &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;++)
    {
        &lt;/FONT&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* charCode = (&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Int32 Microsoft.VisualBasic.Strings.Asc(String __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Asc&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.Strings.Mid(String __gc* , Int32 __gc* , Int32 __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Mid&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;String __gc* stringd; // Parameter&quot;&gt;&lt;FONT color=#006018 size=2&gt;stringd&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;1&lt;/FONT&gt;)) + &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;]);
        &lt;/FONT&gt;&lt;A title=&quot;String __gc* str2 // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;str2&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;/FONT&gt;&lt;A title=System.String href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.String&quot;&gt;&lt;FONT color=#006018 size=2&gt;String&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String System.String.Concat(String __gc* , String __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Concat&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;String __gc* str2 // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;str2&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.Conversions href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.Conversions&quot;&gt;&lt;FONT color=#006018 size=2&gt;Conversions&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Char __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToString&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Char Microsoft.VisualBasic.Strings.Chr(Int32 __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Chr&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* charCode // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;charCode&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;)));
        &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;++;
        &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; (&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;gt; &lt;FONT color=#800000&gt;0x7f&lt;/FONT&gt;)
        {
            &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;FONT color=#800000&gt;0&lt;/FONT&gt;;
        }
    }
    &lt;FONT color=#1000a0&gt;return&lt;/FONT&gt; &lt;/FONT&gt;&lt;A title=&quot;String __gc* str2 // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;str2&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;;
}&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE style=&quot;MARGIN-BOTTOM: 0px&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD style=&quot;PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px&quot; vAlign=top colSpan=2&gt;&lt;PRE&gt;&lt;FONT size=2&gt;-_-오옹... 다른 부분은 완전히 똑같고 딱 한글자 틀립니다.&lt;br /&gt;Encrypt:&lt;br /&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* charCode = (&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Int32 Microsoft.VisualBasic.Strings.Asc(String __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Asc&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.Strings.Mid(String __gc* , Int32 __gc* , Int32 __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Mid&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;String __gc* stringd; // Parameter&quot;&gt;&lt;FONT color=#006018 size=2&gt;stringd&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;1&lt;/FONT&gt;)) + &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;]);
&lt;/FONT&gt;&lt;br /&gt;Decrypt:&lt;br /&gt;&lt;A title=System.Int32 href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32&quot;&gt;&lt;FONT color=#006018 size=2&gt;Int32&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;FONT color=#1000a0&gt;__gc&lt;/FONT&gt;* charCode = (&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Int32 Microsoft.VisualBasic.Strings.Asc(String __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Asc&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.Strings href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.Strings&quot;&gt;&lt;FONT color=#006018 size=2&gt;Strings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.Strings.Mid(String __gc* , Int32 __gc* , Int32 __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;Mid&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=&quot;String __gc* stringd; // Parameter&quot;&gt;&lt;FONT color=#006018 size=2&gt;stringd&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* i // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;i&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;, &lt;FONT color=#800000&gt;1&lt;/FONT&gt;)) - &lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* numArray __gc [] // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;numArray&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;A title=&quot;Int32 __gc* index // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;index&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;]);
&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위의 코드를 기반으로 VC용으로 좀 변환해 봤습니다.&lt;br /&gt; &lt;br /&gt;&lt;/FONT&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;#include &quot;stdafx.h&quot;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;void ParseandDecrypt(char *str)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; char numArray[0x80];&lt;br /&gt;&amp;nbsp; &amp;nbsp; int index = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; do&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((index % 2) == 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numArray[index] = (index - 3);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((index % 2) == 1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numArray[index] = (index + 4);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; index++;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; while ((index &amp;lt;= 0x7f));&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;&amp;nbsp; &amp;nbsp; index = 0;&lt;br /&gt;&amp;nbsp;int length = strlen(str);&lt;br /&gt;&amp;nbsp; &amp;nbsp; char *str2 = (char *)malloc(length+1);&lt;br /&gt;&amp;nbsp;str2[length] = 0;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; length; i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char charCode = (str[i] - numArray[index]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; str2[i] = charCode;&lt;br /&gt;&amp;nbsp; index++;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (index &amp;gt; 0x7f)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; index = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;printf(&quot;Decrypted Text : %s\n&quot;,str2);&lt;br /&gt;&amp;nbsp;free(str2);&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;&amp;nbsp;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;void ParseandEncrypt(char *str)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; char numArray[0x80];&lt;br /&gt;&amp;nbsp; &amp;nbsp; int index = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; do&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((index % 2) == 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numArray[index] = (index - 3);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((index % 2) == 1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numArray[index] = (index + 4);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; index++;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; while ((index &amp;lt;= 0x7f));&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;&amp;nbsp; &amp;nbsp; index = 0;&lt;br /&gt;&amp;nbsp;int length = strlen(str);&lt;br /&gt;&amp;nbsp; &amp;nbsp; char *str2 = (char *)malloc(length+1);&lt;br /&gt;&amp;nbsp;str2[length] = 0;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; size=2&gt;&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; length; i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char charCode = (str[i] + numArray[index]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; str2[i] = charCode;&lt;br /&gt;&amp;nbsp; index++;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (index &amp;gt; 0x7f)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; index = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;printf(&quot;Encrypted Text : %s\n&quot;,str2);&lt;br /&gt;&amp;nbsp;free(str2);&lt;br /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;br /&gt;&lt;FONT size=2&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char buffer[15] = {0,};&lt;br /&gt;&amp;nbsp;printf(&quot;Encrypted Text : &quot;);&lt;br /&gt;&amp;nbsp;gets(buffer);&lt;br /&gt;&amp;nbsp;ParseandDecrypt(buffer);&lt;br /&gt;&amp;nbsp;return 0;&lt;br /&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;FONT size=2&gt;-_-음... 다음조건을 만족할떄 Decrypt되어 출력되는..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#1000a0&gt;else&lt;/FONT&gt; &lt;FONT color=#1000a0&gt;if&lt;/FONT&gt; ((((&lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; != &lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;) &amp;amp; &lt;FONT color=#800000&gt;false&lt;/FONT&gt;) | &lt;FONT color=#800000&gt;false&lt;/FONT&gt;) | (&lt;/FONT&gt;&lt;A title=&quot;VariantType __gc* type // Local Variable&quot;&gt;&lt;FONT color=#006018 size=2&gt;type&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; == &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.VariantType href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType&quot;&gt;&lt;FONT color=#006018 size=2&gt;VariantType&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;VariantType Microsoft.VisualBasic.VariantType.Null;&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.VariantType/Null&quot;&gt;&lt;FONT color=#006018 size=2&gt;Null&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;))
{
   &lt;FONT color=#1000a0&gt;this&lt;/FONT&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;TextBox app14.goes.txt { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.goes/property:txt:System.Windows.Forms.TextBox&quot;&gt;&lt;FONT color=#006018 size=2&gt;txt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;-&amp;gt;&lt;/FONT&gt;&lt;A title=&quot;String System.Windows.Forms.TextBox.Text { ... }&quot; href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:1.0.5000.0:b77a5c561934e089/System.Windows.Forms.TextBox/property:Text:String&quot;&gt;&lt;FONT color=#006018 size=2&gt;Text&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; = &lt;/FONT&gt;&lt;A title=Microsoft.VisualBasic.CompilerServices.Conversions href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.VisualBasic:8.0.0.0:b03f5f7f11d50a3a/Microsoft.VisualBasic.CompilerServices.Conversions&quot;&gt;&lt;FONT color=#006018 size=2&gt;Conversions&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;String Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Object __gc* );&quot;&gt;&lt;FONT color=#006018 size=2&gt;ToString&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;A title=app14.Encrypt href=&quot;http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://app14:1.0.0.0/app14.Encrypt&quot;&gt;&lt;FONT color=#006018 size=2&gt;Encrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;::&lt;/FONT&gt;&lt;A title=&quot;Object app14.Encrypt.ParseandDecrypt(String __gc* stringd);&quot;&gt;&lt;FONT color=#006018 size=2&gt;ParseandDecrypt&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;(&lt;FONT color=#800000&gt;S&quot;fm`{f}kpwrn&quot;&lt;/FONT&gt;));
}
&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;fm`{f}kpwrn 을 만든 코드에 넣어보면 -_-;&lt;br /&gt;&lt;/FONT&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://dual5651.hacktizen.com/tc/attach/1/1110199169.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;291&quot; width=&quot;450&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Decompiler 덕분에 입문자도 거져먹기로 풀 수 있습니다.&lt;br /&gt;(-,.-;; 도구는 인간을 XXXX 만드는거 같아요)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;</description>
			<category>Reverse Engineering</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/303</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/net-Application-%EA%B3%B5%EB%9E%B5-%ED%95%98%EA%B8%B0#entry303comment</comments>
			<pubDate>Fri, 12 Oct 2007 16:15:09 +0900</pubDate>
		</item>
		<item>
			<title>Windows Anti-Debug Reference</title>
			<link>http://dual5651.hacktizen.com/tc/entry/Windows-Anti-Debug-Reference</link>
			<description>&lt;DIV id=article&gt;&lt;SPAN class=headline&gt;Windows Anti-Debug Reference&lt;/SPAN&gt;&lt;br /&gt;&lt;SPAN class=author&gt;&lt;A href=&quot;mailto:nicolas.falliere@gmail.com&quot;&gt;Nicolas Falliere&lt;/A&gt;&lt;/SPAN&gt; &lt;SPAN class=date&gt;2007-09-12&lt;/SPAN&gt;&lt;br /&gt;
&lt;P class=firstParagraph&gt;This paper classifies and presents several anti-debugging techniques used on Windows NT-based operating systems. Anti-debugging techniques are ways for a program to detect if it runs under control of a debugger. They are used by commercial executable protectors, packers and malicious software, to prevent or slow-down the process of reverse-engineering. We&#039;ll suppose the program is analyzed under a ring3 debugger, such as OllyDbg on Windows platforms. The paper is aimed towards reverse-engineers and malware analysts. Note that we will talk purely about generic anti-debugging and anti-tracing techniques. Specific debugger detection, such as window or processes enumeration, registry scanning, etc. will not be addressed here. &lt;/P&gt;&lt;SPAN class=body&gt;&lt;B&gt;[1] Intro&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;This paper classifies and presents several anti-debugging techniques used on Windows NT-based operating systems. &lt;br /&gt;Anti-debugging techniques are ways for a program to detect if it runs under control of a debugger. They are used by commercial executable protectors, packers and malicious software, to prevent or slow-down the process of reverse-engineering. &lt;br /&gt;&lt;br /&gt;We&#039;ll suppose the program is analyzed under a ring3 debugger, such as OllyDbg on Windows platforms. The paper is aimed towards reverse-engineers and malware analysts. &lt;br /&gt;Note that we will talk purely about generic anti-debugging and anti-tracing techniques. Specific debugger detection, such as window or processes enumeration, registry scanning, etc. will not be addressed here.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;[2] Anti-debugging and anti-tracing techniques&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;- Exploiting memory discrepancies&lt;br /&gt;&lt;br /&gt;(1) kernel32!IsDebuggerPresent &lt;br /&gt;IsDebuggerPresent returns 1 if the process is being debugged, 0 otherwise. This API simply reads the PEB!BeingDebugged byte-flag (located at offset 2 in the PEB structure). &lt;br /&gt;Circumventing it is as easy as setting PEB!BeingDebugged to 0. &lt;br /&gt;Example: &lt;br /&gt;call IsDebuggerPresent &lt;br /&gt;test eax, eax &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(2) PEB!IsDebugged&lt;br /&gt;&lt;br /&gt;This field refers to the second byte in the Process Environment Block of the process. It is set by the system when the process is debugged. &lt;br /&gt;This byte can be reset to 0 without consequences for the course of execution of the program (it is an informative flag).&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;mov eax, fs:[30h] &lt;br /&gt;mov eax, byte [eax+2] &lt;br /&gt;test eax, eax &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(3) PEB!NtGlobalFlags&lt;br /&gt;&lt;br /&gt;When a process is created, the system sets some flags that will define how various APIs will behave for this program. Those flags can be read in the PEB, in the DWORD located at offset 0x68 (see the reference). &lt;br /&gt;By default, different flags are set depending if the process is created under a debugger or not. If the process is debugged, some flags controlling the heap manipulation routines in ntdll will be set: FLG_HEAP_ENABLE_TAIL_CHECK, FLG_HEAP_ENABLE_FREE_CHECK and FLG_HEAP_VALIDATE_PARAMETERS. &lt;br /&gt;This anti-debug can be bypassed by resetting the NtGlobalFlags field.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;mov eax, fs:[30h] &lt;br /&gt;mov eax, [eax+68h] &lt;br /&gt;and eax, 0x70 &lt;br /&gt;test eax, eax &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(4) Heap flags&lt;br /&gt;&lt;br /&gt;As explained previously, NtGlobalFlags informs how the heap routines will behave (among other things). Though it is easy to modify the PEB field, if the heap does not behave the same way as it should when the process is not debugged, this could be problematic. It is a powerful anti-debug, as process heaps are numerous, and their chunks can be individually affected by the FLG_HEAP_* flags (such as chunk tails). Heap headers would be affected as well. For instance, checking the field ForceFlags in a heap header (offset 0x10) can be used to detect the presence of a debugger.&lt;br /&gt;&lt;br /&gt;There are two easy ways to circumvent it:&lt;br /&gt;&lt;br /&gt;- Create a non-debugged process, and attach the debugger once the process has been created (an easy solution is to create the process suspended, run until the entry-point is reached, patch it to an infinite loop, resume the process, attach the debugger, and restore the original entry-point).&lt;br /&gt;&lt;br /&gt;- Force the NtGlobalFlags for the process that we want to debug, via the registry key &quot;HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options&quot;: Create a subkey (not value) named as your process name, and under this subkey, a String value &quot;GlobalFlags&quot; set to nothing.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;mov eax, fs:[30h] &lt;br /&gt;mov eax, [eax+18h] ;process heap &lt;br /&gt;mov eax, [eax+10h] ;heap flags &lt;br /&gt;test eax, eax &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(5) Vista anti-debug (no name)&lt;br /&gt;&lt;br /&gt;Here&#039;s an anti-debug specific to Windows Vista that I found by comparing memory dumps of a program running with and without control of a debugger. I&#039;m not sure of its realiability, but it&#039;s worth mentionning (tested on Windows Vista 32 bits, SP0, English version).&lt;br /&gt;&lt;br /&gt;When a process is debugged, its main thread TEB, at offset 0xBFC, contains a pointer to a unicode string referencing a system dll. Moreover, the string follows this pointer (therefore, located at offset 0xC00 in the TEB). If the process is not debugged, the pointer is set to NULL and the string is not present.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;call GetVersion &lt;br /&gt;cmp al, 6 &lt;br /&gt;jne @NotVista &lt;br /&gt;push offset _seh &lt;br /&gt;push dword fs:[0] &lt;br /&gt;mov fs:[0], esp &lt;br /&gt;mov eax, fs:[18h] ; teb &lt;br /&gt;add eax, 0BFCh &lt;br /&gt;mov ebx, [eax] ; pointer to a unicode string &lt;br /&gt;test ebx, ebx ; (ntdll.dll, gdi32.dll,...) &lt;br /&gt;je @DebuggerNotFound &lt;br /&gt;sub ebx, eax ; the unicode string follows the &lt;br /&gt;sub ebx, 4 ; pointer &lt;br /&gt;jne @DebuggerNotFound &lt;br /&gt;;debugger detected if it reaches this point &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;- Exploiting system discrepancies&lt;br /&gt;&lt;br /&gt;(1) NtQueryInformationProcess &lt;br /&gt;ntdll!NtQueryInformationProcess is a wrapper around the ZwQueryInformationProcess syscall. Its prototype is the following:&lt;br /&gt;&lt;br /&gt;NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess( &lt;br /&gt;IN HANDLE ProcessHandle, &lt;br /&gt;IN PROCESS_INFORMATION_CLASS ProcessInformationClass, &lt;br /&gt;OUT PVOID ProcessInformation, &lt;br /&gt;IN ULONG ProcessInformationLength, &lt;br /&gt;OUT PULONG ReturnLength &lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;When called with ProcessInformationClass set to 7 (ProcessDebugPort constant), the system will set ProcessInformation to -1 if the process is debugged. &lt;br /&gt;It is a powerful anti-debug, and there is no easy way to circumvent it. However, if the program is traced, ProcessInformation can be modified when the syscall returns.&lt;br /&gt;&lt;br /&gt;Another solution is to use a system driver that would hook the ZwNtQueryInformationProcess syscall. &lt;br /&gt;Circumventing NtQueryInformationProcess will bypass many anti-debug techniques (such as CheckRemoteDebuggerPresent or UnhandledExceptionFilter).&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push 0 &lt;br /&gt;push 4 &lt;br /&gt;push offset isdebugged &lt;br /&gt;push 7 ;ProcessDebugPort &lt;br /&gt;push -1 &lt;br /&gt;call NtQueryInformationProcess &lt;br /&gt;test eax, eax &lt;br /&gt;jne @ExitError &lt;br /&gt;cmp isdebugged, 0 &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(2) kernel32!CheckRemoteDebuggerPresent&lt;br /&gt;&lt;br /&gt;This API takes two parameters: a process handle, and a pointer to a DWORD. If the call is successful, the DWORD value will be set to 1 if the process is being debugged. &lt;br /&gt;Internally, this API calls ntdll!NtQueryInformationProcess with ProcessInformationClass set to ProcessDebugPort (7).&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset isdebugged &lt;br /&gt;push -1 &lt;br /&gt;call CheckRemoteDebuggerPresent &lt;br /&gt;test eax, eax &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(3) UnhandledExceptionFilter&lt;br /&gt;&lt;br /&gt;When an exception occurs, with Windows XP SP&amp;gt;=2, Windows 2003, and Windows Vista, the usual way the OS processes the exception is:&lt;br /&gt;&lt;br /&gt;- If any, pass control to the per-process Vectored Exception Handlers. &lt;br /&gt;- If the exception is not processed, pass the control to the per-thread top SEH handler, pointed by FS:[0] in the thread that generated the exception. SEH are chained and called in turn if the exception is not processed by the previous in the chain. &lt;br /&gt;- If the exception has not been processed by any of the previous handlers, the final SEH handler (set by the system), will call kernel32!UnhandledExceptionFilter. This function will decide what it should do depending if the process is debugged or not. &lt;br /&gt;- If it is not debugged, it will call the user-defined filter function (set via kernel32!SetUnhandledExceptionFilter). &lt;br /&gt;- If it debugged, the program will be terminated.&lt;br /&gt;&lt;br /&gt;The debugger detection in UnhandledExceptionFilter is made with ntdll!NtQueryInformationProcess.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push @not_debugged &lt;br /&gt;call SetUnhandledExceptionFilter &lt;br /&gt;xor eax, eax &lt;br /&gt;mov eax, dword [eax] ; trigger exception &lt;br /&gt;;program terminated if debugged &lt;br /&gt;;... &lt;br /&gt;@not_debugged: &lt;br /&gt;;process the exception &lt;br /&gt;;continue the execution &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;(4) NtSetInformationThread &lt;br /&gt;ntdll!NtSetInformationThread is a wrapper around the ZwSetInformationThread syscall. Its prototype is the following: &lt;br /&gt;NTSYSAPI NTSTATUS NTAPI NtSetInformationThread( &lt;br /&gt;IN HANDLE ThreadHandle, &lt;br /&gt;IN THREAD_INFORMATION_CLASS ThreadInformationClass, &lt;br /&gt;IN PVOID ThreadInformation, &lt;br /&gt;IN ULONG ThreadInformationLength &lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;When called with ThreadInformationClass set to 0x11 (ThreadHideFromDebugger constant), the thread will be detached from the debugger.&lt;br /&gt;&lt;br /&gt;Similarly to ZwQueryInformationProcess, circumventing this anti-debug requires either modifying ZwSetInformationThread parameters before it&#039;s called, or hooking the syscall directly with the use of a kernel driver.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push 0 &lt;br /&gt;push 0 &lt;br /&gt;push 11h ;ThreadHideFromDebugger &lt;br /&gt;push -2 &lt;br /&gt;call NtSetInformationThread &lt;br /&gt;;thread detached if debugged &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;(5) kernel32!CloseHandle and NtClose&lt;br /&gt;&lt;br /&gt;APIs making user of the ZwClose syscall (such as CloseHandle, indirectly) can be used to detect a debugger. When a process is debugged, calling ZwClose with an invalid handle will generate a STATUS_INVALID_HANDLE (0xC0000008) exception.&lt;br /&gt;&lt;br /&gt;As with all anti-debugs that rely on information made directly available from the kernel (therefore involving a syscall), the only proper way to bypass the &quot;CloseHandle&quot; anti-debug is to either modify the syscall data from ring3, before it is called, or set up a kernel hook.&lt;br /&gt;&lt;br /&gt;This anti-debug, though extremely powerful, does not seem to be widely used by malicious programs.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset @not_debugged &lt;br /&gt;push dword fs:[0] &lt;br /&gt;mov fs:[0], esp &lt;br /&gt;push 1234h ;invalid handle &lt;br /&gt;call CloseHandle &lt;br /&gt;; if fall here, process is debugged &lt;br /&gt;;... &lt;br /&gt;@not_debugged: &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;(6) Self-debugging&lt;br /&gt;&lt;br /&gt;A process can detect it is being debugged by trying to debug itself, for instance by creating a new process, and calling kernel32!DebugActiveProcess(pid) on the parent process.&lt;br /&gt;&lt;br /&gt;In turn, this API calls ntdll!DbgUiDebugActiveProcess which will call the syscall ZwDebugActiveProcess. If the process is already debugged, the syscall fails. Note that retrieving the parent process PID can be done with the toolhelp32 APIs (field th32ParentProcessID in the PROCESSENTRY32 structure.&lt;br /&gt;&lt;br /&gt;(7) Kernel-mode timers&lt;br /&gt;&lt;br /&gt;kernel32!QueryPerformanceCounter is an efficent anti-debug. This API calls ntdll!NtQueryPerformanceCounter which wraps the ZwQueryPerformanceCounter syscall.&lt;br /&gt;&lt;br /&gt;Again, there is no easy way to circumvent this anti-tracing trick.&lt;br /&gt;&lt;br /&gt;(8) User-mode timers&lt;br /&gt;&lt;br /&gt;An API such as kernel32!GetTickCount returns the number of milliseconds ellapsed since the system started. The interesting thing is that it does not make use of kernel-related service to perform its duties. A user-mode process has this counter mapped in its address space. For 8Gb user-mode spaces, the value returned would be:&lt;br /&gt;&lt;br /&gt;d[0x7FFE0000] * d[0x7FFE0004] / (2^24)&lt;br /&gt;&lt;br /&gt;(9) kernel32!OutputDebugStringA&lt;br /&gt;&lt;br /&gt;This anti-debug is quite original, I have encountered it only once, in files packed with ReCrypt v0.80. The trick consists of calling OutputDebugStringA, with a valid ASCII string. If the program is run under control of a debugger, the return value will be the address of the string passed as a parameter. In normal conditions, the return value should be 1.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;xor eax, eax &lt;br /&gt;push offset szHello &lt;br /&gt;call OutputDebugStringA &lt;br /&gt;cmp eax, 1 &lt;br /&gt;jne @DebuggerDetected &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;(10) Ctrl-C&lt;br /&gt;&lt;br /&gt;When a console program is debugged, a Ctrl-C signal will throw a EXCEPTION_CTL_C exception, whereas the signal handler would be called directly is the program is not debugged.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset exhandler &lt;br /&gt;push 1 &lt;br /&gt;call RtlAddVectoredExceptionHandler &lt;br /&gt;push 1 &lt;br /&gt;push sighandler &lt;br /&gt;call SetConsoleCtrlHandler &lt;br /&gt;push 0 &lt;br /&gt;push CTRL_C_EVENT &lt;br /&gt;call GenerateConsoleCtrlEvent &lt;br /&gt;push 10000 &lt;br /&gt;call Sleep &lt;br /&gt;push 0 &lt;br /&gt;call ExitProcess &lt;br /&gt;exhandler: &lt;br /&gt;;check if EXCEPTION_CTL_C, if it is, &lt;br /&gt;;debugger detected, should exit process &lt;br /&gt;;... &lt;br /&gt;sighandler: &lt;br /&gt;;continue &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;- CPU anti-debug&lt;br /&gt;&lt;br /&gt;(1) Rogue Int3&lt;br /&gt;&lt;br /&gt;This is a classic anti-debug to fool weak debuggers. It consists of inserting an INT3 opcode in the middle of a valid sequence of instructions. When the INT3 is executed, if the program is not debugged, control will be given to the exception handler of the protection and execution will continue.&lt;br /&gt;&lt;br /&gt;As INT3 instructions are used by debuggers to set software breakpoints, inserting INT3 opcodes can be used to trick the debugger into believing that it is one his breakpoints. Therefore, the control would not be given to the exception handler, and the course of the program would be modified. Debuggers should track where they set software breakpoints to avoid falling for this one.&lt;br /&gt;&lt;br /&gt;Similarly, note that INT3 may be encoded as 0xCD, 0x03.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset @handler &lt;br /&gt;push dword fs:[0] &lt;br /&gt;mov fs:[0], esp &lt;br /&gt;;... &lt;br /&gt;db 0CCh &lt;br /&gt;;if fall here, debugged &lt;br /&gt;;... &lt;br /&gt;@handler: &lt;br /&gt;;continue execution &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;(2) &quot;Ice&quot; Breakpoint&lt;br /&gt;&lt;br /&gt;The so-called &quot;Ice breakpoint&quot; is one of Intel&#039;s undocumented instruction, opcode 0xF1. It is used to detect tracing programs.&lt;br /&gt;&lt;br /&gt;Executing this instruction will generate a SINGLE_STEP exception. Therefore, if the program is already traced, the debugger will think it is the normal exception generated by executing the instruction with the SingleStep bit set in the Flags registers. The associated exception handler won&#039;t be executed, and execution will not continue as expected. &lt;br /&gt;Bypassing this trick is easy: one can run over the instruction, instead and single-stepping on it. The exception will be generated, but since the program is not traced, the debugger should understand that it has to pass control to the exception handler.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset @handler &lt;br /&gt;push dword fs:[0] &lt;br /&gt;mov fs:[0], esp &lt;br /&gt;;... &lt;br /&gt;db 0F1h &lt;br /&gt;;if fall here, traced &lt;br /&gt;;... &lt;br /&gt;@handler: &lt;br /&gt;;continue execution &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;(3) Interrupt 2Dh&lt;br /&gt;&lt;br /&gt;Executing this interrupt if the program is not debugged will raise a breakpoint exception. If the program is debugged, and the instruction is not executed with the trace flag, no exception will be generated, and execution will carry on normally. If the program is debugged and the instruction traced, the following byte will be skipped, and execution will continue. Therefore, using INT 2Dh can be used as a powerful anti-debug and anti-tracer mechanism. &lt;br /&gt;Example: &lt;br /&gt;push offset @handler &lt;br /&gt;push dword fs:[0] &lt;br /&gt;mov fs:[0], esp &lt;br /&gt;;... &lt;br /&gt;db 02Dh &lt;br /&gt;mov eax, 1 ;anti-tracing &lt;br /&gt;;... &lt;br /&gt;@handler: &lt;br /&gt;;continue execution &lt;br /&gt;;...&lt;br /&gt;&lt;br /&gt;(4) Timestamp counters &lt;br /&gt;High precision counters, storing the current number of CPU cycles executed since the machine started, can be queried with the RDTSC instruction. Classic anti-debugs consist of measuring time deltas at key points in the program, usually around exception handlers. If the delta is too large, that would mean the program runs under control of a debugger (processing the exception in the debugger, and giving control back to the debuggee is a lengthy task).&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset handler &lt;br /&gt;push dword ptr fs:[0] &lt;br /&gt;mov fs:[0],esp &lt;br /&gt;rdtsc &lt;br /&gt;push eax &lt;br /&gt;xor eax, eax &lt;br /&gt;div eax ;trigger exception &lt;br /&gt;rdtsc &lt;br /&gt;sub eax, [esp] ;ticks delta &lt;br /&gt;add esp, 4 &lt;br /&gt;pop fs:[0] &lt;br /&gt;add esp, 4 &lt;br /&gt;cmp eax, 10000h ;threshold &lt;br /&gt;jb @not_debugged &lt;br /&gt;@debugged: &lt;br /&gt;... &lt;br /&gt;@not_debugged: &lt;br /&gt;... &lt;br /&gt;handler: &lt;br /&gt;mov ecx, [esp+0Ch] &lt;br /&gt;add dword ptr [ecx+0B8h], 2 ;skip div &lt;br /&gt;xor eax, eax &lt;br /&gt;ret&lt;br /&gt;&lt;br /&gt;(5) Popf and the trap flag&lt;br /&gt;&lt;br /&gt;The trap flag, located in the Flags register, controls the tracing of a program. If this flag is set, executing an instruction will also raise a SINGLE_STEP exception. The trap flag can be manipulated in order to thwart tracers. For instance, this sequence of instructions will set the trap flag:&lt;br /&gt;&lt;br /&gt;pushf &lt;br /&gt;mov dword [esp], 0x100 &lt;br /&gt;popf&lt;br /&gt;&lt;br /&gt;If the program is being traced, this will have no real effect on the flags register, and the debugger will process the exception, believing it comes from regular tracing. The exception handler won&#039;t be executed. Circumventing this anti-tracer trick simply require to run over the pushf instruction.&lt;br /&gt;&lt;br /&gt;(6) Stack Segment register&lt;br /&gt;&lt;br /&gt;Here&#039;s a very original anti-tracer. I encountered it in a packer called MarCrypt. I believe it is not widely known, not to mention, used. &lt;br /&gt;It consists of tracing over this sequence of instructions:&lt;br /&gt;&lt;br /&gt;push ss &lt;br /&gt;pop ss &lt;br /&gt;pushf &lt;br /&gt;nop&lt;br /&gt;&lt;br /&gt;When tracing over pop ss, the next instruction will be executed but the debugger will not break on it, therefore stopping on the following instruction (NOP in this case). &lt;br /&gt;Marcrypt uses this anti-debug the following way:&lt;br /&gt;&lt;br /&gt;push ss &lt;br /&gt;; junk &lt;br /&gt;pop ss &lt;br /&gt;pushf &lt;br /&gt;; junk &lt;br /&gt;pop eax &lt;br /&gt;and eax, 0x100 &lt;br /&gt;or eax, eax &lt;br /&gt;jnz @debugged &lt;br /&gt;; carry on normal execution&lt;br /&gt;&lt;br /&gt;The trick here is that, if the debugger is tracing over that sequence of instructions, popf will be excuted implicitly, and the debugger will not be able to unset the trapflag in the pushed value on the stack. The protection checks for the trap flag and terminates the program if it&#039;s found. &lt;br /&gt;One simple way to circumvent this anti-tracing is to breakpoint on popf and run the program (to avoid using the TF flag).&lt;br /&gt;&lt;br /&gt;(7) Debug registers manipulation&lt;br /&gt;&lt;br /&gt;Debug registers (DR0 through DR7) are used to set hardware breakpoints. A protection can manipulate them to either detect that hardware breakpoints have been set (and therefore, that it is being debugged), reset them or set them to particular values used to perform code checks later. A packer such as tElock makes use of the debug registers to prevent reverse-engineers from using them. &lt;br /&gt;From a user-mode perspective, debug registers cannot be set using the privileged &#039;mov drx, ...&#039; instruction. Other ways exist:&lt;br /&gt;&lt;br /&gt;- An exception can be generated, the thread context modified (it contains the CPU registers at the time the exception was thrown), and then resumed to normal execution with the new context.&lt;br /&gt;&lt;br /&gt;- The other way is to use the NtGetContextThread and NtSetContextThread syscalls (available in kernel32 with GetThreadContext and SetThreadContext).&lt;br /&gt;&lt;br /&gt;Most protectors use the first, &quot;unofficial&quot; way.&lt;br /&gt;&lt;br /&gt;Example: &lt;br /&gt;push offset handler &lt;br /&gt;push dword ptr fs:[0] &lt;br /&gt;mov fs:[0],esp &lt;br /&gt;xor eax, eax &lt;br /&gt;div eax ;generate exception &lt;br /&gt;pop fs:[0] &lt;br /&gt;add esp, 4 &lt;br /&gt;;continue execution &lt;br /&gt;;... &lt;br /&gt;handler: &lt;br /&gt;mov ecx, [esp+0Ch] ;skip div &lt;br /&gt;add dword ptr [ecx+0B8h], 2 ;skip div &lt;br /&gt;mov dword ptr [ecx+04h], 0 ;clean dr0 &lt;br /&gt;mov dword ptr [ecx+08h], 0 ;clean dr1 &lt;br /&gt;mov dword ptr [ecx+0Ch], 0 ;clean dr2 &lt;br /&gt;mov dword ptr [ecx+10h], 0 ;clean dr3 &lt;br /&gt;mov dword ptr [ecx+14h], 0 ;clean dr6 &lt;br /&gt;mov dword ptr [ecx+18h], 0 ;clean dr7 &lt;br /&gt;xor eax, eax &lt;br /&gt;ret&lt;br /&gt;&lt;br /&gt;(8) Context modification&lt;br /&gt;&lt;br /&gt;As with debug registers manipulation, the context can also be used to modify in an unconventionnal way the execution stream of a program. Debuggers can get easily confused! &lt;br /&gt;Note that another syscall, NtContinue, can be used to load a new context in the current thread (for instance, this syscall is used by the exception handler manager).&lt;br /&gt;&lt;br /&gt;- Uncategorized anti-debug&lt;br /&gt;&lt;br /&gt;(1) TLS-callback&lt;br /&gt;&lt;br /&gt;This anti-debug was not so well-known a few years ago. It consists to instruct the PE loader that the first entry point of the program is referenced in a Thread Local Storage entry (10th directory entry number in the PE optional header). By doing so, the program entry-point won&#039;t be executed first. The TLS entry can then perform anti-debug checks in a stealthy way. &lt;br /&gt;Note that in practice, this technique is not widely used. &lt;br /&gt;Though older debuggers (including OllyDbg) are not TLS-aware, counter-measures are quite easy to take, by the means of plugins of custom patcher tools.&lt;br /&gt;&lt;br /&gt;(2) CC scanning&lt;br /&gt;&lt;br /&gt;A common protection feature used by packers is the CC-scanning loop, aimed at detecting software breakpoints set by a debugger. If you want to avoid that kind of troubles, you may want to use either hardware breakpoints or a custom type of software breakpoint. CLI (0xFA) is a good candidate to replace the classic INT3 opcode. This instruction does have the requirements for the job: it raises a privileged instruction exception if executed by a ring3 program, and occupies only 1 byte of space.&lt;br /&gt;&lt;br /&gt;(3) EntryPoint RVA set to 0&lt;br /&gt;&lt;br /&gt;Some packed files have their entry point RVA set to 0, which means they will start executing &#039;MZ...&#039; which corresponds to &#039;dec ebx / pop edx ...&#039;.&lt;br /&gt;&lt;br /&gt;This is not an anti-debug trick in itself, but can be annoying if you want to break on the entry-point by using a software breakpoint.&lt;br /&gt;&lt;br /&gt;If you create a suspended process, then set an INT3 at RVA 0, you will erase part of the magic MZ value (&#039;M&#039;). The magic was checked when the process was created, but it will get checked again by ntdll when the process is resumed (in the hope of reaching the entry-point). In that case, an INVALID_IMAGE_FORMAT exception will be raised.&lt;br /&gt;&lt;br /&gt;If you create your own tracing or debugging tool, you will want to use hardware breakpoint to avoid this problem.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;[3] Conclusion&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;Knowing anti-debugging and anti-tracing techniques (un)commonly used by malware or protectors is useful knowledge for a reverse-engineer. A program will always have ways to find it is run in a debugger - the same applies for virtual or emulated environments, but since ring3 debuggers are some of the most common analysis tools used, knowing common tricks, and how to bypass them, will always prove useful.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;[4] Links&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://msdn2.microsoft.com/en-us/default.aspx&quot;&gt;MSDN&lt;/A&gt; &lt;br /&gt;&lt;A href=&quot;http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx&quot;&gt;Portable Executable Tutorial, Matt Pietrek &lt;br /&gt;&lt;A href=&quot;http://metasploit.com/users/opcode/syscalls.html&quot;&gt;Syscall Reference, The Metasploit Project &lt;br /&gt;&lt;A href=&quot;http://undocumented.ntinternals.net/&quot;&gt;Undocumented Functions for MS Windows NT/2K&lt;/A&gt; &lt;br /&gt;&lt;A href=&quot;http://www.intel.com/products/processor/manuals/index.htm&quot;&gt;Intel Manuals&lt;/A&gt; &lt;br /&gt;- Common exception codes - Microsoft Windows SDK, ntdll.h &lt;br /&gt;- Status codes list (including common exception codes) - Microsoft Windows DDK, ntstatus.h &lt;br /&gt;- Context Structures documentation - Microsoft Windows SDK, ntdll.h&lt;br /&gt;&lt;br /&gt;[5] Data reference&lt;br /&gt;&lt;br /&gt;- CONTEXT structure for IA32 processors &lt;br /&gt;struct CONTEXT_IA32 &lt;br /&gt;{ &lt;br /&gt;// ContextFlags must be set to the appropriate CONTEXT_* flag &lt;br /&gt;// before calling (Set|Get)ThreadContext &lt;br /&gt;DWORD ContextFlags; &lt;br /&gt;&lt;br /&gt;// CONTEXT_DEBUG_REGISTERS (not included in CONTEXT_FULL) &lt;br /&gt;DWORD Dr0; // 04h &lt;br /&gt;DWORD Dr1; // 08h &lt;br /&gt;DWORD Dr2; // 0Ch &lt;br /&gt;DWORD Dr3; // 10h &lt;br /&gt;DWORD Dr6; // 14h &lt;br /&gt;DWORD Dr7; // 18h&lt;br /&gt;&lt;br /&gt;// CONTEXT_FLOATING_POINT &lt;br /&gt;FLOATING_SAVE_AREA FloatSave;&lt;br /&gt;&lt;br /&gt;// CONTEXT_SEGMENTS &lt;br /&gt;DWORD SegGs; // 88h &lt;br /&gt;DWORD SegFs; // 90h &lt;br /&gt;DWORD SegEs; // 94h &lt;br /&gt;DWORD SegDs; // 98h&lt;br /&gt;&lt;br /&gt;// CONTEXT_INTEGER &lt;br /&gt;DWORD Edi; // 9Ch &lt;br /&gt;DWORD Esi; // A0h &lt;br /&gt;DWORD Ebx; // A4h &lt;br /&gt;DWORD Edx; // A8h &lt;br /&gt;DWORD Ecx; // ACh &lt;br /&gt;DWORD Eax; // B0h&lt;br /&gt;&lt;br /&gt;// CONTEXT_CONTROL &lt;br /&gt;DWORD Ebp; // B4h &lt;br /&gt;DWORD Eip; // B8h &lt;br /&gt;DWORD SegCs; // BCh (must be sanitized) &lt;br /&gt;DWORD EFlags; // C0h &lt;br /&gt;DWORD Esp; // C4h &lt;br /&gt;DWORD SegSs; // C8h&lt;br /&gt;&lt;br /&gt;// CONTEXT_EXTENDED_REGISTERS (processor-specific) &lt;br /&gt;BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;- Process Environment Block structure (from The Wine Project) &lt;br /&gt;struct PEB &lt;br /&gt;{ &lt;br /&gt;BOOLEAN InheritedAddressSpace; // 00 &lt;br /&gt;BOOLEAN ReadImageFileExecOptions; // 01 &lt;br /&gt;BOOLEAN BeingDebugged; // 02 &lt;br /&gt;BOOLEAN SpareBool; // 03 &lt;br /&gt;HANDLE Mutant; // 04 &lt;br /&gt;HMODULE ImageBaseAddress; // 08 &lt;br /&gt;PPEB_LDR_DATA LdrData; // 0c &lt;br /&gt;RTL_UPROCESS_PARAMETERS *ProcessParameters; // 10 &lt;br /&gt;PVOID SubSystemData; // 14 &lt;br /&gt;HANDLE ProcessHeap; // 18 &lt;br /&gt;PRTL_CRITICAL_SECTION FastPebLock; // 1c &lt;br /&gt;PVOID /*PPEBLOCKROUTI*/ FastPebLockRoutine; // 20 &lt;br /&gt;PVOID /*PPEBLOCKROUTI*/ FastPebUnlockRoutine; // 24 &lt;br /&gt;ULONG EnvironmentUpdateCount; // 28 &lt;br /&gt;PVOID KernelCallbackTable; // 2c &lt;br /&gt;PVOID EventLogSection; // 30 &lt;br /&gt;PVOID EventLog; // 34 &lt;br /&gt;PVOID /*PPEB_FREE_BLO*/ FreeList; // 38 &lt;br /&gt;ULONG TlsExpansionCounter; // 3c &lt;br /&gt;PRTL_BITMAP TlsBitmap; // 40 &lt;br /&gt;ULONG TlsBitmapBits[2]; // 44 &lt;br /&gt;PVOID ReadOnlySharedMemoryBase; // 4c &lt;br /&gt;PVOID ReadOnlySharedMemoryHeap; // 50 &lt;br /&gt;PVOID *ReadOnlyStaticServerData; // 54 &lt;br /&gt;PVOID AnsiCodePageData; // 58 &lt;br /&gt;PVOID OemCodePageData; // 5c &lt;br /&gt;PVOID UnicodeCaseTableData; // 60 &lt;br /&gt;ULONG NumberOfProcessors; // 64 &lt;br /&gt;ULONG NtGlobalFlag; // 68 &lt;br /&gt;BYTE Spare2[4]; // 6c &lt;br /&gt;LARGE_INTEGER CriticalSectionTimeout; // 70 &lt;br /&gt;ULONG HeapSegmentReserve; // 78 &lt;br /&gt;ULONG HeapSegmentCommit; // 7c &lt;br /&gt;ULONG HeapDeCommitTotalFreeTh; // 80 &lt;br /&gt;ULONG HeapDeCommitFreeBlockTh; // 84 &lt;br /&gt;ULONG NumberOfHeaps; // 88 &lt;br /&gt;ULONG MaximumNumberOfHeaps; // 8c &lt;br /&gt;PVOID *ProcessHeaps; // 90 &lt;br /&gt;PVOID GdiSharedHandleTable; // 94 &lt;br /&gt;PVOID ProcessStarterHelper; // 98 &lt;br /&gt;PVOID GdiDCAttributeList; // 9c &lt;br /&gt;PVOID LoaderLock; // a0 &lt;br /&gt;ULONG OSMajorVersion; // a4 &lt;br /&gt;ULONG OSMinorVersion; // a8 &lt;br /&gt;ULONG OSBuildNumber; // ac &lt;br /&gt;ULONG OSPlatformId; // b0 &lt;br /&gt;ULONG ImageSubSystem; // b4 &lt;br /&gt;ULONG ImageSubSystemMajorVersion; // b8 &lt;br /&gt;ULONG ImageSubSystemMinorVersion; // bc &lt;br /&gt;ULONG ImageProcessAffinityMask; // c0 &lt;br /&gt;ULONG GdiHandleBuffer[34]; // c4 &lt;br /&gt;ULONG PostProcessInitRoutine; // 14c &lt;br /&gt;PRTL_BITMAP TlsExpansionBitmap; // 150 &lt;br /&gt;ULONG TlsExpansionBitmapBits[32]; // 154 &lt;br /&gt;ULONG SessionId; // 1d4 &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;- Thread Environment Block structure (from The Wine Project) &lt;br /&gt;struct TEB &lt;br /&gt;{ &lt;br /&gt;NT_TIB Tib; // 000 Info block &lt;br /&gt;PVOID EnvironmentPointer; // 01c &lt;br /&gt;CLIENT_ID ClientId; // 020 PID,TID &lt;br /&gt;PVOID ActiveRpcHandle; // 028 &lt;br /&gt;PVOID ThreadLocalStoragePointer; // 02c &lt;br /&gt;PEB *Peb; // 030 &lt;br /&gt;DWORD LastErrorValue; // 034 &lt;br /&gt;ULONG CountOfOwnedCriticalSections; // 038 &lt;br /&gt;PVOID CsrClientThread; // 03c &lt;br /&gt;PVOID Win32ThreadInfo; // 040 &lt;br /&gt;ULONG Win32ClientInfo[0x1f]; // 044 &lt;br /&gt;PVOID WOW32Reserved; // 0c0 &lt;br /&gt;ULONG CurrentLocale; // 0c4 &lt;br /&gt;ULONG FpSoftwareStatusRegister; // 0c8 &lt;br /&gt;PVOID SystemReserved1[54]; // 0cc &lt;br /&gt;PVOID Spare1; // 1a4 &lt;br /&gt;LONG ExceptionCode; // 1a8 &lt;br /&gt;BYTE SpareBytes1[40]; // 1ac &lt;br /&gt;PVOID SystemReserved2[10]; // 1d4 &lt;br /&gt;DWORD num_async_io; // 1fc &lt;br /&gt;ULONG_PTR dpmi_vif; // 200 &lt;br /&gt;DWORD vm86_pending; // 204 &lt;br /&gt;DWORD pad6[309]; // 208 &lt;br /&gt;ULONG gdiRgn; // 6dc &lt;br /&gt;ULONG gdiPen; // 6e0 &lt;br /&gt;ULONG gdiBrush; // 6e4 &lt;br /&gt;CLIENT_ID RealClientId; // 6e8 &lt;br /&gt;HANDLE GdiCachedProcessHandle; // 6f0 &lt;br /&gt;ULONG GdiClientPID; // 6f4 &lt;br /&gt;ULONG GdiClientTID; // 6f8 &lt;br /&gt;PVOID GdiThreadLocaleInfo; // 6fc &lt;br /&gt;PVOID UserReserved[5]; // 700 &lt;br /&gt;PVOID glDispachTable[280]; // 714 &lt;br /&gt;ULONG glReserved1[26]; // b74 &lt;br /&gt;PVOID glReserved2; // bdc &lt;br /&gt;PVOID glSectionInfo; // be0 &lt;br /&gt;PVOID glSection; // be4 &lt;br /&gt;PVOID glTable; // be8 &lt;br /&gt;PVOID glCurrentRC; // bec &lt;br /&gt;PVOID glContext; // bf0 &lt;br /&gt;ULONG LastStatusValue; // bf4 &lt;br /&gt;UNICODE_STRING StaticUnicodeString; // bf8 &lt;br /&gt;WCHAR StaticUnicodeBuffer[261]; // c00 &lt;br /&gt;PVOID DeallocationStack; // e0c &lt;br /&gt;PVOID TlsSlots[64]; // e10 &lt;br /&gt;LIST_ENTRY TlsLinks; // f10 &lt;br /&gt;PVOID Vdm; // f18 &lt;br /&gt;PVOID ReservedForNtRpc; // f1c &lt;br /&gt;PVOID DbgSsReserved[2]; // f20 &lt;br /&gt;ULONG HardErrorDisabled; // f28 &lt;br /&gt;PVOID Instrumentation[16]; // f2c &lt;br /&gt;PVOID WinSockData; // f6c &lt;br /&gt;ULONG GdiBatchCount; // f70 &lt;br /&gt;ULONG Spare2; // f74 &lt;br /&gt;ULONG Spare3; // f78 &lt;br /&gt;ULONG Spare4; // f7c &lt;br /&gt;PVOID ReservedForOle; // f80 &lt;br /&gt;ULONG WaitingOnLoaderLock; // f84 &lt;br /&gt;PVOID Reserved5[3]; // f88 &lt;br /&gt;PVOID *TlsExpansionSlots; // f94 &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;- NtGlobalFlags &lt;br /&gt;FLG_STOP_ON_EXCEPTION 0x00000001 &lt;br /&gt;FLG_SHOW_LDR_SNAPS 0x00000002 &lt;br /&gt;FLG_DEBUG_INITIAL_COMMAND 0x00000004 &lt;br /&gt;FLG_STOP_ON_HUNG_GUI 0x00000008 &lt;br /&gt;FLG_HEAP_ENABLE_TAIL_CHECK 0x00000010 &lt;br /&gt;FLG_HEAP_ENABLE_FREE_CHECK 0x00000020 &lt;br /&gt;FLG_HEAP_VALIDATE_PARAMETERS 0x00000040 &lt;br /&gt;FLG_HEAP_VALIDATE_ALL 0x00000080 &lt;br /&gt;FLG_POOL_ENABLE_TAIL_CHECK 0x00000100 &lt;br /&gt;FLG_POOL_ENABLE_FREE_CHECK 0x00000200 &lt;br /&gt;FLG_POOL_ENABLE_TAGGING 0x00000400 &lt;br /&gt;FLG_HEAP_ENABLE_TAGGING 0x00000800 &lt;br /&gt;FLG_USER_STACK_TRACE_DB 0x00001000 &lt;br /&gt;FLG_KERNEL_STACK_TRACE_DB 0x00002000 &lt;br /&gt;FLG_MAINTAIN_OBJECT_TYPELIST 0x00004000 &lt;br /&gt;FLG_HEAP_ENABLE_TAG_BY_DLL 0x00008000 &lt;br /&gt;FLG_IGNORE_DEBUG_PRIV 0x00010000 &lt;br /&gt;FLG_ENABLE_CSRDEBUG 0x00020000 &lt;br /&gt;FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0x00040000 &lt;br /&gt;FLG_DISABLE_PAGE_KERNEL_STACKS 0x00080000 &lt;br /&gt;FLG_HEAP_ENABLE_CALL_TRACING 0x00100000 &lt;br /&gt;FLG_HEAP_DISABLE_COALESCING 0x00200000 &lt;br /&gt;FLG_VALID_BITS 0x003FFFFF &lt;br /&gt;FLG_ENABLE_CLOSE_EXCEPTION 0x00400000 &lt;br /&gt;FLG_ENABLE_EXCEPTION_LOGGING 0x00800000 &lt;br /&gt;FLG_ENABLE_HANDLE_TYPE_TAGGING 0x01000000 &lt;br /&gt;FLG_HEAP_PAGE_ALLOCS 0x02000000 &lt;br /&gt;FLG_DEBUG_WINLOGON 0x04000000 &lt;br /&gt;FLG_ENABLE_DBGPRINT_BUFFERING 0x08000000 &lt;br /&gt;FLG_EARLY_CRITICAL_SECTION_EVT 0x10000000 &lt;br /&gt;FLG_DISABLE_DLL_VERIFICATION 0x80000000&lt;/SPAN&gt;&lt;/DIV&gt;</description>
			<category>Programming</category>
			<author>(Dual)</author>
			<guid>http://dual5651.hacktizen.com/tc/301</guid>
			<comments>http://dual5651.hacktizen.com/tc/entry/Windows-Anti-Debug-Reference#entry301comment</comments>
			<pubDate>Mon, 08 Oct 2007 13:52:36 +0900</pubDate>
		</item>
	</channel>
</rss>

