<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Ezbeat의 도서관</title>
		<link>http://ezbeat.tistory.com/</link>
		<description>1989.05.04
 nate 친구는 공지에..</description>
		<language>ko</language>
		<pubDate>Tue, 14 Feb 2012 13:52:07 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<managingEditor>Ezbeat</managingEditor>
		<image>
		<title>Ezbeat의 도서관</title>
		<url><![CDATA[http://cfile23.uf.tistory.com/image/14564F0C4B29D499593A93]]></url>
		<link>http://ezbeat.tistory.com/</link>
		<description>1989.05.04
 nate 친구는 공지에..</description>
		</image>
		<item>
			<title>Windows rand() 랜덤 비율</title>
			<link>http://ezbeat.tistory.com/364</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;걍 심심해서 테스트 해봤습니다. Windows에서 Visual Studio를 설치하고 srand와 rand함수를 사용해 랜덤 값을 뽑아내면 얼마나 랜덤할 수 있는지...;;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;srand()&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt; 함수&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/1873F53A4F39E3F71064CC&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/1873F53A4F39E3F71064CC&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;105&quot; width=&quot;410&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;rand()&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt; 함수&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/147E933A4F39E3F8039F02&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/147E933A4F39E3F8039F02&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;162&quot; width=&quot;477&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;Visual Studio 2010/2008 기준으로 이와 같이 정의가 되어 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;
( 그 하위 버전은 확인 못함.. )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;최소 값은 0x0000, 최대 값은 0x7fff&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; 가 되겠군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아래는 테스트 코드입니다. srand의 인자로 얼마나 랜덤 적이고 동적인 값을 넣어야 하는게 관건인듯 싶은데..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;
걍 전 rdtsc를 사용해 넣어봤습니다. ( time()이나 GetTickCount() 함수들 보단 동적이므로.. ㅎㅎ )&lt;/font&gt;&lt;br /&gt;
&lt;textarea name=&quot;code&quot; class=&quot;cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; style=&quot;color: rgb(0, 0, 0); &quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

unsigned int saveNum[32767];

int randnum()
{
	int result;

	__asm
	{
		rdtsc;
		xor eax,edx;
		mov result,eax
	}

	return result;
}

int main(void)
{
	int temp;
	int max, min;	
	double max_percent, min_percent;

	unsigned int loopNum = 1000000000;

	for(unsigned int i = 0; i &amp;lt; loopNum; i++)
	{
		srand(~randnum());
		temp = rand();
		saveNum[temp]++;
	}
	
	max = min = saveNum[0];

	for(int i = 0; i &amp;lt; sizeof(saveNum)/sizeof(unsigned int); i++)
	{
		if(max &amp;lt; saveNum[i])
			max = saveNum[i];

		if(min &amp;gt; saveNum[i])
			min = saveNum[i];
	}

	max_percent = (double)max/loopNum*100;
	min_percent = (double)min/loopNum*100;

	printf(&quot;Max: %u/%u	%f%% \n&quot;,max,loopNum,max_percent);
	printf(&quot;Min: %u/%u	%f%% \n&quot;,min,loopNum,min_percent);

	return 0;
}
&lt;/textarea&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;한번 실행마다 10억 번의 rand를 뽑아내 그 빈도를 조사해보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;가장 많이 나온 숫자의 횟수와 가장 적게 나온 숫자의 횟수를 조사해 %로 알아보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;여러번의 실행을 해보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;/p&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31308/1000000000 &amp;nbsp; 0.003131%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29715/1000000000 &amp;nbsp; &amp;nbsp;0.002971%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31267/1000000000 &amp;nbsp; 0.003127%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29783/1000000000 &amp;nbsp; &amp;nbsp;0.002978%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31222/1000000000 &amp;nbsp; 0.003122%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29809/1000000000 &amp;nbsp; &amp;nbsp;0.002981%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31343/1000000000 &amp;nbsp; 0.003134%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29782/1000000000 &amp;nbsp; &amp;nbsp;0.002978%&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31234/1000000000 &amp;nbsp; 0.003123%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29743/1000000000 &amp;nbsp; &amp;nbsp;0.002974%&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31258/1000000000 &amp;nbsp; 0.003126%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29701/1000000000 &amp;nbsp; &amp;nbsp;0.002970%&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Max: 31209/1000000000 &amp;nbsp; 0.003121%&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;Min: 29777/1000000000 &amp;nbsp; &amp;nbsp;0.002978%&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;정확히 100%를 32767로 나누면 &amp;nbsp;0.00305185% 쯤 나오는데&lt;br /&gt;
기준 %를 기점으로 대략 ±0.0001% 밖에 벗어나질 않는군요.&lt;br /&gt;
&lt;br /&gt;
결론 : 골고루 랜덤한 값이 나옵니다 -_-;; 이상 뻘짓.............. 흑흑..&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-364-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>C</category>
			<category>rand</category>
			<category>srand</category>
			<category>Visual Studio</category>
			<category>windows</category>
			<category>빈도</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/364</guid>
			<comments>http://ezbeat.tistory.com/364#entry364comment</comments>
			<pubDate>Tue, 14 Feb 2012 13:47:56 +0900</pubDate>
		</item>
		<item>
			<title>Windows Message Logging Tool</title>
			<link>http://ezbeat.tistory.com/363</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;Windows 메시지 로깅을 해보자. 간간히 어떠한 작업을 할 때 메시지 로깅이 필요할 때가 있는데 그 때 사용하는 툴 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이상한 잡다구리한 툴이 아닌 VS를 설치하면 같이 설치되는 툴로서..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/1502AA454F38ABC80237AD&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/1502AA454F38ABC80237AD&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;126&quot; width=&quot;111&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;Microsoft Spy++&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이라는 툴입니다. 파일명은 &lt;b&gt;spyxx.exe&lt;/b&gt;군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;Microsoft에서 제공을 해주는 툴이므로 껄쩍지근함 없이 바로 사용할 수 있었습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;타겟 테스트 프로그램은.. &lt;b&gt;PC_CTL.exe&lt;/b&gt;로 하겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;사실 2012년 2월 어느날.. 서울을 갔다가 잘곳이 없어서 찜방에서 자게 되었습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;마침 찜질방 컴퓨터가 있길래.. &amp;nbsp;켰습니다. 사용하려 했더니 돈을 넣으라더군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;전 소프트웨어발전을 위해 착실히 돈을 내고 쓰는 유저이기 때문에 개발자와 찜질방 주인을 위해 돈을 투입했습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그래서.. 관련 exe를 가져왔습니다. 그게 PC_CTL.exe입니다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;부모프로세스로 MSServices.exe라는 프로그램도 있었습니다. :-)&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;피시방에서 살짝쿵 분석을해서 ... 유용?!하게 사용하긴 했지만 일단 여기선 메시지 로깅이 목적이므로.. ㅎㅎㅎ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;먼저 툴을 소개하겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile30.uf.tistory.com/original/12218B424F38AD4B2D7F27&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile30.uf.tistory.com/image/12218B424F38AD4B2D7F27&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;545&quot; width=&quot;428&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;먼저 메시지 로깅 툴을 켜보면 이와 같이 나옵니다. 현재 활성화된 모든 윈도우들에 대한 핸들이 나오는군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그 외에도 Spy메뉴에서 Processes를 누르면..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/134B89434F38B1811F238F&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/134B89434F38B1811F238F&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;497&quot; width=&quot;297&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이와 같이 나오고.... PC_CTL 프로세스도 보이는군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;+버튼을 눌러 자세히 보면..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/125A21404F38B1B02BD1B6&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/125A21404F38B1B02BD1B6&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;446&quot; width=&quot;425&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;또한 원하는 Process, Thread, Windows에 대고 우클릭 후 Message를 누르면 해당 Windows에서 발생하는 모든 메시지를 로깅할 수 있으며..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile3.uf.tistory.com/original/1979E1344F38B20D172726&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile3.uf.tistory.com/image/1979E1344F38B20D172726&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;339&quot; width=&quot;569&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이와 같이 Message Options을 주어서 원하는 메시지만 로깅할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그리고 로깅 후 보고 메시지를 자세히 보고 싶으면 우클릭 후 Properties.. 를 눌러주면..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/165A91384F38B27E093DCA&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/165A91384F38B27E093DCA&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;268&quot; width=&quot;445&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;wParam과 lParam에 대한 자세한 정보도 볼 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;뭐 메시지 관련 API함수들을 Hook해서 체크할수도 있지만 툴이 있으므로 이렇게 편하게 확인하면 됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그리고 PC_CTL 프로그램은 분석결과&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;color: rgb(0, 0, 0); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;Windows 작업 관리자&lt;/font&gt;&lt;/p&gt;
&lt;div style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;레지스트리 편집기&lt;/font&gt;&lt;/div&gt;
&lt;div style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;컴퓨터 관리&lt;/font&gt;&lt;/div&gt;
&lt;div style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;서비스&lt;/font&gt;&lt;/div&gt;
&lt;div style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;시스템 구성 유틸리티&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;위 5개의 프로그램이 켜질경우 자동으로 해당 프로그램들을 꺼버리는데요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그냥 전 각 프로세스의 핸들을 얻어서 TerminateProcess함수로 종료시키는줄 알았습니다만..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt; BP를 걸고 running 해봐도 멈추지 않는걸로 보아 그건 아니더군요.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그래서 한번 봐보았습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;메시지 로깅을 원하는 윈도우를 설정하고 작업관리자를 켜보았습니다. 당연히 작업관리자는 죽겠지요.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile30.uf.tistory.com/original/1206D84B4F38B4ED1632BE&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile30.uf.tistory.com/image/1206D84B4F38B4ED1632BE&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;187&quot; width=&quot;531&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그랬더니 이와 같이 로그가 남았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그러면 이벤트로 작업관리자를 죽이는것 같네요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;작업 관리자의 이벤트를 로깅해봤습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/135E0E474F38B7FC123271&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/135E0E474F38B7FC123271&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;342&quot; width=&quot;586&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;위에 WM_TIMER는 1초에 한번씩 발생하는걸로 봐서 프로세스목록을 1초에 한번씩 얻어오고 있나봅니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;빨간색 네모친것보면 WM_CLOSE이벤트가 발생했군요. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;PC_CTL 프로세스가 SendMessage 혹은 PostMessage를 사용해 WM_CLOSE 이벤트로 작업관리자를 죽였나봅니다.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/1750DB4F4F38B95235E643&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/1750DB4F4F38B95235E643&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 9.jpg&quot; height=&quot;332&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;정답!&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;아무튼 이외에도 기능이 많으니 한번만 써보셔도 괜찮은 툴이라는 것을 알 수 있을 것 입니다. 더 괜찮은 메시지 로깅 툴이 있다면 추천 바랍니다 ^^;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-363-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Program</category>
			<category>++</category>
			<category>Handle</category>
			<category>Hwnd</category>
			<category>Logging</category>
			<category>message</category>
			<category>msservices</category>
			<category>pc_ctl</category>
			<category>process</category>
			<category>Spy</category>
			<category>spyxx.exe</category>
			<category>window</category>
			<category>Windows Message Logging</category>
			<category>WM_CLOSE</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/363</guid>
			<comments>http://ezbeat.tistory.com/363#entry363comment</comments>
			<pubDate>Mon, 13 Feb 2012 16:21:57 +0900</pubDate>
		</item>
		<item>
			<title>TIOBE 프로그래밍 인기 순위</title>
			<link>http://ezbeat.tistory.com/362</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;사이트&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#3058d2&quot;&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot; target=&quot;_blank&quot; title=&quot;[http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html]로 이동합니다.&quot;&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;많은 분들이 포스팅을 해주셨지만 제 블로그 역시 포스팅..할래요. .ㅎㅎ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;현재 2012년 1월 자료&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;까지 나왔습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;사이트에도 나와있듯이&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Arial, Verdana, Helvetica, sans-serif; text-align: left; background-color: rgb(195, 215, 231); &quot;&gt;The TIOBE Programming Community index is an indicator of the popularity of programming languages.&lt;/span&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;프로그래밍 언어의 인기 지표랍니다.&amp;nbsp;&lt;br /&gt;
1년 전 순위와 비교해 상승/하락 정도도 보여주네요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/207E1D454F29E1D31033FB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/207E1D454F29E1D31033FB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;580&quot; width=&quot;570&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/145432454F29E1D337E31A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/145432454F29E1D337E31A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;776&quot; width=&quot;266&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;역시 제가 좋아하는 C언어.. C++도 잘 활용할줄 알아야하는데.. 큰일입니다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아무튼 이렇게 많은 언어들이 있다는 것도 첨 알았네요. 별별 언어가 다있네요 =_=;;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-362-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>etc</category>
			<category>popularity</category>
			<category>Programming</category>
			<category>Tiobe</category>
			<category>순위</category>
			<category>인기</category>
			<category>프로그래밍</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/362</guid>
			<comments>http://ezbeat.tistory.com/362#entry362comment</comments>
			<pubDate>Thu, 02 Feb 2012 10:10:28 +0900</pubDate>
		</item>
		<item>
			<title>Themida 2.1.2.0 Virtual Machine</title>
			<link>http://ezbeat.tistory.com/361</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;리버싱을 하는데 있어서 가장 우리를 난감하게 만드는 놈은 바로 안리 리버싱이 걸려있는 바이너리 입니다.&lt;br /&gt;
이러한 안티리버싱 기술을 자동적으로 바이너리에 덮어씌워주는 놈은 바로 프로텍터들입니다. 대표적인 프로텍터로는&lt;br /&gt;
VMProtect 나 Themida 같은 프로그램들이 있습니다.&lt;br /&gt;
&lt;br /&gt;
두 프로텍터는 역시 명성에 걸맞게 강력한 안티리버싱 기술들이 구현이 되어 있는데 그 중 하나는 Virtual Machine 기술입니다. 쫌 더 직관적으로 말하면 코드 가상화 기술입니다. 사실 아직 제대로 분석을 해보진 못하였지만 차차 분석을 해봐야되므로 간략히 그에 대한 코드를 분석해보았습니다. 전 일단 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;Themida 2.1.2.0 버전에 있는 Virtual Machine 기능&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;을 살펴보았습니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/181C6F454F28DF83215B90&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/181C6F454F28DF83215B90&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;419&quot; width=&quot;527&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
더미다의 Virtual Machine 옵션입니다.&lt;br /&gt;
&lt;br /&gt;
코드 가상화라 함은 원래의 명령어를 가상화를 시키고 가상화된 코드를 본체에 있는 하드웨어적인 CPU가 처리하는 것이 아닌 개발자가 만든 소프트웨어적인 핸들러가 처리를 하게 되는 것입니다. 그 때의 핸들러를 보통 가상화된 명령어를 처리하는 CPU라고 하는데 위 그림에서 Processor Specifications 에서 지정하는 것이 바로 그 소프트웨어적인 CPU를 어떻게 만들 것인지에 대한 옵션입니다. 일단 전 위와 같이 옵션을 지정하였고 위 옵션은 디폴트 옵션보단 조금 더 강력한 옵션입니다.&lt;br /&gt;
&lt;br /&gt;
옆의 Entry Point Virtualization 옵션은 엔트리포인트로부터 몇 개의 명령어를 가상화 시킬 것인가를 지정하는 옵션입니다.&lt;br /&gt;
위와 같이 지정하면 2Byte가 아닌! 2개의 명령어가 가상화 되는 것입니다.&lt;br /&gt;
&lt;br /&gt;
그 외로는&lt;br /&gt;
API 함수에 대한 가상화 레벨을 지정할수도 있고 Multi Branch Techology는 그냥 분석을 더욱 어렵게 하기 위해 분기문을 마구 꼬아놓는 그러한 옵션 같습니다.&lt;br /&gt;
&lt;br /&gt;
아무튼 위와 같은 옵션으로 패킹을 진행하겠습니다. 먼저 원본 파일의 Entry Point를 봐보겠습니다.&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/202CB94B4F28E0450529F7&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/202CB94B4F28E0450529F7&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;257&quot; width=&quot;512&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
익숙한 Entry Point 죠?? 아무튼 이번엔 패킹된 파일의 Entry Point를 봐보도록 하겠습니다.&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/190AE2384F28E0BE1F73CA&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/190AE2384F28E0BE1F73CA&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;354&quot; width=&quot;463&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
옵션대로 위 2개의 명령어가 사라져있고 그 자리엔 쓰레기 값이 채워져 있습니다. 사실상 저 부분은 가상화가 되서 더이상 제어가 저 위치로 오지도 않을 뿐더러 실행도 하지 않습니다. 그렇기 때문에 그냥 저 부분엔 아무 값이나 채워놔도 무방합니다. 그 코드는 그러면 어디서 실행이 되냐구요?? 그건 가상화된 명령어를 실행해줄 소프트웨어적인 CPU가 수행해 주겠지요.&lt;br /&gt;
&lt;br /&gt;
또한 가상화된 명령어는 메모리 어딘가에 마구마구 인코딩되서 짱박혀 있겠지요.&lt;br /&gt;
&lt;br /&gt;
제가 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;간략히 분석해본 더미다 가상화 기술&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;입니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/15464D374F28EE691BE5E1&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/15464D374F28EE691BE5E1&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;368&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;먼저 Entry Point에서 두개의 명령어는 이미 가상화가 되어서 Virtualized Code 상에 존재할 것이고 해당 위치에는 쓰레기 코드가 있습니다. 그리고 Virtualized Code 부분에는 Code Section에 있는 가상화된 명령어만 있는게 아닌 Themida의 원래 기능인 코드, 리소스 등 이런 부분들 인코딩, 압축 되어 있는 것을 디코딩, 압축 해제 시키는 코드도 있는데 그 부분 또한 전부 가상화가 되어서 Virtualized Code 부분에 있는 것 같네요.&lt;br /&gt;
&lt;br /&gt;
그리고 빨간색 화살표는 진행 방향인데요. Themida는 EntryPoint에 있는 CALL 명령어 부분만 가상화 했지 CALL 내부는 가상화 하지 않았습니다. 그렇기 때문에 가상화된 코드를 Virtual CPU가 돌리는 동안 Code Section부분으로 넘어와 Normal Code를 실행 후 다시 가상화된 코드를 실행시키는 것입니다. 이 때 CPU 제어 이동이 있겠지요.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;가상화된 코드는 Virtual CPU가 실행시키고 Normal Code는 하드웨어적인 제 컴퓨터론 Intel CPU가 처리를 하게됩니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
간단하게 실제 코드 상으로 한번 봐볼까요??&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/190EF8334F28F052085A3C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/190EF8334F28F052085A3C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;281&quot; width=&quot;579&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
더미다 패킹 된 프로그램의 EntryPoint입니다. 이제부터 쭉쭉 인코딩된 코드를 디코딩 시킵니다...&lt;br /&gt;
&lt;br /&gt;
계속 실행하다보면 무한반복하는 부분이 생기는데 아마 명령어를 fetch해서 해석하는 부분이겠지요.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/200EA0334F28F1090CA54B&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/200EA0334F28F1090CA54B&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;80&quot; width=&quot;524&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
저 부분에서 Virtual CPU의 Instruction Handler를 호출합니다.. EAX를 Index로 사용하네요.&lt;br /&gt;
( EDI : 0x0044A5E8, EAX : 0x00000057 )&lt;br /&gt;
EDI를 봐보겠습니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/2006F34D4F28F1AC2992EC&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/2006F34D4F28F1AC2992EC&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;643&quot; width=&quot;262&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
빨간색 네모친 부분이 Virtual CPU에서 사용하는 레지스터 입니다.&lt;br /&gt;
또한 그 아래 노란색 네모친 부분이 Instruction Handlers 입니다.&lt;br /&gt;
EAX가 Index가 되서 저 Handler 들 중 하나로 점프를 하게 되는 것입니다.&lt;br /&gt;
개수는 676개입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 Themida Virtual Machine 옵션을 낮게 주고도 해보았는데 차이점이 있었습니다.&lt;br /&gt;
위 가상화 기술 그림은 옵션을 약하게 줬을 경우이고 높게 주었을 경우에는 아래와 같이 됩니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/14427D384F28F4BB3074C0&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/14427D384F28F4BB3074C0&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 9.jpg&quot; height=&quot;503&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;두 번째로 실행되는 Virtual CPU에서 실질적인 Code 섹션에 있는 가상화된 코드를 실행해줍니다.&lt;br /&gt;
&lt;br /&gt;
뭐 더욱 분석이 복잡해 졌네요.&lt;br /&gt;
&lt;br /&gt;
아직 각각의 Instruction Handler 들이 어떤 식으로 작동하는지는 분석을 안해봐서 모르겠네요. 하지만 분명히 하나의 Intel 명령어를 처리하기 위해서 여러개의 Virtualized Code가 수행되는 것은 분명합니다. &lt;br /&gt;
&lt;br /&gt;
JMP xxxxxxxx&lt;br /&gt;
와 같은 명령어 하나만 처리를 하더라도&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/2060A0384F28F5B41152EA&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/2060A0384F28F5B41152EA&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 10.jpg&quot; height=&quot;17&quot; width=&quot;176&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
이 부분이 무려 116번이나 호출된 것을 보면 알 수 있겠지요.&lt;br /&gt;
아마 코드를 가상화 시키면서 까지 거기에 쓰레기 코드 또한 많이 넣어놨을 것입니다.&lt;br /&gt;
&lt;br /&gt;
또한! Instruction Handler들 내부에도 전부 쓰레기 코드왕창에 난독화도 무지되어있습니다.&lt;br /&gt;
또한! 더미다 패킹을 하게되면 생성되는 난독화 방법이나 쓰레기 코드들도 달라지며 opcode 순서도 바뀌게 되며 레지스터 순서도 바뀌고 아무튼 싹다 바뀌더군요. 하나를 제대로 분석했다 하더라도 다른 파일 분석이 힘든.. ㅠ_ㅠ&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
이번 글에서는 Themida 가상화 기술 관련해서 살짝만 맛 보았습니다.&lt;br /&gt;
왠지 제가 원하는 방법으로 구현이 되어 있는것 같아서 마음에 드네요.&lt;br /&gt;
&lt;br /&gt;
나중엔 더욱 깊이 분석해보고 다른 패커에 쓰인 가상화 기술도 분석해봐야겠습니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=========== 2월 7일 추가 분석 ============&lt;br /&gt;
&amp;nbsp;VM CPU로 제어가 넘어오는 부분이 있네요&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/1206F2384F30EC8212FD97&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/1206F2384F30EC8212FD97&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;120&quot; width=&quot;506&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
일단 이 부분이 VM Entry로 들어오는 루틴입니다. 빨간색으로 표시된걸로 봐서 앞 코드에 의해 디코딩이 되었나봅니다.&lt;br /&gt;
그리고 저 루틴을 들어오기 전에 &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/171557384F31443026930A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/171557384F31443026930A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 20.jpg&quot; height=&quot;335&quot; width=&quot;536&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
이러한 부분도 있는데 잘 보시면 0x0041E7D2로 VM Entry로 점프하는 루틴이 많은것을 볼 수 있습니다. &lt;br /&gt;
그리고 각 JMP하기전에 어떠한 값을 push를 하는데 push 하는 값의 용도는 확실히는 모르겠습니다.&lt;br /&gt;
예상으론 외부로 나갔다가 들어오면서 다시 가상화된 코드 부분을 돌리는데 해당 부분을 뜻하는 것 같습니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
각 push에 bp를 걸고 trace를 해본 결과 5번 정도 LoadLibrary를 호출하고 GetLocalTime 함수도 호출을 하더군요.&lt;br /&gt;
아래서 다섯번째 JMP 문이 code영역에 nop처리 된 부분에 원래의 api함수로 채워넣고 안티 디버깅 기술이 걸렸다면 여기서 걸릴 뿐더러 안걸릴 경우 code 영역으로 들어가 정상적인 코드 실행까지 하게 됩니다. 저 JMP문으로 들어갔을 때의 동작방식을 알아봐야겠군요. :-)&lt;br /&gt;
&lt;br /&gt;
그리고....&lt;br /&gt;
VM Entry를 들어왔을 때&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/166678444F3148D631F2A0&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/166678444F3148D631F2A0&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;53&quot; width=&quot;513&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
이 부분 저 부분에서 ESI가 가리키는 메모리 영역에서 1Byte씩 al로 가져옵니다. 또한..&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/2060A0384F28F5B41152EA&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/2060A0384F28F5B41152EA&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;사용자 지정 10.jpg&quot; height=&quot;17&quot; width=&quot;176&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
이 부분하고 1:1로 한번씩 번갈아가면서 실행... 핸들러 수행이 끝나면 LODS 명령어로 점프를 하게 됩니다.&lt;br /&gt;
JMP문은 그 가상화된 명령어를 수행하기 위한 핸들러를 호출하는 부분이구요.&lt;br /&gt;
&lt;br /&gt;
그러면 저기서 LODS했을 때의 AL(1)과 JMP문의 EAX(2)가 같냐? 그건 아닙니다. 뭐 같은 필요는 없겠죠. 꼬아놨다면요.&lt;br /&gt;
하지만...!! 값이 다르더라도 1:1 매치가 되면 좋지만 1:1 매치가 아닙니다. 다대다 관계 더군요. 즉..!&lt;br /&gt;
&lt;br /&gt;
(1)이 2c,f9,f6이 나왔을 때&lt;br /&gt;
(2)는 62 만 계속 나올 때도 있습니다.&lt;br /&gt;
&lt;br /&gt;
그 반대의 경우도 마찬가지구요.&lt;br /&gt;
&lt;br /&gt;
(2)가 62일 경우 (1) 값을 계속 뽑아 50개를 뽑아봤는데.. 규칙이 없습니다.&lt;br /&gt;
&lt;br /&gt;
그래서 트레이스해본 결과 수행되는 루틴이 다를줄 알았는데 (1)에서 (2)로 가는데 까지의 루틴은 항상 같습니다.&lt;br /&gt;
중간에 메모리에 있는 값을 가져와 연산을 수행하는 부분에서 달라지겠군요. 이 부분도 자세히 분석을 해봐야겠군요.&lt;br /&gt;
&lt;br /&gt;조금 더 자세히 분석해본 결과&lt;br /&gt;
(1) 의 값은 도데체 어디에 영향을 미치는지는 잘 모르겠습니다.&lt;br /&gt;
(1) 값은 핸들러 Index를 만드는 과정에 영향을 끼치지는 않더군요.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;그러면 핸들러 인덱스를 누가 만드느냐??&lt;br /&gt;
위위 그림에서 PUSH EBX를 하고 있는데 저 EBX의 BL 값에 의해 인덱스가 만들어집니다.&lt;br /&gt;
그러면 BL값 또한 무작위인데 핸들러 인덱스가 같은 경우도 있지 않냐?? .. 라고 의문을..?&lt;br /&gt;
&lt;br /&gt;바로 &lt;br /&gt;
BL + Handler Index&amp;nbsp;&lt;br /&gt;
의 계산으로 인해 만들어집니다...만;;&lt;br /&gt;
이게 전부는 아닌 것 같군요. 특정 핸들러가 수행되면 EBX값이 BL부분만 바뀌는게 아닌 EBX 전체 값이 바뀌어버리게됩니다.&lt;br /&gt;
더 이상은 너무 시간이 걸려 ....&lt;br /&gt;
&lt;br /&gt;아래는 분석 결과..&lt;br /&gt;
a = push ebx할 때의 bl 값&lt;br /&gt;
b = jmp할 때 handler index&lt;br /&gt;
c = jmp루틴 왔을 때 바뀐 bl값&lt;br /&gt;
&lt;br /&gt;전부다는 아니지만&lt;br /&gt;
c == a + b&lt;br /&gt;
가 성립하고 있는 것을 알 수 있습니다.&lt;br /&gt;
&lt;br /&gt;&lt;div&gt;
BL(a)&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;AL(b)&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;BL(c)&lt;/div&gt;
&lt;div&gt;--------------------------&lt;/div&gt;
&lt;div&gt;8E&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;A9&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;37&lt;/div&gt;
&lt;div&gt;37&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;B5&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;EC&lt;/div&gt;
&lt;div&gt;EF&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;62&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;51&lt;/div&gt;
&lt;div&gt;51&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;55&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;A6&lt;/div&gt;
&lt;div&gt;A6&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;39&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;DF&lt;/div&gt;
&lt;div&gt;C8&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;B5&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;7D&lt;/div&gt;
&lt;div&gt;83&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;62&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;E5&lt;/div&gt;
&lt;div&gt;E5&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;3D&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;22&lt;/div&gt;
&lt;div&gt;22&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;B5&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;D7&lt;/div&gt;
&lt;div&gt;DD&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;62&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;3F&lt;/div&gt;
&lt;div&gt;3F&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;60&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;9F&lt;/div&gt;
&lt;div&gt;9F&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;8A&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;29&lt;/div&gt;
&lt;div&gt;2C&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;62&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;8E&lt;/div&gt;
&lt;div&gt;8E&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;A9&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;37&lt;/div&gt;
&lt;div&gt;37&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;B5&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;EC&lt;/div&gt;
&lt;div&gt;EC&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;62&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;4E&lt;/div&gt;
&lt;div&gt;4E&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;60&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;AE&lt;/div&gt;
&lt;div&gt;AE&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;62&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;10&lt;/div&gt;
&lt;div&gt;10&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;55&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;65&lt;/div&gt;
&lt;div&gt;65&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;A9&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;0E&lt;/div&gt;
0E&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;39&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;47&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-361-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Reversing</category>
			<category>2.1.2.0</category>
			<category>Entry Point</category>
			<category>Garbage Code</category>
			<category>Handlers</category>
			<category>Instruction</category>
			<category>Multi Branch Techology</category>
			<category>themida</category>
			<category>vcp</category>
			<category>virtual machine</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/361</guid>
			<comments>http://ezbeat.tistory.com/361#entry361comment</comments>
			<pubDate>Wed, 01 Feb 2012 17:31:53 +0900</pubDate>
		</item>
		<item>
			<title>ipad 사용자 권한</title>
			<link>http://ezbeat.tistory.com/360</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;ios5에서 어플 디버깅을 하지못해 애 먹고 있던 도중 그냥 재미난걸 보았습니다.&lt;br /&gt;
&lt;br /&gt;현재 제 ipad 에 있는 passwd 파일입니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/1809914B4F2264332DBD06&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/1809914B4F2264332DBD06&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;166&quot; width=&quot;81&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;중요한건 root 계정과 mobile 계정입니다.&amp;nbsp;&lt;br /&gt;
이번엔 현재 실행 중인 프로세스를 봐보겠습니다.&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/196725454F2264B012F77C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/196725454F2264B012F77C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;438&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;제가 ipad에서 오목 어플을 켜봤는데 해당 오목 어플은 mobile이라는 계정의 권한으로 실행이 되게 됩니다.&lt;br /&gt;
뭐 당연히 어플들이 root 권한으로 실행되면 안되겠죠.&lt;br /&gt;
&lt;br /&gt;그러면 저 어플을 root 권한으로 실행시키면?? 당연히 mobile 권한으로는 해당 어플을 끌 수가 없을 것입니다.&lt;br /&gt;
Operation not permitted 라는 오류가 납니다.&lt;br /&gt;
&lt;br /&gt;일단 root 권한으로 저&amp;nbsp;GomokuOnline 프로그램을 켜보겠습니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/150292404F22662429CF56&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/150292404F22662429CF56&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;50&quot; width=&quot;545&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
켰습니다. 하지만 ipad 화면이나 아래 bar에는 오목 어플이 없습니다.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/124C80504F22670E12F3D1&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/124C80504F22670E12F3D1&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;513&quot; width=&quot;384&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;이렇게 말이죠. 하지만 분명히 root 권한으로 실행은 시켰으니 메모리에 올라와 있긴 할 겁니다. &lt;br /&gt;
아직 mobile 계정에서 처리를 못한 것이지요. 여기서 ipad로 해당 어플을 켜줍니다.&lt;br /&gt;
&lt;br /&gt;그러면 mobile에서는 새로 어플리케이션을 실행하는 것이 아닌 이미&amp;nbsp;GomokuOnline 프로그램은 프로세스 목록이 있으니&lt;br /&gt;
어플리케이션을 그냥 ipad 화면에 보여주기만 할 것입니다. 이제 ipad 화면에 보이는 오목 프로그램은 root 권한으로&amp;nbsp;&lt;br /&gt;
실행되고 있습니다.&lt;br /&gt;
&lt;br /&gt;ipad 에서 끌 수 있을까요?? 절대 못끕니다. 왜냐하면 mobile 계정은 root 가 실행시킨 프로그램을 끌 수 없기 때문이죠.&lt;br /&gt;
&lt;br /&gt;뭐 당연한거겠죠. &lt;br /&gt;
이럴 때가 아니라 ios5에서 gdb를 써야하는데 애를 먹네요. ㅠ&lt;br /&gt;
&lt;br /&gt;아.. 끌 때는 그냥 root 계정으로 프로세스 kill 해줌 됩니다. =_=;;&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-360-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>etc</category>
			<category>gdb</category>
			<category>GomokuOnline</category>
			<category>iOS5</category>
			<category>Mobile</category>
			<category>passwd</category>
			<category>root</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/360</guid>
			<comments>http://ezbeat.tistory.com/360#entry360comment</comments>
			<pubDate>Fri, 27 Jan 2012 18:08:13 +0900</pubDate>
		</item>
		<item>
			<title>ARM 명령어 공부</title>
			<link>http://ezbeat.tistory.com/359</link>
			<description>&lt;font color=&quot;#e31600&quot; style=&quot;background-color: transparent; &quot;&gt;ipad2에는 A5라는 CPU가 탑제&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;되어 있습니다&amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/2029713F4F20B12710C9A9&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/2029713F4F20B12710C9A9&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;iphone5apple2011liveblogkeynote1411.jpg&quot; height=&quot;399&quot; width=&quot;600&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;ARM 회사에서 만들었기 때문에 리버싱을 하려면 당연히 ARM CPU에 대해서 적당한 지식이 있어야합니다.&lt;br /&gt;
여기선 조금씩 알아보고 더욱 자세한 내용은 ARM CPU 문서들을 참고해주세요~&lt;br /&gt;
&lt;br /&gt;ARM CPU는 내부적으로 32Bit의 데이터 버스와 32Bit의 어드레드 버스를 제공합니다. &lt;br /&gt;
또한 잘 알려져 있듯이&lt;/font&gt;&lt;font color=&quot;#e31600&quot; style=&quot;background-color: transparent; &quot;&gt; ARM은 대표적인 RISC 코어&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b style=&quot;background-color: transparent; &quot;&gt;&lt;font color=&quot;#801fbf&quot;&gt;RISC 설명&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#3058d2&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;a href=&quot;http://terms.co.kr/RISC.htm&quot;&gt;http://terms.co.kr/RISC.htm&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;즉, ARM의 명령어는 그 종류가 적으면서도, 다양하게 적용시킬 수 있는 특징이 있습니다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;하나씩 알아보면서 느껴보도록 하죠.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b style=&quot;background-color: transparent; &quot;&gt;&lt;font color=&quot;#e31600&quot;&gt;ARM 구조&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;1. 레지스터&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;ARM은 31개의 32Bit 범용 레지스터가 있습니다. 또한 동작모드에 따라는 6개의 Status 레지스터도 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;2. ALU&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;32Bit 연산이 가능한 ALU가 제공됩니다. ARM의 ALU 장점으로는 보통 다른 CPU에서는 shift 명령이 따로 있었는데, ARM에서는 따로 존재하는 것이 아닌 대부분의 명령에서 옵션으로 적용시킬 수 있습니다. ( Barrel Shifter )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;3. Booth&#039;s 곱셈기&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;곱셈 기능을 제공하는 32Bit Booth&#039;s 곱셈기가 있습니다. 곱셈기는 32Bit 연산을 지원하며, 32Bit의 두 입력을 받아서 곱하여, 결과가 32Bit를 넘더라도 넘는 부분은 버리고 32Bit만을 남깁니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b style=&quot;background-color: transparent; &quot;&gt;&lt;font color=&quot;#e31600&quot;&gt;ARM의 레지스터&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;위에서 모두 32Bit인 31개의 범용 레지스터와 6개의 상태레지스터가 있다고 했습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;하지만 ARM 어셈블러에서 사용하는 범용 레지스터 키워드는 r0~r15까지 16개밖에 되지 않습니다. 즉, 다시 말해서 사용자가 한번에 사용할 수 있는 레지스터는 16개입니다. 그 중에 몇개는 프로그램 카운터(PC) 스택 포인터(SP) 등의 용도로 사용됩니다. 그러면 그 나머지는?? 나머지 레지스터는 CPU 동작모드와 관련되어 r0~r15로 리-맵핑되어 사용됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;1. Special Purpose General Register&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;위에서 사용자가 프로그램 할 때 레지스터 지정을 위해 사용할 수 있는 키워드는 r0~r15 입니다. 그 중에 특별한 목적을 위해 사용되는 레지스터를 알아보겠습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;- Program Counter ( r15 )&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r15는 다른 CPU에서와 마찬가지로 PC 와 같은 역할을 합니다. 다만 차이점이 있다면 r15를 일반 다른 레지스터처럼 오퍼랜드로 사용할 수 있다는 점이고 ARM 어셈블러에서는 pc라는 키워드와 r15를 동일하게 취급합니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;* Intel CPU 어셈블러에서는 오퍼렌트로 PC와 같은 역할을 하는 EIP 레지스터를 오퍼렌드로 사용할 수 없습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;- Stack Pointer ( r13 )&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM 에서는 Stack을 위한 명령어가 따로 없습니다. 즉, Push나 Pop 등의 명령어가 제공되지 않습니다. 그러나 sp라는 키워드를 사용하여 r13을 쓸 수 있는데, 묵시적으로 r13을 스택포인터로 사용할 수 있도록 정해 놓은 듯 합니다. 그리고, Push, Pop 같은 명령어가 없으므로, ARM에서는 같은 기능을 일반 데이터 전송 명령을 통해 해결합니다. ARM 의 데이터 전송명령은 Auto Increment 기능이 있어서 하나의 인스트럭션으로 Push나 Pop과 동일한 기능을 수행 할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;( 라고 제가 읽는 문서에서는 설명을 하였지만.. 실제로 현재 최신 ARM CPU는 지원을 합니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#3058d2&quot; style=&quot;background-color: transparent; &quot;&gt;
&lt;a href=&quot;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/Babefbce.html&quot;&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/Babefbce.html&lt;/a&gt;&amp;nbsp; &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;위 링크를 따라 가보시면.. ;; &amp;nbsp;)&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;- Link Register ( r14 )&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;r14는 링크 레지스터라고 부릅니다. 이 레지스터는 Intel CPU에서 보지 못했던 기능의 레지스터인데요. Intel CPU등의 CPU에서는 서브루틴을 호출할 경우 CALL을 사용하면 다음에 수행될 PC를 스택에 넣고, 호출될 번지를 PC에 넣는 동작을 하게됩니다. 하지만 ARM에서는 CALL과 RET와 &amp;nbsp;같은 명령이 없습니다. 대신 Branch With Link라는 명령(BL)이 있는데, 해당 명령을 수행하면, CALL과 비슷하게 다음에 수행될 pc(r15) 값을 스택이 아니라 lr(r14)에 넣고 분기 번지를 pc(r15)에 넣어 분기합니다. 즉, 스택을 사용하지 않는 것이지요. 복귀할 때는 RET 대신 mov pc,lr 이라는 데이터 전송명령으로 복귀합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이러한 방식은 나름대로 장단점이 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;단점&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;어떤 서브루틴이 콜 되었을 때, 서브루틴에서 복귀번지가 r14에 들어있는 상태가 됩니다. 문제는 해당 서브루틴에서 다시 한번 다른 서브루틴을 콜 한다면, 원래 r14에 보관되어 있던 복귀 번지 값이 덮어씌워지는 결과가 생깁니다. 이런 경우엔, 수동으로 sp(r13)를 이용하여 스택에 r14 값을 보관해 두어야 합니다. 즉, 분기(BL) 하기전에 r14를 스택에 보관해 두고, 리턴해서 복구하는 과정을 거치는 셈&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;그러면 왜 굳이 이러한 방법을 쓸까요?? 여러번 분기(BL)하는 경우가 아닌 한번만 분기(BL) 하는 경우라면, 스택을 사용하지 않고 레지스터를 사용함으로써, 그 속도에서 이익을 얻게 되는 것!&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;또한 분석가 입장에서 보면 CALL, RET 명령어가 없어서 가독성 면에서 떨어질 것 같습니다. 이건 저도 아직 경험해 보지 않은 것이지만 이렇게 이론적으로 공부하더라도 그럴 것 같네요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;2. ARM Status Register &amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;위에서 Status 레지스터는 32Bit 짜리 레지스터 6개가 있다고 했습니다. 그러나 6개 모두를 한꺼번에 사용하지는 못하고, 또 그럴 필요도 없습니다. 일단 하나의 32Bit Status 레지스터만 생각하면 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; Status 레지스터는 PSR이라고 부릅니다. 그리고 일반적으로 CPSR이라고 하여 Current Program Status Register라고 부릅니다. PSR은 크게 Flag Bits부분과 Control Bits 부분으로 나뉩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;- Flag Bits&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;어떤 인스트럭션의 결과 등을 나타내는 부분으로 4Bit가 있습니다. 다른 CPU의 Flag Register와 비슷한데 각각 N, Z, C ,V의 4가지 입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;1) Negative/Less Than Flag&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;N으로 표기되는 이 플래그는 연산의 결과가 마이너스인 경우에 세트됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;2) Zero Flag&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;Z로 표기되는 이 플래그는 연산의 결과가 0이 되었을 경우에 세트됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;3) Carry/Borrow/Extend Flag&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;C로 표기되는 이 플래그는 자리올림이나 내림이 발생한 경우, 그리고 Shift 연산 등에서 사용됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;4) Overflow Flag&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;V로 표기되는 이 플래그는 연산의 결과가 오버플로우 되었을 경우 사용됩니다.&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;br /&gt;
이상의 Flag Bit들은 다른 칩의 상태 레지스터와 다르지 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;- Control Bits&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;컨트롤 비트들은 인터럽트를 제어하는 비트와 계속해서 언급되기만하고 실체를 드러내지 않고 있는 Exception과 관련된 CPU 동작모드를 설정하거나 확인할 수 있는 기능을 가진 Bit가 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;1) IRQ/FIQ Disable Bit&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; ARM 인터럽트 중에서 IRQ와 FIQ를 금지시킬 수 있는 클래그입니다. 인터럽트의 종류는 이밖에도 몇 가지가 더 있는데, 그 중에서 IRQ, FIQ는 PSR를 통해 금지시키거나 가능하도록 설정할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;2) Mode Bits&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; M0에서 M4까지의 모드 비트는 CPU의 6개의 동작 상태를 나타냅니다. 즉, 간단히 말하면 ARM은 6개의 동작 모드를 가지는데, 이를테면 User모드와 인터럽트 모드 등입니다.&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;br /&gt;
이제 상태 레지스터를 그림으로 봐보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/1606C83A4F20CA4D24414F&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/1606C83A4F20CA4D24414F&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;44&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;지금까지 레지스터를 알아보았는데 Exception 관련된 부분은 필요할 때 추후 올리겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이번엔 Instruction Set을 알아보도록 하죠.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b style=&quot;background-color: transparent; &quot;&gt;&lt;font color=&quot;#e31600&quot;&gt;ARM 명령어 특징&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;ARM은 32Bit 코어입니다. 특징적인 것은 모든 명령어가 32Bit 하나의 Word로 구성된다는 것입니다. Intel CPU 경우엔 명령어에 따라 대략 1Byte~7Byte까지 있습니다. 하지만 ARM은 모든 명령어를 한 Word로 처리합니다. 일단은 명령어의 개수가 몇 안되고, 주소는 상태주소 방식을 사용하며, 심지어 Immediate 상수 값도 32Bit 값을 그대로 넣을 수 없습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;만약 r0에 32Bit 상수를 넣고 싶다면, 몇몇 예외를 제외하고는 메모리에 미리 넣어두고 해당 메모리를 상태 주소로 참조해서 얻어와야 한다는 뜻입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;역시 장단점이 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;모든 명령어를 같은 사이즈로 처리함에 따라 파이프라인 구현이 용이하다는 점이 있습니다. 그리고 명령어 해석기를 설계할 경우 예외 처리부분이 없으므로, 쉽고 고속으로 처리할 수 있겠지요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;코딩 시에 몇몇 제한이 따른다는 점 입니다. 상대 주소 지정 방식은, 이 때 사용하는 Offset이 24+2=26Bit 이므로, 상대주소라고는 하지만 거의 불편이 없고, 다만 Immediate 오퍼랜드를 지정할 경우에 좀 번거롭다는 점이 있습니다. 그러나 8Bit 해상도를 가지는 오퍼랜드라면 한 Word 내에서 처리가능 합니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; ARM 명령어의 다른 특징으로는 모든 명령어를 조건적으로 실행시킬 수 있다는 것입니다. 예를 들어, Intel CPU에서는 jz, jc와 같은 점프 명령어를 사용합니다. 그 의미는 jz 같은 경우 zf가 설정되어 있으면 점프를 해라, 혹은 jc같은 경우는 cf가 설정되어 있으면 점프를 해라. 라는 의미입니다. 무조건 점프시에는 jmp를 쓰지요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;ARM의 경우엔 그런 플래그의 사용이 점프 명령에 국한되지 않고, 예외 없이 모든 명령어에 사용할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile3.uf.tistory.com/original/170B274B4F20CC7E05BE4C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile3.uf.tistory.com/image/170B274B4F20CC7E05BE4C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;66&quot; width=&quot;535&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;위의 경우를 보시면 jmp에 해당하는 B명령 뿐만 아니라 MOV 와 같은 데이터 전송명령에도 플래그 옵션을 사용했음을 볼 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;삼항 연산자로 예를 들어보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;a = (b==c) ? d:e;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;의미는 b와 c가 같으면 d를 a에 넣고 다르면 e를 a에 넣는 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;일단 Intel CPU에서는??&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/196402444F20D24510A1CB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/196402444F20D24510A1CB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;121&quot; width=&quot;341&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이와 같이 됩니다. ARM CPU를 봐보도록 하겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;제 ipad2 에서 gcc로 컴파일 할 경우 최적화 문제 때문에 원하는 표현이 잘 안나오는 것 같지만&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM CPU의 명령어를 사용하면&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#801fbf&quot; style=&quot;background-color: transparent; &quot;&gt;CMPS r2,r3&lt;br /&gt;
MOVEQ r1,r4&lt;br /&gt;
MOVNE r1,r5&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이렇게 짧게 표현 가능합니다. 중요한 것은 Intel CPU에서는 점프문은 꼭 필요한 반면 ARM CPU에서는 점프문이 꼭 필요하진 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;다시 한번 강조하지만 ARM에서는 이와 같은 조건 옵션을 모든 명령어에 사용 가능합니다. 실제로 모든 OP 코드의 상위 4Bit는 이런 조건 옵션을 나타내는데 사용되는 비트입니다. 각 조건에 사용되는 접미사 목록입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/150D1D484F20D4452018EB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/150D1D484F20D4452018EB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;667&quot; width=&quot;620&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;총 15개로 15 = 1111b 딱 4Bit 맞군요. 다 외울 필요는 없고 여기에서는 그냥 이런 것들이 있구나 하는 정도면 알면 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;필요할 때 보면되기 때문이죠. 명령어를 볼 땐 명령어에서 다 문자로 표시줍니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;다음 특징은 대부분의 명령어에 S라는 접미사를 사용하여 플래그 레지스터에 영향을 줄지 여부를 결정할 수 있다는 것입니다. 특히 연산명령을 수행할 때 &#039;S&#039; 를 붙히면 해당 결과에 따라서 플래그 값들이 변하게 되고, 붙히지 않으면 영향을 미치지 않도록 할 수 있습니다. Intel CPU에서는 연산의 결과에 따라 항상 플래그 값이 영향을 받는거와는 다르군요. 사실 이러한 점 때문에 Intel CPU에서는 특정 연산을 수행시 Push , Pop을 사용해 레지스터를 스택에 저장해 두고 연산이 끝난 후 다시 빼오는 방법을 사용하는데.. 귀찮습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● Branch and Branch with link (B, BL)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/1553B54D4F20D62F21E99E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/1553B54D4F20D62F21E99E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;43&quot; width=&quot;562&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Cond 부분은 위에 있는 조건 옵션입니다. 101은 B 명령 코드입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;L 부분은 1일 경우 BL이 되는 것이고 0이면 B 명령입니다. B는 JMP라고 생각하시면되고, BL은 CALL로 생각하시면 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;다만 BL의 경우엔 PC값을 스택에 넣는 것이 아니라 r14(lr)에 넣는다는 것에 차이가 있습니다. 나머지 하위 24Bit가 Offset으로 사용되는데 ARM은 모든 명령어들이 Word 단위 이므로 총 +/- 32MB 영역을 커버합니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● Data Processing Instruction&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;데이터 프로세싱 명령은 ARM의 50% 정도에 해당하는 명령입니다. 실제 개수는 16개이고, 연산명령, 비교명령, 비트 연산 명령, 데이터 전송 명령 등이 포함됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile22.uf.tistory.com/original/1809F54A4F20DA50390D56&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile22.uf.tistory.com/image/1809F54A4F20DA50390D56&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;49&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;1) &amp;lt;Cond&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; 해당 명령의 조건 실행 플래그입니다. 데이터 프로세싱 명령어에도 당연히 포함됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;해당 플래그를 통해 명령을 현재 플래그 레지스터(CPSR)의 상태에 따라 실행 여부를 결정하는데 사용되는 플래그입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;2) &amp;lt;I&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; Operland 2로 지정되어 있는 부분이 Immediate Operand 인지 아닌지 여부를 나타내는 비트. Immediate Operand라 함은, 예를 들어 Intel CPU에서 MOV AX, 01234h 라고 했을 경우 1234h를 가리키는 말입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;3) &amp;lt;OpCode&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; 데이터 프로세싱 명령 중 어떤 명령인지를 나타내는 필드. 해당 필드와 명령어는 다음과 같습니다.&lt;/font&gt;&lt;br /&gt;
 &lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/183B4C4B4F20DB540B5230&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/183B4C4B4F20DB540B5230&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;535&quot; width=&quot;506&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;4) &amp;lt;S&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; S 비트가 1인 경우는 데이터 프로세싱 명령의 결과가 CPSR에 영향을 미칩니다. 즉, 0인 경우에는 CPSR은 변하지 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;5) &amp;lt;Rn&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; ARM 데이터 프로세싱 명령은 그 결과와 첫 번째 오퍼랜드는 항상 레지스터로 지정해야 합니다. Rn은 첫 번째 오퍼랜드를 가리키는 것으로 위에서 Op1으로 표기한 것에 해당합니다. ARM에서 한번에 볼 수 있는 범용 레지스터는 sp, lr, pc 등을 포함해서 r0~r15까지입니다. 즉, 4Bit를 통해 레지스터를 나타내게 됩니다. 해당 필드는 명령에 따라 사용되지 않기도 합니다. MOV나 MVN등이 이에 해당합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;6) &amp;lt;Rd&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; 오퍼레이션의 결과가 저장될 레지스터를 의미합니다. 역시 레지스터를 가리키므로 4Bit를 사용하고 모든 명령에서 디폴트로 사용되는 필드. ARM의 데이터 프로세싱 명령의 결과는 항상 레지스터로 들어갑니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;7) &amp;lt;Operand 2&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Immediate Operand 혹은 레지스터 Operand 입니다. &amp;lt;I&amp;gt; 필드가 0일 경우 레지스터 입니다. 이에 관해선 많은 설명이 있지만 일단 여기까지만... 필요하면 추후..;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이제 조금 더 명령어의 세부 비트 개념이 아닌 관점을 명령어를 읽는 것에 초점을 맞춰보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#801fbf&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;1. MOV{cond}{S} Rd, Op2&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; Assembler에서 가장 기본적으로 사용되는 데이터 전송명령입니다. ARM에서의 MOV는 다른 칩의 MOV와 비슷하지만 그 Target이 되는 부분이 항상 레지스터라는 점 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;즉, Intel CPU같은 경우 아래 두 명령어 처리가 가능하지만&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;MOV EAX,[EBX]&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;MOV EAX,EBX&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM같은 경우는 첫 번째는 처리할 수 없는 명령어 입니다. 즉, 레지스터나 Immediate 값 같은 것들을 레지스터에 넣는 명령입니다. 참고로.. Target 레지스터가 PC인 경우 S옵션을 사용하면, Exception 모드에서 보통 상태로 빠져 나오는 역할을 하게 됩니다. 예시 코드를 보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#ffffff&quot; style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;MOV r0,r1&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;단순히 r1에 있는 내용을 r0에 넣는 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV r0,#0&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0에 상수 0을 넣는 명령입니다. ARM에서는 상수에 #을 붙혀서 사용합니다. 또 진법 표현은 C에서의 방법을 사용합니다. 즉, MOV r0,#0x30 이런 식으로 사용할 수도 있습니다. 혹은 &amp;amp;을 붙여서 16진수를 나타낼 수도 있습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV r0, #0xfc000003&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0에 상수 값 0xfc000003을 넣는 명령입니다. 해당 값은 8Bit 값 0xFF를 32Bit로 확장하고 오른쪽으로 두 번 Rotate 시킨 값입니다. 그래서 에러가 나지 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV r0, r1, LSL #1&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r1을 왼쪽으로 1bit Shift한 값을 r0에 넣는 것입니다. LSL( Logical Shift Left )&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV r0, r1, LSR r2&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r1을 r2 만큼 오른쪽으로 Shift 한 값을 r0에 넣는 명령입니다. LSR ( Logical Shift Right )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV r0, r0, ASR #24&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0을 오른쪽으로 24bit 만큼 Shift 한 값을 r0에 넣는다. ASR ( Arithmetic Shift Right )&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LSR와 차이점은 최 상위 비트가 1인 경우 새로 계속 해당 비트 값을 유지시킨다는 것입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LSR 같은 경우는 새로 들어오는 최상위 비트는 항상 0입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVS r0, r1, LSR #1&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; C(flag) = r1[0]&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVCC r0, #10 &lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; if C == 0 then r0 = 10&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVCS r0, #11&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; if C == 1 then r0 = 11&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r1을 오른쪽으로 1bit Shift 한 값을 r0에 넣는다. 이 때 연산의 결과가 플래그에 영향을 미치도록 하기 위해 S를 붙힌 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;만약 Carry Flag가 셋팅 됬을 때와 안됬을 때의 차이로 r0에 넣는 값이 달라진다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVS r0, r4 &amp;nbsp; &lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; if r4 == 0 then r0 = 0&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVNE r0, #1 &lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; else r0 = 1&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0에 처음에 무조건 r4 값이 들어가고 MOVNE에서 r4 값이 0이면 0과 1은 다르므로 false로 MOVNE문은 실행되지 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#801fbf&quot;&gt;&lt;b&gt;2. MVN{cond}{s} &amp;nbsp; Rd, Op2&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;이 명령어는 Rd = NOT Operand2 의 의미를 가진 명령입니다. 기존 어셈블러에서는 볼 수 없던 명령이죠. 기능은 MOV 처럼 값을 넣긴 넣는데 NOT을 해서 넣는 명령입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MVN r0, #0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r0 = -1&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;0을 NOT 하면 FF..FFF 이므로 -1 이 되게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;또한 MOV r0, #0xFFFFFFFF 이렇게 하면 에러가 발생합니다. ARM의 모든 명령이 32bit 한 word이고 Immediate 어포랜드처리를 8bit 값을 Rotate 시키는 방식으로 사용하기 때문인데, MVN을 사용함으로써 해당 값을 넣을 수 있습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;3. ADD{cond}{S} &amp;nbsp;Rd, Rn, Op2&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;ADC{cond}{S} &amp;nbsp;Rd, Rn, Op2&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;더하기 명령입니다. Intel CPU와 차이점은 오퍼랜드를 3개 지정한다는 것입니다. Rd 는 결과가 저장될 레지스터로, Data Processing 명령 모두는 그 결과가 Rd로 들어가야만 합니다. 나머지 두개가 서로 더해질 오퍼랜드 입니다. 두개의 오퍼랜드 중 하나는 또 항상 레지스터여야만 합니다. Op2는 Shifted Register 혹은 Immediate Value 중 하나입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADD r0, r0, #1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r0 = r0 + 1&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0에 1을 더한 후 그 값을 r0 넣는 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADD r0, r1, r2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r0 = r1 + r2&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;생략..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADDS r0, r1, r1, LSL #2 &amp;nbsp; &amp;nbsp; ; r0 = r1 * 5&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;알아서 유추... 모든 수의 &amp;lt;&amp;lt;1 은.. x2..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADD r0, r0, r1&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r0 = r0 + r1&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV pc, lr&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; return&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0 과 r1을 더해 r0에 넣고 리턴 하고 있습니다. 리턴 값은 r0 레지스터에 들어가게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;4. SUB{cond}{S} &amp;nbsp; &amp;nbsp; Rd, Rn, Op2&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;
SBC{cond}{S} &amp;nbsp; &amp;nbsp; Rd, Rn, Op2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; Carry Flag와 관련되어 있는 명령&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; RSB{cond}{S} &amp;nbsp; &amp;nbsp; Rd, Rn, Op2&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; RSC{cond}{S} &amp;nbsp; &amp;nbsp; Rd, Rn, Op2&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&amp;nbsp;Carry Flag와 관련되어 있는 명령&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;위 네 명령은 빼기 명령입니다. R로 시작하는 명령은 Rn과 Op2를 바꿔서 명령하는 명령입니다. 즉,&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;SUB Rd, Rn, Op2 &amp;nbsp; =&amp;gt; Rd = Rn - Op2&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;RSB Rd, Rn, Op2 &amp;nbsp; =&amp;gt; Rd = Op2 - Rn&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;SBC Rd, Rn, Op2 &amp;nbsp; =&amp;gt; Rd = &amp;nbsp;Rn - Op2 + Carry - 1&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;5. AND{cond}{S} &amp;nbsp;Rd, Rn, Op2&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; EOR{cond}{S} &amp;nbsp;Rd, Rn, Op2&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; ORR{cond}{S} &amp;nbsp;Rd, Rn, Op2&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이번엔 Bit 연산에 관련된 명령어들입니다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;AND =&amp;gt; AND&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;EOR =&amp;gt; XOR&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ORR =&amp;gt; OR&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;B 명령을 제외하고는 왠만한 명령어는 모두 3글자라서 ORR로 했나봅니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;AND r0, r0, #0xFF&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0과 0xFF를 and 연산 후 그 결과를 r0에 넣습니다. r0의 8bit만 남기는 명령입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ANDCSS r0, r1, ASR r3&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;만약 캐리플래그가 설정되어 있다면 r0 = r0 AND ( r1 &amp;gt;&amp;gt; r3 ) 을 수행합니다. 계산 결과는 플래그에 영향을 미칩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;EORS r0, r0, r0&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;r0 = r0 XOR r0 을 수행하는 명령인데 r0을 0으로 만들고 NF는 0, ZF는 1로 만듭니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;MOV r0, #0xFF&lt;br /&gt;
ORR r0, r0, #0xFF00&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;최종적으로 r0을 0xFFFF를 만드는 과정입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#801fbf&quot;&gt;&lt;b&gt;6. BIC{cond}{S} &amp;nbsp; &amp;nbsp;Rd, Rn, Op2&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;Rd = Rn AND (NOT Op2) 로 설명이 되어 있는 명링입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;BIC r0, r1, #3&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0 = r1 AND 0xFFFFFFFC 의미입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;7. CMP{cond} &amp;nbsp;Rn, Op2&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;CMN{cond} &amp;nbsp;Rn, Op2&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;비교 명령입니다. MOV, MVN처럼 인수가 2개이지만 Rd가 없습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;CMP는 우리가 알던 CMP명령입니다. Rn에서 Op2를 빼 보는 명령이죠. 해당 명령은 레지스터에는 영향을 미치지 않고 플래그에만 영향을 미치는데 이 명령어들은 S 옵션이 없어도 디폴트로 S 옵션을 준 효과가 나타납니다. S 옵션마저 꺼지면.. -_-&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Nop 같은 명령어가 되는건가요?? ㅎ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;CMN은 CMP와 반대로 두 오퍼랜드를 더해보는 명령입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;CMP r2, #23&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVEQ r2, #45&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;만약 r2가 23이면 45를 넣어라..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;CMP r0, #0&lt;br /&gt;
CMPEQ r1, #0&lt;br /&gt;
CMPEQ r2, #0&lt;br /&gt;
CMPEQ r3, #0&lt;br /&gt;
MOVEQ r4, #12&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0부터 r3까지 모두 0이라면 r4에 12를 넣는 명령&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;CMN r1, r2&lt;br /&gt;
MOVEQ r0, #0&lt;br /&gt;
MVNNE r0, #1&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0 = (r1 + r2) == 0 ? 0, -1 &amp;nbsp;이라는 의미.. 영어 해석 같네요.. -_-;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;8. TEQ{cond} &amp;nbsp;Rn, Op2&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;TST{cond} &amp;nbsp;Rn, Op2&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;CMP와 거의 비슷한 구조를 갖는 명령입니다. 기능도 거의 유사..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;CMP가 빼기, CMN가 더하기라면&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;TEQ는 XOR, TST는 AND 연산을 통해 같은 일을 합니다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;하지만 특징이라면 Logical 연산이 일어날 경우 플래그 중에서 VF(Overflow)는 영향을 받지 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;CMP r0, #31&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r0 &amp;lt;= 31&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;TEQ r0, #127&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; r0 == 127&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOVLS r0,#&#039;.&#039;&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; if either then r0 =&#039;.&#039;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;TST r1, #3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;
MOVEQ r0, #1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
MOVNE r0, #0&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0 = (r1 &amp;amp; 3) == 0 ? 1 : 0 이러한 의미 같습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● PSR Transfer&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;PSR이란 Program Status Register 로서 플래그 비트와 Control 비트들로 구성된 레지스터 입니다. 해당 레지스터의 값을 일반 레지스터로 옮기거나 반대의 일을 하는 명령이 PSR Transfer 명령입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;PSR은 32Bit 레지스터입니다. CPSR, SPSR 5개를 합쳐서 총 6개가 있습니다. 여기서 SPSR은 Exception 모드에 따라 여분으로 존재하는 PSR을 말합니다. 실행 모드에 따라서 User가 접근할 수 있는 PSR은 한개, 혹은 2개로 제한됩니다. 예를 들어 User모드에서는 CPSR에만 접근 할 수 있고, IRQ모드에서는 CPSR과 SPSR_irp 에 접근할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;아래 명령어는 그닦 쓸일이 없고 CPU 동작 모드를 임의로 설정하거나, 현재 동작모드를 확인하기 위해서 사용되는 경우가 있습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;1. &amp;nbsp;MRS{cond} &amp;nbsp;Rd,&amp;lt;psr&amp;gt; &amp;nbsp; &amp;nbsp; : Transfer PSR contents to a register&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; MSR{cond} &amp;nbsp;&amp;lt;psr&amp;gt;, Rm &amp;nbsp; &amp;nbsp;: Transfer register contents to PSR&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; MSR{cond} &amp;nbsp;&amp;lt;psrf&amp;gt;, Rm &amp;nbsp; : Transfer register contents to PSR flag bits only&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;MRS명령과 MSR 명령의 의미가 애매할 수도 있습니다. M을 Move로, R을 레지스터로, S를 PSF로 파악하면 MRS의 경우엔 Move Reg PSR 정도로 생각할 수 있습니다. 즉, 레지스터에 PSR 값을 넣는 명령&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;예제 생략.. = _ =&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● 곱하기 명령(MUL, MLA)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM에서는 곱하기 명령이 크게 두 종류가 있습니다. 하나는 그냥 곱하는 것이고, 다른 하나는 곱해서 더하는 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#801fbf&quot;&gt;&lt;b&gt;&amp;nbsp;1. MUL{cond}{S} &amp;nbsp; Rd, Rm, Rs&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이 명령에서는 레지스터만을 사용해야 합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MUL r1, r2, r3&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; r1 = r2 * r3&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;참고로 곱하기의 결과가 32Bit를 넘는다면, 하위 32Bit만 결과 레지스터에 남습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#801fbf&quot;&gt;&lt;b&gt;&amp;nbsp;2. MLA{cond}{S} &amp;nbsp; Rd, Rm, Rs, Rn&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이번엔 레지스터가 4개 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Rd = Rm * Rs + Rn 의 의미 입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● Single Data Transfer( LDR, STR )&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;해당 명령은 레지스터와 외부 메모리와의 데이터 전송을 담당하는 명령입니다. 무척 사용 빈도가 높은 명령. Intel CPU에서는 MOV 하나로 레지스터간의 데이터 전송과, 외부메모리와의 데이터 전송의 두 가지 목적으로 사용하지만 ARM에서는 구분이 되어 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;즉, MOV 명령은 레지스터간의 전송명령, 데이터 처리명령으로 분류되고&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LDR, STR은 데이터 전송명령으로 분류됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LDR은 Load라는 의미로 외부 메모리로부터 레지스터로 데이터를 읽어오는 명령이고,&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STR은 Storage라는 의미로 레지스터로부터 외부 메모리로 데이터를 저장하라는 명령입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;1. LDR{cond}{B} &amp;nbsp;Rd, address{!} &amp;nbsp; &amp;nbsp; &amp;nbsp; ; Rd = Contents of address&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;LDR{cond}{B} &amp;nbsp;Rd, =expression &amp;nbsp; &amp;nbsp; &amp;nbsp;; Rd = expression&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp;STR{cond}{B} &amp;nbsp;Rd, address{!} &amp;nbsp; &amp;nbsp; &amp;nbsp; ; contents of address = Rd&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LDR과 STR은 Single Data 전송 명령입니다. 비슷한 명령으로 LDM, STM은 여러 개의 레지스터 내용을 전송할 수 있는 명령입니다. 이 밖에 SWP라는 스왑 명령이 있는데, 해당 5개의 명령만이 외부 메모리와 레지스터간의 전송을 가능하게 하는 명령입니다. &lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;LDR과 STR의 경우 전송 단위를 바이트, 혹은 워드(32bit)단위로 수행 할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;바이트 단위 전송의 경우 해당 레지스터의 어떤 부분이 사용될지의 여부는 해당 프로세서의 Endian에 달려 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;또, 워드 전송 명령을 사용할 경우, 메모리 주소는 Word align이 되어야 합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Endian 설명&lt;/font&gt;&lt;br /&gt;
&lt;a href=&quot;http://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8&quot; style=&quot;background-color: transparent; color: rgb(0, 0, 0); &quot;&gt;http://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8&lt;/a&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;아래 그림은 LDR과 STR에서 사용하는 전송 모드를 나타낸 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/137448464F210B881AAFE7&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/137448464F210B881AAFE7&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 10.jpg&quot; height=&quot;407&quot; width=&quot;532&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;1) Pre-Indexed Addressing Mode&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이 모드에서는 Rn을 베이스 주소로 사용합니다. 여기에 더해서 Offset을 지정하거나, 혹은 지정하지 않을 수 있습니다. Offset을 사용할 경우에는 해당 Offset을 베이스 주소에서 더하도록 하거나 뺄 수 있는데, 위의 그림에서 +,- 기호가 그것을 나타냅니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR r0, [r1]&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r1을 베이스로 사용하고 Offset은 지정하지 않은 형태입니다. r0에 r1을 번지로 하는 워드를 읽어드립니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR r0, [r1, #132]&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Offset으로 132를 지정한 형태입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;STR r0, [r1, r2]&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;베이스는 r1, Offset은 r2를 사용한 형태입니다. 즉,&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;*(r1 + r2) = r0&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;사람 해깔리게 우 =&amp;gt; 좌가 아닌 이 명령어는 좌 =&amp;gt; 우 &amp;nbsp; 네요..;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR r0, [r1, r2, LSL #2]&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;베이스 r1, Offset은 r2 &amp;lt;&amp;lt; 2 의 형태&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이번에는 Write-Back 기능입니다. LDR 명령의 경우 옵션으로 Write-Back을 지정할 수 있는데, 지정할 경우 원래 베이스에 Offset을 더한 값을 다시 베이스 레지스터로 넣는 기능을 합니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;STR r2, [r0, #-4]!&lt;br /&gt;
r2 = *(r0 - 4)&lt;br /&gt;
r0 = r0 - 4&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이와 같은 의미가 됩니다. Offset을 적용 시켜서 먼저 명령어를 수행 한 후 베이스 주소와 Offset을 더해주는 것이죠.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;아무튼 여기서 Pre-Index Mode이기 때문에 실제 주소를 구할 때 Offset을 먼저 빼준 것입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;2) Post-Indexed Addressing Mode&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;Post 인덱스 모드의 경우에는 Pre 인덱스 모드에 비해 Effective Address는 항상 Rn, 즉, 베이스 주소를 나타내는 레지스터의 값입니다. 그리고 한가지 알아두어야할 것은 Post 인덱스 모드의 경우엔 따로 !를 사용하지 않더라도 이폴트로 Write-Back 모드가 사용됩니다. Post인데 Write-Back이 안된다면, Offset을 사용할 이유가 없군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR r0, [r1], r2&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;대괄호의 사용이 Pre 인덱스의 경우와 다릅니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;r0 에다 r1을 주소로 하여 값을 읽어오고 다시 r1에는 r2를 더해주는 일을 합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;3) Relative Addressing Mode&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;해당 Addressing 모드는 어셈블러가 적절히 지원하여 변환해 주는 모드라고 생각하면 됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LDR r5, ThreeCubed&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ThreeCubed DCD 27&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;위와 같은 경우 실제로는&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR r5, [PC, #constant]&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;형태의 코드로 번역해 줍니다. 즉, PC를 베이스로 삼아서 코드를 만드는 것이지요. 만약 해당 Symbol이 지정하는 범위가 너무 커서 상수로 지정할 수 없다면 어셈블을 할 때 에러를 내게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR r0, =0x12345678&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이 경우 어셈블러가 해당 상수 값을 특정 공간에 모아서 삽입 해 주고(이 공간을 Literal Pool 이라 하는군요.) 역시 마찬가지로 PC를 베이스로 해서 명령코드를 만듭니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● Block Data Transfer 명령(LDM, STM)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;해당 명령은 LDR, STR과 마찬가지로 실제 메모리에 레지스터의 내용을 전달하거나, 전달받을 수 있는 명령입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LDR 명령이 메모리 번지의 내용을 지정된 레지스터로 가져오는 명령이라면 LDM은 가져오긴 하는데, 여러 개의 레지스터의 내용을 한 큐에 가져오는 명령입니다. 가장 많이 사용되는 경우는 스택 연산인 것 같습니다. ARM에는 Push, Pop 명령이 없습니다. 대신 LDR이나 STR을 쓸 수도 있겠고 ,또 LDM, STM을 쓸 수도 있죠.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;push eax&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;push ebx&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;push ecx&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;push edx&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;와 같은 Intel CPU 명령이 있다면&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM Single 데이터 전송 명령으론..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STR r0,[sp],#-4&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STR r1,[sp],#-4&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STR r2,[sp],#-4&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STR r3,[sp],#-4&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM Multiple 전송 명령으론..&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;STMEA sp!,{r0,r1,r2,r3}&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;{ Reg_List }&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;중괄호 사이에 전송 대상이 되는 레지스터를 넣어주면 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;ARM 에서 한 시점에 사용할 수 있는 레지스터의 개수는 r0~r15까지 총 16개입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;또한 LDM 명령의 니모닉상에 16bit의 공간이 있어서 각 비트가 레지스터 r0~r15와 1:1대응이 된다는 사실입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;따라서 { Reg_List }에는 어떠한 레지스터의 조합도 올 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;{r3,r2,r1} 과 {r1,r2,r3}를 했을 경우 메모리에 저장되는 순서는 같습니다. 위 이유 때문..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;위 Multiple 전송 명령에서 STMEA라고 적었는데 EA가 동작모드를 지정하는 부분입니다. 이와 같은 키워드가 8가지가 있고, 동작모드는 4가지가 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;여기서 동작모드는 여러 개의 레지스터 값을 메모리로(로부터) 전송할 경우 해당 메모리 번지를 증가시키면서 저장할지, 혹은 감소시키면서 저장할지를 지정하는 것과, 증/감을 하는데, 저장하기 전에 증/감을 할지, 아니면 저장하고나서 증/감을 할지를 지정하는 것을 의미합니다.&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STMFD/LDMFD : Full Desending Stack &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; ARM 컴파일러가 사용하는 스택&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STMFA/LDMFA : Full Ascending Stack&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STMED/LDMED : Empty Descending Stack&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;STMEA/LDMEA : Empty Ascending Stack&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;깔끔하게 그림 한장으로 보시겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/141DBA3D4F21431F1690A4&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/141DBA3D4F21431F1690A4&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 16.jpg&quot; height=&quot;399&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● Single Data Swap&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#801fbf&quot;&gt;&lt;b&gt;1. SWP{cond}{B} &amp;nbsp; Rd, Rm, [Rn]&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;레지스터를 3개 지정하도록!. 실제 동작은 Rd = [Rn], [Rn] = Rm이 한번에 일어나는 명령&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;B는 Operation이 아니라 Byte Operation을 의미합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;SWP r0, r1, [r2] &lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r0 = [r2], [r2] = r1&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;SWPB r2, r3, [r4]&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; r2 = [r4], [r4] = r3 &amp;nbsp; &amp;nbsp; Bit 0~7까지만 영향을 미침&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;b&gt;&amp;nbsp;● Software Interrupt&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#801fbf&quot;&gt;&lt;b&gt;&amp;nbsp;1. SWI{cond} &amp;nbsp; &amp;nbsp;&amp;lt;expression&amp;gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;SWI는 소프트웨어 인터럽트 명령입니다. SWI 명령이 걸리면 동작모드가 변화합니다. Supervisor 상태로 진입을 하게 됩니다. 이러한 특성 때문에 pSOS의 경우는 System Call의 진입방법으로 사용합니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;pSOS 설명&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#3058d2&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/PSOS&quot; style=&quot;background-color: transparent; &quot;&gt;http://en.wikipedia.org/wiki/PSOS&lt;/a&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b style=&quot;background-color: rgb(0, 0, 0); &quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;===========================================================================================&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;으아........... 대략 5시간의 시간을 걸쳐 겨우겨우 하나의 문서를 읽으면서 정리해보았군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이제 대충 ARM CPU에 대해 알았고 명령어들을 알아보았으니 실제로 프로그래밍을 해본다음 간단한 명령어들을 해석해보고 그만쓰겠습니다......... 제발!!&lt;b&gt; 저장하기&lt;/b&gt;좀 누르고 싶네요 -_-ㅋㅋㅋ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;간단히 두 수를 입력받아 합을 구해주는 프로그램 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;main 함수 부분을 봐보겠습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&lt;div class=&quot;imageblock dual&quot; style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;margin: 0 auto;&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/201D6D364F212369249DF0&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/201D6D364F212369249DF0&quot; alt=&quot;&quot; height=&quot;412&quot; width=&quot;336&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/17429B364F2123B3104701&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/17429B364F2123B3104701&quot; alt=&quot;&quot; height=&quot;580&quot; width=&quot;336&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#e31600&quot;&gt;왼쪽은 실제 환경에서의 gdb로 봐본 결&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;과이고 &lt;/font&gt;&lt;font style=&quot;background-color: transparent; &quot; color=&quot;#e31600&quot;&gt;오른쪽은 Windows에서 IDA로 디스어셈블링을 해본 결과&lt;/font&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;차이점을 아시겠나요?? :-)&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;왼쪽에선 push, pop 명령어가 쓰인 반면 오른쪽에선 STMFD, LDMFD 명령어들이 쓰였습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;뭐 IDA에서는 최신 ARM 명령어를 지원안하나 보군요. 실제로는 push 명령어를 쓰고 어셈블러에서는 STMFD으로 바뀐다고..하는?!&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;위 스샷에서&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;&lt;font style=&quot;background-color: transparent; &quot;&gt;GDB 버전은 6.3.50.20050815-cvs&lt;/font&gt;&lt;br /&gt;
&lt;font style=&quot;background-color: transparent; &quot;&gt;IDA 버전은 6.1.1100421&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이었습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;일일이 트레이스 해가며 디버깅을 해보려 했으나.. 왜 gdb에서 breakpoint가 안먹히죠..?&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;그냥 r 누르니까 bp를 다 무시해버리고 그냥 실행되네요.. 할 수 없이 그냥 코드만 보고 분석해봤습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;STMFD SP!, {R7, LR}&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;스택에 LR 레지스터 값 저장. main 함수 내부적으로 또 다른 함수 호출하므로 &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;LR 레지스터에 값이 덮어 씌워지므로 그것을 막기 위함&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;저장되면 &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;H&amp;nbsp;|....|LR|R7| L&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;이런식으로 저장 된다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADD R7, SP, #0&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;스택 포인터를 R7 레지스터에 더하고 있다.;;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;SUB SP, SP, #0x14&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;스택에 공간을 할당하고 있다. 스택은 높은 주소에서 낮은 주소로 자라기 때문에 ..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166);&quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;STR R0, [SP, #0x1c+var_18] &amp;nbsp;=&amp;gt; [SP, #4]&lt;br /&gt;
STR R1, [SP, #0x1c+var_1c] &amp;nbsp;=&amp;gt; [SP]&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;R0, R1 레지스터에 있는 값을 스택포인터에서 +4, +0 위치에 각각 저장한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR &amp;nbsp; &amp;nbsp; R3, =(aInputNumber - 0x2278)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADD &amp;nbsp; &amp;nbsp; R3, PC, R3 &amp;nbsp; &amp;nbsp; &amp;nbsp;; &quot;Input number : &quot;&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;R3에 &quot;Input number : &quot; 문자열 주소를 가져온다.&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;div&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV &amp;nbsp; &amp;nbsp; R0, R3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; char *&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;BL &amp;nbsp; &amp;nbsp; &amp;nbsp;_printf&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); background-color: transparent; &quot;&gt;문자열 주소를 첫 번째 인자로해서 printf를 호출&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166); &quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;ADD &amp;nbsp; &amp;nbsp; R2, SP, #0x1C+var_10&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: rgb(186, 52, 166); &quot;&gt;&lt;font color=&quot;#ffffff&quot;&gt;ADD &amp;nbsp; &amp;nbsp; R12, SP, #0x1C+var_14&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: rgb(0, 0, 0); background-color: transparent; &quot;&gt;sp에서 +12, +8 위치에 떨어진 곳의 주소를 각각 R2, R12에 넣는다.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: rgb(0, 0, 0); background-color: transparent; &quot;&gt;인자 값을 받기 위해 주소를 가져오겠지요.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;LDR &amp;nbsp; &amp;nbsp; R3, =(aDD - 0x2290)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;ADD &amp;nbsp; &amp;nbsp; R3, PC, R3 &amp;nbsp; &amp;nbsp; &amp;nbsp;; &quot;%d %d&quot;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;&quot;%d %d&quot; 문자열 있는 주소를 R3로 가져옴&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;div&gt;
&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV &amp;nbsp; &amp;nbsp; R0, R3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; char *&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV &amp;nbsp; &amp;nbsp; R1, R2&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;MOV &amp;nbsp; &amp;nbsp; R2, R12&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style=&quot;background-color: rgb(186, 52, 166);&quot; color=&quot;#ffffff&quot;&gt;BL &amp;nbsp; &amp;nbsp; &amp;nbsp;_scanf&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot; style=&quot;background-color: transparent; &quot;&gt;각 인자 값 넣어주소 scanf 호출.. 뭐 이런식입니다.&lt;br /&gt;
&lt;br /&gt;이런 부분은 쉬운 부분이므로&amp;nbsp;&amp;nbsp;&lt;br /&gt;
아래는 각자 알아서... &lt;br /&gt;
&lt;br /&gt;그만 쓸래요! 으악!&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-359-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>A5</category>
			<category>ADC</category>
			<category>ADD</category>
			<category>ALU</category>
			<category>and</category>
			<category>ARM</category>
			<category>ARM Status Register</category>
			<category>BIC</category>
			<category>Branch</category>
			<category>C</category>
			<category>CMN</category>
			<category>cmp</category>
			<category>CPU</category>
			<category>Data Processing</category>
			<category>EOR</category>
			<category>flag</category>
			<category>gdb</category>
			<category>IDA</category>
			<category>Instruction</category>
			<category>ipad2</category>
			<category>LDMEA</category>
			<category>LDMED</category>
			<category>LDMFA</category>
			<category>LDMFD</category>
			<category>LDR</category>
			<category>MLA</category>
			<category>Mov</category>
			<category>Mrs</category>
			<category>MSR</category>
			<category>mul</category>
			<category>mvn</category>
			<category>N</category>
			<category>ORR</category>
			<category>pSOS</category>
			<category>PSR</category>
			<category>register</category>
			<category>RISC</category>
			<category>RSB</category>
			<category>RSC</category>
			<category>SBC</category>
			<category>Special Purpose General Register</category>
			<category>STMEA</category>
			<category>STMED</category>
			<category>STMFA</category>
			<category>STMFD</category>
			<category>str</category>
			<category>sub</category>
			<category>swi</category>
			<category>SWP</category>
			<category>TEQ</category>
			<category>TST</category>
			<category>v</category>
			<category>Z</category>
			<category>레지스터</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/359</guid>
			<comments>http://ezbeat.tistory.com/359#entry359comment</comments>
			<pubDate>Fri, 27 Jan 2012 00:31:37 +0900</pubDate>
		</item>
		<item>
			<title>ARM CPU 공부시작.. ㅠ_ㅠ</title>
			<link>http://ezbeat.tistory.com/358</link>
			<description>&lt;div style=&quot;margin-top: 1px; margin-right: 3px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: hidden; overflow-y: hidden; &quot;&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;ipad2를 산지 어언 반년이상 지난 지금.. 방금까지 탈옥을 해본적이 없다. 사실 탈옥을 해보려고 했지만 패드를 산 이후 멋모르고 ios5로 업데이트를 시켜버리고.. 그냥 쓰고 있었다. 언젠간 탈옥 툴이 나오겠지..라는 마음을 가지고;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;뭐 카페를 뒤져보니 나왔더군요 ㅋ 설 담날이라 휴유증에 빠질찰나 마침 재미있겠다 싶어서 바로 탈옥을 했죠. 사실 탈옥해서 가장 써보고 싶은 것은 gdb로 app를 리버싱해보는 것이었습니다. cydia에 재미있는 툴들도 많지만 뭐 일단 제 우선순위에선 gdb에 밀려났습니다.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;탈옥 후 openSSH를 설치하고 Xshell로 &amp;nbsp;접속해보았습니다.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/13189A404F1F9BCB02F45E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/13189A404F1F9BCB02F45E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;320&quot; width=&quot;637&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;굿 입니다. 뭔가 설레이는 군요.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;일단 디버깅에 필요한 툴들을 다운 받아줍니다. 간단히 apt-get을 사용해 설치하면 됩니다.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;리눅스 커널 정보를 봐볼까요..&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/18198A504F1F9C3B0E0226&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/18198A504F1F9C3B0E0226&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;22&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;!!!!!!!!!! ARM이래요 ARM.... 흑흑.......&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;사실 지금까지 Intel CPU 리버싱 밖에 공부해 보지 않았기 때문에 기대반 두려움 반이었습니다.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;
그래도 포기는 하지 않습니다. 재미있으니까요 :-)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;오늘은 디버깅 창 까지만 봐보겠습니다. 공부공부..;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile30.uf.tistory.com/original/200960474F1F9E692C67BF&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile30.uf.tistory.com/image/200960474F1F9E692C67BF&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;514&quot; width=&quot;384&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;이렇게 켜주시고.. 이제 ps 명령어로 프로세스 확인~&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/180AA7484F1F9E9A0EE489&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/180AA7484F1F9E9A0EE489&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;116&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;현재 GomokuOnline 이라는 프로세스인데 있는 폴더를 보면 Applications 폴더아래 막 이상한 시리얼 넘버같은 폴더로 들어오게 됩니다. 이와 같이 모든 어플리케이션은 저렇게 폴더가 따로 생겨서 설치가 됩니다. IFile 설치해서 보셔도 됩니다.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;아무튼 gdb 로 attach~&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/161E8E404F1F9F580950CE&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/161E8E404F1F9F580950CE&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;183&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;성공적이군요. 레지를 봐보면~ ?!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/177870364F1FA3DD08F4EF&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/177870364F1FA3DD08F4EF&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;273&quot; width=&quot;311&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;역시 ARM...흑흑 ㅋㅋ &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;그리고 gcc를 설치해 천천히 ARM CPU공부를 해봐야겠네요.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;
gcc는 그냥 cydia에서 GNU C Compiler 설치하면 됩니다. ios5 기준..&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/1404D34C4F1FA99D29220E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/1404D34C4F1FA99D29220E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;215&quot; width=&quot;319&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;
이렇게.. - -잘 되네요.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;gcc 버전&lt;/span&gt;&lt;br /&gt;
gcc version 4.2.1 (Based on Apple Inc. build 5555)&lt;br /&gt;
&lt;br /&gt;main 함수&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile30.uf.tistory.com/original/202375404F1FAA7B393D80&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile30.uf.tistory.com/image/202375404F1FAA7B393D80&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;272&quot; width=&quot;475&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;일단 리버싱을 시작해봅시당.. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-358-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Reversing</category>
			<category>ARM</category>
			<category>CPU</category>
			<category>Cydia</category>
			<category>gcc</category>
			<category>gdb</category>
			<category>iOS5</category>
			<category>ipad</category>
			<category>Main</category>
			<category>ssh</category>
			<category>탈옥</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/358</guid>
			<comments>http://ezbeat.tistory.com/358#entry358comment</comments>
			<pubDate>Wed, 25 Jan 2012 15:21:23 +0900</pubDate>
		</item>
		<item>
			<title>BlockInput Function</title>
			<link>http://ezbeat.tistory.com/357</link>
			<description>&lt;b&gt;&lt;font color=&quot;#3058d2&quot;&gt;BlockInput&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;이라는 함수가 있다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;msdn의 친절한 설명을 봐보면..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &#039;Segoe UI&#039;, &#039;Lucida Grande&#039;, Verdana, Arial, Helvetica, sans-serif; &quot;&gt;Blocks keyboard and mouse input events from reaching applications.&lt;/span&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그냥 키보드와 마우스의 입력 이벤트를 막는다고 되어 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;하지만 유일하는 먹히는 키 조합.. Ctrl + Alt + Del 키를 누르면 풀린다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;음.. 그래도 저 키조합도 막을 수 있는 방법을 구글에 찾아보면 소스코드도 포함된 글이 많다~&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;해당 함수는 인자로 BOOL 값을 하나 받는데.. &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;1이면 block하는 것이고 0이면 unblock하는 것&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;이다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;Anti Reversing 기법으로 사용되는 함수이기도 하는데 밥 먹고 소화겸 어떻게 작동하는지 분석을 해보았다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile3.uf.tistory.com/original/122435334F18F7C11B0FA6&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile3.uf.tistory.com/image/122435334F18F7C11B0FA6&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;186&quot; width=&quot;497&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아 참고로.. 위 테스트 환경은 Windows XP SP3 이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;user에서 BlockInput 함수를 호출하면 커널에서는 NtUserBlockInput 함수를 호출하게 된다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;딱 봐도 중요한 함수는 _BlockInput 함수 같다. 앞뒤로 있는 EnterCrit, LeaveCrit 함수는 저 부분을 감싸고 있는 걸로봐선 임계영역을 위한 함수들 같다. 함수 명만봐도..ㅋ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;일단 _BlockInput 함수를 봐보자.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/14555B4D4F18FB680934FB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/14555B4D4F18FB680934FB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;631&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그렇게 길지도 않다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;일단 빨간색 네모 친 부분을 잘 보면 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;파란색 네모 친 부분에서는 gptiBlockInput 변수가 0인지 체크를 한다. 즉 현재 블록 상태인지 아닌지를 체크한다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;0이 라면 블록 상태가 아니라는 뜻이므로 보라색 명령어가 실행이되면서 esi에 있는 값이 들어간다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그 값은 (0xe1df1008) 값이다. 하지만 저 값이 항상 일정하지는 않는 듯 싶다. 여러번 해보니 값이 바뀌는 것 같다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;아무튼 무슨 값이&amp;nbsp;gptiBlockInput&amp;nbsp;변수로 들어간다는 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;하지만&amp;nbsp;gptiBlockInput 값이 0이 아니라면 분홍색 네모 친 부분이 실행된다. 먼저 esi와 비교를 하는데 같으면 그 아래 있는 분홍색 명령어를 실행함으로써&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;gptiBlockInput 변수 값을 0으로 만든다. 다를 경우에는 그냥 종료를 하게된다. 무슨 뜻이냐면 이미 블록이 풀려버렸다는 뜻이다. 왜..? Ctrl + Alt + Del 키를 눌러서 미리 풀어버린 경우에 저렇게 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;일단&amp;nbsp;gptiBlockInput 변수에 들어가는 값에 따라 블록이 되고 안되고가 결정이 된다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그러면 그냥 커널에서 저 값을 강제로 바꿔보면??..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/1408CA504F18FDDB3B7083&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/1408CA504F18FDDB3B7083&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;123&quot; width=&quot;364&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/126EDC4B4F18FE7D2B3170&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/126EDC4B4F18FE7D2B3170&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;322&quot; width=&quot;243&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;-_-;;;;;;;;; 바꾸려고 봤더니 변수가 사라졌다... 또한 NtUserBlockInput 함수도 메모리에 존재하지 않는다. &lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이유는 윈도우에는 nt함수를 위한 user 함수를 위한 각각의 ServiceTable이 있는데&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;nt함수들은 KiServiceTable에 있고 user함수들은 W32pServiceTable에 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;아래는 각 모듈 정보&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;kd&amp;gt; !address &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;kiServiceTable&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; 804d9000 - 001f9000 &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;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Usage &amp;nbsp; &amp;nbsp; &amp;nbsp; KernelSpaceUsageImage&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ImageName &amp;nbsp; ntkrnlpa.exe&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;kd&amp;gt; !address &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;W32pServiceTable&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; bf800000 - 001c3000 &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;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Usage &amp;nbsp; &amp;nbsp; &amp;nbsp; KernelSpaceUsageImage&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ImageName &amp;nbsp; \SystemRoot\System32\win32k.sys&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;또한 분석을 해보면 KiServiceTable은 항상 메모리에 올라와 있지만&lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;&amp;nbsp;W32pServiceTable는&amp;nbsp;W32pServiceTable 내부 함수가 호출될 경우에만 메모리에 올라온다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/1325F7474F1902C9103A18&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/1325F7474F1902C9103A18&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;236&quot; width=&quot;198&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이와 같이..;;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그래서 W32pServiceTable&amp;nbsp;가 메모리에 올라왔을 경우&amp;nbsp;gptiBlockInput&amp;nbsp;변수에 접근할 수 있는데 그 때 값을 바꿔주니&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;BlockInput 함수를 호출하지 않아도 똑같은 동작은 내 맘대로 제어할 수 있었다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그러면 커널에서는 저 값을 어디서 사용하는 것일까? 당연히 키보드와 마우스의 이벤트를 막는 역할을 할 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;한번 하드웨어 브포를 걸어놓고 살펴보자.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;WinDbg에서 &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;ba r4 gptiBlockInput&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이와 같이 하면 해당 변수에 4Byte read 시 BP가 걸리게 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;어디서 멈췄을까요?&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;win32k!ProcessMouseInput&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; 함수에서 멈췄습니다. 처음 부분을 봐보죠.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/147B354E4F1912C234638E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/147B354E4F1912C234638E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;237&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;gptiBlockInput 변수가 0인지 비교를 하고 0이 아니라면 0xbf886745 로 점프를 하게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/1910B74D4F1912FE35BB1C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/1910B74D4F1912FE35BB1C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;75&quot; width=&quot;286&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;가보면 그냥 함수 에필로그 부분인 것을 알 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;즉, 처음에 블록 상태를 나타내는 변수를 검사 후 0이 아닌 값이 있으면 그냥 이벤트 수행 루틴을 건너 뛰어버리는 것 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;참 변수를 직관적으로 잘 사용하고 있군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;키보드 같은 경우도 봐보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/16522D474F1913A532DEF0&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/16522D474F1913A532DEF0&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 9.jpg&quot; height=&quot;120&quot; width=&quot;573&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;xxxKeyEvent 함수에서 해당 변수에 접근을 하고 있고 저 부분에서 0인지 아닌지 검사를 하게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;0이라면 test 명령어이기 때문에 and 연산 후 값이 0이므로 점프하지 않습니다. 0 이 아닌 경우 점프를 하게 되겠죠.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;점프 했을 경우엔... 뭐 위와 비슷하게 처리루틴이 아닌 다른 루틴으로 가겠지요..;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;결론.................. BlockInput 함수.. 이렇게 작동합니다. .ㅎㅎ 허무..;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-357-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>Anti Reversing</category>
			<category>BlockInput</category>
			<category>breakpoint</category>
			<category>EnterCrit</category>
			<category>Events</category>
			<category>gptiBlockInput</category>
			<category>HardWare</category>
			<category>KEYBOARD</category>
			<category>KiServiceTable</category>
			<category>LeaveCrit</category>
			<category>Mouse</category>
			<category>NtUserBlockInput</category>
			<category>ProcessMouseInput</category>
			<category>W32pServiceTable</category>
			<category>WinDbg</category>
			<category>xxxKeyEvent</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/357</guid>
			<comments>http://ezbeat.tistory.com/357#entry357comment</comments>
			<pubDate>Fri, 20 Jan 2012 16:57:23 +0900</pubDate>
		</item>
		<item>
			<title>Codegate 2011 B500 writeup</title>
			<link>http://ezbeat.tistory.com/355</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;대회가 끝난 .. 오래된 이 시점.. 가상화 프로젝트를 진행도중 예전에 가상화 관련해서 리버싱 문제가 하나 있었던거 같은데 그 당시 대회때는 건들어보지도 못했고; 나중에 시간 있을 때 한번 풀어봐야지 하고 문제만 가지고 있었는데 이제서야 풀어보게 되네요~ b100,200,300,400 다 풀었는데 시간상..ㅠㅠ 보지도 못한..;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;문제를 풀어보면서 느낀건데 이거 만든 사람이 참 대단하게 느껴지더군요. 뭐 일단은 문제를 풀어보도록 하죠.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;( 혹시 혼자서 먼저 풀어보실 분은 풀어보셔요. )&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;문제 파일&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://ezbeat.tistory.com/attachment/cfile10.uf@1756F33F4F16CF2A13FF63&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/110706133414/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; 7CAC6AF2303FC01ACD2CEB350DAC0518&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;Q :&amp;nbsp;Find a key.&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;일단 문제를 실행해보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/154CE33D4F16833C0DA459&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/154CE33D4F16833C0DA459&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;76&quot; width=&quot;380&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;출제가의 오타가 보이는 군요. 아무튼 키 파일을 체크를 하는데 해당 파일이 없다고 뜹니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;뭐 리버싱을 해서 원하는 키 파일이 뭔지 알아내야겠지요. 일단 리버싱을 들어가기 전에&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;문제의 정보를 봐보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/127B73404F168245206372&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/127B73404F168245206372&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;윈도우 1.jpg&quot; height=&quot;326&quot; width=&quot;564&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/113F95414F1682681D5AEC&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/113F95414F1682681D5AEC&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;윈도우 2.jpg&quot; height=&quot;326&quot; width=&quot;564&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;해당 바이너리의 ImageBase와 EntryPoint를 살펴보니 시작하는 섹션이 .text 섹션이 아닌 .VM 섹션이라는 것을 알 수 있습니다. 0x409000 부터 .VM 섹션이기 때문이죠. 제가 공부하고 구현해보았던 코드 가상화 기법과는 또 다른 것 같습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아무튼 부푼 기대를 가지고 한번 리버싱을 해보죠.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/165F2C424F1682F008573F&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/165F2C424F1682F008573F&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;276&quot; width=&quot;507&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;올디로 처음 열어보았을 때 화면입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;뭔가 시작부터 복잡하다고 느껴집니다. 전 미친척 하고 일일이 분석을 해보았지요.. =_=;; ㅎㅎ 사실 여러 가상화 기법들을 봐보아야 했기 때문에 겸사겸사 분석해본 것입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;여기에 모든 분석한 위치를 담기엔 뭐해서 대충 설명을 적겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;일단 두 번의 가상 메모리를 할당합니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;VirtualAlloc(NULL,0x1000,0x1000,PAGE_EXECUTE_READWRITE);&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;첫번째 VirtualAlloc된 메모리 : V100&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;두번째 VirtualAlloc된 메모리 : V200&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;으로 일단 가정..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그림이 있어서 말해보면 위 그림에서&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;call dword ptr ds:[eax]&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 위치에서 한번 VirtualAlloc을 합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아무튼 위 과정이 끝나고 쭉쭉 트레이스 하다보면&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/157B61444F1684981387D2&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/157B61444F1684981387D2&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;290&quot; width=&quot;513&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;위와 같은 루틴으로 점프해서 들어오게 되는데 이 루틴이 핵심적인 부분 중 하나입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 루틴은 분석할만한 가치가 100% +_+ ㅋㅋ &amp;nbsp; ㅠ_ㅠ @==^^ 설명이나 얼른..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 루틴에서는 스택 재구성은 물론 별의별 짓을 합니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;트레이스 하다보면&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;0x0040B1D4 에 있는 값과 0x0040B1D4 + 1 위치에 있는 값을 가져와 xor를 시킵니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그리고 0x0040B1D4 + 1 위치에 있는 값에서 xor된 크기 Byte만큼 데이터를 가져옵니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;가져와서 또 지지고 볶고.. 쿵짝쿵짝&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그리고 나면 V100+0xFD4 위치에 특정 명령어가 생성이 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;위 루틴의 끝 부분을 보시겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/1963833B4F16861911238A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/1963833B4F16861911238A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;73&quot; width=&quot;338&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이번 실행때 V100이 0x250000 였나보군요. 아무튼 push하고 retn하므로 저 주소로 뛰겠죠. 가보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/15703C474F168659320D50&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/15703C474F168659320D50&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;62&quot; width=&quot;521&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;push ebx를 하고 난 후 0x40ABBD로 점프를 하게 됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;저 push ebx가 뭘까.... 메모리에 이미 있는 값을 지지고 볶고 한 후 생성된 값인데.. &lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아무튼 계속 트레이스 해본 결과 위 과정이 반복 된다는 것을 확인할 수 있었습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그래서~ 0x0040ABBC 위치에 BP를 잡고 0x00250FD4 위치의 명령어를 계속 확인하면서 적어본 결과입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;6A 00 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH 0&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;6A 00 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH 0&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;60 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSHAD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;9C &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSHFD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;9C &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSHFD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;58 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP EAX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;50 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EAX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;68 03954000 &amp;nbsp; &amp;nbsp; PUSH 409503&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;58 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP EAX &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; ; 7CAC6AF2.00409503&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8B05 F0914000 &amp;nbsp; MOV EAX,DWORD PTR DS:[4091F0]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8D05 F80F3600 &amp;nbsp; LEA EAX,DWORD PTR DS:[360FF8]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8925 F80F3600 &amp;nbsp; MOV DWORD PTR DS:[360FF8],ESP&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8300 04 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ADD DWORD PTR DS:[EAX],4&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;58 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP EAX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8BF2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MOV ESI,EDX &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; ; 7CAC6AF2.00409987&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;46 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;INC ESI &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; ; 7CAC6AF2.00409987&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8A02 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MOV AL,BYTE PTR DS:[EDX]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;3242 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XOR AL,BYTE PTR DS:[EDX+1]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;0FB6C0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MOVZX EAX,AL&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;50 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EAX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;56 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH ESI &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;; 7CAC6AF2.00409988&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;57 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EDI&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;60 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSHAD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;8B0D CC0F3600 &amp;nbsp; MOV ECX,DWORD PTR DS:[360FCC]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;8B35 C80F3600 &amp;nbsp; MOV ESI,DWORD PTR DS:[360FC8] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; 7CAC6AF2.00409988&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;8B3D C40F3600 &amp;nbsp; MOV EDI,DWORD PTR DS:[360FC4]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;F3:A4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;61 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POPAD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;51 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH ECX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;50 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EAX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;57 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EDI&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;51 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH ECX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;68 4B934000 &amp;nbsp; &amp;nbsp; PUSH 40934B&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;59 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP ECX &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; ; 7CAC6AF2.0040934B&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8B0D F4914000 &amp;nbsp; MOV ECX,DWORD PTR DS:[4091F4]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;66:390F &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CMP WORD PTR DS:[EDI],CX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;59 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP ECX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;51 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH ECX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;C60438 68 &amp;nbsp; &amp;nbsp; &amp;nbsp; MOV BYTE PTR DS:[EAX+EDI],68&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;68 66934000 &amp;nbsp; &amp;nbsp; PUSH 409366&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;59 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP ECX &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; ; 7CAC6AF2.00409366&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;81C1 47000000 &amp;nbsp; ADD ECX,47&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;890D DA0F3600 &amp;nbsp; MOV DWORD PTR DS:[360FDA],ECX &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; 7CAC6AF2.004093AD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;C64438 05 C3 &amp;nbsp; &amp;nbsp;MOV BYTE PTR DS:[EAX+EDI+5],0C3&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;59 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POP ECX &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; ; 7CAC6AF2.004093AD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8BF2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MOV ESI,EDX &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; ; 7CAC6AF2.0040998D&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;46 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;INC ESI &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; ; 7CAC6AF2.0040998D&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;8A02 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MOV AL,BYTE PTR DS:[EDX]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;3242 01 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XOR AL,BYTE PTR DS:[EDX+1]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;0FB6C0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MOVZX EAX,AL&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;50 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EAX&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;56 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH ESI &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;; 7CAC6AF2.0040998E&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;57 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH EDI&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;60 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSHAD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;8B0D CC0F3600 &amp;nbsp; MOV ECX,DWORD PTR DS:[360FCC]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;8B35 C80F3600 &amp;nbsp; MOV ESI,DWORD PTR DS:[360FC8] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; 7CAC6AF2.0040998E&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;8B3D C40F3600 &amp;nbsp; MOV EDI,DWORD PTR DS:[360FC4]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;F3:A4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250F7C &amp;nbsp; &amp;nbsp;61 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;POPAD&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00250FD4 &amp;nbsp; &amp;nbsp;51 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PUSH ECX&lt;br /&gt;
&lt;br /&gt;
계속 반복............&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
이러한 값이 생성이 되면서 실행을 하게 됩니다.!! &lt;br /&gt;
일단 여기서 이 가상화에 대한 결론을 내보면 원본 실행 루틴을 문제 만든이의 방법으로 인코딩을 시켜서 메모리에 저장해두고 실행 시 한줄 한줄 디코딩 하면서 실행하는 과정입니다.&lt;br /&gt;
&lt;br /&gt;
너무 값이 많아 살펴보니 비슷비슷한 루틴이 계속 반복되고 있는 것을 알 수 있었습니다. 그리고 반복되는 루틴을 보니..!!&lt;br /&gt;
원본 실행 루틴을 디코딩 시켜서 메모리(V200 +0xFD4)에 저장하는 코드와 동일(너무 비슷?) 함을 알 수 있었습니다. 코드를 전부 분석해보니 눈에 보이더군요. 무튼 디코딩 되서 실행되는 루틴 또한 무언가 값을 디코딩해서 메모리에 저장합니다. 이거 이중 가상화 같군요. 가상화라 해야하나.. 아무튼 그러면 분명히 그 코드를 실행시키는 &amp;nbsp;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/1963833B4F16861911238A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/1963833B4F16861911238A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;73&quot; width=&quot;338&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
이와 비슷한 루틴이 분명히 존재할 것입니다.&lt;br /&gt;
&lt;br /&gt;
PUSH V200+0xFD4&lt;br /&gt;
RETN&lt;br /&gt;
이 루틴이 어딘가 존재한다는 말이죠. 없으면.. 사실상 문제 삭제해버릴 생각이었습니다. ㅎㅎㅎㅎ&lt;br /&gt;
있으니 이렇게 풀이를 작성하고 있겠죠?&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/193D10504F16891B20DDD6&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/193D10504F16891B20DDD6&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;83&quot; width=&quot;349&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
이 위치 입니다. V200이 0x260000 였나보군요.&lt;br /&gt;
RETN 위치로 가보겠습니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/18589A504F16894D01E8E9&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/18589A504F16894D01E8E9&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;75&quot; width=&quot;374&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
뭐 여기서도 역시나 한줄 실행하고 0x4093AD 위치로 가는 것을 알 수 있습니다.&lt;br /&gt;
이제 0x00260FD4 위치에 있는 값을 또 한줄한줄 잡아볼까요?&lt;br /&gt;
&lt;br /&gt;
아!!~ 그 전에 .text 영역을 잠깐 봐보겠습니다.&amp;nbsp;&lt;br /&gt;
보통 가상화를 시키면 가상화된 코드는 원본 코드보다 크기가 훨씬 크기 때문에 새로운 섹션을 만들어서 거기에 넣어두게 됩니다. 이 문제에서는 .VM 섹션에 있는 거구요. 그러면 원본 코드가 있는 .text 섹션엔?? 뭐 쓰레기 값으로 꽉꽉 넣어놨겠죠. 필요 없는 코드이기 때문에요.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
하지만 문제 만든이가 모든 코드를 가상화 시키지 않고 부분부분만 가상화를 시켜놨습니다. 그래서 &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/14333E4F4F1689FB18F675&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/14333E4F4F1689FB18F675&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;652&quot; width=&quot;634&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/195AAD504F168A2402789D&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/195AAD504F168A2402789D&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 9.jpg&quot; height=&quot;727&quot; width=&quot;586&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
이와 같이 듬성듬성 있는 코드 이지만.. (nop 된 부분은 전부 가상화된 코드일 것.. ㅠㅠ)&lt;br /&gt;
전부다 BP를 걸어놨습니다. &lt;br /&gt;
&lt;br /&gt;
다시 가상화 코드 부분으로 돌아와&amp;nbsp;0x00260FD4 위치에 있는 값을 잡아보겠습니다.&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;00260FD4 &amp;nbsp; &amp;nbsp;8D0D 40FB1200 &amp;nbsp; LEA ECX,DWORD PTR DS:[12FB40]&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;이거 한줄 실행하고 .text섹션으로 들어오네요.&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/1863FC494F168C8A29BFBB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/1863FC494F168C8A29BFBB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 10.jpg&quot; height=&quot;174&quot; width=&quot;543&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;잘 보니 인자로 &quot;rb&quot;, &quot;codegate.key&quot; 가 들어가는 걸로 봐서 codegate.key 파일명을 가지고 read/binary ? 로 여는 것을 알 수 있었습니다. 그래서 문제 파일과 동일한 폴더에 그냥 codegate.key 라는 파일을 하나 만들고 그안에 아무내용이나 막 채워넣었습니다. 그 다음 RETN을 하면 다시 .VM섹션으로 돌아오게 됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;계속&amp;nbsp;0x00260FD4&amp;nbsp;위치에 있는 값을 잡아보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/173F33484F169D5E34C955&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/173F33484F169D5E34C955&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 11.jpg&quot; height=&quot;108&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이렇게 잡고나면 running 상태로 빠지게 되며&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/130F194D4F169D7E262060&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/130F194D4F169D7E262060&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 12.jpg&quot; height=&quot;74&quot; width=&quot;422&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 창에서 멈추게 됩니다. 아무키나 누르면 계속 진행되겠지요. 다시 진행하겠습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/135436404F169DDB2D38F5&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/135436404F169DDB2D38F5&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 13.jpg&quot; height=&quot;57&quot; width=&quot;405&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 가상화된 루틴을 실행 후 &amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/153ECA454F169E0D2FE5A8&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/153ECA454F169E0D2FE5A8&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 14.jpg&quot; height=&quot;89&quot; width=&quot;546&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;.text섹션인 이 부분으로 오게됩니다. 이 부분이 codegate.key 파일이 존재하면 JE문에서 점프하지 않고 없으면 점프하게 됩니다. 즉, 없다면 EAX 값이 0으로. 있다면 0x0B6863BD와 같은 값으로...&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;다시 0x00260FD4로..&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/152C0B4E4F169E950525B3&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/152C0B4E4F169E950525B3&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 15.jpg&quot; height=&quot;33&quot; width=&quot;406&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 부분 실행 후 다시 .text 섹션..;;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/111B084D4F169EB71FBABB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/111B084D4F169EB71FBABB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 16.jpg&quot; height=&quot;30&quot; width=&quot;340&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 부분 실행 후 다시 .VM 섹션.. 뭐 무한반복?? [ECX+4] 에는 0x0B6863BD 값이..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/187AC8354F16A0650CA795&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/187AC8354F16A0650CA795&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 17.jpg&quot; height=&quot;35&quot; width=&quot;635&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;위에서 얻어온 값을 가지고 이렇게 비교를 하는 군요. 파일이 없으면 cmp문을 수행 후 I can&#039;t find the file 이라는 문장이 출력됩니다. 위 두 문장을 수행 후 다시 .text 섹션으로 오는데 이 부분이 중요합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/14472E344F16A0D9324DED&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/14472E344F16A0D9324DED&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 18.jpg&quot; height=&quot;159&quot; width=&quot;539&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;CALL 문을 호출하는데 들어가는 인자는&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;Func(0x12FB48,0x200,0x1..) 이렇게 들어갑니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;실제로 수행을 해보면 0x12FB48 메모리 주소에 0x200 바이트 만큼 codegate.key에서 가져오게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아마 저 함수는 fread 함수 같군요 ㅋㅋ 키 길이는 0x200 Byte인것 같습니다. 계속 계속 gogo&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile28.uf.tistory.com/original/14631A454F16A20B1BE22E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile28.uf.tistory.com/image/14631A454F16A20B1BE22E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 19.jpg&quot; height=&quot;23&quot; width=&quot;404&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;한 문장 수행 후 다시 .text.. 지치네요..&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/20441A424F16A23518605E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/20441A424F16A23518605E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 20.jpg&quot; height=&quot;27&quot; width=&quot;342&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;EAX에 0x0B70139B라는 값 넣고 있습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;뭐 또 검증 하겠죠. 아무튼 이제 중요한 부분으로 바로 넘어가겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;계속&amp;nbsp;0x00260FD4&amp;nbsp;에 있는 문을 실행하면&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/1821ED364F16A3672B988B&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/1821ED364F16A3672B988B&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 21.jpg&quot; height=&quot;126&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이와 같은 루틴을 실행하게 되는데 주석에 달아놨듯이 [ECX+8]은 codegate.key에서 읽어온 0x200 Byte의 첫번째 데이터 값입니다. 그리고 그 값이 0x64와 xor 한 후 0x90과 비교를 하는데.. 당연히 다르겠죠. 그래서 아래와 같이 틀렸다는 문장을 실행하게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이제 cmp al,0x90 위치에 올 때마다 al 값을 옆 값과 맞는 값으로 바꿔주면서 진행해보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;혹은 그냥 cmp 실행 후 zero flag를 바꿔줘도 됩니다. ㅋ&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/121E08404F16A53605D984&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/121E08404F16A53605D984&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 22.jpg&quot; height=&quot;466&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이런식으로 진행되게 됩니다. 1Byte씩 가져와 특정 값과 xor 한후 특정 값과 비교를 하죠..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이걸 일일이... 해야 하는거겠죠??.. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;잠시 글 쓰는걸 중단하고 노가다 작업좀 하겠습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;------------ 잠 시 후 ------------&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;워...... fread로 &amp;nbsp;0x200 Byte나 읽었길래 정말 512번의 저 거지같은 노가다를 해야되는줄 알았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;다행이.. 0x64..즉 100Byte만 저짓거리 한 후 &amp;nbsp;...!&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/2007A0374F16BD6B1125EE&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/2007A0374F16BD6B1125EE&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 23.jpg&quot; height=&quot;437&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;위와 같은 루틴을 시행하더군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;codegate.key의 값을 읽어온 메모리 값을 다른 메모리로 100byte만큼 옮깁니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그리고 나서 pop ecx를 마지막으로 .VM섹션에서 한 후.. .text 섹션으로 넘어오게 됩니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 때 단순히 zf만 1로 바꿔주면서 넘어오신 분들은 여기까지 하고 실제 key file 값을 구해주셔야합니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;xor되는 값과 cmp되는 값을 xor 시켜주면서 복원.. 100Byte를 말이죠.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/135AB44B4F16BE3D12D0A6&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/135AB44B4F16BE3D12D0A6&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 24.jpg&quot; height=&quot;325&quot; width=&quot;593&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 루틴인데 무언가 printf 할 느낌이 팍팍드는 이 좋은 기분은 뭘까요?? ^^&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;JL점프문에 의해 루프를 돈 다음 나온 화면을 보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/187D50394F16C9323651EB&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/187D50394F16C9323651EB&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 25.jpg&quot; height=&quot;532&quot; width=&quot;380&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;올바르게 찾은 것 같군요. 아..... 바로 답을 주진 않고 또 뭔가 이상한 값을 주네요.. :-(&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;하! 지! 만! ㅋㅋ 저도 이렇게 비슷한 유형의 문제를 낸적이 있습니다. 추측해봤지만 맞더군요.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;일단 각각의 숫자를 2진수로 바꿉니다. 그리고 1에 색을 넣어서 한번 봐보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/142A64334F16CC8B214606&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/142A64334F16CC8B214606&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 26.jpg&quot; height=&quot;432&quot; width=&quot;464&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;보이십니까?? QR 코드입니다. 하지만 QR코드가 180도 돌아가 있는 것 같군요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;QR코드를 읽을 수 있게끔 변환을 하겠습니다. ( 엑셀 사용.. -.- ) 위 결과를 단 20초면 아래와 같이 변환 가능!&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/121E57384F16CDE4292893&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/121E57384F16CDE4292893&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 27.jpg&quot; height=&quot;552&quot; width=&quot;527&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;위 값을 나의 패드로 찰칵 찍으면?!&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;답 : &lt;/font&gt;&lt;font color=&quot;#801fbf&quot;&gt;I_am_in_C0d3gat3_2011!!&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;뿌듯하네요. ㅋㅋ 이거 푸는데.. 가장 많이 시간이 걸린 곳은.. 바로 키파일 100Byte 저거 찾는 부분입니다. ..ㅠ_ㅠ 아흑..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;PS.&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt; -_-;;;; 이거 조금 찾아보니까.. x86 Virtualizer 툴로 두번 가상화 시킨 것 뿐이네요..;;; 덕분에 x86 가상화 툴 싹다 분석해봤네요.&amp;nbsp;오픈소스 툴이므로 찾아보면 소스코드도 있습니다. 전 아바스트 백신 쓰는데 백신에서 잡네요.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;그 전까지 이 문제 만든이가 직접 가상화 코드를 구현한줄 알았습니다.;;;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-355-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Crack Me</category>
			<category>2011</category>
			<category>7CAC6AF2303FC01ACD2CEB350DAC0518</category>
			<category>b500</category>
			<category>binary</category>
			<category>Binary 500</category>
			<category>CODE</category>
			<category>codegate</category>
			<category>Contest</category>
			<category>hacker</category>
			<category>qr</category>
			<category>virtualized</category>
			<category>x86 Virtualizer</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/355</guid>
			<comments>http://ezbeat.tistory.com/355#entry355comment</comments>
			<pubDate>Wed, 18 Jan 2012 22:56:58 +0900</pubDate>
		</item>
		<item>
			<title>My BSOD</title>
			<link>http://ezbeat.tistory.com/354</link>
			<description>&lt;b&gt;&lt;font color=&quot;#3058d2&quot;&gt;BSOD&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;..Blue Screen of Death.. 아주 짜증나는 화면이죠.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/116628364F08F893050969&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/116628364F08F893050969&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;bsod_realism_by_deviantvicky-d39b1l0.jpg&quot; height=&quot;546&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이 거지 같은 화면을 좀 바꿔볼까요??&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;실제로 드라이버 개발하는 입장에서도 &quot;Inbv&quot; 함수를 사용하면 간단히 BSOD 같은 화면을 구성할 수 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;심심하신 분들은 한번 만들어보세요 ^^ 간단히 Inbv 함수 몇개 import 시키고 그냥 사용하시면 끝납니다.-.-;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;전 조금 더 나아가 장난쳐보기 위해 &amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;실제 윈도우에서 사용하고 있는 블루스크린의 색&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;을 바꿔보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;먼저 KeBugCheck 함수 내부에서 블루스크린을 구성하기 위해 호출되는 Inbv 함수가 무엇인지 보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;Windows XP 기준으로 봐보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/1335F9444F08FA1F0EA0ED&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/1335F9444F08FA1F0EA0ED&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;456&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;InbvSolidColorFill&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;() 함수가 배경 색이고&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;InbvSetTextColor&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;() 함수가 글자색입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;저 두 부분을 후킹해서 살포시 인자 값만 바꿔주면.... 끝끝끝.. ㅎㅎ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그래서 나온 제&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#3058d2&quot;&gt; BSOD&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;입니다. &amp;nbsp;가 아니라 &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;RSOD&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt; 입니다. (&lt;b&gt;Red Screen of Death&lt;/b&gt;)&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/130C7A3F4F08FF5B1495D2&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/130C7A3F4F08FF5B1495D2&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;513&quot; width=&quot;676&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;눈 아프네요.. @_@;;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-354-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>blue screen of death</category>
			<category>BSOD</category>
			<category>error</category>
			<category>InbvSetTextColor</category>
			<category>InbvSolidColorFill</category>
			<category>red screen of death</category>
			<category>RSOD</category>
			<category>windows</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/354</guid>
			<comments>http://ezbeat.tistory.com/354#entry354comment</comments>
			<pubDate>Sun, 08 Jan 2012 11:31:08 +0900</pubDate>
		</item>
		<item>
			<title>SwapContext를 이용한 프로세스 찾기</title>
			<link>http://ezbeat.tistory.com/353</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;지금껏 시스템 프로그래밍을 많이 해왔지만 프로세스를 찾는 프로그래밍은.. 안해본것 같군요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;기껏해봐야 &amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#801fbf&quot;&gt;&lt;b&gt;CreateToolhelp32Snapshot()&amp;nbsp;&lt;br /&gt;
Process32First()&lt;br /&gt;
Process32Next()&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;세 함수를 사용한 유저모드에서 프로세스 찾는...;;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;커널에서도 찾는 방법이 여러가지가 있을 껀데 &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#801fbf&quot;&gt;ZwQuerySystemInformation&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;함수를 사용하는 &amp;nbsp;방법..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;또한 System 프로세스의 EPROCESS 구조체 주소를 구해 링크드 리스트로 연결된 EPROCESS를 쭉 따라가면서 찾는 방법..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;등등 여러가지가 있었습니다. 하지만 API함수를 사용하는 방법은 간단히 후킹해 내 프로세스 정보를 없애버리면 되는것이고&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;EPROCESS 구조체를 쭉 따라가면서 탐지하는 방법은 내 프로세스의 링크를 끊어버리면 탐지가 어렵게 되는.. ;;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그래서 루트킷 책을 보니깐 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;nt!SwapContext 함수를 후킹해 탐지하는 방법&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;이 있더군요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;해당 함수는 현재 실행 중인 스레드의 컨텍스트가 바로 다음에 실행될 스레드의 컨텍스트로 스왑될 때 호출되는 함수입니다. 고로.... IRQL은..?! &lt;/font&gt;&lt;font color=&quot;#3058d2&quot;&gt;PASSIVE_LEVEL&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;이 아닌 &lt;/font&gt;&lt;font color=&quot;#3058d2&quot;&gt;&lt;b&gt;DISPATCH_LEVEL&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;에서 이루어지겠죠. 무튼무튼&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;해당 함수에 들어오게되면 &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;EDI 레지스터는 다음에 실행될 스레드(ETHREAD)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;를 가리키며 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;ESI는 현재 실행 중이며 곧 스왑될 스레드(ETHREAD)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;를 가리킵니다. 실제로 그런지 봐볼까요?&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아 ~ 그리고 이 모든 테스트는 Windows XP SP3에서 테스트 됬습니다. 그렇다고 Windows 7이라고 뭐 다를건 없습니다. -_-;&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;&amp;nbsp;kd&amp;gt; ln nt!SwapContext&lt;/b&gt;&lt;/font&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;805438e0&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;) &amp;nbsp; nt!SwapContext &amp;nbsp; | &amp;nbsp;(80543a38) &amp;nbsp; nt!KeInterlockedSwapPte&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;Exact matches:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; nt!SwapContext = &amp;lt;no type information&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;kd&amp;gt; bp 805438e0&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;kd&amp;gt; g&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;Breakpoint 0 hit&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;nt!SwapContext:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;805438e0 0ac9 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;or &amp;nbsp; &amp;nbsp; &amp;nbsp;cl,cl&lt;/font&gt;&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
현재 SwapContext 함수 처음 부분에 멈춰있는 상태입니다. EDI 레지스터를 확인하고 ETHREAD 구조체에 맵핑 시켜보죠.&amp;nbsp;&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;kd&amp;gt; r&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;eax=00001000 ebx=ffdff000 ecx=00000001 edx=80555880 esi=825b2b30 &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;edi=825b6020&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;eip=805438e0 esp=f8afdce0 ebp=f8afdcf4 iopl=0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nv up ei pl nz na pe nc&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;cs=0008 &amp;nbsp;ss=0010 &amp;nbsp;ds=0023 &amp;nbsp;es=0023 &amp;nbsp;fs=0030 &amp;nbsp;gs=0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; efl=00000206&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;nt!SwapContext:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;805438e0 0ac9 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;or &amp;nbsp; &amp;nbsp; &amp;nbsp;cl,cl&lt;br /&gt;
&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;kd&amp;gt; dt _ETHREAD 825b6020&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;ntdll!_ETHREAD&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x000 Tcb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: _KTHREAD&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c0 CreateTime &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LARGE_INTEGER 0xe6654fd`d4418200&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c0 NestedFaultCount : 0y00&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c0 ApcNeeded &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c8 ExitTime &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LARGE_INTEGER 0x825b61e8`825b61e8&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c8 LpcReplyChain &amp;nbsp; &amp;nbsp;: _LIST_ENTRY [ 0x825b61e8 - 0x825b61e8 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c8 KeyedWaitChain &amp;nbsp; : _LIST_ENTRY [ 0x825b61e8 - 0x825b61e8 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1d0 ExitStatus &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0n0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1d0 OfsChain &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1d4 PostBlockList &amp;nbsp; &amp;nbsp;: _LIST_ENTRY [ 0x825b61f4 - 0x825b61f4 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1dc TerminationPort &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1dc ReaperLink &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1dc KeyedWaitValue &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1e0 ActiveTimerListLock : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1e4 ActiveTimerListHead : _LIST_ENTRY [ 0x825b6204 - 0x825b6204 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1ec Cid &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: _CLIENT_ID&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1f4 LpcReplySemaphore : _KSEMAPHORE&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1f4 KeyedWaitSemaphore : _KSEMAPHORE&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x208 LpcReplyMessage &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x208 LpcWaitingOnPort : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x20c ImpersonationInfo : 0xe163d390 _PS_IMPERSONATION_INFORMATION&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x210 IrpList &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: _LIST_ENTRY [ 0x824541e8 - 0x824541e8 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x218 TopLevelIrp &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x21c DeviceToVerify &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;&amp;nbsp; &amp;nbsp;+0x220 ThreadsProcess &amp;nbsp; : 0x825b9830 _EPROCESS&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x224 StartAddress &amp;nbsp; &amp;nbsp; : 0x80536b02 Void&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x228 Win32StartAddress : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x228 LpcReceivedMessageId : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x22c ThreadListEntry &amp;nbsp;: _LIST_ENTRY [ 0x825b6fd4 - 0x825b75f4 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x234 RundownProtect &amp;nbsp; : _EX_RUNDOWN_REF&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x238 ThreadLock &amp;nbsp; &amp;nbsp; &amp;nbsp; : _EX_PUSH_LOCK&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x23c LpcReplyMessageId : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x240 ReadClusterSize &amp;nbsp;: 7&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x244 GrantedAccess &amp;nbsp; &amp;nbsp;: 0x1f03ff&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 CrossThreadFlags : 0x10&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Terminated &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 DeadThread &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 HideFromDebugger : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 ActiveImpersonationInfo : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 SystemThread &amp;nbsp; &amp;nbsp; : 0y1&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 HardErrorsAreDisabled : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 BreakOnTermination : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 SkipCreationMsg &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 SkipTerminationMsg : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x24c SameThreadPassiveFlags : 3&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x24c ActiveExWorker &amp;nbsp; : 0y1&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x24c ExWorkerCanWaitUser : 0y1&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x24c MemoryMaker &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x250 SameThreadApcFlags : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x250 LpcReceivedMsgIdValid : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x250 LpcExitThreadCalled : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x250 AddressSpaceOwner : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x254 ForwardClusterOnly : 0 &#039;&#039;&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x255 DisablePageFaultClustering : 0 &#039;&#039;&amp;nbsp;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;저기서&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;+0x220 ThreadsProcess &amp;nbsp; : 0x825b9830 _EPROCESS&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 부분이 바로 &amp;nbsp;해당 스레드를 가지고 있는 프로세스의 EPROCESS 구조체 주소 정보가 있는 곳입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;해당 EPROCESS를 따라가보죠.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;kd&amp;gt; dt _EPROCESS 0x825b9830&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;ntdll!_EPROCESS&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x000 Pcb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: _KPROCESS&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x06c ProcessLock &amp;nbsp; &amp;nbsp; &amp;nbsp;: _EX_PUSH_LOCK&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x070 CreateTime &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LARGE_INTEGER 0x0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x078 ExitTime &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LARGE_INTEGER 0x0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x080 RundownProtect &amp;nbsp; : _EX_RUNDOWN_REF&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x084 UniqueProcessId &amp;nbsp;: 0x00000004 Void&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x821a3310 - 0x8055c158 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x090 QuotaUsage &amp;nbsp; &amp;nbsp; &amp;nbsp; : [3] 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x09c QuotaPeak &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: [3] 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0a8 CommitCharge &amp;nbsp; &amp;nbsp; : 7&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0ac PeakVirtualSize &amp;nbsp;: 0x293000&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0b0 VirtualSize &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0x1cf000&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x0 - 0x0 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0bc DebugPort &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0c0 ExceptionPort &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0c4 ObjectTable &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0xe1000cc0 _HANDLE_TABLE&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0c8 Token &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: _EX_FAST_REF&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0cc WorkingSetLock &amp;nbsp; : _FAST_MUTEX&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0ec WorkingSetPage &amp;nbsp; : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x0f0 AddressCreationLock : _FAST_MUTEX&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x110 HyperSpaceLock &amp;nbsp; : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x114 ForkInProgress &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x118 HardwareTrigger &amp;nbsp;: 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x11c VadRoot &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0x825b5200 Void&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x120 VadHint &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0x825b5200 Void&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x124 CloneRoot &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x128 NumberOfPrivatePages : 3&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x12c NumberOfLockedPages : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x130 Win32Process &amp;nbsp; &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x134 Job &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x138 SectionObject &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x13c SectionBaseAddress : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x140 QuotaBlock &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0x8055c200 _EPROCESS_QUOTA_BLOCK&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x144 WorkingSetWatch &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x148 Win32WindowStation : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x14c InheritedFromUniqueProcessId : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x150 LdtInformation &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x154 VadFreeHint &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x158 VdmObjects &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x15c DeviceMap &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0xe1004440 Void&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x160 PhysicalVadList &amp;nbsp;: _LIST_ENTRY [ 0x825b9990 - 0x825b9990 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x168 PageDirectoryPte : _HARDWARE_PTE_X86&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x168 Filler &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x170 Session &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;&amp;nbsp; &amp;nbsp;+0x174 ImageFileName &amp;nbsp; &amp;nbsp;: [16] &amp;nbsp;&quot;System&quot;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x184 JobLinks &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LIST_ENTRY [ 0x0 - 0x0 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x18c LockedPagesList &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x190 ThreadListHead &amp;nbsp; : _LIST_ENTRY [ 0x825b97e4 - 0x8246fbb4 ]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x198 SecurityPort &amp;nbsp; &amp;nbsp; : 0xe19c27b0 Void&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x19c PaeTop &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1a0 ActiveThreads &amp;nbsp; &amp;nbsp;: 0x39&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1a4 GrantedAccess &amp;nbsp; &amp;nbsp;: 0x1f0fff&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1a8 DefaultHardErrorProcessing : 1&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1ac LastThreadExitStatus : 0n0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1b0 Peb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1b4 PrefetchTrace &amp;nbsp; &amp;nbsp;: _EX_FAST_REF&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1b8 ReadOperationCount : _LARGE_INTEGER 0x65&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c0 WriteOperationCount : _LARGE_INTEGER 0x1c7&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1c8 OtherOperationCount : _LARGE_INTEGER 0x12e5&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1d0 ReadTransferCount : _LARGE_INTEGER 0x9a53c&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1d8 WriteTransferCount : _LARGE_INTEGER 0x2c1cd6&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1e0 OtherTransferCount : _LARGE_INTEGER 0x76c46&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1e8 CommitChargeLimit : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1ec CommitChargePeak : 0x1cd&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1f0 AweInfo &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (null)&amp;nbsp;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x1f8 Vm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _MMSUPPORT&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x238 LastFaultCount &amp;nbsp; : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x23c ModifiedPageCount : 0xcc3&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x240 NumberOfVads &amp;nbsp; &amp;nbsp; : 4&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x244 JobStatus &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Flags &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0x40000&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 CreateReported &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 NoDebugInherit &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 ProcessExiting &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 ProcessDelete &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Wow64SplitPages &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 VmDeleted &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 OutswapEnabled &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Outswapped &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 ForkFailed &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 HasPhysicalVad &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 AddressSpaceInitialized : 0y00&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 SetTimerResolution : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 BreakOnTermination : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 SessionCreationUnderway : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 WriteWatch &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 ProcessInSession : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 OverrideAddressSpace : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 HasAddressSpace &amp;nbsp;: 0y1&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 LaunchPrefetched : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 InjectInpageErrors : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 VmTopDown &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Unused3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Unused4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 VdmAllowed &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Unused &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y00000 (0)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Unused1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x248 Unused2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 0y0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x24c ExitStatus &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0n259&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x250 NextPageColor &amp;nbsp; &amp;nbsp;: 0x5bf6&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x252 SubSystemMinorVersion : 0 &#039;&#039;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x253 SubSystemMajorVersion : 0 &#039;&#039;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x252 SubSystemVersion : 0&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x254 PriorityClass &amp;nbsp; &amp;nbsp;: 0x2 &#039;&#039;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x255 WorkingSetAcquiredUnsafe : 0 &#039;&#039;&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;+0x258 Cookie &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0&amp;nbsp;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font color=&quot;#000000&quot;&gt;이부분&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;&amp;nbsp; &amp;nbsp;+0x174 ImageFileName &amp;nbsp; &amp;nbsp;: [16] &amp;nbsp;&quot;System&quot;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 부분에 바로 해당 프로세스의 이름이 담겨 있는 곳입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이 부분만 후킹해서 슬쩍슬쩍 빼오면 되는 것이지요. EDI, ESI 두 레지스터에서 전부 말이죠.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;방법은 간단합니다.&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(254, 222, 199); border-right-color: rgb(254, 222, 199); border-bottom-color: rgb(254, 222, 199); border-left-color: rgb(254, 222, 199); background-color: rgb(254, 222, 199); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;1. nt!SwapContext 함수를 인라인 후킹을 한다. 처음 5Byte를 MyRoutine() 함수로 Jmp하게끔&amp;nbsp;&lt;/font&gt;&lt;br style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;2. MyRoutine() 함수에서는 EDI, ESI 레지스터에서 ETHREAD -&amp;gt; EPROCESS -&amp;gt; ImageFileName 주소를 구한다.&lt;/font&gt;&lt;br style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;3. nt!SwapContext 함수로 다시 점프한다.&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;끝입니다. 구현하면서 중요시 해야될 부분은 보통 API 함수 후킹할 때는 &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;후킹 -&amp;gt; My 함수 호출되면 -&amp;gt; 인자값 조작 -&amp;gt; 언후킹 -&amp;gt; 오리지널 함수 호출 -&amp;gt; 후킹 -&amp;gt; 리턴 값 조작....&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이런식으로 진행이 되는데 이 함수는 그렇게 하면 안됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;일단 문서화된 함수가 아니고.. 찾아보니까 함수의 원형을 도저히 모르겠더군요. 또한 이건 함수라고 하기도 뭐한게 [ebp+8].. 이런식으로 인자 값을 가져와서 하는게 아닌 단순 EDI, ESI 에 있는 값을 모니터링 하기 때문이죠. 일반적인 API함수가 아닌..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;또한 안다 하더라도 위와같은 방식을 사용하면 스레드가 스왑될 때마다 언후킹, 후킹을 하게 되는데 이러면 상당히 오버헤드가 발생하게 됩니다. Windows 같은 경우 하나의 스레드가 사용할 수 있는 퀀텀을 다 사용하면서 스왑된다 하더라도 스왑되는 주기가 매우 짧기 때문이죠. 고로 이런 방식으로 진행됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#e31600&quot;&gt;후킹 -&amp;gt; (naked)My 함수 호출 -&amp;gt; EDI, ESI로부터 프로세스 이름 얻음(함수로 처리) -&amp;gt; nt!SwapContext 함수로 점프&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이런식입니다. 즉 언후킹은 해당 후킹 드라이버가 언로드 될 때만 해주는 것입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그리고 언후킹을 하지 않기 때문에 저 같은 경우는 &amp;nbsp;아래와 같이 구현했습니다;;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#3058d2&quot;&gt;Windows XP SP3 SwapContext 처음 부분&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;805438e0 0ac9 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; or &amp;nbsp; &amp;nbsp; &amp;nbsp;cl,cl&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;805438e2 26c6462d02 &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr es:[esi+2Dh],2&lt;/font&gt;&lt;/div&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;color: rgb(0, 0, 0); white-space: pre; &quot;&gt;	&lt;/span&gt;&lt;font color=&quot;#000000&quot;&gt;805438e7 9c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pushfd&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#3058d2&quot;&gt;My 함수 끝 부분&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;color: rgb(0, 0, 0); white-space: pre; &quot;&gt;		&lt;/span&gt;&lt;font color=&quot;#000000&quot;&gt;or cl,cl&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;mov byte ptr [esi+0x2D],2&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;jmp swapContext_Trampoline &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; SwapContext_Address + 7&lt;br /&gt;
&lt;br /&gt;이런식으로 5Byte가 jmp문으로 바뀐것에 대해 내부적으로 수행해주고 SwapContext 주소에서 +7 자리로 점프를 해서 실행하는 것입니다. 이러면 언후킹할 필요가 없더군요. 오버헤드 막기 성공.. ;;&lt;br /&gt;
&lt;br /&gt;아무튼 구현하니 잘 작동은 합니다.&lt;br /&gt;
&lt;br /&gt;사실 이렇게 끝내면 안되고 당연히 프로세스 이름을 담을 테이블을 만들고 중복 처리도 해주고&amp;nbsp;&lt;br /&gt;
프로세스가 종료되면 해당 프로세스를 테이블에서 빼주고도 하고 유저와 통신을 하면서&amp;nbsp;&lt;br /&gt;
사용자에게 보여주기도 해야하는 과정이 남았지만 이건 나중에 실질적으로 필요할 때가 생기면 구현을 해봐야겠습니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;아래는 그냥 DbgPrint를 사용해 프로세스 이름을 출력하는 과정만 보여주었습니다.&amp;nbsp;&lt;br /&gt;
또한 DKOM방법으로 숨긴 프로세스 또한 찾아지는지 보겠습니다.&lt;br /&gt;
&lt;br /&gt;&lt;embed width=&quot;402&quot; height=&quot;324&quot; src=&quot;/attachment/cfile10.uf@114A58494F03F71231CE33.swf&quot; quality=&quot;high&quot; allowScriptAccess=&quot;always&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot;/&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;이제 이렇게 SwapContext를 후킹해 프로세스를 찾아내는 방법 우회해 프로세스를 숨길 수 있는 방법은 무엇이 있을까요?&lt;br /&gt;
무조건 프로그램을 사용하게 되면 해당 프로세스 내부에 있는 스레드는 걸리게 될 것이고.. 걸리면 탐지가 되는거고..&lt;br /&gt;
안걸리게 해야될탠데.. 안걸리려면 프로세스가 작동을 안해야한다는.. 작동 안할꺼면 필요도 없는 거고..;&lt;br /&gt;
우회할 수 있는 방법엔 무엇이 있을까요?? &amp;nbsp;좋은 방법 아시는 분은 댓글로 저에게 조언 부탁드려요! 막상 바로 떠오르진 않군요.&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-353-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>DISPATCH_LEVEL</category>
			<category>EPROCESS</category>
			<category>ETHREAD</category>
			<category>Hooking</category>
			<category>ImageFileName</category>
			<category>naked</category>
			<category>ntkrnlpa</category>
			<category>ntoskrnl</category>
			<category>PASSIVE_LEVEL</category>
			<category>SwapContext</category>
			<category>ThreadsProcess</category>
			<category>trampoline</category>
			<category>ZwQuerySystemInformation</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/353</guid>
			<comments>http://ezbeat.tistory.com/353#entry353comment</comments>
			<pubDate>Wed, 04 Jan 2012 16:01:11 +0900</pubDate>
		</item>
		<item>
			<title>Remote Library Injection</title>
			<link>http://ezbeat.tistory.com/352</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;예전에부터 해왔던건데 ㅠㅠ Native 함수 후킹 시 함수호출 규약 Calling Convention 을 무시한결과.. 엄청난 삽질을 동반한 시간적 낭비가 있어서 이제 올려보네요.. 아 ㅠㅠ API 후킹 시 함수호출 규약 잘 지킵시다..헝헝..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;한가지 궁금한 점은.. NtOpenFile일 경우 커널이나 유저나 함수호출 규약은 __stdcall로 같은데&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;왜 후킹할 때 user에선 __stdcall을 붙혀줘야되고 kernel에선 안붙혀줘도 되는건지..;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;다시 본론으로 돌아와서 &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;Remote Library Injection&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;은 나름 괜찮은 기술입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;디스크에 읽고 쓰여짐을 탐지하는 모니터링 툴들을 우회할 수 있기 때문이죠.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;간략한 그림을 보시겠습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/150563404EFBE7791BF9EC&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/150563404EFBE7791BF9EC&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;530&quot; width=&quot;408&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;보통 몇몇 악성코드가 작동하는 방식입니다. 먼저 Dropper는 백신에 걸리지 않기 때문에 안전하게 메모리에 올라올 수 있고 그 다음에 악성 dll을 소켓 통신을 통해 받던 Dropper내부적으로 인코딩되어 있던 것을 디코딩하던 한 다음 Disk상에 드랍 시킵니다. 그 다음에 LoadLibrary를 통해 악성 dll을 로드시키는 것이지요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;하지만 이 방법은 백신에 걸리기 쉽습니다. 만약 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;백신이 Disk에 생성되는 모든 파일들에 대해서 모니터링을 하고 있다면?&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아마 Virus.dll이 잡힐 확율은 상당히 높을 것입니다. 그러면 다른 방법으로 Virus.dll을 로드 시킬 방법을 생각해봐야겠군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;아래 그림을 봐보아요~&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/1431E5414EFBE83102042D&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/1431E5414EFBE83102042D&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;530&quot; width=&quot;298&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;상당히 그림을 발로 그렸지만.. 보면 Dropper.exe 내부적으로 소켓통신으로 받았던 원래 가지고 있던 아무튼 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;해당 Virus.dll을 Disk에 드랍하지 않고 자체적으로 메모리상에서 바로 로드해 버리는 것&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;이렇게 구현될 경우 당연히 Disk에 생성되는 모든 파일에 대해서 감시하고 있는 백신은 당연히 농락시킬 수 있는 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;제가 ezbeat.dll로 로드가 되면 단순히 메시지 박스만 띄우는 dll을 하나 만들어 보았습니다. &amp;nbsp;이제 이 dll을 로드해보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/117E71384EFBE9711E2492&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/117E71384EFBE9711E2492&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;260&quot; width=&quot;483&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;간단히&lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt; LoadLibrary&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;를 사용해 &quot;c:\ezbeat.dll&quot; 을 로드하는 방법입니다. 누구나 dll을 로드할 때 이러한 방법을 많이 사용하죠.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;당연히 &amp;nbsp;&quot;c:\ezbeat.dll&quot; 는 Disk상 해당 경로에 존재합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;로드가 된 후 올디로 상태를 확인해보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/1625C03B4EFBEA4E02E240&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/1625C03B4EFBEA4E02E240&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;112&quot; width=&quot;601&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;파란색으로 네모친 부분을 보면 잘 로드가 되었고 Entry 또한 잘 나와 있군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이번엔 &lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;Remote Library Injection을 사용해서 로드하는 방법&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/167BB2434EFBEAB42B4BF9&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/167BB2434EFBEAB42B4BF9&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;340&quot; width=&quot;617&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;EmulateFileToMemory() 함수와 InitHook() 가 추가가 되었군요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그리고 LoadLibrary 할 때 넘어가는 인자가 &quot;K:\ezbeat.dll&quot; 입니다. 하지만 제 컴퓨터에는 K 드라이버는 없습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;즉.. &quot;K:\ezbeat.dll&quot; 은 하드에 존재하지 않는 그냥 가짜 이름입니다. 해당 파일의 내용은 LoadLibrary 호출자 프로세스가 가지고 있습니다. 그러면 실패할까요? 실행해보죠.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/204D0E334EFBEB8224EA58&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/204D0E334EFBEB8224EA58&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;291&quot; width=&quot;411&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;잘 되는군요. 이것도 올디로 봐보겠습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/1330DA394EFBEBB72EEFD5&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/1330DA394EFBEBB72EEFD5&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 9.jpg&quot; height=&quot;142&quot; width=&quot;524&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;로드도 잘 되었고 dll 내부적으로 있는 메시지박스도 잘 실행되었지만.. Entry가 없습니다...&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;바로 이게 Remote Library Injection 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;방법은?&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(231, 253, 181); border-right-color: rgb(231, 253, 181); border-bottom-color: rgb(231, 253, 181); border-left-color: rgb(231, 253, 181); background-color: rgb(231, 253, 181); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;1. &lt;/b&gt;로드시키려는 dll 파일 내용을 메모리 상에 지니게 있도록 한다. ( 소켓으로 받던.. 애당초 인코딩해서 가지고 있던.. )&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;2.&lt;/b&gt; dll 내용을 메모리 상에 올라왔을 때와 똑같이 에뮬레이팅 해준다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;3.&lt;/b&gt; LoadLibrary 내부적으로 호출되는&amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; NtQueryAttributesFile,&amp;nbsp;NtOpenFile,&amp;nbsp;NtCreateSection,&amp;nbsp;NtMapViewOfSection 을 후킹&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;4.&lt;/b&gt; LoadLibrary가 호출되 각 후킹된 Nt 함수들 내부적으로 들어오면 &lt;br /&gt;
&amp;nbsp; &amp;nbsp; 파라미터와 리턴 값을 적절히 조작해 성공하게 만든다.&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;끝입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아래는 영상..&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;embed width=&quot;402&quot; height=&quot;324&quot; src=&quot;/attachment/cfile3.uf@146134444EFBF22E01129E.swf&quot; quality=&quot;high&quot; allowScriptAccess=&quot;always&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot;/&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;일부러 백신에 잡히게 dll을 만들어보고 해당 dll을 가지고 테스트 해봐야겠네요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;아무튼 다른 실시간 모니터링 부분은 몰라도 디스크 모니터링 하는 부분은 우회가 가능한 방법입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;margin-left: 4em; &quot;&gt;
&lt;/div&gt;&lt;div&gt;
&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-352-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>Calling Convention</category>
			<category>disk</category>
			<category>drop</category>
			<category>LoadLibrary</category>
			<category>NT</category>
			<category>NtCreateSection</category>
			<category>NtMapViewOfSection</category>
			<category>NtOpenFile</category>
			<category>NtQueryAttributesFile</category>
			<category>Remote Library Injection</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/352</guid>
			<comments>http://ezbeat.tistory.com/352#entry352comment</comments>
			<pubDate>Thu, 29 Dec 2011 13:57:44 +0900</pubDate>
		</item>
		<item>
			<title>OpenProcess를 막는 방법은??</title>
			<link>http://ezbeat.tistory.com/350</link>
			<description>&lt;font color=&quot;#000000&quot;&gt;모든 기말고사 시험이 끝나고.. 데이터베이스 발표만을 앞둔 상황에서.. 새벽에 심심하던 찰나 문뜩 생각이 나서 장난같지 않은 장난을 한번 쳐봤습니다. 될까 싶었는데 그냥 되더군요.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#e31600&quot;&gt;OpenProcess&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;는 PID를 가지고 대상 프로세스의 커널오브젝트를 가리키는 핸들을 얻어오는 함수입니다.&lt;br /&gt;
dll injection을 하건 해당 프로세스의 메모리 패치를 하던간에.. 무조건 호출되어야하는 함수입니다.&lt;br /&gt;
뭐.. FindWindow를 사용할수도 있지만 윈도우 이름보단 프로세스 이름으로 pid를 얻는게 더 효율적이죠...&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;저놈의 함수를 막을려면 어떻게 할까요.. 유저단에서 생각을 해보면 전역 후킹을 통해 모든 프로세스에 dll을 inection 시키고 모든 프로세스의 kernel32.dll에 있는 OpenProcess를 후킹해서 막아야할까요?.. 물론 되겠죠.&lt;br /&gt;
&lt;br /&gt;이번엔 커널단에서 생각해보겠습니다. 그냥 간단히&amp;nbsp;
KiServiceTable&amp;nbsp;있는 ZwOpenProcess 함수를 후킹할까요?(SSDT..)&lt;br /&gt;
이 방법은 커널 프로그래밍을 해야되는 것 이지만 후킹 탐지가 쉽게 되므로 효율성이 얼마나 있을지 모르겠군요.&lt;br /&gt;
&lt;br /&gt;그 외에도 SYSENTER를 후킹해서 하는 방법..( ZwOpenProcess 시스템 번호로 식별해.. )&lt;br /&gt;
&lt;br /&gt;많은 방법이 있지만 이번에 해볼 방법은 쫌.. &amp;nbsp;살짝 장난스럽긴 하지만&lt;/font&gt;&lt;font color=&quot;#e31600&quot;&gt;&lt;b&gt; PID를 계속적으로 바꿔버리는 것&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;프로세스를 계속 살렸다 죽였다 살렸다 죽였다.. 하는 방법은 아니구요;;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;살아있는 프로세스의 PID를 계속 바꾸는 것&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; 입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/1222673C4EEF73B422D316&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/1222673C4EEF73B422D316&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;396&quot; width=&quot;324&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;바로 저 PID 말이죠.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;프로세스의 PID가 저장되어 있는 장소는 두 군데로 알고 있습니다. 첫번째는&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/19429A4E4EEF741E0F76DC&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/19429A4E4EEF741E0F76DC&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;206&quot; width=&quot;411&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#e31600&quot;&gt;&lt;b&gt;TEB 구조체의 ClientId 멤버변수&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;에 있습니다. 이건 유저에 저장되어 있는 값이구요.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;GetCurrentProcessId()함수를 사용해서 얻오는 PID가 바로 저기서 얻어오는 것 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;두번째는&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/111ABC474EEF747A03C627&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/111ABC474EEF747A03C627&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;244&quot; width=&quot;458&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;커널에 있는 &lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#e31600&quot;&gt;EPROCESS 구조체 내부에 있는 UniqueProcessId 멤버변수&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#000000&quot;&gt;에 있습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;그러면 프로세스 이름으로 검색해 PID를 얻어오는 방법인&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#3058d2&quot;&gt;CreateToolhelp32Snapshot&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#3058d2&quot;&gt;Process32First&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#3058d2&quot;&gt;Process32Next&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;세 함수를 사용한다면 어떠한 PID를 가져올까요??&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;바로 EPROCESS 구조체 내부에 있는 UniqueProcessId 값을 가져오게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;하지만 저 값이 계속적으로 바뀌어버리면??&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#e31600&quot;&gt;제대로 된 PID 값을 알지못해 OpenProcess가 실패하게 될 것&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;입니다. &lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;사실 한번만 바꿔도 되는데... 계속 바뀌어지면 뭔가 있어보이잔아요?...흠..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;아무튼 그런 방법을 사용해 PID를 변경시키는 프로그램을 만들어보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;그리고 다른 프로세스에서는 해당 프로세스의 핸들을 얻기위해 OpenProcess를 계속 시도하였습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;아래는 동영상.. ( 마우스 휠로 브라우져를 확대에 보세요.. )&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;embed width=&quot;402&quot; height=&quot;324&quot; src=&quot;/attachment/cfile10.uf@16753F504EEF8327079745.swf&quot; quality=&quot;high&quot; allowScriptAccess=&quot;always&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot;/&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;이것도 조금만 생각해보시면 파훼법이 있겠죠??&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font color=&quot;#801fbf&quot;&gt;혹시 좋은 방법들이 있다면 댓글로 조언을 해주세요 ^^&amp;nbsp;&lt;/font&gt;&lt;/b&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-350-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>ClientId</category>
			<category>CreateToolhelp32Snapshot</category>
			<category>EPROCESS</category>
			<category>FindWindow</category>
			<category>getcurrentprocessid</category>
			<category>Kernel</category>
			<category>OpenProcess</category>
			<category>PID</category>
			<category>Process32First</category>
			<category>Process32Next</category>
			<category>processid</category>
			<category>TEB</category>
			<category>UniqueProcessId</category>
			<category>ZwOpenProcess</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/350</guid>
			<comments>http://ezbeat.tistory.com/350#entry350comment</comments>
			<pubDate>Tue, 20 Dec 2011 03:34:45 +0900</pubDate>
		</item>
		<item>
			<title>해피캠퍼스는 멍청해!!</title>
			<link>http://ezbeat.tistory.com/349</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;제가 인터넷 서핑 중 해피캠퍼스에 자료를 올려서 용돈벌이를 하고 있다는 학생의 글을 보고&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&quot;오 ~ 나도 한번??&quot;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이라는 생각을 가지고 뭘 한번 올려볼까.. 하고 하드를 뒤져보았다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;일단 테스트로 올려볼 것이기 때문에 예전에 간단히 짜본 음악 플레이어 소스코드를 올려보았다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;해당 코드는 당연히 유니코드 기반 코드였고 내부적으로 한글을 써야했기 때문에&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;_wsetlocale&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;(LC_ALL,_T(&quot;korean&quot;));&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 함수 또한 사용해 주었다..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;해당 함수는 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;wprintf&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;, &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;fputws&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;와 같은 함수들을 통해서 유니코드 기반으로 한글을 출력하고 싶을 때 사용하는 함수;;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;무튼..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;고로 당연히 컴파일도&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile10.uf.tistory.com/original/175C734A4EE09D8E09D2BD&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile10.uf.tistory.com/image/175C734A4EE09D8E09D2BD&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;90&quot; width=&quot;609&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이렇게 유니코드 문자 집합 사용으로 해주어야한다. 이건 뭐 VS 디폴트 옵션이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;컴파일 결과.. 당연히&lt;/font&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt; error - 0, warning - 0&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;.. &amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;다음날.. 해피캠퍼스에서 메일이 왔다... 두근! 등록이 됬구나!..?!&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/205BE64E4EE09E6D313C6D&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/205BE64E4EE09E6D313C6D&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;202&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;??????????????? 허얼?&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;저 오류는... 문자 집합을 멀티바이트 문자 집합 사용을 했을 때.. 나는 오류.. 당연히 자료형이 맞지 않아 날수밖에 없는 오류!&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;해피캠퍼스에서는 코드를 돌릴 때 그냥 기계가 돌리는 것일까요? 사람이 Ctrl + C, V를 사용해 컴파일러에서 돌리는 것일까요?? ... 이런건 알바생 쓰겠죠??..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;너무 한거 아닌가요?ㅠㅠ &amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-349-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Routine</category>
			<category>char</category>
			<category>wchar</category>
			<category>너무해</category>
			<category>멀티바이트</category>
			<category>멍청해</category>
			<category>유니코드</category>
			<category>해피캠퍼스</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/349</guid>
			<comments>http://ezbeat.tistory.com/349#entry349comment</comments>
			<pubDate>Thu, 08 Dec 2011 20:27:43 +0900</pubDate>
		</item>
		<item>
			<title>Immunity Debugger Hard Hooking</title>
			<link>http://ezbeat.tistory.com/348</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;일반적으로 hard 후킹하면 다들 생각하고 있는 것이 있죠. 맞습니다.&lt;br /&gt;
&lt;br /&gt;
만약 kernel32.dll의 WinExec 함수를 하드후킹한다면 해당 함수 내부의 코드 5Byte를 jmp코드로 바꾸죠.&lt;br /&gt;
그리고 응용 프로그램에서 해당 함수가 호출되면 제가 만든 루틴으로 jmp문을 타고 들어오게 됩니다.&lt;br /&gt;
이 때부터 전 파라미터를 조작해버릴수도 있고 리턴 값을 조작해버릴 수도 있습니다.&lt;br /&gt;
&lt;br /&gt;
예전엔 이 과정을 C로 테스팅해보고 실제로 사용도 해봤습니다.&lt;br /&gt;
만약&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt; explorer.exe의 LoadLibrary 함수의 파라미터를 모니터링 할 때 순서&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
1. LoadLibrary를 하드후킹하는 코드를 작성하고 dll로 만든다.&lt;br /&gt;
2. dll injection을 사용해 해당 dll을 explorer.exe 프로세스에 injection한다.&lt;br /&gt;
3. 후킹이 성공되고 explorer에서 LoadLibrary가 호출 됬을 때 &lt;br /&gt;
&amp;nbsp; &amp;nbsp; dll 내부 Hook루틴에서는 파라미터들 값을 낚아챈다.&lt;br /&gt;
4. 낚아챈 값을 파일로 저장하거나 파이프 통신을 사용해 내 프로세스에서 그 결과를 출력한다.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
이런식으로 작동하게 되죠.&lt;br /&gt;
&lt;br /&gt;
하지만 이번엔&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt; Immunity Debugger에서 python 스크립트를 사용해 디버깅 중 하드후킹을 수행해 특정 함수의 인자를 모니터링 해보는 것&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;입니다. &lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;p id=&quot;more348_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;348_0&#039;,&#039;독백&#039;,&#039;접기&#039;); return false;&quot;&gt;독백&lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content348_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;사실 요새 python을 공부해보고 있는 중입니다. 제가 정말 제대로 할줄 아는 언어가 C언어 말고는 없는것 같더군요. 그래서 무언가 하나라도 더 완벽하게 언어를 익히자라는 마음으로 시작해본 것이 python입니다. 제가 처음으로 python을 접해본 것이 wikidocs에서 &quot;점프 투 파이썬&quot; 을 읽어보며 공부했던것 뿐이고 실제로 적용해본 곳은 해킹대회에서 였습니다. 몇몇 해킹대회는 CTF(Capture The Flag) 방식으로 대회가 진행되는데 이때 특정 프로그램(데몬..)을 분석해 취약점을 찾아내고 해당 취약점을 공격하기 위한 payload를 작성해 상대 서버의 쉘을 따내야하는 것입니다. 이 때 payload를 작성 시 C로 하려니까 뭔가 코드 양도 많지고 복잡해지는 것 같더군요. 하지만 python으로 해보니 정말 쉽게 됬다는 것입니다.. 이때는 쫌 해킹대회만을 위한 python을 했지만 이제는 모든 개발을 python으로 해볼 생각입니다. ( C를 버리겠다는건 아니구요.. ㅎ ) 지금도 늦었지만 늦었다고 생각할 때 무언가를 또 시작해봐야겠더군요. 열혈강의 책도 샀구요 ㅠ_ㅠ.. 초보초보.. 앞으로 블로깅을 계속해 프로그래밍 글을 올릴 때면 되도록 python으로 올려야겠습니다.&lt;br /&gt;
&amp;nbsp;C로는 음악 플레이어, ODBC 연동한 관리 시스템, 커널 필터 드라이버를 사용한 키로거, 파일 시스템 필터 드라이버, 각종 해킹대회 문제출제, 간단한 디버거, File Carving Tool, 키젠, 스크린세이버, 바이러스 등등 다 만들어봤지만.. 이제 이런것들을 python으로..하려면..?! ㅠㅠ 언어에 익숙해지면 빨리 해볼수 있겠죠?? ^^? 그날을 꿈꾸며.. 열공하겠습니다.&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;&lt;b&gt;
Immunity Debugger에서는 immlib라는 아주 좋은 라이브러리를 제공&lt;/b&gt;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;해주는데 해당 라이브러리를 사용하면 짧은 코드로 후킹 작업을 할 수 있습니다. 일단 구현은 &quot;파이썬 해킹 프로그래밍&quot; 책을 보면서 구현해 보았고 후킹되는 함수는 달리해보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/19499A3A4EE05737215089&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/19499A3A4EE05737215089&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;465&quot; width=&quot;548&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
Immunity Debugger를 보면 아래 command 창이 있습니다. 해당 창에서 windbg 명령어도 사용이 가능하며&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
위 그림과 같이 ! 를 붙히면 \PyCommands 폴더에 있는 python 스크립트를 실행할 수 있습니다. ( py 빼고 입력 )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
이제 ezbeat.py 코드를 보기전에&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
후킹 당할 프로그램 코드와 ( C언어 ..-_-; 방금 위에서 말해놓고!! ) 후킹 결과화면을 보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
후킹은 WinExec 함수를 후킹하였고 모니터링 할 값은 파라미터 2개와 리턴 값입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile21.uf.tistory.com/original/1208454A4EE05FFB3CB882&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile21.uf.tistory.com/image/1208454A4EE05FFB3CB882&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;277&quot; width=&quot;367&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
단순히 계산기와 메모장 하나씩 각각 다른 속성으로 띄워주는 프로그램입니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;
실행 순서&lt;/font&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;
1. 위 프로그램 Immunity Debugger에 붙힘&lt;br /&gt;
2. ezbeat.py 실행&lt;br /&gt;
3. 프로그램 실행&lt;br /&gt;
4. ezbeat.py 실행&lt;br /&gt;
5. log창 확인&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
해당 프로그램을 Immunity Debugger에 붙히고 ezbeat.py를 돌린 후 실행시켜보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/147DAF3B4EE061652F7236&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/147DAF3B4EE061652F7236&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;47&quot; width=&quot;162&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
성공적으로 후킹이 되었습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile22.uf.tistory.com/original/146142394EE08A2322A354&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile22.uf.tistory.com/image/146142394EE08A2322A354&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;45&quot; width=&quot;348&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
log창을 확인 결과입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
훅이 2번 걸렸고 각각의 인자들은 저렇습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
그런데 첫번째 호출됬을 때 두번째 인자로 SW_NORMAL(0x01) 을 주었는데 왜 0x00으로 나왔냐..라고 궁금해하실 분들도 계실탠데.. 저도 왜 저런가 궁금해서 WinExec 함수 내부를 봐봤더니&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile26.uf.tistory.com/original/136F03404EE08AEA374228&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile26.uf.tistory.com/image/136F03404EE08AEA374228&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;591&quot; width=&quot;548&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
저 부분에서 두번째 인자가 1일경우 점프를 하게 되고 &quot;EBP+0xC&quot; 자리에 ESI(0x00) 값으로 채워지는 것을 확인했습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
그냥 그런가보다 하고 넘어가주세요...;;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
이제&lt;/font&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt; ezbeat.py 코드&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;를 보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;textarea name=&quot;code&quot; class=&quot;cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; style=&quot;color: rgb(0, 0, 0); &quot;&gt;# -*- coding: utf-8 -*-

from immlib import *
from libhook import *

# 후킹하기 위해 해당 함수의 ret 명령의 주소를 찾아준다.
def getRet(imm, allocaddr, max_opcodes = 500):
    addr = allocaddr

    for a in range(0, max_opcodes):        
        # addr에 있는 값을 디스 어셈, 그 다음에  opCode 클래스에서 get 함수를 사용해 얻는 값은 다음 명령어 값
        op = imm.disasmForward( addr , 1 )  
        
        # 그 다음 명령어가 &quot;RETN&quot; 인지 체크
        if op.getDisasm().find(&quot;RETN&quot;) != -1:
            op = imm.disasmBackward( addr, 3)
            return op.getAddress()  # 맞으면 그 주소 리턴
            
        addr = op.getAddress()
        
    return 0x00

def main(args):
    imm = Debugger()
    Name = &quot;ezbeat&quot;
    
    # knowledge DB에서 Name 객체를 얻는다.
    fast = imm.getKnowledge(Name)
    
    # 얻기를 성공하면.. = 이미 후킹이 되어 있다면
    if fast:
        # 후킹 함수가 호출돼 로깅 함수들이 호출되면 로깅 함수는 FastLogHook 객체가 만든 메모리 영역에 로깅한 정보를 저장한다.
        # 저장된 로깅 정보를 보려면 getAlloLog() 래퍼 함수를 이용.
        # getAlloLog() 함수는 메모리의 내용을 파싱해 다음과 같은 형태의 파이썬 리스트를 반환
        # [(hook_address, (arg1,arg2,argN)), ... ]
        # list[0][0] =&amp;gt; 후킹 된 주소
        # list[0][1][0] =&amp;gt; arg1
        hook_list = fast.getAllLog()
        
        # 후킹된 함수의 주소를 얻어옴
        FuncRetAddr = imm.getKnowledge(&quot;HookFuncNames&quot;)     
        count = 0
        
        for a in hook_list:
            imm.log(&quot;WinExec(0x%08x,0x%08x) - ret : 0x%08x&quot; % 
                    (hook_list[count][1][0],
                     hook_list[count][1][1],
                     hook_list[count][1][2]),
                    hook_list[count][0])
            
            count += 1

        return &quot;[*] Hook hit Num : %d&quot; % len(hook_list)
        
        
    # 실질적인 후킹 설정 작업을 진행하기 전에 디버거를 일시 정지 시킨다.
    imm.pause()
    FuncAddr = imm.getAddress(&quot;kernel32.WinExec&quot;)
    
    # 모듈 정보를 얻음
    module = imm.getModule(&quot;kernel32.dll&quot;)
    
    # 모듈이 분석되지 않았으면 분석함
    if not module.isAnalysed():
        imm.analyseCode(module.getCodebase())
    
    FuncRetAddr = getRet(imm,FuncAddr)
    #imm.log(&quot;RET address : 0x%08x&quot; % FuncRetAddr)
    
    # knowledge DB에 후킹할 주소를 넣는다.
    imm.addKnowledge(&quot;HookFuncNames&quot;, FuncRetAddr)
    
    # 이제 실질적인 후킹 설정 작업을 수행한다. stdcall 함수 cdecl은 STDCALL 뺌
    fast = STDCALLFastLogHook(imm)
    
    imm.log(&quot;Logging on WinExec 0x%08x&quot; % FuncRetAddr)
    fast.logFunction(FuncRetAddr)   # 원래의 명령을 점프 코드로 덮음
    
    &quot;&quot;&quot;
    fast.logRegister(register)      # 후킹 함수가 호출됐을 때 특정 레지스터의 값을 살펴볼 수 있음
    fast.logDirectMemory(address)   # 후킹 함수가 호출됐을 때 특정 메모리 주소의 데이터를 살펴볼 때 사용
    fast.logBaseDisplacement(register,offset)   # 스택의 파라미터 값을 참조하거나 레지스터로부터 특정 오프셋만큼 떨어진 곳의 데이터를 살펴볼 때 사용
    &quot;&quot;&quot;
    
    # ret직전의 부근에서 후킹하기 때문에 EAX에는 리턴 값이 들어가 있고
    # 함수 프롤로그는 했지만 JMP문에 의해 LEAVE가 사라져서 에필로그는 실행 안된 상태
    fast.logBaseDisplacement(&quot;EBP&quot;,8)       # 첫번째 인자
    fast.logBaseDisplacement(&quot;EBP&quot;,0xC)     # 두번째 인자
    fast.logRegister(&quot;EAX&quot;)                 # 리턴 값
    
    # 후킹 설정
    fast.Hook()
    
    # 이후에 후킹 결과를 얻기 위해 후킹 객체를 저장한다.
    imm.addKnowledge(Name, fast, force_add = 1)   
    
    return &quot;[*] Success Hooked&quot;
&lt;/textarea&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;주석은 최대한 자세히 달아보았습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
immlib 나 각 라이브러리에 있는 자세한 함수 설명은&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#193da9&quot;&gt;&lt;a href=&quot;http://debugger.immunityinc.com/Documentation/&quot; target=&quot;_blank&quot; title=&quot;[http://debugger.immunityinc.com/Documentation/]로 이동합니다.&quot;&gt;http://debugger.immunityinc.com/Documentation/&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이쪽으로 가시면 더욱 자세히 볼 수 있습니다.&lt;br /&gt;
&lt;br /&gt;이제 후킹 된 실제 어셈 코드를 봐보도록 하겠습니다.&amp;nbsp;&lt;br /&gt;
WinExec 후킹 전 코드 일부분입니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/12172C3B4EE0D92D333A82&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/12172C3B4EE0D92D333A82&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;181&quot; width=&quot;529&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;후킹 후 코드 일부분입니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile22.uf.tistory.com/original/1928B83B4EE0D92D244160&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile22.uf.tistory.com/image/1928B83B4EE0D92D244160&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;136&quot; width=&quot;528&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
잘 비교해 보시면 어떤 부분이 달라졌는지 알 수 있습니다.&lt;br /&gt;
원본 코드는 어디로..?;; 일단 JMP문을 따라 들어가보겠습니다.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/113A843F4EE0DC121674D3&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/113A843F4EE0DC121674D3&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;423&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;열심히 분석해서 주석을 달아놨습니다.&lt;br /&gt;
즉, 위 코드를 전체적인 그림으로 봐보면&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/1663B8404EE0DD202BC4EE&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/1663B8404EE0DD202BC4EE&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;574&quot; width=&quot;341&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
여기서 얻을 인자 같은 것은 python코드를 짜는 사람 마음이기 때문에 후킹 코드와 원하는 값 저장할 크기는 유동적입니다.&lt;br /&gt;
그리고 python 코드를 보시면&amp;nbsp;getAllLog() 함수를 사용해 메모리로부터 값을 가져온다고 했는데 바로&lt;br /&gt;
0x00000080위치에서 가져오는 것 입니다. 실제로 저 위치에 있는 리턴 값을 0x64로 바꿔보고 실행해보겠습니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/1850433D4EE0DDB109A4EF&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/1850433D4EE0DDB109A4EF&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;18&quot; width=&quot;350&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;그리고 제가 알던 후킹방법하고 다른 점은 JMP로 덮힌 코드를 후킹 코드 내부에서 실행한다는 것입니다.&lt;br /&gt;
음... 나머지는.. 다들 알아서 해보시면 알 수 있을 것입니다. 글을 쓰다 잠시.. 정신놓고 어딜 갔다와서 갑자기 이상하네요.ㅠㅠ&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;Immunity 디버거에서 파이썬을 실행시킬 땐 PyCommand를 사용하는데 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;
PyCommand를 만들 때 기본적인 템플릿이 존재&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;합니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;&lt;b&gt;첫번째&lt;/b&gt;는 파라미터를 받아들이는 main()함수를 정의&lt;br /&gt;
&lt;b&gt;
두번째&lt;/b&gt;는 문자열을 리턴해야 한다는 것&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;위 코드를 잘보면 main함수의 인자로 받을 수 있게끔 args를 써주었고 리턴도 하고 있는 것을 볼 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
이것을 잘 응용하면 더욱 편하게 디버깅을 할수 있을 것 같네요..&lt;/font&gt;&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-348-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>addKnowledge</category>
			<category>analyseCode</category>
			<category>FastLogHook</category>
			<category>getAddress</category>
			<category>getAllLog</category>
			<category>getKnowledge</category>
			<category>hard hooking</category>
			<category>immlib</category>
			<category>immunity</category>
			<category>immunity Debugger</category>
			<category>isAnalysed</category>
			<category>libhook</category>
			<category>logBaseDisplacement</category>
			<category>logDirectMemory</category>
			<category>logRegister</category>
			<category>python</category>
			<category>STDCALLFastLogHook</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/348</guid>
			<comments>http://ezbeat.tistory.com/348#entry348comment</comments>
			<pubDate>Thu, 08 Dec 2011 19:31:40 +0900</pubDate>
		</item>
		<item>
			<title>ScreenSaver 만들어보기</title>
			<link>http://ezbeat.tistory.com/347</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;플젝에 치여 이리저리 정신못차리고 있는 와중에 예전부터 한번쯤 만들어보고 싶었던 스크린 세이버 만드는 것을 잠자는 시간을 쪼개 익혀봤습니다. 공부했다고 하는것보단 이건 그냥 방법을 익혔다고 표현하는게 올바를 것 같습니다. ^^;;&lt;br /&gt;
&lt;br /&gt;
API책을 보며 공부했습니다.&lt;br /&gt;
&lt;br /&gt;
스크린 세이버는 컴퓨터를 해보신 분들이라면 누구나 한번쯤은 보신 화면일 것입니다.&lt;br /&gt;
&amp;nbsp;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/202406494ED5EA4626B2C7&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/202406494ED5EA4626B2C7&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;sc.jpg&quot; height=&quot;194&quot; width=&quot;259&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
익숙하신 화면이죠?? ;;ㅋ&lt;br /&gt;
&lt;br /&gt;
이러한 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;스크린 세이버는 원래 두가지 용도&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;로 사용이 되었습니다.&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;1. 오랫동안 화면이 정지되어 있을 경우 같은 위치에 정적인 그림이 계속 표시되므로써 모니터의 특정 부분만 빨리 손상되는 것을 방지하는 것. 이 기능은 스크린 세이버의 원래적인 용도에 부합되는 기능입니다.&lt;br /&gt;
&lt;br /&gt;
2. 보안상 중요한 정보가 누출되는 것을 방지한다. 작업중 잠시 자리를 비울 경우 작업하던 내용을 누군가가 보거나 또는 파일 등의 정보를 훔쳐갈 수도 있는데 스크린 세이버는 화면을 잠금으로써 정보 누출을 방지하는 것..&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
하지만 요새는 모니터 성능도 좋아져서 1번 같은 경우의 용도로는 거의 사용이 안됩니다. &lt;br /&gt;
그리고 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;새로운 3번의 기능이 추가&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;되었죠.&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;3. 일부러 모니터를 끄지 않고 자리를 비움으로써 사람들이 자기의 스크린 세이버를 보고 감탄해 하는 기능&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
제 주위만 해도 이러하신 분들이 수두룩 하시죠. 소녀시대 스크린 세이버부터...ㅎㅎ&lt;br /&gt;
하지만 저는 직접 코딩을 해 나만의 스크린 세이버를 만들어 보고 싶었습니다. 일단 이 글에선 간략한 샘플 코드만 만들어보죠.&lt;br /&gt;
&lt;br /&gt;
스크린 세이버는 OS가 부팅될 때 함께 실행이 된다. 그리고 항상 사용자의 키보드와 마우스를 감시하며 제어판에서 지정한 시간동안 입력이 없을 경우 미리 지정되어 있는 스크린 세이버 애플릿을 실행합니다.&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;text-align: left;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(254, 222, 199); border-right-color: rgb(254, 222, 199); border-bottom-color: rgb(254, 222, 199); border-left-color: rgb(254, 222, 199); background-color: rgb(254, 222, 199); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 15px; &quot;&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;용어 정리&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;
스크린 세이버 :&lt;/b&gt; 운영체제의 일부이며 항상 실행상태에서 사용자의 입력을 감시하는 프로그램&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;
스크린 세이버 애플릿 : &lt;/b&gt;스크린 세이버에 의해 호출되는 실행 파일(.scr)&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; style=&quot;font-family: Gulim; background-color: rgb(255, 255, 255); &quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;&lt;p align=&quot;left&quot;&gt;&lt;span class=&quot;std&quot; style=&quot;font-family: 굴림; font-size: 9pt; line-height: 1.25; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
이러한 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;스크린 세이버 애플릿이 실행이 안되는 경우&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;가 있습니다.&lt;br /&gt;
&lt;b&gt;
1. 스크린 세이버 애플릿이 지정이 안되었을 경우&lt;br /&gt;
2. 윈도우 기반이 아닌 응용 프로그램이 실행 중일 때&lt;br /&gt;
3. 컴퓨터 교육 프로그램(CBT)이 실행중일 때&lt;br /&gt;
4. 한 프로그램이라도 스크린 세이버의 실행을 거부할 때&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
스크린 세이버 애플릿은 스크린 세이버에 의해 실행되며 사용자의 입력이 있으면 즉시 종료된다.&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;이제 간단한 샘플 코드를 작성해 볼 것인데 다행이도 Windows에서는 참 좋은 라이브러리를 지원해주고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
바로 &quot;&lt;/font&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;ScrnSave.lib&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&quot; 이다. &lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;애플릿 개발자들이 애플릿이 언제 호출될지 설정 대화상자는 언제 어떻게 보여줄지, 제목 문자열은 어디에 넣어둘지 등을 다 생각해서 개발을 한다면 어려움에 호소할 것이다. 그래서 이러한 문제는 없애기 위해 스크린 세이버 라이브러리를 제공하며 대부분의 약속이 이미 프로그래밍되어 있으므로 애플릿은 스크린 세이버 라이브러리와 연결하고 자신의 고유한 화면 처리만 하면 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
샘플 코드를 봐보자.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;
&lt;/font&gt;&lt;textarea name=&quot;code&quot; class=&quot;cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; style=&quot;color: rgb(0, 0, 0); &quot;&gt;#include &amp;lt;Windows.h&amp;gt;
#include &amp;lt;tchar.h&amp;gt;
#include &amp;lt;ScrnSave.h&amp;gt;

#ifdef UNICODE
#pragma comment(lib, &quot;ScrnSavW.lib&quot;)
#else
#pragma comment(lib, &quot;ScrnSave.lib&quot;)
#endif

#pragma comment(lib,&quot;ComCtl32.lib&quot;)

/* 
	스크린 세이버의 메시지를 처리하는 메시지 프로시저
	원형도 WndProc과 동일하며 프로그래밍 방법도 동일
	스크린 세이버 라이브러리는 애플릿에 적절한 전체화면의 검정색 배경에 항상 위 옵션으로 메인 윈도우를 만들며
	메인 윈도우의 메시지 프로시저로 이 함수를 지정한다. 
	이 함수에서 처리하지 않는 메시지는 DefScreenSaverProc함수로 전달하여 스크린 세이버 라이브러리가 처리
*/
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR *Mes = _T(&quot;http://ezbeat.tistory.com&quot;);

	switch(iMessage){
	case WM_CREATE:
		return 0;

	case WM_PAINT:
		hdc = BeginPaint(hWnd,&amp;amp;ps);
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc,RGB(255,255,255));
		TextOut(hdc,500,500,Mes,_tcslen(Mes));

		MoveToEx(hdc,500,500,NULL);
		Ellipse(hdc,200,200,300,300);
		EndPaint(hWnd,&amp;amp;ps);
		return 0;
	}
	return DefScreenSaverProc(hWnd,iMessage,wParam,lParam);
}

/*
	설정 대화상자의 메시지 처리 함수. 일반적인 대화상자 메시지 프로시저와 동일
	사용자로부터 설정 상태를 입력받아 약속된 장소(보통 레지스트리)에 저장하는 역할
*/
BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	return TRUE;
}

/*
	커스텀 컨트롤을 등록할 때 사용. 보통 TRUE를 리턴하면 된다.*
*/
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
	return TRUE;
}
&lt;/textarea&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
위 사용된 3개의 함수는 필수적으로 있어야 한다. 각 함수에 대한 설명은 주석으로 간략히 달아놨다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
그리고 위에 참조할 라이브러리를 지정해주어야하는데&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;
유니코드 기반으로 프로그래밍 하려면 &quot;&lt;/font&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;ScrnSavW.lib&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;&quot; 라이브러리를 사용&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;해주면 된다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
이 부분에서 잘 안되서 애먹었다.;;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.naver.com/PostView.nhn?blogId=sainthkh&amp;amp;logNo=140062316898&amp;amp;categoryNo=59&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;listtype=0&quot; target=&quot;_blank&quot; title=&quot;[http://blog.naver.com/PostView.nhn?blogId=sainthkh&amp;amp;logNo=140062316898&amp;amp;categoryNo=59&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;listtype=0]로 이동합니다.&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;&lt;b&gt;http://blog.naver.com/PostView.nhn?blogId=sainthkh&amp;amp;logNo=140062316898&amp;amp;categoryNo=59&amp;amp;viewDate=¤tPage=1&amp;amp;listtype=0&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
위 블로그에 잘 설명이 되어 있었다 ^^; 감사합니다~&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;또한 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;스크린 세이버 애플릿 파일은 확장자가 .exe가 아닌 .scr&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그렇기 때문에 아래와 같이 셋팅을 해주고 컴파일을 해주어야합니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하지 않으면 실행할때마다 확장자를 바꾸고 실행하는 번거로움을 겪에 될 것 입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/1408DB354ED5F5202D26E5&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/1408DB354ED5F5202D26E5&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;302&quot; width=&quot;556&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이제 실행된 결과 화면을 봐보자.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/164E8A3D4ED5F43708ADB0&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/164E8A3D4ED5F43708ADB0&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;제목 없음.jpg&quot; height=&quot;553&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;잘 만들어져 졌군요. 저 상태에서 키가 눌린다거나 마우스 입력이 들어오면 바로 스크린 세이버창은 꺼지게 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이제 이것을 응용해 저만의 스크린 세이버 애플릿을 만들어보겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
멋지게 만들고 싶었지만 그럴 시간은 없어서 초간단으로 만들었습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://ezbeat.tistory.com/attachment/cfile2.uf@117C604B4ED61D582EDFA9.scr&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/110706133414/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Ezbeat.scr&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
끝... -_-.. 심심하신분은 실행해보세요오.. scr 이라고해서 바이러스 절대 아닙니다! ㅋㄷㅋㄷ&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-347-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>ComCtl32.lib</category>
			<category>DefScreenSaverProc</category>
			<category>RegisterDialogClasses</category>
			<category>SCR</category>
			<category>ScreenSaverConfigureDialog</category>
			<category>ScreenSaverProc</category>
			<category>scrnsave.lib</category>
			<category>ScrnSavW.lib</category>
			<category>스크린 세이버</category>
			<category>애플릿</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/347</guid>
			<comments>http://ezbeat.tistory.com/347#entry347comment</comments>
			<pubDate>Wed, 30 Nov 2011 18:21:57 +0900</pubDate>
		</item>
		<item>
			<title>API vs MFC</title>
			<link>http://ezbeat.tistory.com/346</link>
			<description>&lt;div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;많은 사람들은 항상 이야기를 한다. &quot;MFC가 좋아요? API가 좋아요? 라고..&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그리고 많은 사람들은 MFC도 짜증나고 API도 짜증난다고 말한다.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;모든 사람들은 다음과 같이 말한다.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;API는 너무 어렵다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;MFC는 너무 복잡하다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;API는 너무 코드 양이 많다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;MFC는 부풀어 있다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;API는 마법사가 없다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;MFC는 나쁘게 설계되어 있다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;API는 객체지향하지 않다.&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;MFC는 내 개를 걷어찼다.?!&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;API는 나의 여자친구를 빼앗아갔다.?!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;어디서 본 글이고 공감되서 써봤습니다.&lt;br /&gt;
마지막 두 문장은 애매모하네요.&lt;br /&gt;
API가 나의 여자친구를 빼앗아 갔다는 것은 &lt;br /&gt;
그만큼 코드짜는데 시간이 걸리기 때문에 여자친구를 만나지 못해 헤어졌다는 말 같은데...&lt;br /&gt;
MFC가 내 개를 걷어찼다는 것이 무슨 말인지..ㅠ&lt;br /&gt;
원본 문장은 이렇습니다. - &lt;b&gt;&quot;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 13px; line-height: normal; &quot;&gt;&lt;b&gt;MFC kicked my dog&quot;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;혹시 무슨 뜻인지 아시는 분은 댓글로좀 알려주세요 ㅠ_ㅠ..&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-346-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>API</category>
			<category>Application Program Interface</category>
			<category>MFC</category>
			<category>The Microsoft Foundation Class Library</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/346</guid>
			<comments>http://ezbeat.tistory.com/346#entry346comment</comments>
			<pubDate>Wed, 30 Nov 2011 01:07:15 +0900</pubDate>
		</item>
		<item>
			<title>ATmega128 LCD password 실험</title>
			<link>http://ezbeat.tistory.com/345</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;요샌.. 학과공부에 너무 치여 이도저도 못하고 있는 저 입니다..ㅠㅠ&lt;br /&gt;
하드웨어도 배우는데 지금까지 ATmega128을 가지고 간단한 실습들을 하였고&lt;br /&gt;
다음시간부터 micro mouse를 가지고 길 찾기 프로젝트를 해야합니다..ㅠㅠ&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;별의별걸 다 실험했지만 ATmega128로 실험한 마지막 실습은 영상으로 남겼습니다..ㅠㅠ &lt;br /&gt;
그냥 올립니다..ㅠㅠ&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;p style=&quot;margin:0&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0&quot; width=&quot;502&quot; height=&quot;399&quot;&gt;
	&lt;param name=&quot;movie&quot; value=&quot;http://flvs.daum.net/flvPlayer.swf?vid=K6gMr-W0UB8%24&amp;amp;pwidth=502&amp;amp;pheight=399&quot;/&gt;
	&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;
	&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;
	&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot;/&gt;
	&lt;embed src=&quot;http://flvs.daum.net/flvPlayer.swf?vid=K6gMr-W0UB8%24&amp;amp;pwidth=502&amp;amp;pheight=399&quot; width=&quot;502&quot; height=&quot;399&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; type=&quot;application/x-shockwave-flash&quot; bgcolor=&quot;#000000&quot;/&gt;
&lt;/object&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;USART0을 사용했고.. 시그널 처리를 해 만든 것입니다.&lt;br /&gt;
&lt;br /&gt;ATmega128.. 이로서 실습이 끝났지만..ㅠㅠ 학교에 반납해야한다는거..;;&lt;br /&gt;
나중에 micro mouse도 제대로 작동하게 만들면 영상 올리겠습니다~&lt;br /&gt;
&lt;br /&gt;하드웨어도 은근히 잼는거 같아요.. 아직 이론적 지식이 부족한거 같지만요 ;;ㅋ&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-345-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Routine</category>
			<category>ATMEGA128</category>
			<category>LCD</category>
			<category>Signal</category>
			<category>usart0</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/345</guid>
			<comments>http://ezbeat.tistory.com/345#entry345comment</comments>
			<pubDate>Thu, 17 Nov 2011 22:57:49 +0900</pubDate>
		</item>
		<item>
			<title>Prefix list in executive component</title>
			<link>http://ezbeat.tistory.com/344</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/1171553D4E609980315CD5&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/1171553D4E609980315CD5&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;693&quot; width=&quot;507&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;윈도우 시스템 루틴의 명명 규칙을 이해한다면 이들 익스포트된 함수의 이름을 좀 더 쉽게 해독할 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;일반적인 형태&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;
&amp;lt;Prefix&amp;gt;&amp;lt;Operation&amp;gt;&amp;lt;Object&amp;gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;Prefix&lt;/b&gt; : 루틴을 &amp;nbsp;익스포트하는 내부 컴포넌트&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;
Operation&lt;/b&gt; : 객체나 리소스에 행해지는 동작&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;
Object&lt;/b&gt; : 동작 대상&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-344-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>Alpc</category>
			<category>CC</category>
			<category>CM</category>
			<category>Dbgk</category>
			<category>Em</category>
			<category>Etw</category>
			<category>EX</category>
			<category>executive component</category>
			<category>FsRtl</category>
			<category>hal</category>
			<category>Hvl</category>
			<category>IO</category>
			<category>kd</category>
			<category>Ke</category>
			<category>Lsa</category>
			<category>MM</category>
			<category>NT</category>
			<category>OB</category>
			<category>PF</category>
			<category>PO</category>
			<category>PP</category>
			<category>prefix</category>
			<category>PS</category>
			<category>RTL</category>
			<category>SE</category>
			<category>tm</category>
			<category>vf</category>
			<category>Wdi</category>
			<category>Whea</category>
			<category>WMI</category>
			<category>Zw</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/344</guid>
			<comments>http://ezbeat.tistory.com/344#entry344comment</comments>
			<pubDate>Fri, 02 Sep 2011 17:58:12 +0900</pubDate>
		</item>
		<item>
			<title>API Listbox에서 가로 스크롤 넣기</title>
			<link>http://ezbeat.tistory.com/343</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;현재 프로젝트를 하고 있던 도중 리스트박스를 만들어서 파일 경로를 얻어오는 부분을 구현하고 있었습니다.&lt;br /&gt;
뭐 다른 부분은 문제가 되질 않지만 &amp;nbsp;파일 경로가 길어질 경우 리스트박스 가로 길이를 넘어서게 되서 뒷 부분이 짤려서 안보이게 되더군요.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile24.uf.tistory.com/original/115532574E41F1F4338C60&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile24.uf.tistory.com/image/115532574E41F1F4338C60&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;133&quot; width=&quot;252&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
보시면 저렇게 짤려있습니다;;&lt;br /&gt;
&lt;br /&gt;
전 평소대로 생각했습니다. 그냥 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;리스트박스 속성창&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 뒤져보면 있겠지.. 찾아보았더니 있더군요?!&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/1636864B4E41F25706BC80&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/1636864B4E41F25706BC80&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;299&quot; width=&quot;451&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;디폴트 False&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;로 되어 있어서 저 값을 True로 바꾸고 다시 실행시켜보았더니!&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
가로 스크롤은 안생기더군요.......... 그래서 인터넷에 찾아보니 친절히 코드가 있어서 그걸 가져다 사용해 보았습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;( 뭔가 오류가 쫌 있어서 살짝 바꾸기만 했습니다. )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;출처 :&amp;nbsp;&lt;/font&gt;&lt;a href=&quot;http://stpetrus27.wordpress.com/2009/03/15/win32-control-listbox-%E3%80%90horizontal-scroll%E3%80%91/&quot; target=&quot;_blank&quot; title=&quot;[http://stpetrus27.wordpress.com/2009/03/15/win32-control-listbox-%E3%80%90horizontal-scroll%E3%80%91/]로 이동합니다.&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;http://stpetrus27.wordpress.com/2009/03/15/win32-control-listbox-%E3%80%90horizontal-scroll%E3%80%91/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;textarea name=&quot;code&quot; class=&quot;cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; style=&quot;color: rgb(0, 0, 0); &quot;&gt;//리스트 박스에 가로 스크롤을 넣어준다.
void OnAdjustListBoxHScroll(HWND hWndLB)
{
	int nTextLen = 0, nWidth = 0;
	int nCount = 0, idx = 0;
	HDC hDC = NULL;
	HFONT hFont = NULL;
	SIZE sz = {0};
	char pszText[MAX_PATH] = {0,};

	nCount = SendMessage(hWndLB, LB_GETCOUNT, 0, 0);
	hFont = (HFONT)SendMessage(hWndLB, WM_GETFONT, 0, 0);
	hDC = GetDC(hWndLB);
	SelectObject(hDC, (HGDIOBJ)hFont);

	for (idx = 0; idx &amp;lt; nCount; ++idx) {
		nTextLen = SendMessage(hWndLB, LB_GETTEXTLEN, idx, 0);
		memset(pszText,0,MAX_PATH);
		SendMessageA(hWndLB, LB_GETTEXT, idx, (LPARAM)pszText);
		GetTextExtentPoint32A(hDC, pszText, nTextLen, &amp;amp;sz);
		nWidth = max(sz.cx, nWidth);
	}
	ReleaseDC(hWndLB, hDC);
	SendMessage(hWndLB, LB_SETHORIZONTALEXTENT, nWidth+20, 0);
}
&lt;/textarea&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;코드는 그렇게 복잡하진 않습니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;현재 리스트박스에 있는 문자열들의 가로 길이를 얻어와서 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;가장 긴 값을 가지고&amp;nbsp;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;LB_SETHORIZONTALEXTENT &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;메시지를 넘기는 것입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러면 리스트 박스에&lt;/font&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 9pt; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 13px; line-height: 21px; &quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 9pt; &quot;&gt;가로 스크롤이 가능한 너비를&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 9pt; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: rgb(0, 0, 0); &quot;&gt;&lt;span style=&quot;font-size: 9pt; &quot;&gt;Pixel&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;단위로 지정 되게 되면서 가로 스크롤이 생기게 됩니다.&lt;br /&gt;
( 마지막에 뒷부분이 조금 잘리길래 +20 정도를 더 해주었습니다. )&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;리스트 박스에&amp;nbsp;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;LB_ADDSTRING &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;메시지로 값을 추가했을 때 바로 그 아래 문장에 해당 함수를 호출시켜주면 됩니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;당연히 리스트박스 속성창에서 Horizontal Scroll 값&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;은 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;True&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;로 해주어야 합니다.&lt;br /&gt;
 False로 했을 경우 위 함수를 적용시켜도 스크롤 바는 생기지 않습니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/206FB8514E41F4AF15BABD&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/206FB8514E41F4AF15BABD&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;196&quot; width=&quot;260&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;만족스럽습니다. 이런거에서 시간을 낭비하고 있다니..ㅠ_ㅠ .. 짜증나는군요.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-343-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>GetTextExtentPoint32</category>
			<category>Horizontal</category>
			<category>LB_GETCOUNT</category>
			<category>LB_GETTEXT</category>
			<category>LB_GETTEXTLEN</category>
			<category>LB_SETHORIZONTALEXTENT</category>
			<category>ListBox</category>
			<category>scroll</category>
			<category>SendMessage</category>
			<category>WM_GETFONT</category>
			<category>가로</category>
			<category>스크롤바</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/343</guid>
			<comments>http://ezbeat.tistory.com/343#entry343comment</comments>
			<pubDate>Wed, 10 Aug 2011 12:04:47 +0900</pubDate>
		</item>
		<item>
			<title>바로가기</title>
			<link>http://ezbeat.tistory.com/342</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;오늘 학교를 가기엔 너무 덥고.. 집에 있기엔 짜증이 나서 광천터미널에 영풍문고를 가보기로 마음 먹음.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;가서 베스트 셀러를 읽을 생각이었지만 내 의지와 상관없이 몸이 IT서적 있는데로 직행.. 어쩔수없는 본능.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;뭐 하나만 보기로 하고 윈도우 포렌식 책을 들었는데 목차에 윈도우 바로가기에 대한 내용이 있어서 읽어봤는데 재미있더군요.냥 머리속에만 남기기 뭐해서 정리합니다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;================================================&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;바로가기(shortcut)&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이라고 불리는 링크 파일은 윈도우에만 있는 독특한 기능이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;여기서 궁금하실수도 있는데 리눅스에서도 심볼릭링크라고해서 바로가기와 같은 기능을 하는 놈이 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러면 이 두개는 뭐가 다르냐는 것이다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;정확히 말하면 윈도우에 심볼릭 링크가 본격적으로 지원되기 시작한 것은 Vista 이후부터다. &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;고로 윈도우에는 바로 가기와 심볼릭 링크가 동시에 존재하므로 이 둘은 같다고 할 수 없다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;먼저 바로가기와 심볼릭 링크의 가장 큰 차이점이다.&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;심볼릭 링크 : &amp;nbsp;파일 시스템 수준에서 구현&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;1. 파일 시스템이 보기에는 심볼릭 링크라는 별도의 파일이 아닌 그것이 바리키고 있는 대상 파일로 보임.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;즉, 중간에 있는 심볼릭 링크는 애플리케이션에는 완전히 투명&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;2. 대상에 대한 절대 경로 혹은 상태 경로에 대한 정보만 가지고 있다.&lt;br /&gt;
&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;바로 가기 : 애플리케이션 수준에서 구현&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;1. 그 자체가 완벽한 하나의 파일.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 즉, 바로 가기는 파일이 가지고 있어야만 하는 모든 메타데이터와 MFT 엔트리를 가지고 있다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 파일 시스템이 보기에도 완전히 독립적인 별개의 파일로 보이고,&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 바로 가기를 사용하기 위해서는 애플리케이션 혹은 OS 수준에서 별도의 기능이 필요&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp;2. 대상에 대한 절대 경로만 가지고 있다.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile3.uf.tistory.com/original/173956404E3553D12AFB45&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile3.uf.tistory.com/image/173956404E3553D12AFB45&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;96&quot; width=&quot;82&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;바로 가기&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;의 정식 명칭은 &#039;Shell Link&#039;로, &#039;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;Shell Link Binary File Format&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&#039; 으로 만들어진 파일임을 의미&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이&amp;nbsp;Shell Link Binary File Format의 기능과 구조는 MS 문서에 자세히 나와있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;( 쉽게 찾으실 수 있겠지만 나와 같이 게으르신 분을 위해 파일을 그냥 올립니다. )&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://ezbeat.tistory.com/attachment/cfile25.uf@1579584D4E3557151EFBEE.pdf&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/pdf.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; ms-shllink-pdf.pdf&lt;/a&gt;&lt;/div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
바로 가기라서 간단할꺼 같지만 문서 양을 보면 52p에 달한다..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;제가 읽은 책이 윈도우 포렌식이라서 &amp;nbsp;바로 가기에 반드시 필요한 부분과 포렌식 관점에서 중요한 부분만 설명하겠습니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;바로 가기 생성&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;● 윈도우 설치 시&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;가장 대표적인 예는 윈도우를 처음 설치할 때 바탕 화면에 생기는 &#039;내 컴퓨터&#039; 같은 기본 바로 가기들이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 외에도 작업 표시줄에 있는 아이콘이나 &#039;내 음악&#039; 폴더에 있는 &#039;sample music&#039;과 같은 파일들도 모두 바로 가기로 만들어 진다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile28.uf.tistory.com/original/18397D514E3557E3050033&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile28.uf.tistory.com/image/18397D514E3557E3050033&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;49&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;제가 쓰는 작업 표시줄 일부인데 이렇게 각각 아이콘들이 전부 바로 가기들입니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;위 그림은 Windows 7에서의 모양이고 아래는 Windows XP에서의 모양입니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/137D26474E35589A06443A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/137D26474E35589A06443A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;63&quot; width=&quot;379&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;● 윈도우 설치 후&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;윈도우는 사용자의 편의를 위해 최근에 열었던 문서들의 목록을 자동으로 저장한다. 그 목록은 단순한 문자열이 아니라 모두 바로 가기들이다.&amp;nbsp;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/162376424E3559BC18F42E&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/162376424E3559BC18F42E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;437&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;● 애플리케이션 설치 시&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;대부분 애플리케이션은 설치 과정에서 사용자에게 바탕 화면이나 작업 표시줄, 그리고 시작 모튜에 새로 설치한 애플리케이션의 바로 가기 항목을 만들지를 물어본다. 만들겠다고하면 설치 과정에서 자동으로 바로 가기를 만들어준다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;● 사용자가 생성&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;너무 당연한 이야기이다. 바로 가기 안 만들어본 분이 계시려나..&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile29.uf.tistory.com/original/167468434E355A792FE772&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile29.uf.tistory.com/image/167468434E355A792FE772&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;356&quot; width=&quot;292&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;파일에 대고 우클릭을 하면 위와 같이 나오며 바로 가기 만들기를 누르면 끝이다.. 흠..&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이제 바로 가기의 구조를 알아보자&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;바로 가기의 구조&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;바로 가기가 가지고 있는 정보 종류는 바로 가기 파일의 속성 정보 창에서 바로 가기 탭을 보면 대충은 알 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;난 notepad.exe를 대상으로 해보았다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/127455484E355B4B2D66E9&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/127455484E355B4B2D66E9&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;479&quot; width=&quot;432&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;원본 파일의 종류, 전체 경로, 실행 옵션 등 기본적인 정보들만 있는거 같지만 이것은 바로 가기가 가지고 있는 전체 정보의 극히 일부분에 지나지 않는다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;제대로 파고 들어가기 전에 일반적으로 해킹대회 때나 리버싱 할 때 사용하는 Hex Editor로 열어보았다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;( 파일의 모든 내용을 볼 수 있으므로.. )&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;보고 싶은 분만 보시길.. 이 파일에 대한 설명은 하지 않겠다. 딱 봐도 뭔가 이상한 정보들이 많이 있다는것 정도는 알수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;p id=&quot;more342_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;342_0&#039;,&#039;Hex Editor로 열어본 바로 가기&#039;,&#039;접기&#039;); return false;&quot;&gt;Hex Editor로 열어본 바로 가기&lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content342_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/1758EE404E355D54200666&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/1758EE404E355D54200666&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;1070&quot; width=&quot;616&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;바로 가기는 다음과 같이 크게 다섯 부분으로 나눌 수 있다. 각 부분들은 저마다 고유한 내부 구조를 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(231, 253, 181); border-right-color: rgb(231, 253, 181); border-bottom-color: rgb(231, 253, 181); border-left-color: rgb(231, 253, 181); background-color: rgb(231, 253, 181); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;SHELL_LINK_HEADER: &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;식별 정보, 타임 스탬프, 그리고 선택 가능한 구조의 존재 유무를 표시하는 플래그를 저장&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;LINKTARGET_IDLIST :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 원본에 대한 정보를 담고 있다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&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; &amp;nbsp; &amp;nbsp; 이 구조는 Shell Link Binary File Format에서 선택 사항이지만&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;&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;LINKINFO : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;원본의 위치를 찾을 때 필요한 정보를 담고 있다. 이 역시 선택 항목&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;STRING_DATA : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;사용자 인터페이스나 &amp;nbsp;경로 식별 정보를 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;EXTRA_DATA : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;기타 정보를 가지고 있다.&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이제 하나하나 세세하게 알아보자.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;SHELL_LINK_HEADER&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/2024EF4C4E3601EE205729&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/2024EF4C4E3601EE205729&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;117&quot; width=&quot;612&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/1923D34C4E3601EA244437&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/1923D34C4E3601EA244437&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;577&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;실제 Hex Editor에 있는 값과 비교해 가면서 적어본 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;중요한 것만 몇가지 집고 넘어가겠다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;CLSID는 고정적인 값으로 바로 가기를 찾는데 중요한 역할을 할 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;SHELL_LINK_HEADER의 LinkFlag&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/151B34334E3603C60F72A7&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/151B34334E3603C60F72A7&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;149&quot; width=&quot;491&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;LINKTARGET_IDLIST&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;바로 가기에서&amp;nbsp;LINKTARGET_IDLIST는 필수적인 항목이다.&amp;nbsp;LINKTARGET_IDLIST는 2Byte에 걸쳐 IDList의 크기가 나오고 그 뒤에 가변 길이의 IDList가 나온다. IDList의 크기가 가변적이기 때문에 당연히&amp;nbsp;LINKTARGET_IDLIST의 크기도 가변적이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;IDList는 다시 두 부분으로 나뉘는데, 첫 번째 부분은 2Byte의 고정 길이를 갖는 ItemIDSize이며, 그 뒤로는 가변 길이의 Data가 붙게 된다. IDList의 데이터는 일정한 구조가 없다. IDList의 끝에는 IDList의 끝을 알리는 2Byte크기의 예약 영역이 나오는데, 이것은 모두 0으로 채워져 있으며 TerminalID라고 부른다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile7.uf.tistory.com/original/15500B404E360CEF2EEE79&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile7.uf.tistory.com/image/15500B404E360CEF2EEE79&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;275&quot; width=&quot;593&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;010 Editor 툴로 보면 쉽게 그 구조를 파악할 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/133A78384E360E34157989&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/133A78384E360E34157989&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;255&quot; width=&quot;374&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;IDListSize가 223이라고 나왔는데 223 = 0xDF이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그 아래로 IDList 구조체 배열이 0,1,2,3 쭉 있다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;LINKINFO&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;LinkInfo도 바로 가기에 필수적인 요소이며, 원본 파일이 정해진 위치에 없는 경우 그것을 찾기 위한 필수 정보들을 가지고 있다. 그 필수 정보에는 원본이 저장되어 있던 볼륨의 정보 혹은 맵드 드라이브 문자, 원본까지의 UNC 경로 등이 포함된다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/181BF14D4E36137512FC65&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/181BF14D4E36137512FC65&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 6.jpg&quot; height=&quot;106&quot; width=&quot;592&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile5.uf.tistory.com/original/130B994D4E3613762E920A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile5.uf.tistory.com/image/130B994D4E3613762E920A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 7.jpg&quot; height=&quot;216&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;LinkInfo Flag는 특이하게도 전체 32비트 중에서 좌측 2비트만을 사용하는데 그 의미는 아래와 같다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/1951C4534E36143E3A452F&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/1951C4534E36143E3A452F&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 8.jpg&quot; height=&quot;104&quot; width=&quot;607&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;VolumeID필드는 바로 가기가 생성될 당시에 원본이 있던 볼륨의 데이터를 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 정보는 원본이 제 위치에 없는 경우 원본을 찾는데 이용된다. 컴퓨터 포렌식 관점에서 이 정보는 매우 중요.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;바로 가기의 링크가 끊어졌다면 우리는 이 볼륨 정보를 보고 사라진 볼륨에 대한 힌트를 얻을 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;VolumeID 구조 ( 010 Editor로 그냥 봄.. )&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/157B354B4E3614EC20A03A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/157B354B4E3614EC20A03A&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 9.jpg&quot; height=&quot;91&quot; width=&quot;319&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;STRING_DATA&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 구조체는 사용자 인터페이스와 경로 식별자를 알려주는 일련의 문자열들로 구성.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;각 문자열은 앞에 2Byte 길이의 문자열 크기가 먼저 나오고, 그 다음에 그에 해당하는 길이만큼의 문자열이 뒤따른다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 구조체에 올 수 있는 문자열의 종류는 LinkFlags에 따라 결정되며 가능한 문자열은 다음과 같다.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(254, 254, 184); border-right-color: rgb(254, 254, 184); border-bottom-color: rgb(254, 254, 184); border-left-color: rgb(254, 254, 184); background-color: rgb(254, 254, 184); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;NAME_STRING :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 바로 가기에 대한 설명을 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;RELATIVE_PATH :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 바로 가기를 기준으로 원본까지의 상대 주소를 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;WORKING_DIR :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 바로 가기를 활성화시켰을 때 사용할 수 있는 working directory의 주소를 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;COMMAND_LINE_ARGUMENTS : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;애플리케이션을 실행할 때 사용한 명령 옵션을 가지고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;ICON_LOCATION :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 바로 가기를 사용자에게 보여줄 때 사용할 아이콘의 위치 정보를 가지고 있다.&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;제가 테스트한 notepad.exe의 바로가기에는 다음과 같은 정보가 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/18249F524E3616C104F97D&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/18249F524E3616C104F97D&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 11.jpg&quot; height=&quot;72&quot; width=&quot;588&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/117FF7564E36173E259928&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/117FF7564E36173E259928&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 10.jpg&quot; height=&quot;90&quot; width=&quot;372&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;RELATIVE_PATH&amp;nbsp;,WORKING_DIR&amp;nbsp;두 정보가 있었다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;EXTRA_DATA&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 구조체는 말 그대로 원본에 대한 추가 정보를 가지고 있다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;5가지 중요 정보 중에서 가장 방대한 크기를 차지하고 있었다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;추가될 수 있는 정보의 종류가 많지만 필요한 부분만 정리해보겠다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/11276F554E3629800F258F&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/11276F554E3629800F258F&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 12.jpg&quot; height=&quot;331&quot; width=&quot;389&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/181CC0554E36298025D479&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/181CC0554E36298025D479&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 13.jpg&quot; height=&quot;340&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;지금까지 바로 가기에 대해서 분석해 보았는데 이 간단한 놈이 이렇게 복잡한 내용을 담고 있다는 것은 처음 알았다.&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-342-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>etc</category>
			<category>CLSID</category>
			<category>EXTRA_DATA</category>
			<category>Link</category>
			<category>LinkFlag</category>
			<category>LINKINFO</category>
			<category>LINKTARGET_IDLIST</category>
			<category>Shell Link Binary File Format</category>
			<category>SHELL_LINK_HEADER</category>
			<category>shortCut</category>
			<category>STRING_DATA</category>
			<category>Symbolic</category>
			<category>바로 가기</category>
			<category>심볼릭링크</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/342</guid>
			<comments>http://ezbeat.tistory.com/342#entry342comment</comments>
			<pubDate>Sun, 31 Jul 2011 22:50:44 +0900</pubDate>
		</item>
		<item>
			<title>커널 데이터 버퍼</title>
			<link>http://ezbeat.tistory.com/341</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;정리차원에서 간략히 올립니다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;I/O를 요청한 스레드나 프로세스의 데이터 버퍼에 대한 정보는 IRP 구조체에 저장되어 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
드라이버에 &amp;nbsp;I/O 요청과 관련된 스레드나 프로세스의 데이터 버퍼를 설명하기 위한 세 가지 서로 다른 방법을 제공&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;Direct I/O : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;MDL(Memory Descriptor List)이라 불리는 구조체를 사용하여 I/O를 요청한 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 스레드의 물리 주소 공간에 위치한 데이터 영역을 가리키는 방식&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;Buffered I/O :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 버퍼에 저장된 데이터가 I/O를 요청한 스레드의 주소 공간에서 시스템 주소 공간에 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 있는 임시 영역으로 복사되고, 드라이버는 복사된 데이터의 버퍼 포인터를 사용하는 방식&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;Neither I/O : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;드라이버는 버퍼에 해당하는 I/O를 요청한 스레드의 가상 주소를 제공하는 방식&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;드라이버는 I/O 관리자가 어떤 물리 장치에 전달되는 모든 IRP_MJ_READ/IRP_MJ_WRITE 요청이 어떤 방식으로 데이터를 주소받는지 알수 있도록 한 가지 방식을 선택해야 한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;디바이스 오브젝트가 생성됐을 때 필요한 정보를 초기화하는 과정에서 디바이스 오브젝트에 있는 Flags 필드에 있는 특정 정보를 설정함으로써 가능&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;DeviceObject-&amp;gt;Flags |= &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;DO_BUFFERED_IO&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;;&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#2b8400&quot;&gt; // &amp;nbsp;Buffered I/O&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
DeviceObject-&amp;gt;Flags |= &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;DO_DIRECT_IO&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;; &amp;nbsp;&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#2b8400&quot;&gt;// &amp;nbsp;Direct I/O&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;아무 설정도 하지 않으면 디폴트로 Neither I/O 방식&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile26.uf.tistory.com/original/2049F3414E2E2F121F174B&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile26.uf.tistory.com/image/2049F3414E2E2F121F174B&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;165&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이번엔 디바이스 I/O 컨트롤 코드에서 사용하는 버퍼 방식에 대해 알아보겠다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/180C22564E2E2FA132E720&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/180C22564E2E2FA132E720&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;images.jpg&quot; height=&quot;111&quot; width=&quot;408&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;위 그림은 IOCTL 코드인데 IOCTL코드를 만드는 매크로가 winioctl.h에 정의되어 있다.&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;/p&gt;
&lt;div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
#define &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;CTL_CODE&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;( DeviceType, Function, Method, Access ) ( &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp; &amp;nbsp; ((&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;DeviceType&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;) &amp;lt;&amp;lt; 16) | ((&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;Access&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;) &amp;lt;&amp;lt; 14) | ((&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;Function&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;) &amp;lt;&amp;lt; 2) | (&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#3058d2&quot;&gt;Method&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;) \&lt;/font&gt;&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
)&lt;/font&gt;&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;저기서 Method 라고 된 부분이 처리하고자 하는 I/O 요청을 위해 제공된 데이터 버퍼를 설명하기 위해 사용된다.&lt;br /&gt;
&lt;br /&gt;
다시 말해 Method 인자는 DeviceIoControl() 함수 호출 시 제공되는 두 개의 데이터 버퍼(입력버퍼, 출력 버퍼)에 &lt;br /&gt;
대한 정보를 드라이버에 알린다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
I/O 컨트롤 코드에서 제공하는 데이터 버퍼를 설명하기 위한 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;서로 다른 세가지 방식&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;에 대해서 알아보자.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;METHOD_BUFFERED : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;DeviceIoControl() 함수에서 제공하는 입력 버퍼와 출력 버퍼를 Buffered I/O 방식으로 처리&lt;br /&gt;
&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;
METHOD_IN_DIRECT &amp;amp; METHOD_OUT_DIRECT : &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;DeviceIoControl() 함수에서 제공되는 입력 버퍼를 Buffered I/O 방식으로 처리하고 출력 버퍼를 Direct I/O 방식으로 처리&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;여기서 IN과 OUT의 유일한 차이점&lt;br /&gt;
I/O 관리자가 처리하는 출력 버퍼에 대한 액세스 권한 조사.&lt;br /&gt;
METHOD_IN_DIRECT - I/O 관리자는 I/O를 요청한 스레드가 출력 버퍼에 대한 읽기 권한을 가지고 있는지 조사한다.&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;&lt;br /&gt;
METHOD_OUT_DIRECT - I/O 관리자는 I/O를 요청한 스레드가 출력 버퍼에 대한 쓰기 권한을 가지고 있는지 조사한다.&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;
METHOD_NEITHER :&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; DeviceIoControl() 함수에서 제공되는 입력 버퍼와 출력 버퍼를 Neither I/O 방식으로 처리&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;IOCTL 코드에서 사용되는 버퍼링 방법에 대해 간단히 요약한 표&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/154661484E2E4390123FEA&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/154661484E2E4390123FEA&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;275&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-341-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>Access</category>
			<category>Buffered</category>
			<category>DeviceIoControl</category>
			<category>DeviceType</category>
			<category>Direct</category>
			<category>DO_BUFFERED_IO</category>
			<category>DO_DIRECT_IO</category>
			<category>function</category>
			<category>I/O</category>
			<category>ioctl</category>
			<category>Method</category>
			<category>METHOD_BUFFERED</category>
			<category>METHOD_IN_DIRECT</category>
			<category>METHOD_NEITHER</category>
			<category>METHOD_OUT_DIRECT</category>
			<category>neither</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/341</guid>
			<comments>http://ezbeat.tistory.com/341#entry341comment</comments>
			<pubDate>Tue, 26 Jul 2011 12:05:08 +0900</pubDate>
		</item>
		<item>
			<title>.text section disasm</title>
			<link>http://ezbeat.tistory.com/340</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;예전에 1010으로된 Opcode를 손으로 직접 ModR/M Byte표와 SIB Byte를 표를 봐가며 어셈코드로 바꿔본적이 있다. 하지만 이걸 자동화 툴로 만든다는건 엄청난 시간적 노력이 필요하다. 마침 문서를 읽다가 이러한 모듈이 이미 제공되고 있다는 것을 알고 그것을 토대로 간단한 프로그램을 만들어보았다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;쓸모는 없지만 나중에 기회가 되면 OllyDbg처럼 멋지게 만들어보고 싶다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;disasm을 하는데 있어서 사용한 코드는 PVDasm 이라는 툴에서 사용하는 엔진 코드를 가져왔다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;해당 코드는 인터넷에서 찾아보면 쉽게 구할 수 있을 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;내가 만든 툴은 이렇다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;argv[1]에 타겟 프로그램을 올리고 실행&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;해당 파일에서 .text섹션에 있는 코드만 전부 디스어셈블&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;링 해준다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;consol창에서 보여주는건 한계가 있어서 파일로 저장도 하게끔 해놓았다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock dual&quot; style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;margin: 0 auto;&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://cfile26.uf.tistory.com/original/136DFA534E2D81852D608C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile26.uf.tistory.com/image/136DFA534E2D81852D608C&quot; alt=&quot;&quot; height=&quot;267&quot; width=&quot;336&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://cfile9.uf.tistory.com/original/117C69534E2D8186218CFE&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile9.uf.tistory.com/image/117C69534E2D8186218CFE&quot; alt=&quot;&quot; height=&quot;259&quot; width=&quot;336&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;왼쪽 그림은 올리디버거에서 켜본것이고 오른쪽은 내가 만든 툴이 읽어서 변환한 내용이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;심심하신 분들은 테스트해보세요.;;&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://ezbeat.tistory.com/attachment/cfile30.uf@1931CE3F4E2D865A264210.exe&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/exe.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; .text_disasm.exe&lt;/a&gt;&lt;/div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-340-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Program</category>
			<category>.text</category>
			<category>consol</category>
			<category>disasm</category>
			<category>Disassemble</category>
			<category>OllyDbg</category>
			<category>pvdasm</category>
			<category>Section</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/340</guid>
			<comments>http://ezbeat.tistory.com/340#entry340comment</comments>
			<pubDate>Tue, 26 Jul 2011 00:07:15 +0900</pubDate>
		</item>
		<item>
			<title>Data Read/Write in Cache</title>
			<link>http://ezbeat.tistory.com/339</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;프로젝트 때문에 파일 시스템 필터 드라이버를 만들어봐야되는데 파일 시스템 필터 드라이버 같은 경우는 캐시 개념이 빠질수가 없습니다. 그래서 책 공부하다가 중요한 내용이 나와 정리 차원에서 올려봅니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;====================================================================================================&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;데이터의 처리와 관련된 부분은 데이터 읽기와 쓰기 과정에서 거의 처리&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;된다. 그리고 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;나머지 부분은 캐시 관리자가 제공하는 함수들의 사용법만 이해&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하면 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;데이터 읽기 동작&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/17032E584E1AE642304954&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/17032E584E1AE642304954&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;690&quot; width=&quot;587&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;lt;출처 : 드라이버 개발자를 위한 윈도우 파일 시스템 - 데이터 읽기 동작&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;항상 애플리케이션에서 전달되는 모든 동작은 I/O 관리자를 거쳐 파일 시스템 드라이버에 전달된다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이제 각 번호를 설명하겠다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;1. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;애플리케이션이 ReadFile() Win32 API 함수를 사용하여 데이터 읽기 동작을 요청하고, 제어는 커널에 있는 I/O 관리자에 전달된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;2.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; &amp;nbsp;I/O 관리자는 애플리케이션에서 전달된 데이터 읽기 동작에 대한 IRP를 생성한 뒤 이를 직접 적절한 파일 시스템 드라이버에 전달한다. &lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;애플리케이션과 데이터를 주고받기 위해 사용되는 메모리 관리 기법에는 세 가지 방식이 있다. 첫째는 사용자가 유저 모드에서 할당된 메모리의 내용을 커널 모드의 시스템 가상 주소 공간으로 복사하는 Buffered 방식이다. 둘째는 입출력 관리자가 사용자 버퍼를 가리키는 MDL(Memory Descriptor List)을 할당하고 MDL과 관련된 페이지를 보호하는 방식을 택함으로써 데이터의 복사 과정 없이 직접 유저 모드에서 할당된 메모리와 데이터를 주고받는 DMA 방식이다. 마지막은 유저 모드에서 할당된 가상 주소를 I/O 관리자가 수정하지 않은 상태로 파일 시스템 드라이버에 전달하는 Neither 방식이다. 일반적으로 대부분의 파일 시스템 드라이버와 통신을 하기 위해 사용되는 방식은 MDL이며, 가끔 Neither 방식을 사용하는 경우도 있다. 단, Neither 방식을 선택한 경우에는 항상 스레드 컨텍스트가 유저 모드 컨텍스트와 일치해야 한다.&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;3. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;파일 시스템 드라이버가 데이터 읽기 요청을 받고 Buffered 액세스를 위해 오픈된 파일에 직접 데이터 읽기 동작을 지시한다. 이 경우 데이터 읽기 동작을 실행하고자 하는 파일이 캐싱되지 않았다면 (FileObject-&amp;gt;PrivateCachedMap == NULL) 파일 시스템 드라이버가 캐시 관리자를 호출하여 파일에 대한 캐싱을 초기화하고, 캐시 관리자는 VMM(Virtual Memory Manager)에 캐시된 파일을 위해 파일 매핑(섹션 오브젝트)을 생성하도록 지시한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;4. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;파일 시스템 드라이버는 캐시 관리자에서 제공하는 CcCopyRead() 함수를 사용하여 데이터 읽기 요청을 캐시 관리자에게 전달한다. 캐시 관리자는 이 요청을 받은 후 사용자 버퍼에 데이터를 전달하기 위해 필요한 모든 단계를 담당한다. 이후 데이터를 캐싱하기 위한 단계는 전적으로 캐시 관리자가 담당한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;5.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자는 파일의 데이터 구조를 검사하고, 사용자가 요청한 데이터 영역의 값에 대한 매핑된 뷰가 있는지 결정한다. 이때 매핑된 뷰가 없으면 캐시 관리자는 매핑된 뷰를 생성한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;6.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자는 매핑된 뷰에서 사용자 버퍼로 메모리 복사를 수행한다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;7. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;파일의 매핑된 뷰가 실제 요구된 데이터를 포함하는 물리 페이지와 연결되어 있지 않으면 페이지 오류가 발생하고, 페이지 오류를 해결하기 위한 필요한 동작을 수행하도록 가상 메모리 관리자에 제어를 넘긴다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;8. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;VMM은 물리 페이지를 할당하고 I/O 관리자를 통해 파일 시스템 드라이버에 물리 디스크에서 데이터를 읽기 위한 I/O(Non-cached Paging I/O Read) 요청을 전달한다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;9.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; Non-cached 데이터 읽기 요청을 받은 파일 시스템 드라이버는 하드 디스크와 같은 보조 저장 장치에 있는 데이터를 얻기 위한 I/O 요청을 생성한다. 그리고 새로 생성된 I/O 요청을 디스크 드라이버나 SCSI 드라이버와 같은 실제 보조 저장 장치를 관리하는 하위 레벨 드라이버에 전달한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;10.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 계층 구조상 파일 시스템 드라이버 아래에 위치하는 디스크 드라이버와 같은 하위 레벨 드라이버가 보조 저장 장치에서 데이터를 얻고 I/O 요청을 종료한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;11.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 파일 시스템 드라이버는 가상 메모리 관리자가 요구한 페이징 I/O 요청을 종료하고, 제어를 가상 메모리 관리자에 전달한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;12.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 페이지 오류를 발생시켰던 명령을 다시 실행한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;13.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자는 파일의 매핑된 뷰에서 사용자 버퍼로 데이터 복사를 완료한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;14.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자는 캐시된 데이터를 사용자 버퍼로 복사한 후, 제어를 파일 시스템 드라이버에 전달한다. 이때 데이터는 아직 캐시 관리자가 사용하기 위한 가상 주소 공간에 캐시된 상태로 남아 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;15.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 파일 시스템 드라이버는 I/O 관리자가 처음에 전달한 IRP에 대한 처리를 종료한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;16.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; I/O 관리자가 데이터 읽기 요청을 완료한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801fbf&quot;&gt;데이터 저장 동작&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile8.uf.tistory.com/original/18143C584E1AE64203D1C9&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile8.uf.tistory.com/image/18143C584E1AE64203D1C9&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;776&quot; width=&quot;668&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;lt;출처 : 드라이버 개발자를 위한 윈도우 파일 시스템 - 데이터 쓰기 동작&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;데이터 저장 동작은 위에서 설명한 데이터 읽기 동작과 유사하다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;1.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 애플리케이션이 WriteFile() Win32 API 함수를 호출하여 데이터 저장을 요청하고, 제어는 커널에 있는 I/O 관리자로 이동한다. &lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;2.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; I/O 관리자가 IRP를 생성하여 적절한 파일 시스템 드라이버에 직접 데이터 저장 요청 명령을 전달한다. 이때 사용되는 버퍼의 관리 방식은 데이터 읽기 동작과 동일하다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;3.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 파일 시스템 드라이버는 Buffered 액세스를 위해 오픈된 파일에 직접 데이터 저장을 지시한다. 이때 데이터 저장을 실행하는 파일이 캐싱되지 않았다면 &amp;nbsp;파일 시스템 드라이버가 캐시 관리자를 호출함으로써 파일을 캐싱할 것을 지시한다. VMM는 캐시된 파일에 대한 파일 매핑(섹션 오브젝트)을 생성한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;4. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;파일 시스템 드라이버는 캐시 관리자가 제공하는 CcCopyWrite() 함수를 사용하여 데이터 저장 요청을 캐시 관리자에 전달한다. &amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;5.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자는 데이터 구조를 검사하고, 사용자가 수정한 데이터 영역을 포함하는 파일에 대한 매핑된 뷰가 어디에 있는지 결정한다. 만약 매핑된 뷰가 없으면 캐시 관리자가 파일에 대해 매핑된 뷰를 새로 생성한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;6. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;캐시 관리자가 메모리 복사를 구현한다. 이때 메모리 복사는 사용자 버퍼에서 파일의 매핑된 뷰와 연관된 가상 주소 공간으로 이루어진다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;7. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;가상 주소 영역이 물리 페이지와 연결되어 있지 않다면 페이지 오류가 발생하는데 이를 해결하기 위해 VMM로 제어가 이동한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;8. &lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;VMM는 요청된 데이터를 저장하기 위하여 사용될 물리 페이지를 할당한다. 사용자가 전체 페이지를 덮어 씌울 경우에는 캐시 관리자나 가상 메모리 관리자가 데이터를 수정하기 전에 디스크와 분리되어 이미 물리 페이지에 있는 데이터는 읽지 않는다. 그러나 일부 페이지가 수정되었다면 페이지의 수정이 허락되기 전에 VMM는 페이지 오류를 처리하기 위해 데이터 읽기 위한 페이징 I/O(Paging I/O Read) 요청을 발생시킨다. 페이지 오류를 처리한 후 페이지 오류를 발생시켰던 명령이 다시 실행된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;9.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자가 사용자 버퍼에서 파일의 매핑된 뷰와 연관된 가상 주소 영역으로 데이터의 복사를 완료한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;10.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자가 제어를 파일 시스템 드라이버로 전달한다. 이때 사용자 데이터는 시스템 메모리에 있으며, 아직 보조 저장 장치에 전달하지 않은 상태이다. 실질적인 보조 저장 장치로의 저장은 캐시 관리자가 나중에 처리한다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;11.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 캐시 관리자가 데이터 저장 요청을 종료한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;12.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; 파일 시스템 드라이버는 I/O 관리자가 처음에 전달한 IRP를 종료하고, IRP의 종료 메시지를 I/O 관리자에 전달한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#e31600&quot;&gt;13.&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; I/O 관리자가 사용자 데이터 저장 요청을 완료한다.&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-339-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Programming&amp;Theory</category>
			<category>cache</category>
			<category>Cache Manager</category>
			<category>CcCopyRead</category>
			<category>CcCopyWrite</category>
			<category>File System Driver</category>
			<category>FileObject</category>
			<category>I/O Manager</category>
			<category>IRP</category>
			<category>PrivateCachedMap</category>
			<category>Read</category>
			<category>ReadFile</category>
			<category>Virtual Memory Manager</category>
			<category>write</category>
			<category>WriteFile</category>
			<category>파일 시스템 드라이버</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/339</guid>
			<comments>http://ezbeat.tistory.com/339#entry339comment</comments>
			<pubDate>Tue, 12 Jul 2011 10:40:23 +0900</pubDate>
		</item>
		<item>
			<title>Code Virtualized</title>
			<link>http://ezbeat.tistory.com/338</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;U3에서 발표 후 기술문서로 만든다는 것을 이제서야 만드네요.&lt;br /&gt;
&lt;br /&gt;안티리버싱 기법 중 코드 가상화 기법에 대한 기술문서 입니다.&lt;br /&gt;
아래는 목차입니다.&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile26.uf.tistory.com/original/12720C404E086ECF1C73B2&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile26.uf.tistory.com/image/12720C404E086ECF1C73B2&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;706&quot; width=&quot;494&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://ezbeat.tistory.com/attachment/cfile2.uf@205B0B414E086EF92F37A3.pdf&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/pdf.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Code Virtualized.pdf&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-338-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Reversing</category>
			<category>anti</category>
			<category>Code Virtualized</category>
			<category>reversing</category>
			<category>가상화</category>
			<category>코드 가상화</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/338</guid>
			<comments>http://ezbeat.tistory.com/338#entry338comment</comments>
			<pubDate>Mon, 27 Jun 2011 20:53:36 +0900</pubDate>
		</item>
		<item>
			<title>PKCS 용도</title>
			<link>http://ezbeat.tistory.com/337</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;먼저 공개키 암호의 용도를 알아보기 전에 표기 방법에 대해서 설명하겠다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;A의 공개키로 메시지 M을 암호화&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; : C = {M}&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;A&lt;/span&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;
A의 개인키로 암호문 C를 복호화&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; : M = [C]&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;A&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
서명은 복호화와 같은 연산이다. 그래서 &lt;/font&gt;&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;A의 메시지 M 서명(서명된 메시지)&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; : S = [M]&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;A&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;암호화와 &amp;nbsp;복호화는 역 역산&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이므로 아래와 같이 표현이 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;[{M}&lt;span style=&quot;font-size: 8pt; &quot;&gt;A&lt;/span&gt;]&lt;span style=&quot;font-size: 8pt; &quot;&gt;A&lt;/span&gt; = &amp;nbsp;{[M]&lt;span style=&quot;font-size: 8pt; &quot;&gt;A&lt;/span&gt;}&lt;span style=&quot;font-size: 8pt; &quot;&gt;A &lt;/span&gt;= M&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;
공개키 암호 용도&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
대칭키 암호가 할 수 있는 일은 모두 공개키 암호로 수행할 수 있다. 단점이라면 처리속도가 느리다는 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
하지만 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;공개키 암호는 대칭키 암호화 비교해 두 가지 중요한 장점을 제공&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;1. 공개키 암호는 미리 공유 키를 설정할 필요가 없다는 점&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
2. 전자서명은 무결성뿐만 아니라 부인봉쇄(Non-Repudiation)를 제공하는 것&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;쫌 있다가 위 두가지 장점에 대해서 알아보도록 하자.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;&lt;br /&gt;
현실 세계에서의 보안성&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
실제로 우리가 사용하고 있는 암호체계는 어떻게하는게 좋을까??&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;대칭키 암호의 장점과 공개키 암호의 장점을 섞은 합성 암호체계를 구성하는 것&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
즉, &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;공개키 암호처럼 키를 공유하지 않으면서 대칭키 암호의 효율성을 취하는 것&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;공개키 암호는 대칭키를 설정하기 위해 사용하고&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
대칭키는 데이터를 암호화하는데 사용하는 것이다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile27.uf.tistory.com/original/142C20564DEE06710EBE32&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile27.uf.tistory.com/image/142C20564DEE06710EBE32&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 1.jpg&quot; height=&quot;179&quot; width=&quot;622&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&amp;nbsp;위 그림에서 간단하게 설명하고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
먼저 대칭키에 사용될 키 K를 B에게 전해주어야 되는데 이 때 B의 공개키를 가지고 K를 암호화 시켜서 B에게 보낸다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
그리고 B는 B의 개인키를 사용해 복호화하면 A,B 두 사람은 키를 안전하게 공유하는 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
이제 공유된 키 값을 가지고 대칭키 암호체계를 사용해 메시지를 주고 받으면 되는 것이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;물론 위 그림은 취약한 부분이 있다. 실제로 A가 B에게 보내는 키 값은 B의 공개키로 암호화되는 것이기 때문에 누구나 연산이 가능하고, B는 그 값을 보낸 사람을 확인할 수가 없다. 이 때 안전하게 공유할 수 있는 방법은 다음에 설명하겠다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;서명과 부인봉쇄&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;공개키 암호는 대칭키 암호와 마찬가지로 무결성을 사용할 수 있다. 대칭키에서는 MAC이 무결성을 제공한다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하지만 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;공개키 서명은 무결성을 제공하면서 대칭키 암호가 제공할 수 없었던 부인봉쇄도 더불어 제공&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;한다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;먼저 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;대칭키가 제공하는 무결성을 살펴볼 예&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;를 들어보자.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;1. A가 주식 100장을 사기 위해 자신이 선호하는 증권 중개인 B에게 주문서를 제출&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;2. 자신의 주문에 대한 무결성을 확신하기 위해 A는 공유 대칭키 K를 사용해 MAC을 계산&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;3. A가 주문한 이후 B에게 대금을 지급하기 전에 그 주식이 80%나 가치가 떨어짐&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;4. A는 주문서를 제출하지 않았다고 주장 ( 거래를 부인 )&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;5. &amp;nbsp;B도 키 K를 가지고 있기 때문에 A가 제출한 주문서 위조 가능 ( A가 주문서 제출한 사실을 증명할 수 없다 )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;위 예제는 대칭키 암호 체계를 사용한 경우이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하지만 &lt;b&gt;MAC 계산 대신 전자서명을 사용하면 이러한 문제는 자연히 사라진다.&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A만이 자신의 개인키를 알고 있기 때문에 B는 그 받은 문서를 위조할 수 없다. 그러므로 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;전자서명은 무결성과 부인봉쇄 기능 모두를 제공&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;할 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;비밀성과 부인봉쇄&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A가 메시지 M을 B에게 보낸다고 하자.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 때 A는 비밀성과 부인봉쇄 두가지를 모두 하기 위해서 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;먼저 메시지 M을 B의 공개키로 암호화(비밀성)하고 자신의 개인키로 서명(부인봉쇄)을 했다고 하자.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러면 두 가지 전부 해결할 수 있는 방법으로 보인다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 때 A는 &lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;{[M]&lt;span style=&quot;font-size: 8pt; &quot;&gt;A&lt;/span&gt;}&lt;span style=&quot;font-size: 8pt; &quot;&gt;B&lt;/span&gt;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; ==&amp;gt; 메시지 M을 A의 개인키로 서명 후 B의 공개키로 암호화 ( 선서명 후암호화 )&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;[{M}&lt;span style=&quot;font-size: 8pt; &quot;&gt;B&lt;/span&gt;]&lt;span style=&quot;font-size: 8pt; &quot;&gt;A&lt;/span&gt;&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; ==&amp;gt; 메시지 M을 B의 공개키로 암호화 후 A의 개인키로 서명 ( 선암호화 후서명 )&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;두가지 방법을 생각해 볼 수 있는데 어떠한 방법이 더 좋을까?? ( 순서가 바뀌면 영향이 있을까? )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;예를 들어보자.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A가 B랑 사귀고 있다. 이 때 A는 B에게 메시지를 보낸다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&quot;나는 당신을 사랑해요~&quot;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;보내기 전 A는 &amp;nbsp;{[M]&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;A&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;B&amp;nbsp;&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;선서명 후암호화 한 후 B에게 보낸다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하지만 B는 장난끼가 발동해 B의 개인키를 사용해 해당 메시지에서 [M]A를 얻어낸다. ( 복호화 )&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그리고 해당 메시지를 {[M]&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;A&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 11px; line-height: 16px; color: rgb(0, 0, 0); &quot;&gt;c&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;(C의 공개키로 암호화)로 바꾼 후 C에게 보낸다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러면 C는 A를 보낸 메시지를 받고 A가 자기를 좋아하는지 알고 서로 당황하게 만들 수가 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그 사실을 안 A는 이제 암호화를 먼저 한 후 서명을 하기로 한다. (&amp;nbsp;[{M}&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;B&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;]&lt;/font&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(0, 0, 0); &quot;&gt;A&amp;nbsp;&lt;/span&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;)&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하지만 이 방법 또한 안전하지 않다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;짧게 설명하면 A의 공개키또한 전부 공개되어 있으므로 A가 서명한 내용을 제거할 수 있고 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;자신의 개인키로 서명을 해버리면 해당 메시지는 자기것이 되어버리기 때문이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;즉, 공개키 암호에서는 누구나 메시지를 암호화할 수 있고 누구나 서명을 검증 할 수 있다.&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-337-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Cryptography</category>
			<category>MAC</category>
			<category>pkcs</category>
			<category>개인키</category>
			<category>공개키</category>
			<category>대칭키</category>
			<category>무결성</category>
			<category>보안성</category>
			<category>복호화</category>
			<category>부인봉쇄</category>
			<category>비밀성</category>
			<category>서명</category>
			<category>암호화</category>
			<category>용도</category>
			<category>전자서명</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/337</guid>
			<comments>http://ezbeat.tistory.com/337#entry337comment</comments>
			<pubDate>Tue, 07 Jun 2011 20:14:25 +0900</pubDate>
		</item>
		<item>
			<title>ECC 디피-헬먼</title>
			<link>http://ezbeat.tistory.com/336</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;ECC 디피-헬먼은 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;DH의 ECC 버전&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;공개된 정보는 곡선과 곡선 상의 한 점으로 구성된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;y^2 = x^3 + 11x + b (mod 167)&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;다음 점 (x,y)를 선정하고 b를 이 점이 곡선 상에 위치하도록 결정&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;(x,y) = 2,7 &amp;nbsp; -&amp;gt; b = 19&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;최종적으로 공개된 정보&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;y^2 = x^3 + 11x + 19 (mod 167), 점 (2,7)&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;A와 B는 각각 자신들의 비밀 승수를 선정&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;한다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A의 비밀 승수 &lt;b&gt;a = 15&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;B의 비밀 승수 &lt;b&gt;b = 22&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러면 A는 다음과 같이 계산할 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;a(2,7) = 15(2,7) = (102,88)&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;15(2,7)은 (2,7) + (2,7) + ... + (2,7) 총 15회는 더하는 것과 같다.&lt;br /&gt;
타원곡선 암호에서 두 점을 더하는 방법은 전 글에서 해보았다.&amp;nbsp;&lt;br /&gt;
&lt;a href=&quot;http://ezbeat.tistory.com/335&quot; target=&quot;_blank&quot; title=&quot;[http://ezbeat.tistory.com/335]로 이동합니다.&quot;&gt;http://ezbeat.tistory.com/335&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/a&gt;하지만 (102,88)을 보면 타원곡선 내 없는 점 같이 보인다.&lt;br /&gt;
&lt;b&gt;y^2 = 1062349 mod 167 = 62 mod 167&lt;/b&gt;&lt;br /&gt;
하지만&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt; 62에서 167을 계속 더해가면 88의 제곱인 7744 값이 나오게 된다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;즉, &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;62 mod 167 = 7744 mod 167 ( 7744 = 88^2 )&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;위에서 본 15회의 덧셈을 손으로 한다는 것은 시간상 문제도 있으므로 프로그램을 짜서 돌리는게 훨씬 현명하다.&lt;br /&gt;
ECC에서 두 점 합을 구하는 프로그램을 만들어 보았다. 단순히 두 점의 합을 구하는 것이기 때문에&lt;br /&gt;
15회의 덧셈을 위해선 입력을 몇 번 더 해주어야한다. 코드이다.&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;more336_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;336_0&#039;,&#039;코드보기&#039;,&#039;접기&#039;); return false;&quot;&gt;코드보기&lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content336_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&lt;textarea name=&quot;code&quot; class=&quot;cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;math.h&amp;gt;
#include &amp;lt;Windows.h&amp;gt;

enum {
	GREY = 0x7,
	WHITE = 0xF,
	GREEN = 0xA,
	CYAN = 0xB,
	RED = 0xc,
	YELLOW = 0xE
};

typedef struct point{
	int x;
	int y;
}point;

int mod(int num,int p, int flag);
int GetM(point p1, point p2,int a,int p);
void Set_Color_Console(WORD color);

int main(void)
{
	int a,b;
	point p1,p2,p3;
	int m;
	int p;
	int y_2;
	int y_2_mod;

	int count = 0;

	printf(&quot;타원곡선 생성 (E : y^2 = x^3 + ax + b) \n&quot;);
	printf(&quot;a : &quot;);
	scanf(&quot;%d&quot;,&amp;amp;a);
	printf(&quot;b : &quot;);
	scanf(&quot;%d&quot;,&amp;amp;b);

	printf(&quot;\n&quot;);

	printf(&quot;mod p : &quot;);
	scanf(&quot;%d&quot;,&amp;amp;p);

	printf(&quot;\n&quot;);
	
	while(1)
	{
		memset(&amp;amp;p1,0,sizeof(point));
		memset(&amp;amp;p2,0,sizeof(point));
		memset(&amp;amp;p3,0,sizeof(point));
		Set_Color_Console(WHITE);
		printf(&quot;★더할 두 점을 입력하세요 \n&quot;);
		Set_Color_Console(GREY);
		printf(&quot;p1 : &quot;);
		scanf(&quot;%d %d&quot;,&amp;amp;(p1.x),&amp;amp;(p1.y));
		printf(&quot;p2 : &quot;);
		scanf(&quot;%d %d&quot;,&amp;amp;(p2.x),&amp;amp;(p2.y));

		if(p2.x - p1.x &amp;lt; 0)
		{
			Set_Color_Console(RED);
			printf(&quot;두 점을 바꿔서 다시 입력해주세요. ( x2-x1 &amp;lt; 0 ) \n&quot;);
			Set_Color_Console(GREY);
			fflush(stdin);
			continue;
		}

		printf(&quot;\n&quot;);

		Set_Color_Console(GREEN);
		printf(&quot;타원곡선 : E : y^2 = x^3 + %dx + %d (mod %d) \n&quot;,a,b,p);
		Set_Color_Console(GREY);
		printf(&quot;p1 : (%d,%d) \np2 : (%d,%d) \n&quot;,p1.x,p1.y,p2.x,p2.y);

		m = GetM(p1,p2,a,p);
		printf(&quot;m : %d \n\n&quot;,m);

		p3.x = m * m - p1.x - p2.x;
		p3.x = mod(p3.x,p,0);
		p3.y = m * (p1.x - p3.x) - p1.y;
		p3.y = mod(p3.y,p,0);

		printf(&quot;P1 + P2 = P3 : &quot;);
		Set_Color_Console(CYAN);
		printf(&quot;(%d,%d) \n\n&quot;,p3.x,p3.y);
		Set_Color_Console(GREY);

		y_2 = (p3.x * p3.x * p3.x) + (a * p3.x) + b;
		printf(&quot;y^2 = %d \n&quot;,y_2);
		y_2_mod = mod(y_2,p,0);
		printf(&quot;y^2 mod %d = %d mod %d \n\n&quot;,p,y_2_mod,p);
	}	

	//타원곡선 위의 점 중에 정수가 되는 p3.y값 찾음 ( 보류 )
/*
	while(1)
	{
		temp = sqrt((double)y_2_mod);
		if((temp - (int)temp) != 0)
		{
			y_2_mod += p;
		}
		else
		{
			p3.y = (int)temp;
			break;
		}
	}

	printf(&quot;타원곡선 위의 정수인 점 \n&quot;);
	printf(&quot;P3 : (%d,%d) \n&quot;,p3.x,p3.y);	
*/

	return 0;
}

//(음수)^-1 처리는 안되어 있음
int mod(int num,int p, int flag)
{
	//+,- mod 연산
	if(flag == 0)
	{
		int count = 0;

		//- mod
		if(num &amp;lt; 0)
		{
			num *= -1;
			while(1)
			{				
				if(((num + count++) % p) == 0)
				{
					num = --count;
					count = 1;
					break;
				}
			}
		}
		//+ mod
		else
			num %= p;

		return num;
	}
	//revers_mod 연산 ^-1 되어 있는 것
	else if(flag == 1)
	{
		int count = 1;

		//^-1 mod
		do 
		{
			if((num*count % p) == 1)
			{
				num = count;
				break;
			}
		} while (count++);

		return num;
	}

	return -1;
}

int GetM(point p1, point p2,int a,int p)
{
	int count = 0;

	if(p1.x == p2.x &amp;amp;&amp;amp; p1.y == p2.y)
	{
		//입력 시 tmp2는 음수가 안되도록
		int tmp1 = 3 * (p1.x * p1.x) + a;
		int tmp2 = 2 * p1.y;

		tmp1 = mod(tmp1,p,0);
		tmp2 = mod(tmp2,p,1);

		return ((tmp1 * tmp2) % p);
	}
	else
	{
		//입력 시 tmp2는 음수가 안되도록. 즉, 두번째 x값이 첫번째 x값 보다 크게끔 입력
		int tmp1 = p2.y - p1.y;
		int tmp2 = p2.x - p1.x;

		tmp1 = mod(tmp1,p,0);
		tmp2 = mod(tmp2,p,1);

		return ((tmp1 * tmp2) % p);
	}

	return -1;
}

void Set_Color_Console(WORD color)
{
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsole,color);
}
&lt;/textarea&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;
&lt;/font&gt;&lt;/div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A는 이 결과를 B에게 보낸다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;B도 다음과 같이 계산하고 그 결과를 A에게 보낸다.&lt;/font&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;b(2,7) = 22(2,7) = (9,43)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A는 다음과 같이 자신의 비밀 승수 a를 B에게서 받은 값에 곱한다.&lt;/font&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;a(9,43) = 15(9,43) = (131,140)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;B도 유사한 방식으로 다음과 같이 계산한다.&lt;/font&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;b(102,88) = 22(102,88) = (131,140)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이렇게 하여 A와 B는 대칭키로 사용하기에 적절한 비밀정보를 공유하게 된다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;이것이 가능한 것은 AB(2,7) = BA(2,7) 이기 때문&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다. &lt;b&gt;( 간략한 그림 )&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/1673793D4DE8831238B4E2&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/1673793D4DE8831238B4E2&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 5.jpg&quot; height=&quot;284&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
이러한 DH ECC도 중간자 공격에 취약하기는 마찬가지이다.&lt;br /&gt;
&amp;nbsp;&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-336-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Cryptography</category>
			<category>ECC</category>
			<category>곡선</category>
			<category>공개키</category>
			<category>디피</category>
			<category>승수</category>
			<category>암호</category>
			<category>타원곡선</category>
			<category>헬먼</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/336</guid>
			<comments>http://ezbeat.tistory.com/336#entry336comment</comments>
			<pubDate>Fri, 03 Jun 2011 15:46:18 +0900</pubDate>
		</item>
		<item>
			<title>타원곡선 암호</title>
			<link>http://ezbeat.tistory.com/335</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&quot;타원곡선&quot;은 특정한 암호체계가 아니다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;&lt;b&gt;타원곡선&lt;/b&gt;들은 공개키 암호체계에서 요구되는 복잡한 수학 연산을 수행하는 또 다른 방법을 단순히 제공하는 것&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;타원곡선 암호(ECC)&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;장점 :&lt;/b&gt; 타원곡신인 경우가 아닌 경우와 비교해 같은 수준의 보안성을 위해 필요한 비트 수가 적다는 것&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;단점 :&lt;/b&gt; 타원곡선이 복잡해 타원곡선의 수학에는 비용이 다소 더 든다는 점&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러나&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt; 전체적으로 볼 때 타원 곡선은 계산적 장점을 제공&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그래서 ECC는 휴대용 장비 같은 자원이 제한되는 환경에서 특별히 선호된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;타원곡선 E는 아래 함수 그래프의 형태이다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;E : y^2 = x^3 + ax + b&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;∞로 표현되는 무한대의 특수한 점도 함께 포함한다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile26.uf.tistory.com/original/19164E334DE84B74331989&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile26.uf.tistory.com/image/19164E334DE84B74331989&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 4.jpg&quot; height=&quot;420&quot; width=&quot;475&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;위 그림은 타원곡선 상에서 두 점의 함을 찾는데 사용되는 방법도 설명하고 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;두 점 P1, P2 더하기 위해 두 점을 지나는 선&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;을 그린다. 일반적으로 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;그 선은 곡선상에서 서로 다른 점과 만난다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;만약 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;그렇게 만나면 이 다른 점은 x축에 반사되어 그 합을 P3으로 얻는다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;P3 = P1 + P2&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;타원곡선에서 필요한 유일한 수학은 바로 덧셈이다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;암호를 위해 점들의 이산 집합이 요구&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이것은 다음과 같이 원래의 타원곡선 공식에 &quot;mod p&quot;를 더하면 수행될 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;y^2 = x^3 + ax + b (mod p)&lt;/font&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;예를 들어 아래의 타원곡선을 생각해 보자.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;y^2 = x^3 + 2x + 3 (mod 5) &amp;nbsp; --- ①&lt;br /&gt;
&lt;br /&gt;
이 곡선 상의 모든 점 (x,y)에 대해 가능한 x값과 이와 일치하는 y값을 계산해 나열해 보자.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
x = 0 ==&amp;gt; y^2 = 3 ==&amp;gt; 해가 없음 mod 5&lt;br /&gt;
x = 1 ==&amp;gt; y^2 = 6 = 1 ==&amp;gt; y = 1,4 mod 5&lt;br /&gt;
x = 2 ==&amp;gt;&amp;nbsp;y^2 = 15 = 0 ==&amp;gt; y = 0 mod 5&lt;br /&gt;
x = 3 ==&amp;gt;&amp;nbsp;y^2 = 36 = 1 ==&amp;gt; y = 1,4 mod 5&lt;br /&gt;
x = 4 ==&amp;gt;&amp;nbsp;y^2&amp;nbsp;&amp;nbsp;= 75 = 0 ==&amp;gt; y = 0 mod 5&lt;br /&gt;
&lt;br /&gt;
① 식의 타원곡선 상의 점들은 다음과 같다.&lt;br /&gt;
(1,1), (1,4), (2,0), (3,1), (3,4), (4,0),&amp;nbsp;∞&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
이제 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;두 점을 합하는 알고리즘&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;을 살펴보자&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(231, 253, 181); border-right-color: rgb(231, 253, 181); border-bottom-color: rgb(231, 253, 181); border-left-color: rgb(231, 253, 181); background-color: rgb(231, 253, 181); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;주어진 조건 :&lt;/b&gt; 곡선 &amp;nbsp;E:&amp;nbsp;y^2 = x^3 + ax + b (mod p)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; E 상에서 P1 = (x1,y1), P2 = (x2,y2)&lt;br /&gt;
&lt;b&gt;구하고자 하는 해:&lt;/b&gt; P3 = (x3,y3) = P1 + P2&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;알고리즘&lt;/b&gt;&lt;br /&gt;
x3 = m^2 - x1 - x2 (mod p)&lt;br /&gt;
y3 = m(x1 - x3) - y1 (mod p)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;m 값&lt;/b&gt;&lt;br /&gt;
만약 P1과 P2가 같지 않다면 (if P1 ≠ P2)&lt;br /&gt;
(y2 - y1) * (x2 - x1)^-1 mod p&lt;br /&gt;
만약 P1과 P2가 같다면 (if P1 = P2)&lt;br /&gt;
(3x1^2+a) * (2y1)^-1 mod p&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;특수한 경우 1 :&lt;/b&gt; if m = ∞ 이면 P3 = ∞&lt;br /&gt;
&lt;b&gt;특수한 경우 2 :&lt;/b&gt; 모든 점 P는 ∞ + P = P &amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;예제 문제&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; ( 위 에서 사용한 E 곡선 그대로 사용 mod 5 )&lt;br /&gt;
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(254, 222, 199); border-right-color: rgb(254, 222, 199); border-bottom-color: rgb(254, 222, 199); border-left-color: rgb(254, 222, 199); background-color: rgb(254, 222, 199); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;P3 = (1,4) + (3,1)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;m&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; = (1 - 4) * (3 - 1)^-1 mod 5 = -3 * 2^-1 mod 5 = -3 mod 5 * 2^-1 mod 5 = (2 * 3) mod 5 = 6 mod 5 = 1 mod 5&lt;/font&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;m&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; = 1&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;x3&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; = 1^2 - 1 - 3 = -3 mod 5 = &lt;/font&gt;&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;2 &lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;mod 5&lt;/font&gt;&lt;br /&gt;
&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;y3&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; = 1 * (1 - 2) - 4 = -5 mod 5 = &lt;/font&gt;&lt;b style=&quot;color: rgb(0, 0, 0); &quot;&gt;0&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt; mod 5&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;P3 = (2,0)&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;P3 점도 y^2 = x^3 + 2x + 3 (mod 5)이 곡선 위의 한 점이라는 것을 확인&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;할 수 있다.&lt;br /&gt;
0 = &amp;nbsp;8 + 4 + 3 = 15 mod 5 = 0 mod 5&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
이제 타원곡선 상에서 덧셈을 할 수 있으므로 다음 글에선 ECC 디피-헬먼(디피-헬먼 타원곡선 암호 버전)에 대해 알아보겠다.&lt;/font&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-335-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Cryptography</category>
			<category>e</category>
			<category>ECC</category>
			<category>mod</category>
			<category>개인키</category>
			<category>공개키</category>
			<category>암호</category>
			<category>암호화</category>
			<category>이산 집합</category>
			<category>타원곡선</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/335</guid>
			<comments>http://ezbeat.tistory.com/335#entry335comment</comments>
			<pubDate>Fri, 03 Jun 2011 14:00:30 +0900</pubDate>
		</item>
		<item>
			<title>디피-헬먼 키교환 알고리즘</title>
			<link>http://ezbeat.tistory.com/334</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;디피-헬먼(DH) 키교환 알고리즘은 GCHQ의 윌리엄슨에 의해 발명&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;되었다. 그러다가 곧 독립적으로, 이름에서 짐작할 수 있듯이 화이트필즈 디피와 마틴 헬먼에 의해 재발명되었다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;DH는 암호화나 서명을 위해 사용되는것이 아니라 사용자가 비밀 공유를 설정하는 데 사용&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;된다. &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;대칭키 암호의 근본적인 문제 중 하나가 키 설정의 문제이기 때문에 그 의미는 크다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;대칭키 암호에서 송수신자간 대칭된 키를 공유해야 되는데 이 때 키교환 시 사용한다는 말이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;DH의 보안성은 이산 로그 문제의 계산 난이도에 의존한다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이산 로그 문제는 비록 NP-complete 문제로 알려져 있지는 않지만 인수분해 문제처럼 풀기가 매우 어렵다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;DH 의 수학적 표현은 상대적으로 단순하다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;p를 소수라하고 q는 생성자라 하자.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;여기서 어떤 x ∈ {1,2, ... ,p-1}에 대해 x = g^n mod p 를 만족하는 지수 n을 찾을 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;p의 값과 생성자 q는 공개&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;되어 있다.&lt;br /&gt;
이제 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;키 교환을 위해 A는 자신의 비밀 지수 a를 생성하고, B는 그의 비밀 지수 b를 생성&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;한다.&lt;br /&gt;
A는 &lt;b&gt;(g^a mod p)&lt;/b&gt;를 B에게 보내고 B는 &lt;b&gt;(g^b mod p)&lt;/b&gt;를 A에게 보낸다. 이어서 A는 다음을 계산한다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(g^b)^a mod p = g^ab mod p&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
B도 유사한 방법으로 다음을 계산한다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(g^a)^b mod p = g^ab mod p&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
그러면&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt; &lt;b&gt;(g^ab mod p)&lt;/b&gt; 가 공유한 비밀이 되어 통상적인 대칭키로 사용&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;될 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile26.uf.tistory.com/original/170A5A3F4DE824D7173A53&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile26.uf.tistory.com/image/170A5A3F4DE824D7173A53&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 2.jpg&quot; height=&quot;172&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 때 &lt;/font&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;공격자 C&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;는 중간에&amp;nbsp;(g^b)^a mod p,&amp;nbsp;(g^a)^b mod p 를 볼 수 있기 때문에 (g^ab mod p) 를 거의 알 수 있는 것처럼 보이지만 C는 &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;g^a * g^b = g^(a+b) ≠ g^ab mod p&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;위가 성립하기 때문에 쉽게 알 수가 없다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;C는 어려운 이산 로드 문제를 풀기 위해 필요한 a나 b를 찾아야한다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이러한 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;DH 알고리즘은 중간자 공격에 민감&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;하다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이것은&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt; C가 직접 A와 B 중간에 서서 오가는 메시지를 가로채는 능동적인 공격&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;C가 앞서 말한 위치에 있으면 A와 B 간의 DH교환은 부서질 수 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;div class=&quot;imageblock&quot; style=&quot;display:inline;&quot;&gt;&lt;a href=&quot;http://cfile25.uf.tistory.com/original/162E85404DE8428F0877C6&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile25.uf.tistory.com/image/162E85404DE8428F0877C6&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;사용자 지정 3.jpg&quot; height=&quot;135&quot; width=&quot;683&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이렇게 되면 A나 B둘 중 누구도 잘못된 것을 알지 못하고 있는 사이에 C는 A와 B간에 오가는 모든 메시지를 읽고 변경할 수 있게 된다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이러한 중간자 공격을 어떻게 막을 수 있을까??&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;1. 공유하는 대칭키로 DH교환을 암호화&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;2. 공개키로 DH교환을 암호화&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;3. 개인키로 DH값을 서명&amp;nbsp;&lt;/font&gt;&lt;/b&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-334-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-fr/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-fr/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Cryptography</category>
			<category>GCHQ</category>
			<category>mod</category>
			<category>대칭키</category>
			<category>디피</category>
			<category>비밀</category>
			<category>서명</category>
			<category>암호화</category>
			<category>윌리엄슨</category>
			<category>키교환</category>
			<category>헬먼</category>
			<author>Ezbeat</author>
			<guid>http://ezbeat.tistory.com/334</guid>
			<comments>http://ezbeat.tistory.com/334#entry334comment</comments>
			<pubDate>Fri, 03 Jun 2011 11:16:37 +0900</pubDate>
		</item>
		<item>
			<title>RSA</title>
			<link>http://ezbeat.tistory.com/333</link>
			<description>&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이번엔 배낭암호체계에 이어 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;표준 공개키 암호화 체계인 RSA 암호체계&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;에서 대해서 알아보겠다.&lt;br /&gt;
&lt;br /&gt;RSA라는 이름도 다른 유명한 공개키 암호체계처럼 이를 발명한 사람, &lt;br /&gt;
즉, &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;리베스트, 샤미르, 애들맨의 이름을 딴 것&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이다.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;사람이 큰 수들의 인수분해에 그렇게 많은 관심을 갖는 이유는 RSA의 보안성이 이러한 형태의 인수분해가 매우 어렵다는 사실에 근거를 두고 있기 때문이다. 그러나 인수분해 문제는 세일즈맨의 여행 문제처럼 확실하게 어려운 문제인지 여부는 알려져 있지 않다.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; color: rgb(0, 0, 0); &quot;&gt;&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;b&gt;세일즈맨의 여행 문제&lt;/b&gt;&lt;br /&gt;
많은 수의 도시가 있고 한 도시에서 다른 도시로의 여행 경비를 알고 있을 때, 각 도시를 한번씩만 방문한 후 출발한 도시로 되돌아오는데 가장 비용이 적게 드는 여행 경로를 찾는 것이다. Traveling Salesman Problem(TSP)로 알려져 있는데, 계산복잡도 이론 가운데 풀기 어려운 문제의 전형적인 예로 사용.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;&lt;b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;RSA&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;의 공개키와 개인키 쌍을 생성하기 위해 두 개의 큰 소스 p와 q를 선택하고 그 둘의 곱 N = pq를 계산한다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;다음 (p-1)(q-1) 에 서로 소인 e를 선택하고 &quot;e mod (p-1)(q-1)&quot; 에 대한 역곱수를 계산한다. &lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 e의 역수를 d로 표기하자.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이제 N = pq, ed = 1 mod (p-1)(q-1)을 만족하는 e와 d를 가진다.&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;N은 계수, e는 암호화 지수, d는 복호화 지수&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;공개키: (N,e), 개인키 : d&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;암호화&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;C = M^e mod N&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;복호화&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;M = C^d mod N&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(231, 253, 181); border-right-color: rgb(231, 253, 181); border-bottom-color: rgb(231, 253, 181); border-left-color: rgb(231, 253, 181); background-color: rgb(231, 253, 181); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt;RSA 예제&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A는 &amp;nbsp;p = 11, q = 3 선정&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;계수 N = 11 * 3 = 33&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;(p-1) * (q-1) = 20&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;20과 서로 소가 되는 암호화 지수 e = 3 선정&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;e^-1 mod (p-1)(q-1) = 3^-1 mod 20 = 7 = d&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;공개키 : (33,3), 개인키 : 7&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;B가 A에게 메시지 M = 15 보내려고 함.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;B는 A의 공개키인 (33,3)을 사용해 암호화 함.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;C = M^e mod N = 15^3 mod 33 = 9&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;A는 받은 C = 9를 캐인키 d = 7을 사용해 복호화&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;b&gt;M = C^d mod N = 9^7 mod 33 = 15&lt;/b&gt; &amp;nbsp;( 복호화 성공 )&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;&lt;br /&gt;
문제를 푸는 것을 보면 &lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;큰 지수승을 계산해야하는데 이를 쉽게 처리하는 방법&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;이 있다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#E31600&quot;&gt;제곱의 반복 기법&lt;/font&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;을 사용하는 것이다.&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;예를 들어&lt;/font&gt;&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#801FBF&quot;&gt; 5^20 mod 35&lt;/font&gt;&lt;/b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;를 계산해보자.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;보통 제곱의 반복 기법을 사용하지 않으면 mod 연산을 하기 전에 5를 20번 곱하고 있어야한다.&lt;/font&gt;&lt;br /&gt;
&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;그러면 수가 엄청 커지면서 계산하는데 많은 비용이 들어간다.&lt;/font&gt;&lt;br /&gt;
&lt;b&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;( 5^20 = 95,367,431,640,625 )&lt;/font&gt;&lt;/b&gt;&lt;br
