<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>-榮-</title>
    <link>https://honorlog.tistory.com/</link>
    <description>리버싱 공부 기록</description>
    <language>ko</language>
    <pubDate>Thu, 9 Jul 2026 08:09:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>xii.xxv</managingEditor>
    <item>
      <title>디버깅 실습4 - Debug Blocker  동작원리</title>
      <link>https://honorlog.tistory.com/46</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Debug Blocker&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Dubug Blocker &lt;/span&gt;&lt;span&gt;기법은 프로세스가 자기 자신&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;또는 다른 실행 파일&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;을 디버깅 모드로 실행하는 기법이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 기법은 다양한 안티 디버깅 기법 중 하나로&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;몇몇 &lt;/span&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;프로텍터에서 사용되고 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Debug Bolcker &lt;/span&gt;&lt;span&gt;기법이 적용된 프로세스는 디버거로 동작할 때와 디버기로 동작할 때 각각 다른 코드를 실행하도록 프로그래밍되어 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 중요한 코드가 디버기 프로세스에서 실행된다면 그쪽을 디버깅해야 한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;하지만 디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계 자체가 안티 디버깅 역할을 하기 때문에 디버기 프로세스의 디버깅이 까다로워진다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span&gt;안티 디버깅 특성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Debug Blocker &lt;/span&gt;&lt;span&gt;기법이 안티 디버깅으로 분류되는 이유는 아래와 같다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;● 부모&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;자식 관계&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 프로세스 관계는 기본적으로 부모&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;자식 프로세스 관계이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이전 실습의 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Self-Creation &lt;/span&gt;&lt;span&gt;기법&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;에서 같은 프로그램이 부모 프로세스로 실행될 때와 자식 프로세스로 실행될 때 다른 동작을 하는 경우 자식 프로세스의 디버깅이 까다로워지는 것을 확인한 적 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;디버기 프로세스는 다른 디버거에서 디버깅을 할 수 없다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Windows &lt;/span&gt;&lt;span&gt;운영체제에서는 여러 디버거로 동시에 같은 프로세스를 디버깅할 수 없다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;자식 프로세스를 디버거를 사용하여 &lt;/span&gt;&lt;span&gt;Attach &lt;/span&gt;&lt;span&gt;하는 것이 불가능하다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;디버기 프로세스를 디버깅하고 싶으면 우선 기존 디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계를 끊어야 한다..&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;디버거 프로세스를 종료하면 디버기 프로세스도 동시에 종료&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계를 끊기 위해서 강제로 디버거 프로세스를 종료시키면 동시에 디버기 프로세스도 종료된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기를 직접 디버깅하자니 연관된 디버거 프로세스 때문에 불가능하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그 디버거 프로세스를 종료하자니 디버기 프로세스도 같이 종료되는 어려운 상황에 놓이게 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;디버거에서 디버기의 코드를 조작&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Debug Blocker &lt;/span&gt;&lt;span&gt;기법에서 디버거의 역할은 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;실행 분기를 조작&lt;/span&gt;&lt;span&gt;하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;코드를 생성&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;변경&lt;/span&gt;&lt;span&gt;시킨다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;또한 지속적으로 디버기 프로세스의 코드 실행에 영향을 끼친다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;다시 말해 디버거 프로세스 없이 디버기 프로세스만으로는 정상적인 실행이 불가능한 경우가 많다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;디버기의 예외&lt;/span&gt;&lt;span&gt;(Exception)&lt;/span&gt;&lt;span&gt;를 디버거에서 처리&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계에서 디버기 프로세스에 발생한 &lt;/span&gt;&lt;span&gt;모든 예외는 디버거에서 처리&lt;/span&gt;&lt;span&gt;하도록 되어 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;가령 디버기 프로세스가 의도적으로 예외&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;예&lt;/span&gt;&lt;span&gt;, Memory Access Violation)&lt;/span&gt;&lt;span&gt;를 발생시킬 때&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이 예외가 해결되지 않으면 더 이상 코드를 실행할 수 없다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 예외는 디버거 프로세스에서 해결해야 된다..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0. 실행 구조.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lyewF/btsEAUmAOcR/L3XG0OsOnKguQMXAsn2UFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lyewF/btsEAUmAOcR/L3XG0OsOnKguQMXAsn2UFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lyewF/btsEAUmAOcR/L3XG0OsOnKguQMXAsn2UFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlyewF%2FbtsEAUmAOcR%2FL3XG0OsOnKguQMXAsn2UFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;374&quot; data-filename=&quot;0. 실행 구조.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기 프로세스에 예외가 발생하면 실행이 멈추고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;디버거 프로세스가 제어권을 가지게 된다.. 이때 디버거에서는 디버기의 &lt;/span&gt;&lt;span&gt;실행 분기를 변경&lt;/span&gt;&lt;span&gt;해 버린다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;추가적으로 디버기 프로세스 내의 &lt;/span&gt;&lt;span&gt;암호화된 코드를 복호화&lt;/span&gt;&lt;span&gt;하거나&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;레지스터 혹은 스택에 특정한 값을 입력&lt;/span&gt;&lt;span&gt;하는 등의 다양한 작업을 수행하는 경우도 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 리버서는 디버거 프로세스에서 &lt;/span&gt;&lt;span&gt;어떻게 예외를 처리하는지 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;디버거 프로세스를 디버깅&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;하면서 일일이 확인해야 된다. 그래야 정확한 디버기 프로세스의 실행 코드를 얻을 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 사실들이 &lt;/span&gt;&lt;span&gt;Debug Blocker &lt;/span&gt;&lt;span&gt;기법을 상당히 까다로운 안티 디버깅 기법으로 만든다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span&gt;디버깅 실습&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실습 파일&lt;/span&gt;&lt;span&gt;(DebugMe4.exe)&lt;/span&gt;&lt;span&gt;의 실행 화면을 보면 기능을 대략 짐작할 수 있습니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;부모 프로세스&lt;/span&gt;&lt;span&gt;(Debugger)&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;&amp;ldquo;Parent Process&amp;rdquo;&lt;/span&gt;&lt;span&gt;라는 문자열과 자식 프로세스&lt;/span&gt;&lt;span&gt;(Debuggee)&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;&amp;ldquo;Child Process&amp;rdquo; &lt;/span&gt;&lt;span&gt;메시지 박스를 확인 가능하다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0. 실행화면.jpg&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KEnrJ/btsEy1GwmFl/hDaAbTah1M0DH2iAp5cGJ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KEnrJ/btsEy1GwmFl/hDaAbTah1M0DH2iAp5cGJ1/img.jpg&quot; data-alt=&quot;DebugMe4.exe 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KEnrJ/btsEy1GwmFl/hDaAbTah1M0DH2iAp5cGJ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKEnrJ%2FbtsEy1GwmFl%2FhDaAbTah1M0DH2iAp5cGJ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;531&quot; data-filename=&quot;0. 실행화면.jpg&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DebugMe4.exe 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;차 시도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;처음에는 프로그램의 저체 구조를 파악하기 위한 목적으로 간단히 디버깅해 본다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;○ &lt;/span&gt;&lt;span&gt;디버깅 시작 위치 선정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DebugMe4.exe &lt;/span&gt;&lt;span&gt;파일은 &lt;/span&gt;&lt;span&gt;Console &lt;/span&gt;&lt;span&gt;시반의 프로그램이므로 디버깅 시작 위치&lt;/span&gt;&lt;span&gt;(main() &lt;/span&gt;&lt;span&gt;함수&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;를 알 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;프로그램의 핵심적인 코드를 찾아낼 때 사용할 수 있는 또 다른 방법은 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;① &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;프로그램 내에서 사용되는 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lsquo;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;문자열&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;rsquo;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;을 이용하는 방법과 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;② &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;프로그램에서 호출되는 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;Win32 API&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;를 예상해서 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;BP&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;를 설치하는 방법 등이 있다&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;○&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; main()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;로 &lt;/span&gt;&lt;span&gt;DebugMe4.exe &lt;/span&gt;&lt;span&gt;파일을 열고 &lt;/span&gt;&lt;span&gt;main()&lt;/span&gt;&lt;span&gt;까지 이동한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1. main.jpg&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNB93w/btsEBlYhe9g/TRJUFLfXYPWpkpVSvrycTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNB93w/btsEBlYhe9g/TRJUFLfXYPWpkpVSvrycTK/img.jpg&quot; data-alt=&quot;DebugMe4.exe의 main() 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNB93w/btsEBlYhe9g/TRJUFLfXYPWpkpVSvrycTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNB93w%2FbtsEBlYhe9g%2FTRJUFLfXYPWpkpVSvrycTK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1163&quot; height=&quot;516&quot; data-filename=&quot;1. main.jpg&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DebugMe4.exe의 main() 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;main() &lt;/span&gt;&lt;span&gt;함수 코드는 매우 간단하게 구성되어 있다&lt;/span&gt;&lt;span&gt;. &amp;lsquo;ReverseCore:DebugMe4&amp;rsquo;&lt;/span&gt;&lt;span&gt;라는 이름의 뮤텍스&lt;/span&gt;&lt;span&gt;(Mutex) &lt;/span&gt;&lt;span&gt;객체를 생성한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;00401009&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[408004]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; CreateMutexW()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CreateMutexW() API&lt;/span&gt;&lt;span&gt;가 정상적으로 리턴되었다면 &lt;/span&gt;&lt;span&gt;Last Error&lt;/span&gt;&lt;span&gt;를 구해서 &lt;/span&gt;&lt;span&gt;B7(ERROR_ALREADY_EXISTS)&lt;/span&gt;&lt;span&gt;과 비교한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;0040102A&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401030&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[40801C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CMP EAX, 0B7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; GetLastError()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 코드는 전형적인 &lt;/span&gt;&lt;span&gt;Mutex &lt;/span&gt;&lt;span&gt;객체를 이용한 프로세스 중복 실행 체크 코드&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉 DebugMe4.exe 파일이 부모 모드로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;처음 실행되면 &amp;lsquo;ReverseCode :DebugMe4&amp;rsquo; 이름의 &lt;/span&gt;&lt;span&gt;Mutex&lt;/span&gt;&lt;span&gt;가 정상적으로 생성되며 &lt;/span&gt;&lt;span&gt;Last Error&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;이 될 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그러나 자식 모드로 실행되면 이미 &lt;/span&gt;&lt;span&gt;부모 프로세스에서 생성한 같은 이름의 &lt;/span&gt;&lt;span&gt;Mutex &lt;/span&gt;&lt;span&gt;객체가 존재하므로 &lt;/span&gt;&lt;span&gt;Last Error&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;B7&lt;/span&gt;&lt;span&gt;이 될 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 원리를 이요하여 &lt;/span&gt;&lt;span&gt;DebugMe4.exe &lt;/span&gt;&lt;span&gt;프로세스가 부모 모드인지 자식 모드인지 판별할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 10px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;height: 10px;&quot;&gt;&lt;span&gt;&lt;span&gt;00401035&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401037&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040103C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040103E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040103F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401041&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401042&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 10px;&quot;&gt;&lt;span&gt;&lt;span&gt;JE SHORT 0040103F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL 0040160&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;XOR EAX, EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RETN&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA EAX, EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;DB 15&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;DB 7F&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 10px;&quot;&gt;&lt;span&gt;&lt;span&gt;; 0040103F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; 00401060&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; Illegal use of register&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재는 부모 모드로 실행 중이므로 결국 &lt;/span&gt;&lt;span&gt;401060 &lt;/span&gt;&lt;span&gt;함수를 호출한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401060 &lt;/span&gt;&lt;span&gt;함수는 상당히 큰 규모의 함수이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;간단히 훑어보며 자식 프로세스를 어떤 식으로 생성하는지 확인해 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401060 &lt;/span&gt;&lt;span&gt;함수 내에서 자기 자신&lt;/span&gt;&lt;span&gt;(DebugMe4.exe)&lt;/span&gt;&lt;span&gt;을 디버그 모드&lt;/span&gt;&lt;span&gt;(DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS)&lt;/span&gt;&lt;span&gt;로 실행하는 코드를 확인할 수 있다&lt;/span&gt;&lt;span&gt;. DebugMe4.exe&lt;/span&gt;&lt;span&gt;는 자기 자신을 자식 프로세스로 실행하는데&lt;/span&gt;&lt;span&gt;, Debug &lt;/span&gt;&lt;span&gt;모드로 실행시켜서 부모 프로세스는 디버거가 되고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;자식 프로세스는 디버기로 동작하도록 만든다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2. createprocess.jpg&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yNA4Y/btsEybpk6Hm/MndC5DVoORzBEMu8yuOkF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yNA4Y/btsEybpk6Hm/MndC5DVoORzBEMu8yuOkF0/img.jpg&quot; data-alt=&quot;CreateProcessW() 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yNA4Y/btsEybpk6Hm/MndC5DVoORzBEMu8yuOkF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyNA4Y%2FbtsEybpk6Hm%2FMndC5DVoORzBEMu8yuOkF0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;413&quot; data-filename=&quot;2. createprocess.jpg&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CreateProcessW() 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;※ 1&lt;/span&gt;&lt;span&gt;차 시도에서 알아낸 사실&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;lsquo;ReverseCore:DebugMe4&amp;rsquo;라는 이름의 Mutex 객체를 이용한 부모/자식 프로세스 구분&lt;/li&gt;
&lt;li&gt;부모/자식 프로세스에서 갈라지는 실행 코드(부모 : 401037, 자식 : 40103F)&lt;/li&gt;
&lt;li&gt;부모/자식 프로세스의 관계는 디버거/디버기 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;● 2&lt;/span&gt;&lt;span&gt;차 시도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Debug Blocker &lt;/span&gt;&lt;span&gt;기법에서는 보통 자식 프로세스&lt;/span&gt;&lt;span&gt;(Debuggee)&lt;/span&gt;&lt;span&gt;에서 핵심 코드가 실행된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;앞에서 확인한 &lt;/span&gt;&lt;span&gt;Mutex&lt;/span&gt;&lt;span&gt;를 이용한 조건 분기를 조작하여 자식 프로세스 모드에서 실행될 코드를 디버깅해 보자&lt;/span&gt;&lt;span&gt;. OllyDbg&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;DebugMe4.exe &lt;/span&gt;&lt;span&gt;디버깅을 재실행하고&lt;/span&gt;&lt;span&gt;, 401035 &lt;/span&gt;&lt;span&gt;주소에 &lt;/span&gt;&lt;span&gt;BP&lt;/span&gt;&lt;span&gt;를 걸고 실행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우측 &lt;/span&gt;&lt;span&gt;Register &lt;/span&gt;&lt;span&gt;창의 &lt;/span&gt;&lt;span&gt;ZF(Zero Flag)&lt;/span&gt;&lt;span&gt;를 마우스 더블클릭하여 &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;로 변경한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그러면 &lt;/span&gt;&lt;span&gt;401035 &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;JE &lt;/span&gt;&lt;span&gt;명령에 의하여 &lt;/span&gt;&lt;span&gt;40103F &lt;/span&gt;&lt;span&gt;주소로 점프한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3. 조건 분기 코드.jpg&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wyUPF/btsEASPQoTF/GWUny6e3xntDrYVjbvXszK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wyUPF/btsEASPQoTF/GWUny6e3xntDrYVjbvXszK/img.jpg&quot; data-alt=&quot;401035 주소의 조건 분기 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wyUPF/btsEASPQoTF/GWUny6e3xntDrYVjbvXszK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwyUPF%2FbtsEASPQoTF%2FGWUny6e3xntDrYVjbvXszK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1083&quot; height=&quot;378&quot; data-filename=&quot;3. 조건 분기 코드.jpg&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;401035 주소의 조건 분기 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;40103F &lt;/span&gt;&lt;span&gt;주소의 코드를 보면 &lt;/span&gt;&lt;span&gt;ILLEGAL INSTRUCTION&lt;/span&gt;&lt;span&gt;예외가 발생한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;0040103F&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;LEA EAX, EAX&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;IA32 MANUAL&lt;/span&gt;&lt;span&gt;에서 &lt;/span&gt;&lt;span&gt;LEA(Load Effective Address) &lt;/span&gt;&lt;span&gt;명령어의 정의를 보면 &lt;/span&gt;&lt;span&gt;LEA &lt;/span&gt;&lt;span&gt;명령어의 첫 번째 &lt;/span&gt;&lt;span&gt;Operand&lt;/span&gt;&lt;span&gt;는 레지스터&lt;/span&gt;&lt;span&gt;(r16/r32/r64)&lt;/span&gt;&lt;span&gt;이고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;두 번째 &lt;/span&gt;&lt;span&gt;Operand&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;Memory&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4. LEA.jpg&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAJY7f/btsECnOP8LB/y8KMKnPi1gsPp4VBlaM1KK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAJY7f/btsECnOP8LB/y8KMKnPi1gsPp4VBlaM1KK/img.jpg&quot; data-alt=&quot;LEA(Load Effective Address) 명령어 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAJY7f/btsECnOP8LB/y8KMKnPi1gsPp4VBlaM1KK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAJY7f%2FbtsECnOP8LB%2Fy8KMKnPi1gsPp4VBlaM1KK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;108&quot; data-filename=&quot;4. LEA.jpg&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LEA(Load Effective Address) 명령어 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;40103F &lt;/span&gt;&lt;span&gt;주소의 명령어&lt;/span&gt;&lt;span&gt;(LEA EAX, EAX)&lt;/span&gt;&lt;span&gt;를 보면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;두 번째 &lt;/span&gt;&lt;span&gt;Operand&lt;/span&gt;&lt;span&gt;에 &lt;/span&gt;&lt;span&gt;Memory&lt;/span&gt;&lt;span&gt;가 아닌 레지스터&lt;/span&gt;&lt;span&gt;(EAX)&lt;/span&gt;&lt;span&gt;가 왔기 때문에 &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt;이 발생하게 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이러한 잘못된 명령어는 &lt;/span&gt;&lt;span&gt;IA32 Opcode Map&lt;/span&gt;&lt;span&gt;에 의해 억지로 조합할 수는 있지만 실제로 사용될 수 없다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자식 프로세스&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;디버기&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;에서 &lt;/span&gt;&lt;span&gt;4013F &lt;/span&gt;&lt;span&gt;주소의 잘못된 명령어&lt;/span&gt;&lt;span&gt;(LEA EAX, EAX)&lt;/span&gt;&lt;span&gt;가 실행되면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;예외가 발생하여 부모 프로세스&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;에게 제어권이 넘어간다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;제어권을 받은 부모 프로세스에서는 해당 예외를 처리함과 동시에 또 다른 작업을 수행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401041 &lt;/span&gt;&lt;span&gt;주소의 명령어를 보면 정상적인 형태의 명령어가 아닌 것을 알 수 있다&lt;/span&gt;&lt;span&gt;.(OllyDbg&lt;/span&gt;&lt;span&gt;가 해당 코드를 &lt;/span&gt;&lt;span&gt;Disassemble&lt;/span&gt;&lt;span&gt;하지 못한다&lt;/span&gt;&lt;span&gt;.) &lt;/span&gt;&lt;span&gt;아마 제어권을 넘겨받은 부모&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;프로세스에서 해당 코드를 복호화 혹은 다른 주소로 실행 분기를 변경하든지 작업을 할 것으로 예상할 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;따라서 부모 프로세스&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;의 실행 코드를 상세히 분석하는 방법밖에는 없다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;※ &lt;span&gt;2&lt;/span&gt;&lt;span&gt;차 시도에서 알아낸 사실&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자식(디버기) 프로세스의 실행 코드에 의도적인 예외 발생 코드 존재&lt;/li&gt;
&lt;li&gt;이후 코드는 정상적인 코드로 보이지 않음(암호화된 코드, 데이터 혹은 의미 없는 코드)&lt;/li&gt;
&lt;li&gt;부모(디버거)의 실행 코드를 상세히 분석해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;● &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;차 시도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;부모&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;401060 &lt;/span&gt;&lt;span&gt;함수를 상세히 디버깅한다&lt;/span&gt;&lt;span&gt;. OllyDbg&lt;/span&gt;&lt;span&gt;를 재실행하여 &lt;/span&gt;&lt;span&gt;40115C&lt;/span&gt;&lt;span&gt;까지 재실행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 543px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 264px;&quot;&gt;
&lt;td style=&quot;height: 264px;&quot;&gt;&lt;span&gt;&lt;span&gt;0040115C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401160&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401161&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401165&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401166&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401167&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401168&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040116A&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040116B&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040116C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040116D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401174&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401175&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401176&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 264px;&quot;&gt;&lt;span&gt;&lt;span&gt;LEA EAX, DWORD PTR SS:[ESP+10]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA ECX, DWORD PTR SS:[ESP+24]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA EDX, DWORD PTR SS:[ESP+3D8]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[40800C]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 264px;&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pProcessInfo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pStartupInfo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CurrentDir&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pEnvironment&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CreationFlags = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;DEBUG_PROCESS |DEBUG&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;_ONLY_&lt;br /&gt;&amp;nbsp; &amp;nbsp;THIS_PROCESS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -InheritHandle&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pThreadSecurity&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pProcessSecutiry&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CommandLine&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -ModuleFileName&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; CreateProcessW()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;height: 52px;&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;height: 52px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 52px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&lt;span&gt;004011A9&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011AE&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH 409A58&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL 00401345&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&lt;span&gt;; ASCII &amp;ldquo;Parent Process&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; printf()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;height: 52px;&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 52px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 52px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 70px;&quot;&gt;
&lt;td style=&quot;height: 70px;&quot;&gt;&lt;span&gt;&lt;span&gt;004011C3&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011C5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011C9&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011CA&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 70px;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH &lt;/span&gt;&lt;span&gt;&amp;ndash;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA ECX, DWORD PTR SS:[ESP+6C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[408024]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 70px;&quot;&gt;&lt;span&gt;&lt;span&gt;; -Timeout&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pDebugEvent&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; WaitForDebugEvent()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401176 &lt;/span&gt;&lt;span&gt;주소에서 &lt;/span&gt;&lt;span&gt;CreateProcessW() API&lt;/span&gt;&lt;span&gt;를 호출하여 자기 자신&lt;/span&gt;&lt;span&gt;(DebugMe4.exe)&lt;/span&gt;&lt;span&gt;을 &lt;/span&gt;&lt;span&gt;Debug Mode&lt;/span&gt;&lt;span&gt;로 실행시킨다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;4011CA &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;WaitForDebugEvent()&lt;/span&gt;&lt;span&gt;를 이용해서 디버기 프로세스로부터 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트가 발생하기를 기다린다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;BOOL WaitForDebugEvent(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[out] LPDEBUG_EVENT lpDebugEvent,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[in] DWORD dwMilliseconds&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;출처 &lt;/span&gt;&lt;span&gt;: MSDN&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WaitForDebugEvent() API&lt;/span&gt;&lt;span&gt;를 호출하면 &lt;/span&gt;&lt;span&gt;dwMilliseconds&lt;/span&gt;&lt;span&gt;에서 정한 시간 동안 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트를 기다린다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;예외도 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트의 한 종류이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 디버기 프로세스에서 예외가 발생하면 &lt;/span&gt;&lt;span&gt;WaitForDebugEvent() API&lt;/span&gt;&lt;span&gt;가 리턴하고&lt;/span&gt;&lt;span&gt;, lpDebugEvent &lt;/span&gt;&lt;span&gt;포인터가 가리키는 &lt;/span&gt;&lt;span&gt;DEBUG_EVENT &lt;/span&gt;&lt;span&gt;객체에 해당 예외에 대한 정보가 채워진다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;typedef struct _DEBUG_EVENT {&lt;br /&gt;DWORD dwDebugEventCode;&lt;br /&gt;DWORD dwProcessId;&lt;br /&gt;DWORD dwThreadId;&lt;br /&gt;union {&lt;br /&gt;EXCEPTION_DEBUG_INFO Exception;&lt;br /&gt;CREATE_THREAD_DEBUG_INFO CreateThread;&lt;br /&gt;CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;&lt;br /&gt;EXIT_THREAD_DEBUG_INFO ExitThread;&lt;br /&gt;EXIT_PROCESS_DEBUG_INFO ExitProcess;&lt;br /&gt;LOAD_DLL_DEBUG_INFO LoadDll;&lt;br /&gt;UNLOAD_DLL_DEBUG_INFO UnloadDll;&lt;br /&gt;OUTPUT_DEBUG_STRING_INFO DebugString;&lt;br /&gt;RIP_INFO RipInfo;&lt;br /&gt;} u;&lt;br /&gt;} DEBUG_EVENT, *LPDEBUG_EVENT;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;출처 &lt;/span&gt;&lt;span&gt;: MSDN&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5. DEBUG EVENT.jpg&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cz69Fq/btsEAcnx5o9/xJQiEA4JKl7oCr355D4dB0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cz69Fq/btsEAcnx5o9/xJQiEA4JKl7oCr355D4dB0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cz69Fq/btsEAcnx5o9/xJQiEA4JKl7oCr355D4dB0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcz69Fq%2FbtsEAcnx5o9%2FxJQiEA4JKl7oCr355D4dB0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;818&quot; data-filename=&quot;5. DEBUG EVENT.jpg&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: right;&quot;&gt;출처&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;: MSDN &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;dwDebugEventCode &lt;/span&gt;&lt;span&gt;멤버는 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트의 종류&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;타입&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;. 9&lt;/span&gt;&lt;span&gt;가지의 이벤트가 존재하며&lt;/span&gt;&lt;span&gt;, u &lt;/span&gt;&lt;span&gt;멤버는 각각의 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트에 해당하는 구조체가 저장된다&lt;/span&gt;&lt;span&gt;(u &lt;/span&gt;&lt;span&gt;멤버는 &lt;/span&gt;&lt;span&gt;union&lt;/span&gt;&lt;span&gt;이며 &lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;개의 &lt;/span&gt;&lt;span&gt;structure&lt;/span&gt;&lt;span&gt;를 하나로 묶어버린다&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4011CA &lt;/span&gt;&lt;span&gt;주소까지 디버깅하면 pDebugEvent가 가리키는 주소는 &lt;/span&gt;&lt;span&gt;18F9D8&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7. waitfordebugevent api 호출 이전의 debug event 구조체.jpg&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJScED/btsEBZtSWpH/OlSPhz3kb26nRWSiAIyjk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJScED/btsEBZtSWpH/OlSPhz3kb26nRWSiAIyjk1/img.jpg&quot; data-alt=&quot;WaitForDebugEvent() API 호출 이전의 DEBUG_EVENT 구조체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJScED/btsEBZtSWpH/OlSPhz3kb26nRWSiAIyjk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJScED%2FbtsEBZtSWpH%2FOlSPhz3kb26nRWSiAIyjk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;961&quot; height=&quot;161&quot; data-filename=&quot;7. waitfordebugevent api 호출 이전의 debug event 구조체.jpg&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WaitForDebugEvent() API 호출 이전의 DEBUG_EVENT 구조체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WaitForDebugEvent() API &lt;/span&gt;&lt;span&gt;호출을 실행한 후 &lt;/span&gt;&lt;span&gt;18F9D8&lt;/span&gt;&lt;span&gt;을 보면 &lt;/span&gt;&lt;span&gt;dwDebugEventCode &lt;/span&gt;&lt;span&gt;값은 &lt;/span&gt;&lt;span&gt;3(CREATE_PROCESS_DEBUG_EVENT)&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8. 7호출 이후 DEBUG EVENT 구조체.jpg&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nroy9/btsEDexlVx3/4NyrkwHutfTlyX7djWfFW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nroy9/btsEDexlVx3/4NyrkwHutfTlyX7djWfFW0/img.jpg&quot; data-alt=&quot;WaitForDebugEvent() API 호출 이후의 DEBUG_EVENT 구조체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nroy9/btsEDexlVx3/4NyrkwHutfTlyX7djWfFW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnroy9%2FbtsEDexlVx3%2F4NyrkwHutfTlyX7djWfFW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;592&quot; height=&quot;98&quot; data-filename=&quot;8. 7호출 이후 DEBUG EVENT 구조체.jpg&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WaitForDebugEvent() API 호출 이후의 DEBUG_EVENT 구조체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;트레이싱을 하다 보면 조건 분기 코드가 나온다&lt;/span&gt;&lt;span&gt;. 4011F0 &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;[ESP+68]&lt;/span&gt;&lt;span&gt;은 [18F9D8](dwDebugEventCode)이다. 이 값을 &lt;/span&gt;&lt;span&gt;EAX &lt;/span&gt;&lt;span&gt;레지스터에 저장한 후 4011F4 주소에서 &lt;/span&gt;&lt;span&gt;1(EXCEPTION_DEBUG_EVENT)&lt;/span&gt;&lt;span&gt;과 비교한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;현재 &lt;/span&gt;&lt;span&gt;dwDebugEventCode&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;이므로 4011F7 주소의 &lt;/span&gt;&lt;span&gt;JNZ &lt;/span&gt;&lt;span&gt;명령에 의해 4012C0 주소로 점프한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9. 조건 분기 1.jpg&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTxrP/btsEy4cdZ1z/GhREcZwQ0OCYPsqb2hgkT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTxrP/btsEy4cdZ1z/GhREcZwQ0OCYPsqb2hgkT1/img.jpg&quot; data-alt=&quot;dwDebugEventCode 값의 비교를 통한 조건 분기 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTxrP/btsEy4cdZ1z/GhREcZwQ0OCYPsqb2hgkT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTxrP%2FbtsEy4cdZ1z%2FGhREcZwQ0OCYPsqb2hgkT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;146&quot; data-filename=&quot;9. 조건 분기 1.jpg&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dwDebugEventCode 값의 비교를 통한 조건 분기 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4012C0 &lt;/span&gt;&lt;span&gt;주소에서 다시 &lt;/span&gt;&lt;span&gt;EAX(dwDebugEventCode) &lt;/span&gt;&lt;span&gt;값을 &lt;/span&gt;&lt;span&gt;5(EXIT_PROCESS_DEBUG_EVENT)&lt;/span&gt;&lt;span&gt;와 비교한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;현재 &lt;/span&gt;&lt;span&gt;EAX &lt;/span&gt;&lt;span&gt;값은 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;이므로 4012C3 주소의 &lt;/span&gt;&lt;span&gt;JE &lt;/span&gt;&lt;span&gt;명령어를 그대로 통과한다&lt;/span&gt;&lt;span&gt;. 4012D4 &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;ContinueDebugEvent() API&lt;/span&gt;&lt;span&gt;를 호출하면서 실행이 멈춰진 디버기 프로세스를 계속 실행시켜 준다. 그리고 4012F2 주소의 &lt;/span&gt;&lt;span&gt;WaitForDebugEvent() API&lt;/span&gt;&lt;span&gt;를 호출하여 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트를 기다리는 상태가 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;다시 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트가 발생하면 4011F0 주소로 가게 된다..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10. 조건 분기 2.jpg&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Doszl/btsEAjAaZvA/KJhWRZRSOriJKtFEfWaWb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Doszl/btsEAjAaZvA/KJhWRZRSOriJKtFEfWaWb1/img.jpg&quot; data-alt=&quot;dwDebugEventCode 값의 비교를 통한 조건 분기 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Doszl/btsEAjAaZvA/KJhWRZRSOriJKtFEfWaWb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDoszl%2FbtsEAjAaZvA%2FKJhWRZRSOriJKtFEfWaWb1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1155&quot; height=&quot;376&quot; data-filename=&quot;10. 조건 분기 2.jpg&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dwDebugEventCode 값의 비교를 통한 조건 분기 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4011F0~4011F7 주소의 명령어를 보면&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이 루프는 디버기로부터 &lt;/span&gt;&lt;span&gt;EXCEPTION_DEBUG_EVENT(1) &lt;/span&gt;&lt;span&gt;예외를 기다리는 것을 알 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 경우를 집중적으로 분석하자&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;가장 간단한 방법은 &lt;/span&gt;&lt;span&gt;4011FD&lt;/span&gt;&lt;span&gt;에 &lt;/span&gt;&lt;span&gt;BP&lt;/span&gt;&lt;span&gt;를 설치하고 실행하는 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;루프는 디버기의 &lt;/span&gt;&lt;span&gt;EXCEPTION_DEBUG_EVENT(1)&lt;/span&gt;&lt;span&gt;가 발생했을 때 &lt;/span&gt;&lt;span&gt;4011FD &lt;/span&gt;&lt;span&gt;주소에 정확히 멈출 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;또 다른 방법은 &lt;/span&gt;&lt;span&gt;4011FD&lt;/span&gt;&lt;span&gt;에 &lt;/span&gt;&lt;span&gt;Conditional Log Break Point[SHIFT+F4]&lt;/span&gt;&lt;span&gt;를 설치하여 사용자 로그를 출력하고 조건에 따라 실행을 멈추도록&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;● 4&lt;/span&gt;&lt;span&gt;차 시도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;CLBP(Conditional Log Break Point) &lt;/span&gt;&lt;span&gt;기능을 이용하여 4011F0~4012FA 루프의 동작 흐름을 살펴보자&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우선 디버기로부터 발생하는 모든 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트를 출력해 보자&lt;/span&gt;&lt;span&gt;. OllyDbg&lt;/span&gt;&lt;span&gt;를 재실행해서 &lt;/span&gt;&lt;span&gt;Go To Expression[CTRL+G] &lt;/span&gt;&lt;span&gt;명령으로 4011F0 주소로 이동한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11. 4011f0 주소로 이동.jpg&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Fcsr/btsEBnaJ9sn/zEkk1VJahKkQSIkQ5kkH6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Fcsr/btsEBnaJ9sn/zEkk1VJahKkQSIkQ5kkH6k/img.jpg&quot; data-alt=&quot;4011F0 주소로 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Fcsr/btsEBnaJ9sn/zEkk1VJahKkQSIkQ5kkH6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Fcsr%2FbtsEBnaJ9sn%2FzEkk1VJahKkQSIkQ5kkH6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;330&quot; data-filename=&quot;11. 4011f0 주소로 이동.jpg&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4011F0 주소로 이동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4011F0 &lt;/span&gt;&lt;span&gt;주소에 커서를 위치한 후 &lt;/span&gt;&lt;span&gt;Conditional Log Break Point[SHIFT+F4] &lt;/span&gt;&lt;span&gt;명령을 내린다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12. 4011F0 주소에 CONDITIONAL LOG BREAK POINT 설치.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XgM0C/btsEyPTQNrd/ujVCH18WPJrFZQqPQi3Drk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XgM0C/btsEyPTQNrd/ujVCH18WPJrFZQqPQi3Drk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XgM0C/btsEyPTQNrd/ujVCH18WPJrFZQqPQi3Drk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXgM0C%2FbtsEyPTQNrd%2FujVCH18WPJrFZQqPQi3Drk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;403&quot; data-filename=&quot;12. 4011F0 주소에 CONDITIONAL LOG BREAK POINT 설치.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Condition&amp;nbsp;항목에 필요한 조건을 입력&amp;nbsp;(생략 가능)&lt;/li&gt;
&lt;li&gt;Explanation과 Expression 항목에는 Log 창에 출력하고 싶은 내용 입력&lt;/li&gt;
&lt;li&gt;Pause program 항목은 언제까지 실행할지 선택&lt;/li&gt;
&lt;li&gt;Log value of expression&amp;nbsp;항목은 어떤 상황에 로그를 출력할지를 선택&lt;br /&gt;-&amp;nbsp;Pause program&amp;nbsp;항목은&amp;nbsp;&amp;lsquo;Never&amp;rsquo;&amp;nbsp;옵션을 지정하여&lt;br /&gt;프로그램이 끝날 때까지 실행되도록 하였고, Log&lt;br /&gt;value of expression&amp;nbsp;항목은&amp;nbsp;&amp;lsquo;Alway&amp;rsquo;&amp;nbsp;옵션을 지정하여&lt;br /&gt;주어진 조건과 상관없이 항상 로그를 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CLBP&lt;/span&gt;&lt;span&gt;가 설치되면 해당 주소는 분홍색으로 표시되어 일반적인 &lt;/span&gt;&lt;span&gt;BP&lt;/span&gt;&lt;span&gt;의 붉은색과 구분된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;Breakpoints &lt;/span&gt;&lt;span&gt;창의 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Active&amp;rsquo; &lt;/span&gt;&lt;span&gt;항목에 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Explanation&amp;rsquo;&lt;/span&gt;&lt;span&gt;에 기록한 내용이 표시된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13. clbp.jpg&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcFXxi/btsEyOUXiDX/zPJK8CF8pjXGcezNm1vQc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcFXxi/btsEyOUXiDX/zPJK8CF8pjXGcezNm1vQc1/img.jpg&quot; data-alt=&quot;4011F0 주소에 설치된 Conditional Log Break Point&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcFXxi/btsEyOUXiDX/zPJK8CF8pjXGcezNm1vQc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcFXxi%2FbtsEyOUXiDX%2FzPJK8CF8pjXGcezNm1vQc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;177&quot; data-filename=&quot;13. clbp.jpg&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4011F0 주소에 설치된 Conditional Log Break Point&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 상태로 &lt;/span&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;에 실행 명령을 내리면 &lt;/span&gt;&lt;span&gt;DebugMe4.exe&lt;/span&gt;&lt;span&gt;가 정상적으로 실행되면서 로그를 출력한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;출력된 로그를 보면 디버기 프로세스에서 총 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;회의 &lt;/span&gt;&lt;span&gt;EXCEPTION_DEBUG_EVENT&lt;/span&gt;&lt;span&gt;(1)&lt;/span&gt;&lt;span&gt;가 발생한 것을 알 수 있다&lt;/span&gt;&lt;span&gt;. (&lt;/span&gt;&lt;span&gt;로그의 대부분은 &lt;/span&gt;&lt;span&gt;LOAD_DL_DEBUG_EVENT(6)&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14. 실행로그.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPlfpi/btsEB07pmsS/U9eKh3MDC7ULMQ4CHT205k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPlfpi/btsEB07pmsS/U9eKh3MDC7ULMQ4CHT205k/img.jpg&quot; data-alt=&quot;실행 로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPlfpi/btsEB07pmsS/U9eKh3MDC7ULMQ4CHT205k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPlfpi%2FbtsEB07pmsS%2FU9eKh3MDC7ULMQ4CHT205k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;752&quot; data-filename=&quot;14. 실행로그.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 로그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;● 5&lt;/span&gt;&lt;span&gt;차 시도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;EXCEPTION_DEBUG_EVENT(1)&lt;/span&gt;&lt;span&gt;의 경우를 집중적으로 디버깅한다&lt;/span&gt;&lt;span&gt;. OllDbg&lt;/span&gt;&lt;span&gt;를 재실행하고 4011F0 주소에 설치된 &lt;/span&gt;&lt;span&gt;CLBP&lt;/span&gt;&lt;span&gt;를 수정한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;&amp;lsquo;Pause program&amp;rsquo; &lt;/span&gt;&lt;span&gt;항목을 &lt;/span&gt;&lt;span&gt;&amp;lsquo;On condition&amp;rsquo; &lt;/span&gt;&lt;span&gt;옵션으로 변경하여 조건에 맞는 경우 프로그램 실행을 멈추도록 한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Log value of expression&amp;rsquo; &lt;/span&gt;&lt;span&gt;항목 역시 &lt;/span&gt;&lt;span&gt;&amp;lsquo;On condition&amp;rsquo; &lt;/span&gt;&lt;span&gt;옵션으로 변경하여 조건에 맞는 경우만 로그를 출력하도록 한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;○ System Break Point&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;에서 실행 명령을 내리면 &lt;/span&gt;&lt;span&gt;dwDebugEventCode = 1(EXCEPTION_DEBUG_EVENT)&lt;/span&gt;&lt;span&gt;의 경우에 &lt;/span&gt;&lt;span&gt;4011F0 &lt;/span&gt;&lt;span&gt;주소에서 멈추게 된다&lt;/span&gt;&lt;span&gt;. 4011FD &lt;/span&gt;&lt;span&gt;주소까지 트레이싱한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15. EXCEPTIONCODE 비교.jpg&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nadJQ/btsEy86H8uY/QcDVbq9WVLYNDq4a0ID2b1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nadJQ/btsEy86H8uY/QcDVbq9WVLYNDq4a0ID2b1/img.jpg&quot; data-alt=&quot;ExceptionCode 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nadJQ/btsEy86H8uY/QcDVbq9WVLYNDq4a0ID2b1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnadJQ%2FbtsEy86H8uY%2FQcDVbq9WVLYNDq4a0ID2b1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;332&quot; data-filename=&quot;15. EXCEPTIONCODE 비교.jpg&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ExceptionCode 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사용되는 메모리는 다음과 같다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;[ESP+68] = [18F9D8] = DEBUG_EVENT.dwDebugEventCode&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;[ESP+74] = [18F9E4] = DEBUG_EVENT.EXCEPTION_DEBUG_INFO.EXCEPTION_RECODE.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ExceptionCode&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;[ESP+80] = [18F9F0] = DEBUG_EVENT.EXCEPTION_DEBUG_INFO.EXCEPTION_RECODE.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ExceptionAddress&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 디버거 프로세스는 77A0114C(ExceptionAddress) 주소에서 &lt;/span&gt;&lt;span&gt;80000003(ExceptionCode - &amp;ldquo;EXCEPTION_BREAKPOINT&amp;rdquo;) &lt;/span&gt;&lt;span&gt;예외가 발생했다는 의미이다&lt;/span&gt;&lt;span&gt;. 77A0114C &lt;/span&gt;&lt;span&gt;주소의 명령어를 따라가 보면,&lt;/span&gt;&lt;span&gt; ntdll.dll &lt;/span&gt;&lt;span&gt;모듈의 &lt;/span&gt;&lt;span&gt;&amp;lsquo;System Break Point&amp;rsquo;&lt;/span&gt;&lt;span&gt;인 것을 알 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;프로그램을 디버기 모드로 실행시킬 때 무조건 발생하는 예외이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;16. SYSTEM BP.jpg&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oa5tp/btsECuUH7VD/kAcggUQtgUyCbFohWrTwb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oa5tp/btsECuUH7VD/kAcggUQtgUyCbFohWrTwb0/img.jpg&quot; data-alt=&quot;System Break Point&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oa5tp/btsECuUH7VD/kAcggUQtgUyCbFohWrTwb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOa5tp%2FbtsECuUH7VD%2FkAcggUQtgUyCbFohWrTwb0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;57&quot; data-filename=&quot;16. SYSTEM BP.jpg&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;System Break Point&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;typedef struct _EXCEPTION_DEBUG_INFO {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EXCEPTION_RECORD ExceptionRecord;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DWORD dwFirstChance;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;typedef struct _EXCEPTION_RECORD {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DWORD ExceptionCode;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DWORD ExceptionFlags;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;struct _EXCEPTION_RECORD *ExceptionRecord;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PVOID ExceptionAddress;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DWORD NumberParameters;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ULONG_PTR ExceptionInformation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[EXCEPTION_MAXIMUM_PARAMETERS];&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;} EXCEPTION_RECORD;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;출처 &lt;/span&gt;&lt;span&gt;: MSDN&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;○ EXCEPTION_ILLEGAL_INSTRUCTION (1)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4011F0 주소에서 다시 실행이 멈춘다&lt;span&gt;. &lt;/span&gt;&lt;span&gt;ExceptionCode = C000001D(EXCEPTION_ILLEGAL_INSTRUCTION)이고, ExceptionAddress = 40103F&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;. 40103F&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;차 시도에서 확인한 &lt;/span&gt;&lt;span&gt;&amp;lsquo;LEA EAX, EAX&amp;rsquo;&lt;/span&gt;&lt;span&gt;명령어가 위치한 주소이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17. EXCEPTION_ILLEGAL_INSTRUCTION.jpg&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pt14O/btsEA6UAQYO/WlwSgySSzcXgeHjrwiv9Xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pt14O/btsEA6UAQYO/WlwSgySSzcXgeHjrwiv9Xk/img.jpg&quot; data-alt=&quot;40103F 주소에서 EXCEPTION_ILLEGAL_INSTRUCTION 예외 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pt14O/btsEA6UAQYO/WlwSgySSzcXgeHjrwiv9Xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPt14O%2FbtsEA6UAQYO%2FWlwSgySSzcXgeHjrwiv9Xk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;293&quot; data-filename=&quot;17. EXCEPTION_ILLEGAL_INSTRUCTION.jpg&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;40103F 주소에서 EXCEPTION_ILLEGAL_INSTRUCTION 예외 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4011F0 주소의 루프에는 &lt;span&gt;3&lt;/span&gt;&lt;span&gt;개의 조건 분기 코드가 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;004011F0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011F4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011F7&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011FD&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401205&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040120B&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401212&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401217&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040121D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR SS:[ESP+68]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CMP EAX, 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;JNZ 004012C0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CMP DWORD PTR SS:[ESP+74], C000001D&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;JNZ 004012C5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR SS;[ESP+80]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CMP EAX, 40103F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;JNZ 00401299&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR SS:[ESP+10]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; 1) dwDebugEventCode==1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; 2) ExceptionCode == &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;C000001D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;;3) ExceptionAddress == &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;40103F&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;가지 조건이 모두 만족되면 &lt;/span&gt;&lt;span&gt;40121D &lt;/span&gt;&lt;span&gt;주소의 코드를 실행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫 번째 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRUCTION &lt;/span&gt;&lt;span&gt;예외가 발생했을 때&lt;/span&gt;&lt;span&gt;, 40121D &lt;/span&gt;&lt;span&gt;주소의 코드가 실행되는 것을 확인했다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;따라서 디버기 프로세스의 예외를 처리해서 재실행하는 코드가 나타날 것이라 생각된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;○&amp;nbsp;EXCEPTION_ILLEGAL_INSTRUCTION (2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;세 번째 &lt;/span&gt;&lt;span&gt;EXCEPTION_DEBUG_EVENT&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;401048 &lt;/span&gt;&lt;span&gt;주소에서 나타난다&lt;/span&gt;&lt;span&gt;. ExceptionCode&lt;/span&gt;&lt;span&gt;는 이전과 마찬가지로 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRUCTION&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;세 번의 조건 분기로 인해 &lt;/span&gt;&lt;span&gt;401299 &lt;/span&gt;&lt;span&gt;주소로 점프한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;두 번째 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRUCTION&lt;/span&gt;&lt;span&gt;이 발생하였을 때 &lt;/span&gt;&lt;span&gt;401299 &lt;/span&gt;&lt;span&gt;주소의 코드가 실행된다는 것을 알 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;18. EXCEPTION_ILLEGAL_INSTRUCTION2.jpg&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRoNE/btsEBrjRXiS/v8flcBvG63OFHCALHTctPK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRoNE/btsEBrjRXiS/v8flcBvG63OFHCALHTctPK/img.jpg&quot; data-alt=&quot;401048 주소에서 EXCEPTION_ILLEGAL_INSTRUCTION 예외 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRoNE/btsEBrjRXiS/v8flcBvG63OFHCALHTctPK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRoNE%2FbtsEBrjRXiS%2Fv8flcBvG63OFHCALHTctPK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;298&quot; data-filename=&quot;18. EXCEPTION_ILLEGAL_INSTRUCTION2.jpg&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;401048 주소에서 EXCEPTION_ILLEGAL_INSTRUCTION 예외 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 상태에서 &lt;/span&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;의 실행&lt;/span&gt;&lt;span&gt;[F9]&lt;/span&gt;&lt;span&gt;을 하면 자식 프로세스의 메시지 박스가 나타나며 정상적으로 실행되는 것을 확인할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;※ 5&lt;/span&gt;&lt;span&gt;차 시도에서 알아낸 사실&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;디버기 프로세스에서 두 번의 EXCEPTION_ILLEGAL_INSTRUCTION 예외가 발생&lt;/li&gt;
&lt;li&gt;EXCEPTION_ILLEGAL_INSTRUCTION 예외가 발생한 경우 디버거 프로세스의 40121D, 401299 주소의 코드가 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;● 6&lt;/span&gt;&lt;span&gt;차 시도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DebugMe4.exe&lt;/span&gt;&lt;span&gt;의 핵심 코드&lt;/span&gt;&lt;span&gt;(40121D, 401299)&lt;/span&gt;&lt;span&gt;를 디버깅한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;○ 40121D (&lt;/span&gt;&lt;span&gt;첫 번째 예외&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;40121D &lt;/span&gt;&lt;span&gt;주소의 코드를 디버깅해 보자&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;401233 &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;ReadProcessMemory() API &lt;/span&gt;&lt;span&gt;호출 코드는 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;401041 &lt;/span&gt;&lt;span&gt;주소에서 &lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;바이트 크기만큼 읽어오는 명령이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;19. readprocessmemory.jpg&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAO2fA/btsEA0z5BHk/WX2eQQLGw90GEUc7OnwQPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAO2fA/btsEA0z5BHk/WX2eQQLGw90GEUc7OnwQPk/img.jpg&quot; data-alt=&quot;ReadProcessMemory() API 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAO2fA/btsEA0z5BHk/WX2eQQLGw90GEUc7OnwQPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAO2fA%2FbtsEA0z5BHk%2FWX2eQQLGw90GEUc7OnwQPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;297&quot; data-filename=&quot;19. readprocessmemory.jpg&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ReadProcessMemory() API 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401041 &lt;/span&gt;&lt;span&gt;주소의 첫 번째 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRUCTION &lt;/span&gt;&lt;span&gt;예외가 발생하는 &lt;/span&gt;&lt;span&gt;40103F &lt;/span&gt;&lt;span&gt;주소 명령&lt;/span&gt;&lt;span&gt;(LEA EAX, EAX)&lt;/span&gt;&lt;span&gt;바로 다음 주소이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20 읽어오는 byte.jpg&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3c31M/btsEyOACSTc/VGcblF54p5wKJ4j9lggP10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3c31M/btsEyOACSTc/VGcblF54p5wKJ4j9lggP10/img.jpg&quot; data-alt=&quot;ReadProcessMemory() API의 pBaseAddress&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3c31M/btsEyOACSTc/VGcblF54p5wKJ4j9lggP10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3c31M%2FbtsEyOACSTc%2FVGcblF54p5wKJ4j9lggP10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;352&quot; data-filename=&quot;20 읽어오는 byte.jpg&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ReadProcessMemory() API의 pBaseAddress&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ReadProcessMemory() API &lt;/span&gt;&lt;span&gt;호출을 넘기면 &lt;/span&gt;&lt;span&gt;ReadProcessMemory() API&lt;/span&gt;&lt;span&gt;에서 읽어온 &lt;/span&gt;&lt;span&gt;Byte&lt;/span&gt;&lt;span&gt;들을 &lt;/span&gt;&lt;span&gt;7F&lt;/span&gt;&lt;span&gt;와 XOR하는 코드를 발견할 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 &lt;/span&gt;&lt;span&gt;XOR&lt;/span&gt;&lt;span&gt;은 &lt;/span&gt;&lt;span&gt;XOR &lt;/span&gt;&lt;span&gt;디코딩 루프&lt;/span&gt;&lt;span&gt;(Decoding Loop)&lt;/span&gt;&lt;span&gt;로&lt;/span&gt;&lt;span&gt;, 401041~401054 &lt;/span&gt;&lt;span&gt;주소를 디코딩하여 정상적인 코드로 변환하는 역할을 한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;21. xor.jpg&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bvv9E/btsEx6auHoy/osRsiFerWylqDupKKTSgY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bvv9E/btsEx6auHoy/osRsiFerWylqDupKKTSgY0/img.jpg&quot; data-alt=&quot;Decidong Loop&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bvv9E/btsEx6auHoy/osRsiFerWylqDupKKTSgY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBvv9E%2FbtsEx6auHoy%2FosRsiFerWylqDupKKTSgY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;270&quot; data-filename=&quot;21. xor.jpg&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Decidong Loop&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;21-1. 변환된 코드.jpg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7McG2/btsEyvulUUo/K1aBRVOE6eu9eismeYKN4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7McG2/btsEyvulUUo/K1aBRVOE6eu9eismeYKN4K/img.jpg&quot; data-alt=&quot;Decodeing Code&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7McG2/btsEyvulUUo/K1aBRVOE6eu9eismeYKN4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7McG2%2FbtsEyvulUUo%2FK1aBRVOE6eu9eismeYKN4K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;255&quot; data-filename=&quot;21-1. 변환된 코드.jpg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Decodeing Code&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디코딩 루프에서 디코딩된 코드를 &lt;/span&gt;&lt;span&gt;WriteProcessMemory() API&lt;/span&gt;&lt;span&gt;를 사용하여 &lt;/span&gt;&lt;span&gt;401041~401054 &lt;/span&gt;&lt;span&gt;주소에 덮어쓴다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;디버기 프로세스 입장에서는 암호화된 주소영역이 디버거에 의해 복호화된 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22. write.jpg&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oaLfd/btsEx8zkRIz/8HlIgrOMxQLif8X2rIHcL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oaLfd/btsEx8zkRIz/8HlIgrOMxQLif8X2rIHcL0/img.jpg&quot; data-alt=&quot;WriteProcessMemory() API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oaLfd/btsEx8zkRIz/8HlIgrOMxQLif8X2rIHcL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoaLfd%2FbtsEx8zkRIz%2F8HlIgrOMxQLif8X2rIHcL0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;278&quot; data-filename=&quot;22. write.jpg&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WriteProcessMemory() API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후에는 메인 &lt;/span&gt;&lt;span&gt;Thread&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;Context &lt;/span&gt;&lt;span&gt;구조체를 읽어와서 &lt;/span&gt;&lt;span&gt;EIP&lt;/span&gt;&lt;span&gt;를 변경하는 코드를 확인할 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이로 인해 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;40103F &lt;/span&gt;&lt;span&gt;주소의 에서 발생한 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INST-RUCTION &lt;/span&gt;&lt;span&gt;예외가 해결된다&lt;/span&gt;&lt;span&gt;. (40103F &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;LEA EAX, EAX&lt;/span&gt;&lt;span&gt;의 명령어는 &lt;/span&gt;&lt;span&gt;2byte)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;23. eip 변경.jpg&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf8nO1/btsEy35rNiX/ovrzwFsk6NYKMyYAWFSiU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf8nO1/btsEy35rNiX/ovrzwFsk6NYKMyYAWFSiU1/img.jpg&quot; data-alt=&quot;디버기 프로세스의 EIP 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf8nO1/btsEy35rNiX/ovrzwFsk6NYKMyYAWFSiU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf8nO1%2FbtsEy35rNiX%2FovrzwFsk6NYKMyYAWFSiU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;506&quot; data-filename=&quot;23. eip 변경.jpg&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디버기 프로세스의 EIP 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;변경한 &lt;/span&gt;&lt;span&gt;EIP&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;SetThreadProcess() API &lt;/span&gt;&lt;span&gt;호출하여 적용한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;4012D4 &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;ContinueDebugEvent() API&lt;/span&gt;&lt;span&gt;를 호출하여 실행이 중지된 디버기 프로세스를 다시 실행되도록 한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이후 &lt;/span&gt;&lt;span&gt;4012F2 &lt;/span&gt;&lt;span&gt;주소의 &lt;/span&gt;&lt;span&gt;WaitForDebugEvent() API&lt;/span&gt;&lt;span&gt;를 다시 호출하여 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;Debug &lt;/span&gt;&lt;span&gt;이벤트를 기다린다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1. 40121D 실행코드 흐름.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sPMzi/btsEAYvKGZr/RIcRv4i2Uz47zomtLSUYkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sPMzi/btsEAYvKGZr/RIcRv4i2Uz47zomtLSUYkK/img.png&quot; data-alt=&quot;40121D 실행 코드 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sPMzi/btsEAYvKGZr/RIcRv4i2Uz47zomtLSUYkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsPMzi%2FbtsEAYvKGZr%2FRIcRv4i2Uz47zomtLSUYkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;914&quot; height=&quot;598&quot; data-filename=&quot;1. 40121D 실행코드 흐름.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;40121D 실행 코드 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;1. Generate Exception(&lt;/span&gt;&lt;span&gt;디버기&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기 프로세스의 &lt;/span&gt;&lt;span&gt;40103F &lt;/span&gt;&lt;span&gt;주소에서 &lt;/span&gt;&lt;span&gt;EXCEPTION_IELLAGER_INSTRUCTION &lt;/span&gt;&lt;span&gt;예외가 발생한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 순간 디버기 프로세스는 실행이 중지되고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;디버거 프로세스에게 제어가 넘어온다&lt;/span&gt;&lt;span&gt;.(&lt;/span&gt;&lt;span&gt;정확히는 디버거 프로세스에서 호출한 &lt;/span&gt;&lt;span&gt;WaitForDebugEvent() API&lt;/span&gt;&lt;span&gt;가 리턴된다&lt;/span&gt;&lt;span&gt;.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;2. Decoding Loop(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거는 디버기 프로세스의 &lt;/span&gt;&lt;span&gt;401041~401054 &lt;/span&gt;&lt;span&gt;메모리 영역을 읽어 들여&lt;/span&gt;&lt;span&gt;XOR(7F) &lt;/span&gt;&lt;span&gt;명령으로 디코딩한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 디코딩된 실제 코드를 디버기 프로세스의 동일한 메모리 영역에 덮어쓴다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;3.Change EIP(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기의 코드 실행 주소&lt;/span&gt;&lt;span&gt;(EIP)&lt;/span&gt;&lt;span&gt;를 변경&lt;/span&gt;&lt;span&gt;(40103F-&amp;gt;401041)&lt;/span&gt;&lt;span&gt;한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;4. Countinue Debuggee(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;40103F&lt;/span&gt;&lt;span&gt;의 예외를 처리했으므로 디버기 프로세스를 실행하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;다시 디버거는 디버기의 예외를 기다리는 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;대기&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;모드로 전환된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;○ 401299 (&lt;/span&gt;&lt;span&gt;두 번째 예외&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 번째 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRUCTION &lt;/span&gt;&lt;span&gt;예외는 &lt;/span&gt;&lt;span&gt;401048&lt;/span&gt;&lt;span&gt;에서 발생한다&lt;/span&gt;&lt;span&gt;. 401299 &lt;/span&gt;&lt;span&gt;주소에서는 &lt;/span&gt;&lt;span&gt;401048&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;2byte &lt;/span&gt;&lt;span&gt;명령어를 변경&lt;/span&gt;&lt;span&gt;(8DC0(LEA EAX, EAX) -&amp;gt; 681C(PUSH XXXX))&lt;/span&gt;&lt;span&gt;하는 &lt;/span&gt;&lt;span&gt;WriteProcessMemory() API&lt;/span&gt;&lt;span&gt;를 호출한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;24. waitfordebugevent.jpg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1J1c9/btsEyvulXTJ/pa8NwdrvmFdG2NGX6kE3lK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1J1c9/btsEyvulXTJ/pa8NwdrvmFdG2NGX6kE3lK/img.jpg&quot; data-alt=&quot;WriteProcessMemory() API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1J1c9/btsEyvulXTJ/pa8NwdrvmFdG2NGX6kE3lK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1J1c9%2FbtsEyvulXTJ%2Fpa8NwdrvmFdG2NGX6kE3lK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;303&quot; data-filename=&quot;24. waitfordebugevent.jpg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WriteProcessMemory() API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 &lt;/span&gt;&lt;span&gt;2byte&lt;/span&gt;&lt;span&gt;가 수정되며 그 이후의 명령어도 정상적으로 해석되고&lt;/span&gt;&lt;span&gt;, EXCEPTION_ILLEGAL_INSTRUCTION &lt;/span&gt;&lt;span&gt;예외도 해결된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2. 401299 실행 코드 흐름.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIM1OG/btsEx9kJ8Xc/F4DHZDtNUoF1AZULi3q4e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIM1OG/btsEx9kJ8Xc/F4DHZDtNUoF1AZULi3q4e1/img.png&quot; data-alt=&quot;401299 실행 코드 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIM1OG/btsEx9kJ8Xc/F4DHZDtNUoF1AZULi3q4e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIM1OG%2FbtsEx9kJ8Xc%2FF4DHZDtNUoF1AZULi3q4e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;409&quot; data-filename=&quot;2. 401299 실행 코드 흐름.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;401299 실행 코드 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;1.&amp;nbsp;&lt;span&gt;Generate Exception(&lt;/span&gt;&lt;span&gt;디버기&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기 프로세스의 &lt;/span&gt;&lt;span&gt;401048 &lt;/span&gt;&lt;span&gt;주소에서 &lt;/span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRUCTION &lt;/span&gt;&lt;span&gt;예외가 발생한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;2. Code Patch(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기 프로세스의 &lt;/span&gt;&lt;span&gt;401048~401049 &lt;/span&gt;&lt;span&gt;메모리 영역에 &lt;/span&gt;&lt;span&gt;&amp;lsquo;681C&amp;rsquo;&lt;/span&gt;&lt;span&gt;를 덮어쓴다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;3. Countinue Debuggee(&lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예외가 처리되었으므로 디버기 프로세스를 실행시킨다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 디버거를 다시 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;대기&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;모드로 전환한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Debug Blocker &lt;/span&gt;&lt;span&gt;기법은 상당히 까다로운 기법이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;아주 단순한 형태로 구현된 &lt;/span&gt;&lt;span&gt;DebugMe4.-exe&lt;/span&gt;&lt;span&gt;파일도 디버깅 설명이 길다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계를 강제로 끊고 &lt;/span&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;로 &lt;/span&gt;&lt;span&gt;Attach &lt;/span&gt;&lt;span&gt;시킨다는 개념만 이해하면 큰 문제없이 디버깅할 수 있을 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>DebugBlocker</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/46</guid>
      <comments>https://honorlog.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 8 Feb 2024 02:58:35 +0900</pubDate>
    </item>
    <item>
      <title>디버깅 실습3 - PE Image Switching 개념 및 동작 원리</title>
      <link>https://honorlog.tistory.com/45</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. PE Image&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lsquo;PE Image&amp;rsquo;(&lt;/span&gt;&lt;span&gt;혹은 &lt;/span&gt;&lt;span&gt;Process Image&lt;/span&gt;&lt;span&gt;나 &lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt;라고 함&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;란 간단히 말해 &lt;/span&gt;&lt;span&gt;&amp;lsquo;PE &lt;/span&gt;&lt;span&gt;파일이 프로세스 메모리에 매핑&lt;/span&gt;&lt;span&gt;(mapping)&lt;/span&gt;&lt;span&gt;된 모습&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;이라고 할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt;(notepad.exe)&lt;/span&gt;&lt;span&gt;을 프로세스로 실행시키면 그 프로세스의 가상 메모리는 아래 그림과 같은 형태가 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, OS&lt;/span&gt;&lt;span&gt;는 프로세스를 위한 가상 메모리를 생성하고&lt;/span&gt;&lt;span&gt;, USER &lt;/span&gt;&lt;span&gt;메모리 영역에 &lt;/span&gt;&lt;span&gt;notepad.exe &lt;/span&gt;&lt;span&gt;파일을 매핑시킨다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;notepad.exe&lt;/span&gt;&lt;span&gt;에 사용되는 &lt;/span&gt;&lt;span&gt;Import DLL &lt;/span&gt;&lt;span&gt;파일들&lt;/span&gt;&lt;span&gt;(kernel32.dll, user32.dll, gui32.dll &lt;/span&gt;&lt;span&gt;등&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;을 차례대로 매핑시킨다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이때&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;USER &lt;/span&gt;&lt;span&gt;메모리에 매핑된 &lt;/span&gt;&lt;span&gt;Notepad.exe &lt;/span&gt;&lt;span&gt;영역을 &lt;/span&gt;&lt;span&gt;(notepad.exe &lt;/span&gt;&lt;span&gt;파일에 대한&lt;/span&gt;&lt;span&gt;) PE Image&lt;/span&gt;&lt;span&gt;라고 표현한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0. pe파일과 프로세스 관계.jpg&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WoQkZ/btsEdNICQlP/uUk6kRFTthZIY875YQE4c0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WoQkZ/btsEdNICQlP/uUk6kRFTthZIY875YQE4c0/img.jpg&quot; data-alt=&quot;PE 파일과 프로세스 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WoQkZ/btsEdNICQlP/uUk6kRFTthZIY875YQE4c0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWoQkZ%2FbtsEdNICQlP%2FuUk6kRFTthZIY875YQE4c0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;592&quot; height=&quot;577&quot; data-filename=&quot;0. pe파일과 프로세스 관계.jpg&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE 파일과 프로세스 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 PE 파일과 PE Image 사이에는 형태적으로 아래의 그림과 같이 파이가 발생하는데, 이것은 일반적으로 PE 파일은 File Alignment와 Section Alignment가 다르고, 각 섹션에서의 Raw Data Size와 Virtual Size가 다르기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1. 매핑된 pe image.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGc9p8/btsEdDF4to6/fepk4KO6RDkGN6iEzj5KD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGc9p8/btsEdDF4to6/fepk4KO6RDkGN6iEzj5KD1/img.png&quot; data-alt=&quot;PE 파일 프로세스 메모리에 매핑된 PE Image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGc9p8/btsEdDF4to6/fepk4KO6RDkGN6iEzj5KD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGc9p8%2FbtsEdDF4to6%2Ffepk4KO6RDkGN6iEzj5KD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;736&quot; data-filename=&quot;1. 매핑된 pe image.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE 파일 프로세스 메모리에 매핑된 PE Image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. PE Image Switching&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PE Image Switching&lt;/span&gt;&lt;span&gt;은 &lt;/span&gt;&lt;b&gt;&lt;span&gt;다른 프로세스를 실행한 후 가상 메모리의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 자신의 것과 바꿔&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;버리는 기법&lt;/b&gt;이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;정확히는 어떤 프로세스&lt;/span&gt;&lt;span&gt;(A.exe)&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;SUSPEND &lt;/span&gt;&lt;span&gt;모드로 실행한 후 전혀 다른 &lt;/span&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt;(B.exe)&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 매핑시켜 &lt;/span&gt;&lt;span&gt;A.exe &lt;/span&gt;&lt;span&gt;프로세스 메모리 공간에서 실행하는 기법이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2. PE Image switching 개념도.jpg&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFO5Le/btsEfo2rVIN/iTfPkrioshhH1GPiu0OdtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFO5Le/btsEfo2rVIN/iTfPkrioshhH1GPiu0OdtK/img.jpg&quot; data-alt=&quot;PE Image Switching 개념도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFO5Le/btsEfo2rVIN/iTfPkrioshhH1GPiu0OdtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFO5Le%2FbtsEfo2rVIN%2FiTfPkrioshhH1GPiu0OdtK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;183&quot; data-filename=&quot;2. PE Image switching 개념도.jpg&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE Image Switching 개념도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 변경하면 프로세스 이름은 원본 그래도 &lt;/span&gt;&lt;span&gt;A.exe&lt;/span&gt;&lt;span&gt;이지만 실제 프로세스 메모리에 매핑된 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;B.exe&lt;/span&gt;&lt;span&gt;이기 때문에 원본&lt;/span&gt;&lt;span&gt;(A.exe)&lt;/span&gt;&lt;span&gt;과는 전혀 다른 동작을 한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 경우&lt;/span&gt;&lt;span&gt;, A.exe&lt;/span&gt;&lt;span&gt;를 겉모습만 남아있는 &lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;껍데기&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;프로세스&lt;/b&gt;라고 말할 수 있고&lt;/span&gt;&lt;span&gt;, B.exe&lt;/span&gt;&lt;span&gt;를 실제로 실행되는 &lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;알맹이&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;프로세스&lt;/b&gt;라고 말할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 기법은 PE 프로텍터에서 안티 디버깅으로 쓰이기도 하고, 악성코드에서 정상 프로세스로 위장하고자 할 때 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span&gt;디버깅 실습&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;- 실행 화면&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;간단한 예제 파일들&lt;/span&gt;&lt;span&gt;(fake.exe, real.exe, DebugMe3.exe)&lt;/span&gt;&lt;span&gt;로 확인해 보자&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;파일의 실행 화면을 보면 &lt;/span&gt;&lt;span&gt;CUI(Console User Interface) &lt;/span&gt;&lt;span&gt;기반의 프로그램인 것을 알 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0. fake 실행화면.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz5NiK/btsEkvAYS28/bgm4YVxJqdiJpt2kWcULlk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz5NiK/btsEkvAYS28/bgm4YVxJqdiJpt2kWcULlk/img.jpg&quot; data-alt=&quot;fake.exe 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz5NiK/btsEkvAYS28/bgm4YVxJqdiJpt2kWcULlk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz5NiK%2FbtsEkvAYS28%2Fbgm4YVxJqdiJpt2kWcULlk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;143&quot; data-filename=&quot;0. fake 실행화면.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fake.exe 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일은 실행 화면은 다이얼로그에 간단한 문자열을 출력하는 &lt;/span&gt;&lt;span&gt;GUI(Graphic User Interface) &lt;/span&gt;&lt;span&gt;기반의 프로그램이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1. real 실행화면.jpg&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDaSQU/btsElJlEiKA/HHYUTbkpKAKGR94pz7Kix0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDaSQU/btsElJlEiKA/HHYUTbkpKAKGR94pz7Kix0/img.jpg&quot; data-alt=&quot;real.exe 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDaSQU/btsElJlEiKA/HHYUTbkpKAKGR94pz7Kix0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDaSQU%2FbtsElJlEiKA%2FHHYUTbkpKAKGR94pz7Kix0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;222&quot; data-filename=&quot;1. real 실행화면.jpg&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;real.exe 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fake.exe&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일은 서로 다른 사용자 환경을 가지고 있다&lt;/span&gt;&lt;span&gt;. PE Image Switching &lt;/span&gt;&lt;span&gt;기법을 이용하면 &lt;/span&gt;&lt;span&gt;fake.exe&lt;/span&gt;&lt;span&gt;를 껍데기 프로세스로 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;를 알맹이 프로세스로 실행시킬 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2. debugme3 실행.jpg&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckMu3m/btsEkxr0whU/tj5Ds15qgSQEkMLR3JPEJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckMu3m/btsEkxr0whU/tj5Ds15qgSQEkMLR3JPEJk/img.jpg&quot; data-alt=&quot;DebugMe3.exe 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckMu3m/btsEkxr0whU/tj5Ds15qgSQEkMLR3JPEJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckMu3m%2FbtsEkxr0whU%2Ftj5Ds15qgSQEkMLR3JPEJk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;91&quot; data-filename=&quot;2. debugme3 실행.jpg&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DebugMe3.exe 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Process hacker&lt;/span&gt;&lt;span&gt;로 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스를 확인하면 실행되는 프로세스의 이름은 &lt;/span&gt;&lt;span&gt;fake.exe&lt;/span&gt;&lt;span&gt;이지만 실제로는 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;프로세스가 실행되는 것을 확인할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3. pe image switching 기법으로 실행된 fake.exe.jpg&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6dSDR/btsEmNVbJth/04OrzrTblHiB2VekKwuLPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6dSDR/btsEmNVbJth/04OrzrTblHiB2VekKwuLPk/img.jpg&quot; data-alt=&quot;PE Image Switching 기법으로 실행된 fake.exe&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6dSDR/btsEmNVbJth/04OrzrTblHiB2VekKwuLPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6dSDR%2FbtsEmNVbJth%2F04OrzrTblHiB2VekKwuLPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;663&quot; height=&quot;675&quot; data-filename=&quot;3. pe image switching 기법으로 실행된 fake.exe.jpg&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE Image Switching 기법으로 실행된 fake.exe&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &lt;span&gt;구체적인 동작 원리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;로 실행 파라미터&lt;/span&gt;&lt;span&gt;(fake.exe real.exe)&lt;/span&gt;&lt;span&gt;를 입력하여 &lt;/span&gt;&lt;span&gt;DebugMe3.exe&lt;/span&gt;&lt;span&gt;를 연다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4. ollydbg file - open.jpg&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp4tnV/btsEm94SGUb/7kpVoWCwkHjeGuTy7fnRe1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp4tnV/btsEm94SGUb/7kpVoWCwkHjeGuTy7fnRe1/img.jpg&quot; data-alt=&quot;OllyDbg의 File \ Open 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp4tnV/btsEm94SGUb/7kpVoWCwkHjeGuTy7fnRe1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp4tnV%2FbtsEm94SGUb%2F7kpVoWCwkHjeGuTy7fnRe1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;270&quot; data-filename=&quot;4. ollydbg file - open.jpg&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OllyDbg의 File \ Open 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;main() &lt;/span&gt;&lt;span&gt;함수 위치로 이동한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6. main.jpg&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo2wqb/btsEnbIgcG5/sTkxKPnV7xXVLmkM3izCfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo2wqb/btsEnbIgcG5/sTkxKPnV7xXVLmkM3izCfK/img.jpg&quot; data-alt=&quot;main() 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo2wqb/btsEnbIgcG5/sTkxKPnV7xXVLmkM3izCfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo2wqb%2FbtsEnbIgcG5%2FsTkxKPnV7xXVLmkM3izCfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;553&quot; data-filename=&quot;6. main.jpg&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;main() 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;main() &lt;/span&gt;&lt;span&gt;함수에서 중요한 내용만 추리면 아래의 내용과 같다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 27px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 99.8837%; height: 17px;&quot; colspan=&quot;3&quot;&gt;&lt;span&gt;&lt;span&gt;main()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;
&lt;td style=&quot;width: 15.1163%; height: 10px;&quot; rowspan=&quot;16&quot;&gt;&lt;span&gt;&lt;span&gt;00401000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401001&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401003&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401006&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401063&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401079&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040107A&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040107E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040107F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401081&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401083&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401085&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401087&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401089&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040108B&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040108C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040108E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004010B2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004010D1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004010F0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004010F1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401116&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401118&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401119&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401149&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040114B&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040114C&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.6744%; height: 10px;&quot; rowspan=&quot;16&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EBP, ESP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;AND ESP, FFFFFFF8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;SUB ESP, 5C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL 00401150&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA ECX, DWORD PTR SS:[ESP+24]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[40900C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL 004011D0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL 00401320&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409038]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH &lt;/span&gt;&lt;span&gt;&amp;ndash;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409010]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV ESP, EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;POP EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RETN&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.093%; height: 10px;&quot; rowspan=&quot;16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; SubFunc_1()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pProcessInfo = 0018FEE8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pStartupInfo = 0018FEF8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CurrentDir = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pEnvironment = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CreationFlags = CREATE_&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;SUSPENED&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -InheritHandles = FALSE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pThreadSecurity = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pProcessSecurity = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CommandLine = &lt;/span&gt;&lt;span&gt;&amp;ldquo;fake.exe&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -ModuleFileName = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;;CreateProcessW()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; SubFunc_2()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; SubFunc_3()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hThread = 00000034&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(widnow)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ResumeThread()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Timeout = INFINITE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hObject = 00000038&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(window)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; WaitForSinfleObject()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위의 내용을 기반으로 코드 흐름도를 그려보면 아래의 그림과 같다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3. main 함수의 코드 흐름도.jpg&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnVmCz/btsEkAh0KJ3/DQbZtfSGKzJMS2LjfPNOY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnVmCz/btsEkAh0KJ3/DQbZtfSGKzJMS2LjfPNOY1/img.jpg&quot; data-alt=&quot;main() 함수의 코드 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnVmCz/btsEkAh0KJ3/DQbZtfSGKzJMS2LjfPNOY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnVmCz%2FbtsEkAh0KJ3%2FDQbZtfSGKzJMS2LjfPNOY1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;407&quot; data-filename=&quot;3. main 함수의 코드 흐름도.jpg&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;main() 함수의 코드 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;-&amp;nbsp; SubFunc_1()&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SubFunc_1() &lt;/span&gt;&lt;span&gt;함수 내부의 주요 코드를 추리면 아래와 같다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드의 내용은 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일을 통째로 메모리에 읽어 들이고 있으며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;메모리에 파일 내용을 저장한 뒤 main() 함수로 돌아간다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;real.exe &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;파일이 저장된 메모리 주소를 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;MEM_FILE_REAL&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;이라고 부르겠다&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 369px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 99.8837%; height: 17px;&quot; colspan=&quot;3&quot;&gt;&lt;span&gt;&lt;span&gt;SubFunc_1()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 159px;&quot;&gt;
&lt;td style=&quot;width: 15.3488%; height: 159px;&quot;&gt;&lt;span&gt;&lt;span&gt;00401150&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401151&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401153&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401154&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401155&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401157&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040115C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040115E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401160&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401162&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401167&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401168&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040116F&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.814%; height: 159px;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EBP, ESP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 80&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 3&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 80000000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV DWORD PTR SS:[EBP-4], 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409020]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%; height: 159px;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hTemplateFile = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Attributes = NORMAL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Mode = OPEN_EXISTING&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pSecurity = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -ShareMode = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;FILE_SHARE_READ&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Access = GENERIC_READ&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -FileName = &amp;ldquo;real.exe&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; CreateFileW()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 56px;&quot;&gt;
&lt;td style=&quot;width: 99.8837%; height: 56px;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 73px;&quot;&gt;
&lt;td style=&quot;width: 15.3488%; height: 73px;&quot;&gt;&lt;span&gt;&lt;span&gt;00401185&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401187&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401188&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040118E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401190&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401191&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.814%; height: 73px;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409004]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EBX, EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EBX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL 00401624&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%; height: 73px;&quot;&gt;&lt;span&gt;&lt;span&gt;; -pFileSizeHigh = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; GetFileSize()&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -bufsize = A000 (40960)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; new()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 99.8837%; height: 10px;&quot; colspan=&quot;3&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 15.3488%; height: 10px;&quot;&gt;&lt;span&gt;&lt;span&gt;004011A6&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011A8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011AB&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011AC&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011AD&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011AE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011AF&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011B5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011B6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.814%; height: 10px;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA ECX, DWORD PRT SS:[EBP-4]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EBX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[40901C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ESI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409030]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%; height: 10px;&quot;&gt;&lt;span&gt;&lt;span&gt;; -pOverlapped = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesRead = 0018FECC&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -ByteToRead = A000 (40960)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Buffer = 00392EF8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hFile = 00000030 (window)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ReadFile()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hObject = 00000030 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(window)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; CloseHandle()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 99.8837%; height: 10px;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 15.3488%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span&gt;004011C4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.814%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span&gt;RETN&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;-&amp;nbsp; CreateProcess(&amp;ldquo;fake.exe&amp;rdquo;, CREATE_SUSPENDED)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스를 &lt;/span&gt;&lt;span&gt;SUSPEND &lt;/span&gt;&lt;span&gt;모드로 생성하는 함수이다&lt;/span&gt;&lt;span&gt;. SUSPEND &lt;/span&gt;&lt;span&gt;모드로 생성하는 이유는 프로세스 실행을 멈춘 상태에서 메모리를 조작하기 위함이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;00401079&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040107A&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040107E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040107F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401081&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401083&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401085&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401087&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401089&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040108B&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040108C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040108E&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA ECX, DWORD PTR SS:[ESP+24]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[40900C]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; -pProcessInfo = 0013FEE8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pStartupInfo = 0013FEF8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CurrentDir = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pEnvironment = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CreationFlags = CREATE_&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;SUSPENED&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -InheritHandles = FALSE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pThreadSecurity = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pProcessSecurity = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -CommandLine = &lt;/span&gt;&lt;span&gt;&amp;ldquo;fake.exe&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -ModuleFileName = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; CreateProcessW()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;- SubFunc_2()&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SubFunc_2() &lt;/span&gt;&lt;span&gt;함수 내부의 주요 코드를 추리면 아래와 같으며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이 코드가 &lt;/span&gt;&lt;span&gt;PE Image Switching &lt;/span&gt;&lt;span&gt;기법의 핵심이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;span&gt;&lt;span&gt;SubFunc_2()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;004011D0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004011D1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EBP, ESP&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;0040120C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040120D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040120E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401218&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV DWORD PTR SS:[EBP-2D0], 10007&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409000]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&lt;span&gt;&lt;span&gt;; -pContext&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hThread&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; GetThreadContext()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;00401246&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040124C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040124E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401250&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401252&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401258&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401259&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040125C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040125D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040125E&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;MOV ECX, DWORD PTR SS:[EBP-22C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EDX, DWORD PTR DS:[ESI]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA EAX, DWORD PTR SS:[EBP=2D4]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ADD ECX, 8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409018]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&lt;span&gt;&lt;span&gt;; CONTEXT.Ebx = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;address of PEB&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesRead = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesToRead = 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Buffer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBaseAddress = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;PEB.ImageBase&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ReadProcessMemory()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;0040128C&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040128F&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401293&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401297&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040129D&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR DS:[EDI+3C]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV ECX, DWORD PTR DS:[EAX+EDI+34]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA EAX, DWORD PTR DS:[EAX+EDI+34]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CMP ECX, DWORD PTR SS:[EBP-2D4]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;JNZ SHORT 004012EA&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&lt;span&gt;&lt;span&gt;; EDI = MEM_FILE_REAL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;= Address of IDH&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; [EDI+3C] = &lt;/span&gt;&lt;span&gt;IDH.e_lfanew&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; EAX+EDI = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Address of INH&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; EAX+EDI+34 = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;INH.IOH.ImageBase&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ECX = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ImageBase of real.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; [EBP-2D4] = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ImageBase of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; case 1 : ImageBase of real.exe == ImageBase of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;0040129F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012A4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012A9&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012AF&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012B0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012B6&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012BC&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012BE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012BF&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012C0&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH 40B258&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 40B270&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409014]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409028]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EDX, DWORD PTR SS:[EBP-2D4]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV DCX, DWORD PTR DS:[ESI]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL EAX&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&lt;span&gt;&lt;span&gt;; -Name = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;ZwUnmapViewOfSection&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; --pModule = &amp;ldquo;ntdll.dll&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; --GetModuleHandleW()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hModule&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; GetProcAddress()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -ProcHandle = Process &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Handle of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -BaseAddress = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ImageBase of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ZwUnmapViewOfSection()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; case 2 : ImageBase of real.exe != ImageBase of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;004012EA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F7&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012FA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012FB&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012FC&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;MOV EDX, DWORD PTR SS:[EBP-22C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR DS:[ESI]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ADD EDX, 8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409034]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&lt;span&gt;&lt;span&gt;; Address of PEB &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&amp;ldquo;fake.exe&amp;rdquo;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesWritten = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -BytesToWrite = 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Buffer = ImageBase of &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;real.exe&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Address = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;PEB.ImageBase&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; WriteProcessMemory()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.8837%;&quot; colspan=&quot;3&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;&lt;span&gt;00401311&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401313&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401314&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.2092%;&quot;&gt;&lt;span&gt;&lt;span&gt;MOV ESP, EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;POP EBP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RETN&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.1396%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;● fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 실제 매핑 주소 구하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401218 &lt;/span&gt;&lt;span&gt;주소에서 &lt;/span&gt;&lt;span&gt;GetTjreadContext() API&lt;/span&gt;&lt;span&gt;를 호출하여 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 메인 스레드 컨텍스트(CONTEXT)를 구한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 27px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 27px;&quot;&gt;
&lt;td style=&quot;height: 27px;&quot;&gt;&lt;span&gt;&lt;span&gt;0040120C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040120D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040120E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401218&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 27px;&quot;&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV DWORD PTR SS:[EBP-2D0], 10007&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409000]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 27px;&quot;&gt;&lt;span&gt;&lt;span&gt;; -pContext&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hThread&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; GetThreadContext()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 메인 스레드 컨텍스트를 구하는 이유는 &lt;/span&gt;&lt;span&gt;PEB&lt;/span&gt;&lt;span&gt;를 구하기 위해서이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;프로세스의 실제 매핑 주소는 &lt;/span&gt;&lt;span&gt;PEB.ImageBase &lt;/span&gt;&lt;span&gt;멤버에 저장되어 있어서 &lt;/span&gt;&lt;span&gt;ReadProcessMemory() API&lt;/span&gt;&lt;span&gt;를 호출하여 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 매핑 주소를 구한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 131px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 131px;&quot;&gt;
&lt;td style=&quot;height: 131px;&quot;&gt;&lt;span&gt;&lt;span&gt;00401246&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040124C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040124E&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401250&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401252&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401258&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;00401259&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040125C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040125D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040125E&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 131px;&quot;&gt;&lt;span&gt;&lt;span&gt;MOV ECX, DWORD PTR SS:[EBP-22C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EDX, DWORD PTR DS:[ESI]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LEA EAX, DWORD PTR SS:[EBP=2D4]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ADD ECX, 8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409018]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 131px;&quot;&gt;&lt;span&gt;&lt;span&gt;; CONTEXT.Ebx = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;address of PEB&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesRead = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesToRead = 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Buffer&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBaseAddress = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;PEB.ImageBase&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ReadProcessMemory()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;● real.exe &lt;/span&gt;&lt;span&gt;파일의 &lt;/span&gt;&lt;span&gt;ImageBase &lt;/span&gt;&lt;span&gt;구하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;40128C&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;40128F &lt;/span&gt;&lt;span&gt;주소의 명령들은 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일의 &lt;/span&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;헤더 정보를 읽어서 &lt;/span&gt;&lt;span&gt;ImageBase&lt;/span&gt;&lt;span&gt;를 구하는 코드이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;EDI &lt;/span&gt;&lt;span&gt;레지스터 값은 &lt;/span&gt;&lt;span&gt;MEM_FILE_REAL &lt;/span&gt;&lt;span&gt;주소로&lt;/span&gt;&lt;span&gt;, SubFunc_1()&lt;/span&gt;&lt;span&gt;에서 할당받은 메모리 시작 주소이며&lt;/span&gt;&lt;span&gt;, real.exe &lt;/span&gt;&lt;span&gt;파일의 내용이 저장되어 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, EDI&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;헤더를 가리킨다.. 따라서 &lt;/span&gt;&lt;span&gt;EDI+3C&lt;/span&gt;&lt;span&gt;가 의미하는 것은 &lt;/span&gt;&lt;span&gt;IMAGE_DOS_HEADER &lt;/span&gt;&lt;span&gt;구조체의 &lt;/span&gt;&lt;span&gt;e_lfanew &lt;/span&gt;&lt;span&gt;멤버이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 32px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 32px;&quot;&gt;
&lt;td style=&quot;height: 32px;&quot;&gt;&lt;span&gt;&lt;span&gt;0040128C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;height: 32px;&quot;&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR DS:[EDI+3C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;height: 32px;&quot;&gt;&lt;span&gt;&lt;span&gt;; EDI = MEM_FILE_REAL &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;= Address of IDH&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; [EDI+3C] = &lt;/span&gt;&lt;span&gt;IDH.e_lfanew&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;EAX+EDI = IDH.e_lfanew + Start of PE = IMAGE_NT_HEADERS &lt;/span&gt;&lt;span&gt;구조체가 시작 주소&lt;/span&gt;&lt;span&gt;, EAX+EDI+34 = IMAGE_OPTIONAL_HEADER.ImageBase&lt;/span&gt;&lt;span&gt;가 멤버를 의미한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;0040128F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;MOV ECX, DWORD PTR DS:[EAX+EDI+34]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; EAX+EDI = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Address of INH&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; EAX+EDI+34 = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;INH.IOH.ImageBase&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;● 비교 &lt;/span&gt;&lt;span&gt;: ImageBase of fake.exe &amp;amp; ImageBase of real.exe&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 실제 매핑 주소와 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일의 &lt;/span&gt;&lt;span&gt;ImageBase &lt;/span&gt;&lt;span&gt;값을 비교한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 &lt;/span&gt;&lt;span&gt;ImageBase &lt;/span&gt;&lt;span&gt;값의 일치 여부에 따라 실행 분기가 달라진다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;00401297&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;0040129D&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;CMP ECX, DWORD PTR SS:[EBP-2D4]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;JNZ SHORT 004012EA&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; ECX = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ImageBase of real.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; [EBP-2D4] = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ImageBase of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;◎&amp;nbsp; ImageBase&lt;/span&gt;&lt;span&gt;가 같은 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 경우 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;가 매핑되려는 주소 &lt;/span&gt;&lt;span&gt;400000&lt;/span&gt;&lt;span&gt;에 이미 &lt;/span&gt;&lt;span&gt;fake.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;가 매칭되어 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그대로 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;를 매칭시키면 충돌이 발생하기 때문에 먼저 &lt;/span&gt;&lt;span&gt;fake.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 언매핑 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4. imagebase가 같은 경우.jpg&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcKEBX/btsEkfL5OgT/Dntus3UZaIwcD2Wk3bKBCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcKEBX/btsEkfL5OgT/Dntus3UZaIwcD2Wk3bKBCk/img.jpg&quot; data-alt=&quot;ImageBase가 같은 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcKEBX/btsEkfL5OgT/Dntus3UZaIwcD2Wk3bKBCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcKEBX%2FbtsEkfL5OgT%2FDntus3UZaIwcD2Wk3bKBCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;432&quot; data-filename=&quot;4. imagebase가 같은 경우.jpg&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ImageBase가 같은 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;004012BE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012BF&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012C0&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL EAX&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; -ProcHandle = Process &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Handle of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -BaseAddress = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ImageBase of fake.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ZwUnmapViewOfSection()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;ZwUnmapViewOfSection() API&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;NTSYSAPI NTSTATUS ZwUnmapViewOfSection(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[in] HANDLE ProcessHandle,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[in, optional] PVOID BaseAddress&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;출처 &lt;/span&gt;&lt;span&gt;: MSDN&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;◎ ImageBase&lt;/span&gt;&lt;span&gt;가 다른 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 가상 메모리 공간에 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 위해 필요한 공간을 할당하고 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;를 매핑시키면 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;의 주소가 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 매핑 주소라는 것을 &lt;/span&gt;&lt;span&gt;PEB&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;ImageBase &lt;/span&gt;&lt;span&gt;멤버를 변경해서 알려줘야 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5. imagebase가 다른 경우.jpg&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBhz8Y/btsEkws9d4W/DqEJ4xAg1OZPZhl4XK0qj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBhz8Y/btsEkws9d4W/DqEJ4xAg1OZPZhl4XK0qj1/img.jpg&quot; data-alt=&quot;ImageBase가 다를 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBhz8Y/btsEkws9d4W/DqEJ4xAg1OZPZhl4XK0qj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBhz8Y%2FbtsEkws9d4W%2FDqEJ4xAg1OZPZhl4XK0qj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;417&quot; data-filename=&quot;5. imagebase가 다른 경우.jpg&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ImageBase가 다를 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;004012EA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012F7&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012FA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012FB&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004012FC&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;MOV EDX, DWORD PTR SS:[EBP-22C]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MOV EAX, DWORD PTR DS:[ESI]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ADD EDX, 8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EDX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;PUSH EAX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409034]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; Address of PEB &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&amp;ldquo;fake.exe&amp;rdquo;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -pBytesWritten = NULL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -BytesToWrite = 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Buffer = ImageBase of &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;real.exe&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -Address = &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;PEB.ImageBase&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; -hProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; WriteProcessMemory()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;- SubFunc_3()&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 함수에서는 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일을 &lt;/span&gt;&lt;span&gt;fake.exe&lt;/span&gt;&lt;span&gt;프로세스에 매핑시키는 코드를 가지고 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;매핑은 매핑할 위치에 가상 메모리를 할당하여&lt;/span&gt;&lt;span&gt;, fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;PE Header&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;PE Section &lt;/span&gt;&lt;span&gt;위치에 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;정보를 쓴다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이후 &lt;/span&gt;&lt;span&gt;EP&lt;/span&gt;&lt;span&gt;를 변경하면 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 기존의 &lt;/span&gt;&lt;span&gt;&amp;lsquo;fake.exe&amp;rsquo;&lt;/span&gt;&lt;span&gt;에서 &lt;/span&gt;&lt;span&gt;&amp;lsquo;real.exe&amp;rsquo;&lt;/span&gt;&lt;span&gt;로 변경하는 작업이 완료된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;● real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 위한 메모리 할당&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;트레이싱 하다 보면 &lt;/span&gt;&lt;span&gt;VirtualAllocEx() API &lt;/span&gt;&lt;span&gt;함수 호출 코드를 만난다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 함수의 파라미터에서 할당받고자 하는 메모리의 시작주소&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;(Arg2 = 00400000 ; real.exe&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;ImageBase)&lt;/span&gt;&lt;span&gt;와 할당받을 메모리 크기&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;(Arg3 = 0000A000 ; real.exe&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;SizeOfImage)&lt;/span&gt;&lt;span&gt;를 확인할 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이 함수는 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스에 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 위한 메모리 공간을 할당받기 위한 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7. virtualalloc.jpg&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2wIqr/btsEnfqkzn4/EzvC0HHsusSMfiUm5CoFp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2wIqr/btsEnfqkzn4/EzvC0HHsusSMfiUm5CoFp0/img.jpg&quot; data-alt=&quot;VirtualAllocEx() 호출 : real.exe의 PE Image 메모리 할당&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2wIqr/btsEnfqkzn4/EzvC0HHsusSMfiUm5CoFp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2wIqr%2FbtsEnfqkzn4%2FEzvC0HHsusSMfiUm5CoFp0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;908&quot; height=&quot;300&quot; data-filename=&quot;7. virtualalloc.jpg&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VirtualAllocEx() 호출 : real.exe의 PE Image 메모리 할당&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;● PE Header Mapping &amp;amp; PE Section Mapping&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WriteProcessMemory() API&lt;/span&gt;&lt;span&gt;를 이용하여 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE &lt;/span&gt;&lt;span&gt;헤더를 &lt;/span&gt;&lt;span&gt;VirtualAllocEx() API&lt;/span&gt;&lt;span&gt;로 할당받은 메모리 영역에 쓰고 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8. 헤더 매칭.jpg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HDTvK/btsEjFjNvb5/ckScDnclBgoZFis6Ab0xp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HDTvK/btsEjFjNvb5/ckScDnclBgoZFis6Ab0xp1/img.jpg&quot; data-alt=&quot;PE Header 매핑&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HDTvK/btsEjFjNvb5/ckScDnclBgoZFis6Ab0xp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHDTvK%2FbtsEjFjNvb5%2FckScDnclBgoZFis6Ab0xp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;267&quot; data-filename=&quot;8. 헤더 매칭.jpg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE Header 매핑&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후 섹션의 개수만큼 루프를 돌면서 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;섹션 위치에 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;섹션을 쓴다 이 작업을 마치면 &lt;/span&gt;&lt;span&gt;real.exe &lt;/span&gt;&lt;span&gt;파일은 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;400000(real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;ImageBase) &lt;/span&gt;&lt;span&gt;주소에 완전히 매핑된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9. section mapping.jpg&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csOnMB/btsEkRKV8nW/KK2Fkli6silTIcj9kl6FZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csOnMB/btsEkRKV8nW/KK2Fkli6silTIcj9kl6FZK/img.jpg&quot; data-alt=&quot;PE Section 매핑&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csOnMB/btsEkRKV8nW/KK2Fkli6silTIcj9kl6FZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsOnMB%2FbtsEkRKV8nW%2FKK2Fkli6silTIcj9kl6FZK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;320&quot; data-filename=&quot;9. section mapping.jpg&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE Section 매핑&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;● EP &lt;/span&gt;&lt;span&gt;변경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스는 &lt;/span&gt;&lt;span&gt;SUSPEND &lt;/span&gt;&lt;span&gt;모드로 생성된 상태이다&lt;/span&gt;&lt;span&gt;. SUSPEND &lt;/span&gt;&lt;span&gt;모드로 생성된 프로세스가 &lt;/span&gt;&lt;span&gt;Resume&lt;/span&gt;&lt;span&gt;되면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;가장 먼저 &lt;/span&gt;&lt;span&gt;ntdll!RtlUserThreadStart() API(CONTEXT.Eip)&lt;/span&gt;&lt;span&gt;를 실행하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;결국 리턴 값인 &lt;/span&gt;&lt;span&gt;EP(Entry Point) &lt;/span&gt;&lt;span&gt;주소&lt;/span&gt;&lt;span&gt;(CONTEXT.Eax)&lt;/span&gt;&lt;span&gt;로 이동된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;따라서 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;&amp;lsquo;real.exe&amp;rsquo;&lt;/span&gt;&lt;span&gt;로 변경했으므로 &lt;/span&gt;&lt;span&gt;CONTEXT.Eax&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;EP &lt;/span&gt;&lt;span&gt;주소&lt;/span&gt;&lt;span&gt;(401060)&lt;/span&gt;&lt;span&gt;으로 변경해야 정상 실행이 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10. setthreadcontext().jpg&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCSjM/btsEmF4m4fY/lYySh7wHd6GNQZKSIUNhCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCSjM/btsEmF4m4fY/lYySh7wHd6GNQZKSIUNhCK/img.jpg&quot; data-alt=&quot;SetThreadContext()&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCSjM/btsEmF4m4fY/lYySh7wHd6GNQZKSIUNhCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCSjM%2FbtsEmF4m4fY%2FlYySh7wHd6GNQZKSIUNhCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1045&quot; height=&quot;238&quot; data-filename=&quot;10. setthreadcontext().jpg&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SetThreadContext()&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;- ResumeThread()&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;마지막으로 &lt;/span&gt;&lt;span&gt;ResumeThread()&lt;/span&gt;&lt;span&gt;를 호출하여 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스를 &lt;/span&gt;&lt;span&gt;Resume &lt;/span&gt;&lt;span&gt;시킨다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot;&gt;&lt;span&gt;&lt;span&gt;; Resume Thread&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;004010F0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;004010F1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;PUSH ECX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CALL DWORD PTR DS:[409038]&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;; -hThread = 00000034 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(widnow)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;; ResumeThread()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;real.exe&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;PE Image&lt;/span&gt;&lt;span&gt;를 가진 &lt;/span&gt;&lt;span&gt;fake.exe &lt;/span&gt;&lt;span&gt;프로세스의 실행이 재개된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11. PE image가 real.exe로 변경된 fake.exe 프로세스.jpg&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxEaPF/btsEmRDeE65/T9TPDKsRTMVL7S7loY5PP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxEaPF/btsEmRDeE65/T9TPDKsRTMVL7S7loY5PP0/img.jpg&quot; data-alt=&quot;PE Image가 real.exe로 변경된 fake.exe 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxEaPF/btsEmRDeE65/T9TPDKsRTMVL7S7loY5PP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxEaPF%2FbtsEmRDeE65%2FT9TPDKsRTMVL7S7loY5PP0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;497&quot; data-filename=&quot;11. PE image가 real.exe로 변경된 fake.exe 프로세스.jpg&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PE Image가 real.exe로 변경된 fake.exe 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5. &lt;/span&gt;&lt;span&gt;마무리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실습 예제 파일의 디버깅을 통해 &lt;/span&gt;&lt;span&gt;PE Image Switching &lt;/span&gt;&lt;span&gt;기법의 동작 원리를 살펴보았다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 동작 원리에서는 &lt;/span&gt;&lt;span&gt;DebugMe3.exe&lt;/span&gt;&lt;span&gt;를 디버깅한 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;디버깅 기법으로 따지면 일반적인 응용 프로그램 디버깅과 다를 게 없다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;리버서 입장에서는 &lt;/span&gt;&lt;span&gt;PE Image Switching &lt;/span&gt;&lt;span&gt;기법의 동작 원리도 중요하지만&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그 기법이 적용된 프로세스를 디버깅하는 것에 더 관심이 있을 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>ImageSwitching</category>
      <category>PEImage</category>
      <category>PEImageSwitching</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/45</guid>
      <comments>https://honorlog.tistory.com/45#entry45comment</comments>
      <pubDate>Wed, 31 Jan 2024 20:15:30 +0900</pubDate>
    </item>
    <item>
      <title>디버깅 실습2 - Self-Creation (JIT 디버깅)</title>
      <link>https://honorlog.tistory.com/44</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Self-Creation&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실행 중에 자기 자신을 자식&lt;/span&gt;&lt;span&gt;(Child) &lt;/span&gt;&lt;span&gt;프로세스로 생성시키는 것을 &lt;/span&gt;&lt;span&gt;Self-Creation&lt;/span&gt;&lt;span&gt;이라고 한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0_self-creation 기법.jpg&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2e1IP/btsDuyMsd0L/8Kpo8DANDkdQXKJXwx0AYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2e1IP/btsDuyMsd0L/8Kpo8DANDkdQXKJXwx0AYK/img.jpg&quot; data-alt=&quot;Self-Creation 기법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2e1IP/btsDuyMsd0L/8Kpo8DANDkdQXKJXwx0AYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2e1IP%2FbtsDuyMsd0L%2F8Kpo8DANDkdQXKJXwx0AYK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;95&quot; data-filename=&quot;0_self-creation 기법.jpg&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Self-Creation 기법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 파일들은 같은 실행 파일이면서 부모&lt;/span&gt;&lt;span&gt;(Parent)&lt;/span&gt;&lt;span&gt;로 실행될 때와 자식으로 실행될 때 서로 다르게 동작한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;하나의 실행 파일에 두 가지 실행 경로가 존재하는 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_self-creation 동작 화면.jpg&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/szzi1/btsDuwgRLeE/zQHgj1Nc55CYuH5kRpbf7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/szzi1/btsDuwgRLeE/zQHgj1Nc55CYuH5kRpbf7k/img.jpg&quot; data-alt=&quot;Self-Creation 동작 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/szzi1/btsDuwgRLeE/zQHgj1Nc55CYuH5kRpbf7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fszzi1%2FbtsDuwgRLeE%2FzQHgj1Nc55CYuH5kRpbf7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;280&quot; data-filename=&quot;1_self-creation 동작 화면.jpg&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Self-Creation 동작 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&amp;nbsp;- 동작 원리&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Self-Creation &lt;/span&gt;&lt;span&gt;기법의 동작 원리는 아래 그림과 같다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqIgKi/btsDuUu4tOg/gNQBX2HhFkdQSdNsQEgzUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqIgKi/btsDuUu4tOg/gNQBX2HhFkdQSdNsQEgzUK/img.png&quot; data-alt=&quot;Self-Creation 기법 동작 원리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqIgKi/btsDuUu4tOg/gNQBX2HhFkdQSdNsQEgzUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqIgKi%2FbtsDuUu4tOg%2FgNQBX2HhFkdQSdNsQEgzUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;405&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Self-Creation 기법 동작 원리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;● Create Child Process (SUSPEND mode)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;부모 프로세스가 실행되면 &lt;/span&gt;&lt;span&gt;main() &lt;/span&gt;&lt;span&gt;함수가 호출되고&lt;/span&gt;&lt;span&gt;, main()&lt;/span&gt;&lt;span&gt;에서 &lt;/span&gt;&lt;span&gt;SUSPEND &lt;/span&gt;&lt;span&gt;모드로 자식 프로세스를 생성&lt;/span&gt;&lt;span&gt;한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SUSPEND 모드로 생성되면, Import DLL들은 로딩되지만 &lt;b&gt;메인 스레드(Main Thread)가 멈춘 상태&lt;/b&gt;가 된다.(&amp;lsquo;스레드를 재운다&amp;rsquo;라고 표현)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메인 스레드는 프로세스가 생성될 때 기본적으로 생성되는 스레드로, EP 코드를 실행시키는 가장 중요한 역할을 수행한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 &lt;b&gt;SUSPEND 모드로 실행된 프로세스는 메인 스레드가 멈추면서 EP 코드가 실행되지 못하고 아무런 동작을 하지 못하는 상태&lt;/b&gt;가 된다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;● &lt;span&gt;Change EIP&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;외부의 프로세스의 스레드가 실행할 코드 주소를 임의로 변경하는 것은 디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계에서 가능하며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;부모 프로세스와 자식 프로세스는 디버거&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;디버기 관계이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;디버거는 &lt;/span&gt;&lt;span&gt;Debugging API&lt;/span&gt;&lt;span&gt;를 이용하여 디버기 프로세스의 코드 실행 위치를 맘대로 변경할 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;부모 프로세스는 현&lt;/span&gt;&lt;span&gt;재 멈춰있는 자식 프로세스의 메인 스레드의 컨텍스트(Context)를 얻어서 &lt;/span&gt;&lt;span&gt;EIP &lt;/span&gt;&lt;span&gt;멤버를 원하는 주소 값으로 변경한 후 적용&lt;/span&gt;&lt;span&gt;하면 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자식 프로세스의 메인 스레드는 &lt;/span&gt;&lt;span&gt;PROCESS_INFORMATION &lt;/span&gt;&lt;span&gt;구조체의 &lt;/span&gt;&lt;span&gt;hThread &lt;/span&gt;&lt;span&gt;멤버이다&lt;/span&gt;&lt;span&gt;. GetThreadContext() API&lt;/span&gt;&lt;span&gt;에 &lt;/span&gt;&lt;span&gt;hThread &lt;/span&gt;&lt;span&gt;핸들을 입력하면 스레드 컨텍스트(CONTEXT) 구조체를 얻어낼 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;PROCESS_INFORMATION &lt;/span&gt;&lt;span&gt;구조체 정의&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;typedef struct _PROCESS_INFORMATION {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; HANDLE&amp;nbsp; &amp;nbsp;hProcess;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; HANDLE&amp;nbsp; &amp;nbsp;hThread;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; DWORD&amp;nbsp; &amp;nbsp;dwProcessId;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; DWORD&amp;nbsp; &amp;nbsp;dwThreadId;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;출처 &lt;/span&gt;&lt;span&gt;: MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;EIP&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;CONTEXT &lt;/span&gt;&lt;span&gt;구조체의 &lt;/span&gt;&lt;span&gt;Eip &lt;/span&gt;&lt;span&gt;멤버이다&lt;/span&gt;&lt;span&gt;(EIP &lt;/span&gt;&lt;span&gt;레지스터 의미&lt;/span&gt;&lt;span&gt;). &lt;/span&gt;&lt;span&gt;이 값을 &lt;/span&gt;&lt;span&gt;ChildProc()&lt;/span&gt;&lt;span&gt;함수 주소로 변경하면 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;[ctx.Eip = (DWORD)ChildProc;]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;WOW64_CONTEXT &lt;/span&gt;&lt;span&gt;구조체 정의&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;typedef struct _WOW64_CONTEXT {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; DWORD ContextFlags;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; DWORD Dr0; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //04h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; DWORD Dr1; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //08h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Dr2; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //0Ch&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Dr3; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //10h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Dr6; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //14h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Dr7; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //18h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;WOW64_FLOATING_SAVE_AREA FloatSave;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD SegGs; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //88h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD SegFs;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //90h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD SegEs; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //94h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD SegDs; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //98h&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Edi; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //9Ch&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; DWORD Esi; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //A0h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Ebx; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //A4h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; DWORD Edx; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //A8h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Ecx; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //ACh&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Eax; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //B0h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Ebp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //B4h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; DWORD Eip; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; //B8h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD SegCs; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;//BCh&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD EFlags; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;//C0h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD Esp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;//C4h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;DWORD SegSs; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;//C8h&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;} WOW64_CONTEXT;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;출처 &lt;/span&gt;&lt;span&gt;: MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;SetThreadContext() API&lt;/span&gt;&lt;span&gt;를 호출하여 새로 변경된 &lt;/span&gt;&lt;span&gt;CONTEXT &lt;/span&gt;&lt;span&gt;구조체를 자식 프로세스의 메인 스레드에 세팅하고 &lt;/span&gt;&lt;span&gt;ResumeThread() API&lt;/span&gt;&lt;span&gt;를 호출하면 자식 프로세스의 메인 스레드가 깨어나면서 변경된 &lt;/span&gt;&lt;span&gt;EIP(=&lt;/span&gt;&lt;span&gt;실행할 코드 주소&lt;/span&gt;&lt;span&gt;=ChildProc())&lt;/span&gt;&lt;span&gt;를 실행한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;스레드 컨텍스트를 변경하는 것이 핵심이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;● Resum Main Thread&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자식 프로세스의 멈춰져 있는 메인 스레드를 실행&lt;/span&gt;&lt;span&gt;(&amp;lsquo;&lt;/span&gt;&lt;span&gt;스레드를 깨운다&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;라고 표현&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;이제 메인 스레드는 변경시킨 코드 주소를 실행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span&gt;디버깅 실습&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&amp;nbsp;- 고려 사항&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Self-Creation &lt;/span&gt;&lt;span&gt;기법의 디버깅에서 고려할 사항은 디버깅 중에 개로 생성되는 자식 프로세스를 어떻게 시작 시점부터 디버깅할 수 있는지이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부모 프로세스를 디버깅하여 자식 프로세스의 EP가 어느 주소로 변경되는지를 확인&lt;/li&gt;
&lt;li&gt;&amp;lsquo;무한 루프 설치 방법&amp;rsquo; 또는 JIT(Jump-In-Time) 디버깅 방법 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;SUSPEND 프로세스&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Q. 실습 예제에서는 SUSPEND 모드로 자식 프로세스를 생성시키고, 메인 스레드의 EIP를 변경시키는 방식이 사용되었다. 부모 프로세스를 디버깅 중 자식 프로세스가 생성된 순간 다른 디버거로 Attach하면 안 되나?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;A. 디버거는 Suspended 프로세스를 Attach할 수 없다. 디버거의 Attach 대상 프로세스 목록에 아예 나타나지 않을 것이며, 메인 스레드가 깨어난 상태(Resume)가 되어야 목록에서 확인될 것이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&amp;nbsp;- JIT &lt;/span&gt;&lt;span&gt;디버깅&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JIT(Jump-In-Time) &lt;/span&gt;&lt;span&gt;디버깅은 실행 중인 프로세스에 예외&lt;/span&gt;&lt;span&gt;(Exception)&lt;/span&gt;&lt;span&gt;가 발생했을 때 &lt;/span&gt;&lt;b&gt;&lt;span&gt;OS&lt;/span&gt;&lt;span&gt;에서 자동으로 지정된 디버거를 실행하여 해당 프로세스에 &lt;/span&gt;&lt;span&gt;Attach&lt;/span&gt;&lt;/b&gt;&lt;span&gt;해주는 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;JIT 디버깅은 주로 애플리케이션 개발 과정에서 사용되며, Visual C++을 JIT 디버거로 설정하여 예외가 발생한 소스코드를 직접 확인하는 데 사용된다(소스코드를 가지고 있는 경우).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;● JIT &lt;/span&gt;&lt;span&gt;디버거 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;에는 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Options - Just-in-debugging&amp;rsquo; &lt;/span&gt;&lt;span&gt;메뉴에 자신을 &lt;/span&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;디버거로 등록시키는 기능이 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2. just-in-time 메뉴.jpg&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ESZHZ/btsDAEKXhuP/3nrzskHpo6BdAmiFEOkPvk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ESZHZ/btsDAEKXhuP/3nrzskHpo6BdAmiFEOkPvk/img.jpg&quot; data-alt=&quot;Just-in-time debugging 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ESZHZ/btsDAEKXhuP/3nrzskHpo6BdAmiFEOkPvk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FESZHZ%2FbtsDAEKXhuP%2F3nrzskHpo6BdAmiFEOkPvk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;137&quot; data-filename=&quot;2. just-in-time 메뉴.jpg&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Just-in-time debugging 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후 다이얼로그에서 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Make OllyDbg just-in-time debugger&amp;rsquo; &lt;/span&gt;&lt;span&gt;선택&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4EV57/btsDyQFc9oL/IUyuwacKkklLWyRyw69ws0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4EV57/btsDyQFc9oL/IUyuwacKkklLWyRyw69ws0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;256&quot; data-filename=&quot;3. ekdldjffhrm.jpg&quot; data-widthpercent=&quot;50.5&quot; style=&quot;width: 49.9117%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4EV57/btsDyQFc9oL/IUyuwacKkklLWyRyw69ws0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4EV57%2FbtsDyQFc9oL%2FIUyuwacKkklLWyRyw69ws0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xKYBA/btsDxzqoguw/L4EqkHf1akhxnF9MlM31fk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKYBA/btsDxzqoguw/L4EqkHf1akhxnF9MlM31fk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;262&quot; data-filename=&quot;3-2 다이얼로그 jit 세팅 후.jpg&quot; style=&quot;width: 48.9255%;&quot; data-widthpercent=&quot;49.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKYBA/btsDxzqoguw/L4EqkHf1akhxnF9MlM31fk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKYBA%2FbtsDxzqoguw%2FL4EqkHf1akhxnF9MlM31fk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Just-in-time 디버깅 다이얼로드 설정 전/후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;디버거로 등록되었으며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;현재 시스템에서 설정된 &lt;/span&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;디버거는 아래 레지스트리의 키에서 확인 가능하다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;64bit 환경에서는 JIT 설정이 안 된다. 32bit 환경에서 실습 진행하는 것을 추천&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-4 64비트에서 설정 안된.jpg&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WScv1/btsDxSDeysD/1VXiZaRVJwcsbRkPBbU9I0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WScv1/btsDxSDeysD/1VXiZaRVJwcsbRkPBbU9I0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WScv1/btsDxSDeysD/1VXiZaRVJwcsbRkPBbU9I0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWScv1%2FbtsDxSDeysD%2F1VXiZaRVJwcsbRkPBbU9I0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;853&quot; height=&quot;136&quot; data-filename=&quot;3-4 64비트에서 설정 안된.jpg&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-3 32비트에서 설정된.jpg&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnbXPn/btsDA3jq8wB/fHCKt6Y73JdkkWUHWoFR80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnbXPn/btsDA3jq8wB/fHCKt6Y73JdkkWUHWoFR80/img.jpg&quot; data-alt=&quot;OllyDbg JIT 설정 시 regedit (64bit / 32bit)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnbXPn/btsDA3jq8wB/fHCKt6Y73JdkkWUHWoFR80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnbXPn%2FbtsDA3jq8wB%2FfHCKt6Y73JdkkWUHWoFR80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;136&quot; data-filename=&quot;3-3 32비트에서 설정된.jpg&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OllyDbg JIT 설정 시 regedit (64bit / 32bit)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&amp;nbsp;- 실습 예제 파일&lt;/span&gt;&lt;span&gt;(DebugMe2.exe) &lt;/span&gt;&lt;span&gt;디버깅&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실습 예제 파일의 디버깅 목표는 자식 프로세스의 (새로운)EP 코드로부터 정확히 디버깅을 하는 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Self-Creation &lt;/span&gt;&lt;span&gt;기법은 자기 자신을 자식 프로세스로 실행하면서 시작되는 코드&lt;/span&gt;&lt;span&gt;(EP code) &lt;/span&gt;&lt;span&gt;위치를 변경하기에 먼저 부모 프로세스를 디버깅하여 자식 프로세스의 시작 코드 주소를 얻어야 한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;디버깅 방법으로 자식 프로세스를 디버깅하면 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;● 부모 프로세스 디버깅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OllyDbg&lt;/span&gt;&lt;span&gt;로 &lt;/span&gt;&lt;span&gt;DebugMe2.exe&lt;/span&gt;&lt;span&gt;를 열어 &lt;/span&gt;&lt;span&gt;main() &lt;/span&gt;&lt;span&gt;함수까지 진행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4. jit로 등록된 ollydbg MAIN.jpg&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUtAuB/btsDA43HywN/1F5dyV6o6PN50aPkO8kNrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUtAuB/btsDA43HywN/1F5dyV6o6PN50aPkO8kNrK/img.jpg&quot; data-alt=&quot;JIT 디버거로 등록된 OllyDbg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUtAuB/btsDA43HywN/1F5dyV6o6PN50aPkO8kNrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUtAuB%2FbtsDA43HywN%2F1F5dyV6o6PN50aPkO8kNrK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;547&quot; data-filename=&quot;4. jit로 등록된 ollydbg MAIN.jpg&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JIT 디버거로 등록된 OllyDbg&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;트레이싱을 하다 보면 &lt;/span&gt;&lt;span&gt;CreateProcess() API &lt;/span&gt;&lt;span&gt;호출 코드&lt;/span&gt;&lt;span&gt;(401102)&lt;/span&gt;&lt;span&gt;가 보이는데 이 코드가 실행되면 &lt;/span&gt;&lt;span&gt;SUSPEND &lt;/span&gt;&lt;span&gt;모드의 자식 프로세스가 생성된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5. Createprocee()호출 코드 및 파라미터.jpg&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTUgNo/btsDAbWFf6t/vV5i0HvTE24F058InNgenk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTUgNo/btsDAbWFf6t/vV5i0HvTE24F058InNgenk/img.jpg&quot; data-alt=&quot;CreateProcess() 호출 코드 및 파라미터 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTUgNo/btsDAbWFf6t/vV5i0HvTE24F058InNgenk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTUgNo%2FbtsDAbWFf6t%2FvV5i0HvTE24F058InNgenk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;476&quot; data-filename=&quot;5. Createprocee()호출 코드 및 파라미터.jpg&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CreateProcess() 호출 코드 및 파라미터 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅을 진행하면 &lt;/span&gt;&lt;span&gt;GetThreadContext()/SetThreadContext() API &lt;/span&gt;&lt;span&gt;호출 코드가 나타난다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 코드에서 자식 프로세스의 메인 스레드 컨텍스트(CONTEXT) 구조체를 구하여 &lt;/span&gt;&lt;span&gt;CONTEXT.Eip &lt;/span&gt;&lt;span&gt;값을 &lt;/span&gt;&lt;span&gt;ChildProc() &lt;/span&gt;&lt;span&gt;주소로 변경한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CONTEXT 구조체의 시작 주소는 &lt;b&gt;GetThreadContext()/SetThreadContex() API의 두 번째 파라미터&lt;/b&gt;를 확인하면 알 수 있다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CONTEXT &lt;/span&gt;&lt;span&gt;구조체의 시작 주소(18FA68)에서 B8h&lt;/span&gt;&lt;span&gt;만큼 떨어진 곳에 EIP(18FA68+B8h=18FB20)가 존재한다&lt;/span&gt;&lt;span&gt;. EIP &lt;/span&gt;&lt;span&gt;변경 주소는 401186주소에서 401000&lt;/span&gt;&lt;span&gt;인 것을 확인할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6-0. context.eip 변경 코드.jpg&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wET6h/btsDA5uMtky/hDmakO8cq1PQQEnKNooXlK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wET6h/btsDA5uMtky/hDmakO8cq1PQQEnKNooXlK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wET6h/btsDA5uMtky/hDmakO8cq1PQQEnKNooXlK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwET6h%2FbtsDA5uMtky%2FhDmakO8cq1PQQEnKNooXlK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;442&quot; data-filename=&quot;6-0. context.eip 변경 코드.jpg&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAwLup/btsDuQ0vAGt/AN0JvWIYyYUl0w73KUpdD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAwLup/btsDuQ0vAGt/AN0JvWIYyYUl0w73KUpdD1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;161&quot; data-filename=&quot;6-1.Getthreadcontext.jpg&quot; style=&quot;width: 44.9586%; margin-right: 10px;&quot; data-widthpercent=&quot;45.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAwLup/btsDuQ0vAGt/AN0JvWIYyYUl0w73KUpdD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAwLup%2FbtsDuQ0vAGt%2FAN0JvWIYyYUl0w73KUpdD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLuLf5/btsDwEsaVzM/MmFlKkwvYqjrKNNHW3GppK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLuLf5/btsDwEsaVzM/MmFlKkwvYqjrKNNHW3GppK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;142&quot; data-filename=&quot;6-2.setthreadcontext.jpg&quot; style=&quot;width: 53.8787%;&quot; data-widthpercent=&quot;54.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLuLf5/btsDwEsaVzM/MmFlKkwvYqjrKNNHW3GppK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLuLf5%2FbtsDwEsaVzM%2FMmFlKkwvYqjrKNNHW3GppK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;CONTEXT.Eip 변경 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후는 &lt;/span&gt;&lt;span&gt;ResumeThread(pi.hThread) API&lt;/span&gt;&lt;span&gt;를 호출하여 자식 프로세스의 메인 스레드를 시작시키고&lt;/span&gt;&lt;span&gt;, WaitForSingleObject(pi.hProcess, INFINITE) API&lt;/span&gt;&lt;span&gt;를 호출하여 자식 프로세스가 종료할 때까지 기다리는 상태가 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.resume.jpg&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn7eqn/btsDyAJjfN3/wT5Voj5jpctAPHfzkngDU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn7eqn/btsDyAJjfN3/wT5Voj5jpctAPHfzkngDU0/img.jpg&quot; data-alt=&quot;ResumeThread(pi.hThread) API 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn7eqn/btsDyAJjfN3/wT5Voj5jpctAPHfzkngDU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn7eqn%2FbtsDyAJjfN3%2FwT5Voj5jpctAPHfzkngDU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;97&quot; data-filename=&quot;7.resume.jpg&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ResumeThread(pi.hThread) API 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.waitforsingleobject.jpg&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIW4Hn/btsDzykcrMk/NjDGzKnrxtTOHFNNkLr4s0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIW4Hn/btsDzykcrMk/NjDGzKnrxtTOHFNNkLr4s0/img.jpg&quot; data-alt=&quot;WaitForSingleObjevt(pi.hProcess, INFINITE) API 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIW4Hn/btsDzykcrMk/NjDGzKnrxtTOHFNNkLr4s0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIW4Hn%2FbtsDzykcrMk%2FNjDGzKnrxtTOHFNNkLr4s0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;337&quot; data-filename=&quot;8.waitforsingleobject.jpg&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WaitForSingleObjevt(pi.hProcess, INFINITE) API 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;● 자식 프로세스 디버깅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Stud_PE &lt;/span&gt;&lt;span&gt;유틸리티를 이용하여 &lt;/span&gt;&lt;span&gt;401000 &lt;/span&gt;&lt;span&gt;주소&lt;/span&gt;&lt;span&gt;(VA : Virtual Address)&lt;/span&gt;&lt;span&gt;를 파일 옵셋&lt;/span&gt;&lt;span&gt;(Offset)&lt;/span&gt;&lt;span&gt;으로 변환하면 &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;이 나온다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9. Stud_PE 유틸리티의 RVARAW 기능.jpg&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQ0P9/btsDxVNu3Ip/yxuWrq8zZtkQ3kDCjTlRjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQ0P9/btsDxVNu3Ip/yxuWrq8zZtkQ3kDCjTlRjk/img.jpg&quot; data-alt=&quot;Stud_PE 유틸리티의 RVA &amp;amp;lt;=&amp;amp;gt; RAW 기능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQ0P9/btsDxVNu3Ip/yxuWrq8zZtkQ3kDCjTlRjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQ0P9%2FbtsDxVNu3Ip%2FyxuWrq8zZtkQ3kDCjTlRjk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;201&quot; data-filename=&quot;9. Stud_PE 유틸리티의 RVARAW 기능.jpg&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Stud_PE 유틸리티의 RVA &amp;lt;=&amp;gt; RAW 기능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;HxD &lt;/span&gt;&lt;span&gt;유틸리티로 파일 옵셋 &lt;/span&gt;&lt;span&gt;400 &lt;/span&gt;&lt;span&gt;위치의 한 바이트를 0xCC로 변경&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;원본 값 &lt;/span&gt;&lt;span&gt;: 0x6A)&lt;/span&gt;&lt;span&gt;한 후 저장한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAyaZ7/btsDxg5H94Q/kUpF3Ku2fc9UrMSQZriYpK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAyaZ7/btsDxg5H94Q/kUpF3Ku2fc9UrMSQZriYpK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;142&quot; data-filename=&quot;10. 변경 전.jpg&quot; data-widthpercent=&quot;49.22&quot; style=&quot;width: 48.6428%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAyaZ7/btsDxg5H94Q/kUpF3Ku2fc9UrMSQZriYpK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAyaZ7%2FbtsDxg5H94Q%2FkUpF3Ku2fc9UrMSQZriYpK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byluFG/btsDAERIcLu/pGqeFvUKM97Ex2ZqlD9muK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byluFG/btsDAERIcLu/pGqeFvUKM97Ex2ZqlD9muK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;142&quot; data-filename=&quot;10-1. 변경 후.jpg&quot; style=&quot;width: 50.1944%;&quot; data-widthpercent=&quot;50.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byluFG/btsDAERIcLu/pGqeFvUKM97Ex2ZqlD9muK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyluFG%2FbtsDAERIcLu%2FpGqeFvUKM97Ex2ZqlD9muK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;HxD 유틸리티로 400 파일 옵셋 값을 0xCC로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0xCC는 INT3 &lt;span&gt;명령어&lt;/span&gt;&lt;span&gt;(Break Point)&lt;/span&gt;&lt;span&gt;를 의미한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;파일 옵셋 &lt;/span&gt;&lt;span&gt;0x400(VA&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;401000)&lt;/span&gt;&lt;span&gt;의 0xCC 코드가 실행되면&lt;/span&gt;&lt;span&gt;, EXCEPTION_BREAKPOINT &lt;/span&gt;&lt;span&gt;예외가 발생하게 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11. 예외 발생 다이얼로그.jpg&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wAaLr/btsDAFQD29l/QNNCTOdQKMQkgUbbvUEOh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wAaLr/btsDAFQD29l/QNNCTOdQKMQkgUbbvUEOh0/img.jpg&quot; data-alt=&quot;예외 발생 다이얼로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wAaLr/btsDAFQD29l/QNNCTOdQKMQkgUbbvUEOh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwAaLr%2FbtsDAFQD29l%2FQNNCTOdQKMQkgUbbvUEOh0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;148&quot; data-filename=&quot;11. 예외 발생 다이얼로그.jpg&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예외 발생 다이얼로그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 시스템에 &lt;/span&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;디버거가 등록되어 있으므로 &lt;/span&gt;&lt;span&gt;&amp;lsquo;Debug&amp;rsquo;&lt;/span&gt;&lt;span&gt;를 선택하면 등록된 디버거에 Attach되어 해당 부분부터 디버깅이 가능하다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12. 0xCC가 설치된 ChildProc) 함수.jpg&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pyx1h/btsDxVzZo12/yHii7kfSPgdQI1PwnXkRz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pyx1h/btsDxVzZo12/yHii7kfSPgdQI1PwnXkRz0/img.jpg&quot; data-alt=&quot;0xCC가 설치된 ChildProc() 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pyx1h/btsDxVzZo12/yHii7kfSPgdQI1PwnXkRz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPyx1h%2FbtsDxVzZo12%2FyHii7kfSPgdQI1PwnXkRz0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;222&quot; data-filename=&quot;12. 0xCC가 설치된 ChildProc) 함수.jpg&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;0xCC가 설치된 ChildProc() 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;401000 &lt;/span&gt;&lt;span&gt;주소의 0xCC를 원래 코드(0x6A)로 되돌린다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13. 원본 코드로 변경.jpg&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VFulE/btsDxApjS9l/kjsKQkNs4Evh1j5FxaLowK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VFulE/btsDxApjS9l/kjsKQkNs4Evh1j5FxaLowK/img.jpg&quot; data-alt=&quot;원본 코드(0x6A)로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VFulE/btsDxApjS9l/kjsKQkNs4Evh1j5FxaLowK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVFulE%2FbtsDxApjS9l%2FkjsKQkNs4Evh1j5FxaLowK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;195&quot; data-filename=&quot;13. 원본 코드로 변경.jpg&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원본 코드(0x6A)로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 전상 코드 상태에서 디버깅을 진행하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14. 원본 ChildProc() 함수.jpg&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVKLAm/btsDAr5ZBJw/ksz8gDX75hxJgv5LkVFdXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVKLAm/btsDAr5ZBJw/ksz8gDX75hxJgv5LkVFdXK/img.jpg&quot; data-alt=&quot;원본 ChildProc() 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVKLAm/btsDAr5ZBJw/ksz8gDX75hxJgv5LkVFdXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVKLAm%2FbtsDAr5ZBJw%2Fksz8gDX75hxJgv5LkVFdXK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1035&quot; height=&quot;210&quot; data-filename=&quot;14. 원본 ChildProc() 함수.jpg&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원본 ChildProc() 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span&gt;마무리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;디버깅의 기본 개념은 서비스 디버깅의 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;무한 루프 설치&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;방법과 매우 유사하다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;유용한 디버깅 기법들이므로 까다로운 프로세스의 디버깅에 사용하면 좋다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/y7Lsj/btsDxzYgqQH/vNzz1g63DLbilVRk6lKngk/%EB%A6%AC%EB%B2%84%EC%8B%B1%20%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC%20-%20%EB%94%94%EB%B2%84%EA%B9%85%20%EC%8B%A4%EC%8A%B52_%EC%97%85%EB%A1%9C%EB%93%9C%EC%9A%A9.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;리버싱 핵심원리 - 디버깅 실습2_업로드용.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.61MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>JIT</category>
      <category>Self-Creation</category>
      <category>디버깅</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/44</guid>
      <comments>https://honorlog.tistory.com/44#entry44comment</comments>
      <pubDate>Tue, 16 Jan 2024 02:29:26 +0900</pubDate>
    </item>
    <item>
      <title>문자열 인코딩 개념 정리- ASCII / ANSI / EUC-KR / CP949 / UNICODE / UTF-8</title>
      <link>https://honorlog.tistory.com/43</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;1.&amp;nbsp;ASCII&amp;nbsp;(American&amp;nbsp;Standard&amp;nbsp;Code&amp;nbsp;for&amp;nbsp;Information&amp;nbsp;Interchange)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASCII는 최초의 문자열 인코딩&lt;/li&gt;
&lt;li&gt;7bit로 구성&lt;/li&gt;
&lt;li&gt;영어를 위한 문자, 숫자, 특수문자, 기호 등 128개 문자를 표현 (2^7 == 128)&lt;/li&gt;
&lt;li&gt;영어를 위한 문자(American Standard Code)이기 때문에 다른 언어는 표현이 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;2.&amp;nbsp;ANSI&amp;nbsp;(American&amp;nbsp;National&amp;nbsp;Standard&amp;nbsp;Institute)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ANSI는 ASCII의 확장판 느낌으로 영어 이외의 다른 언어를 지원할 목적으로 만들어짐&lt;/li&gt;
&lt;li&gt;8bit로 256개의 문자를 표현&lt;/li&gt;
&lt;li&gt;앞의 7bit는 ASCII와 동일하며, 뒤의 1bit로 다른 언어의 문자표를 의미&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;각 언어별로 Code 값을 가짐 - CodePage&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;ANSI = ASCII(7bit) + CodePage(1bit)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;3.&amp;nbsp;EUC-KR&amp;nbsp;(Extended&amp;nbsp;Unix&amp;nbsp;Code-Korea)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한글 지원을 위해 유닉스 계열에서 나온 완성형 코드 조합&lt;/li&gt;
&lt;li&gt;완성형 코드 - 완성된 문자 하나하나에 코드 번호를 부여한 것&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;반대의 개념, 조합형 코드 - 자음과 모음 각각에 코드 번호를 부여하여 초성, 중성, 종성을 조합하여 하나의 문자를 나타내는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;2Byte로 하나의 문자를 표현&lt;/li&gt;
&lt;li&gt;한글 단어 2350자만 사전순으로 배열하여 모든 한글 단어를 표현하기에 역부족&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.&amp;nbsp;CP949&amp;nbsp;(Code&amp;nbsp;Page&amp;nbsp;949)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한글 지원을 위해 윈도우즈 계열에서 나온 환장 완성형 코드 조합&lt;/li&gt;
&lt;li&gt;2Byte로 하나의 문자를 표현&lt;/li&gt;
&lt;li&gt;EUC-KR이 사용하지 않는 나머지 바이트열을 활용하여 대부분의 한글 단어를 표현 가능&lt;/li&gt;
&lt;li&gt;EUC-KR의 확장이므로 호환되며, EUC-KR에서 표현되지 않는 문자는 조합하여 표현&lt;/li&gt;
&lt;li&gt;949는 한국 페이지 번호를 의미&lt;/li&gt;
&lt;li&gt;MS949, Windows-949라 부르기도 함&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;윈도우&amp;nbsp;메모장에서&amp;nbsp;ANSI&amp;nbsp;인코딩으로&amp;nbsp;저장하면&amp;nbsp;CP949&amp;nbsp;방식에&amp;nbsp;의해&amp;nbsp;인코딩 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◎&amp;nbsp;UNICODE&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 고안된 코드 조합&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 전 세계의 기기들이 통일된 인코딩 방식을 사용할 수 있도록 하기 위해 고안&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 2byte 숫자로 1:1 매핑시키는 &amp;lsquo;방식&amp;rsquo;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;nbsp; &amp;nbsp;(유니코드를 표현하는 여러 가지 인코딩 방식들이 존재)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- UTF-8, UTF-16, UTF-32 등은 유니코드 기반의 문자들을 바이트열에 인코딩하는 방식&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;유니코드는&amp;nbsp;전&amp;nbsp;세계&amp;nbsp;문자들&amp;nbsp;각각에&amp;nbsp;맵핑된&amp;nbsp;코드들을&amp;nbsp;담고&amp;nbsp;있는&amp;nbsp;거대한&amp;nbsp;표이며,&amp;nbsp;UTF-8&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;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;5-1.&amp;nbsp;UTF-8&amp;nbsp;(&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Unicode&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Transformation&amp;nbsp;Format&amp;nbsp;-&amp;nbsp;8bit)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유니코드를 위한 가변 길이 문자 인코딩(멀티바이트) 방식 중 하나&lt;/li&gt;
&lt;li&gt;ANSI의 단점 보완을 목적으로 만들어짐&lt;/li&gt;
&lt;li&gt;멀티바이트 개념을 사용하여 하나의 Character Set에 거의 모든 문자를 넣음&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ANSI는 다국어를 지원하기 위해 CodePage 정보를 미리 알고 있어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;멀티바이트란 표현해야 하는 문자에 따라 글자 크기를 가변으로 변경하여 사용하는 것&lt;/li&gt;
&lt;li&gt;멀티바이트(1~4bytes)로 최대 1,112,064자를 표현 가능&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ANSI는 고정바이트(1byte) 형태로 최대 256자 표현 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;첫 128자는 ASCII 코드 값으로 ANSI와 UTF-8이 동일&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;영어를 사용할 경우 1byte만 사용, 중동지역 언어 또는 많은 유럽 언어가 2bytes, 한국 중국, 일본 등 동아시아권 언어는 3bytes이상을 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;5-2.&amp;nbsp;UTF-16&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16bit 기반으로 저장하는 UTF-8의 변형&lt;/li&gt;
&lt;li&gt;자주 사용하는 문자는 2byte, 그렇지 않은 문자는 4byte로 표현&lt;/li&gt;
&lt;li&gt;한글의 경우, UTF-16으로 저장하면 2bytes면 되어 용량의 이점이 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;UTF-8로 저장하면 3bytes가 필요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;경우에 따라서는 2bytes 이상을 사용할 경우도 있어 큰 이점은 아니다.&lt;/li&gt;
&lt;li&gt;Byte Ordering을 고려함에 따른 복잡성 증대와 ANSI와 호환이 안 되는 단점이 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Byte Ordering은 데이터가 저장되는 순서로, Rettle Endian과 Big Endian 방식이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;5-3&amp;nbsp;UTF-32&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 문자를 4byte의 고정 길이로 인코딩&lt;/li&gt;
&lt;li&gt;코드 변형 규칙이나 가변 길이에 대한 특별한 고려를 하고 싶지 않을 때, 일관성 있고 단순한 방식으로 문자열을 처리할 수 있다는 장점&lt;/li&gt;
&lt;li&gt;하나의 문자를 저장하는데 너무 많은 저장 공간이 사용되고 Byte Ordering을 고려함해야 하는 문제가 있어 자주 사용되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ansi</category>
      <category>ascii</category>
      <category>CP949</category>
      <category>EUC-KR</category>
      <category>Unicode</category>
      <category>UTF-16</category>
      <category>UTF-32</category>
      <category>UTF-8</category>
      <category>인코딩</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/43</guid>
      <comments>https://honorlog.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 10 Jan 2024 20:00:03 +0900</pubDate>
    </item>
    <item>
      <title>Advanced 안티 디버깅</title>
      <link>https://honorlog.tistory.com/42</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1.&amp;nbsp;가비지&amp;nbsp;코드&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;의미&amp;nbsp;없는&amp;nbsp;코드를&amp;nbsp;대량으로&amp;nbsp;추가시켜&amp;nbsp;디버깅을&amp;nbsp;힘들게&amp;nbsp;만드는&amp;nbsp;기법&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;중간&amp;nbsp;중간에&amp;nbsp;진짜&amp;nbsp;의미&amp;nbsp;있는&amp;nbsp;고드를&amp;nbsp;섞어&amp;nbsp;버리거나&amp;nbsp;다른&amp;nbsp;안티&amp;nbsp;디버깅&amp;nbsp;기법&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을&amp;nbsp;혼합해서&amp;nbsp;사용하면&amp;nbsp;디버깅이&amp;nbsp;매우&amp;nbsp;힘들다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&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;않다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2.&amp;nbsp;Breaking&amp;nbsp;Code&amp;nbsp;Alignment&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;IA32-Instruction을&amp;nbsp;잘&amp;nbsp;이해한&amp;nbsp;상태에서&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;정교하게&amp;nbsp;어셈블리&amp;nbsp;프로그래밍을&amp;nbsp;하면,&amp;nbsp;디버거의&amp;nbsp;디스어셈블&amp;nbsp;과정에&amp;nbsp;혼란&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉,&amp;nbsp;디스어셈블리&amp;nbsp;코드가&amp;nbsp;깨진&amp;nbsp;것처럼&amp;nbsp;보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&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;lsquo;Breaking&amp;nbsp;Code&amp;nbsp;Alignment&amp;rsquo;&amp;nbsp;기법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사람이&amp;nbsp;파악하기&amp;nbsp;어렵게&amp;nbsp;뒤죽박죽&amp;nbsp;섞어&amp;nbsp;놓은&amp;nbsp;코드를&amp;nbsp;난도화&amp;nbsp;코드(Obfuscated&amp;nbsp;Code)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;가비지&amp;nbsp;코드와&amp;nbsp;Breaking&amp;nbsp;Code&amp;nbsp;Alignment&amp;nbsp;기법을&amp;nbsp;잘&amp;nbsp;조합하여&amp;nbsp;사용하면&amp;nbsp;훌륭한&amp;nbsp;Obfuscated&amp;nbsp;Code&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3.&amp;nbsp;Encryption&amp;nbsp;/&amp;nbsp;Decryption&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;암호화/복호화&amp;nbsp;기법은&amp;nbsp;프로그램의&amp;nbsp;코드와&amp;nbsp;데이터를&amp;nbsp;숨기기&amp;nbsp;위해&amp;nbsp;패커/프로텍터에서&amp;nbsp;자주&amp;nbsp;사용되는&amp;nbsp;기법&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정상적인&amp;nbsp;코드를&amp;nbsp;암호화시키는&amp;nbsp;행위를&amp;nbsp;인코딩(Encoding),&amp;nbsp;암호화된&amp;nbsp;코드를&amp;nbsp;복호화시키는&amp;nbsp;행위를&amp;nbsp;디코딩(Decoding)이라고&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;간단한&amp;nbsp;디코딩&amp;nbsp;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디코딩의&amp;nbsp;경우&amp;nbsp;프로그램&amp;nbsp;내에서&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;복호화&amp;nbsp;과정을&amp;nbsp;완료해야&amp;nbsp;정산적인&amp;nbsp;코드&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가&amp;nbsp;나타난다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;안티&amp;nbsp;덤프&amp;nbsp;기법의&amp;nbsp;하나로써&amp;nbsp;복호화한&amp;nbsp;정상&amp;nbsp;코드를&amp;nbsp;실행시킨&amp;nbsp;이후에&amp;nbsp;다시&amp;nbsp;암호화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는&amp;nbsp;기법이&amp;nbsp;있다.&amp;nbsp;실행&amp;nbsp;중인&amp;nbsp;프로세스의&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;메모리&amp;nbsp;코드를&amp;nbsp;덤프해도&amp;nbsp;암호화된&amp;nbsp;코드만&amp;nbsp;보이게&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-2.&amp;nbsp;복잡한&amp;nbsp;디코딩&amp;nbsp;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;복잡한&amp;nbsp;디코딩&amp;nbsp;코드의&amp;nbsp;경우&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;가비지&amp;nbsp;코드가&amp;nbsp;포함되는&amp;nbsp;등의&amp;nbsp;형태로&amp;nbsp;복잡한&amp;nbsp;디코딩&amp;nbsp;코드&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가&amp;nbsp;이루어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&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;&lt;/span&gt;&lt;span&gt;&lt;b&gt;유효&amp;nbsp;명령어를&amp;nbsp;뽑아&lt;/b&gt;&lt;/span&gt;&lt;span&gt;낼&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-3.&amp;nbsp;특수한&amp;nbsp;경우&amp;nbsp;-&amp;nbsp;코드&amp;nbsp;재조합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어떤&amp;nbsp;프로텍터들은&amp;nbsp;코드의&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;가독성을&amp;nbsp;떨어뜨리고&amp;nbsp;트레이싱을&amp;nbsp;어렵게&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;하기&amp;nbsp;위해서&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;실행코드를&amp;nbsp;실시간으로&amp;nbsp;재조합&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는&amp;nbsp;경우가&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드&amp;nbsp;실행&amp;nbsp;직전&amp;nbsp;코드에서&amp;nbsp;레지스리에&amp;nbsp;접근하여&amp;nbsp;SUB/ADD/XOR&amp;nbsp;등의&amp;nbsp;명령어를&amp;nbsp;사용하여&amp;nbsp;이후의&amp;nbsp;코드를&amp;nbsp;변경한다.&amp;nbsp;변경된&amp;nbsp;코드.&amp;nbsp;즉,&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;새로운&amp;nbsp;코드를&amp;nbsp;재생성하여&amp;nbsp;실행&lt;/b&gt;&lt;/span&gt;&lt;span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다른&amp;nbsp;장점은&amp;nbsp;사용자가&amp;nbsp;만약&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;디코딩되는&amp;nbsp;위치에&amp;nbsp;software&amp;nbsp;BP를&amp;nbsp;설치했을&amp;nbsp;때,&amp;nbsp;실행&amp;nbsp;에러&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를&amp;nbsp;발생킨다.&amp;nbsp;&lt;span style=&quot;color: #666666;&quot;&gt;(BP가&amp;nbsp;설치된&amp;nbsp;영역은&amp;nbsp;CC로&amp;nbsp;패치가&amp;nbsp;되어&amp;nbsp;전혀&amp;nbsp;다른&amp;nbsp;계산&amp;nbsp;결과가&amp;nbsp;나오기&amp;nbsp;때문&amp;nbsp;-&amp;nbsp;OllyDbg의&amp;nbsp;경우,&amp;nbsp;Software&amp;nbsp;BP가&amp;nbsp;설치된&amp;nbsp;주소의&amp;nbsp;내용을&amp;nbsp;보호해서&amp;nbsp;새로운&amp;nbsp;값으로&amp;nbsp;쓰지&amp;nbsp;못하게&amp;nbsp;한다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4.&amp;nbsp;Stolen&amp;nbsp;Bytes(Remove&amp;nbsp;OEP)&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원본&amp;nbsp;코드의&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;일부(주로&amp;nbsp;OEP코드)를&amp;nbsp;패커/프로텍터가&amp;nbsp;생성한&amp;nbsp;메모리&amp;nbsp;영역으로&amp;nbsp;옮겨서&amp;nbsp;실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;장점은&amp;nbsp;프로세스&amp;nbsp;메모리&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;덤프&amp;nbsp;시&amp;nbsp;OEP&amp;nbsp;코드의&amp;nbsp;일부분이&amp;nbsp;없어&amp;nbsp;정상&amp;nbsp;실행&amp;nbsp;불가&lt;/b&gt;&lt;/span&gt;&lt;span&gt;(Anti-Dump&amp;nbsp;기법)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Stolen&amp;nbsp;Bytes가&amp;nbsp;적용된&amp;nbsp;파일을&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;다른&amp;nbsp;패커/프로텍터로&amp;nbsp;압축&amp;nbsp;시&amp;nbsp;리버서에게&amp;nbsp;혼란&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을&amp;nbsp;준다.&amp;nbsp;&lt;span style=&quot;color: #666666;&quot;&gt;(언팩의&amp;nbsp;성공여부를&amp;nbsp;의심하게&amp;nbsp;됨)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;프로텍터의&amp;nbsp;종류에&amp;nbsp;따라&amp;nbsp;다양한&amp;nbsp;형태의&amp;nbsp;실행이&amp;nbsp;존재한다.&amp;nbsp;Stolen&amp;nbsp;Bytes&amp;nbsp;실행&amp;nbsp;후&amp;nbsp;메모리에서&amp;nbsp;제거하는&amp;nbsp;경우도&amp;nbsp;있다.&lt;span style=&quot;color: #666666;&quot;&gt;(메모리&amp;nbsp;할당&amp;nbsp;-&amp;nbsp;Stolen&amp;nbsp;Bytes&amp;nbsp;코드&amp;nbsp;복호화&amp;nbsp;-&amp;nbsp;실행&amp;nbsp;-&amp;nbsp;메모리&amp;nbsp;해제)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5.&amp;nbsp;API&amp;nbsp;리다이렉션(Redirection)&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;디버깅&amp;nbsp;시&amp;nbsp;흐름을&amp;nbsp;대략적으로&amp;nbsp;빨리&amp;nbsp;파악할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;좋은&amp;nbsp;방법은&amp;nbsp;주요&amp;nbsp;Win32&amp;nbsp;API(파일,&amp;nbsp;레지스트리,&amp;nbsp;프로세스,&amp;nbsp;네트워크&amp;nbsp;등)에&amp;nbsp;BP를&amp;nbsp;설치하는&amp;nbsp;것&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;BP&amp;nbsp;설치&amp;nbsp;후&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;실행하면&amp;nbsp;BP를&amp;nbsp;설치한&amp;nbsp;API가&amp;nbsp;호출된&amp;nbsp;후&amp;nbsp;멈춘&lt;/b&gt;&lt;/span&gt;&lt;span&gt;다.&amp;nbsp;이때&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;스택에는&amp;nbsp;리턴주소가&amp;nbsp;저장&lt;/b&gt;&lt;/span&gt;&lt;span&gt;되어&amp;nbsp;그&amp;nbsp;주소부터&amp;nbsp;디버깅을&amp;nbsp;하면&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;효과적으로&amp;nbsp;핵심&amp;nbsp;코드에&amp;nbsp;다가갈&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이런&amp;nbsp;디버깅&amp;nbsp;노하우를&amp;nbsp;회피하는&amp;nbsp;기법이&amp;nbsp;API&amp;nbsp;Redirection이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;프로텍터는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;주요&amp;nbsp;API들의&amp;nbsp;전체코드&amp;nbsp;혹은 일부를&amp;nbsp;다른&amp;nbsp;메모리&amp;nbsp;영역으로&amp;nbsp;복사&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;그리고&amp;nbsp;보호&amp;nbsp;대상&amp;nbsp;프로그램의&amp;nbsp;코드를&amp;nbsp;분석하여&amp;nbsp;해당&amp;nbsp;API를&amp;nbsp;호출하는&amp;nbsp;코드를&amp;nbsp;패치시켜&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;자신이&amp;nbsp;복사해둔&amp;nbsp;API코드가&amp;nbsp;실행&lt;/b&gt;&lt;/span&gt;&lt;span&gt;되도록&amp;nbsp;한다.&amp;nbsp;따라서&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;원본&amp;nbsp;API&amp;nbsp;주소에&amp;nbsp;BP를&amp;nbsp;설치해도&amp;nbsp;소용이&amp;nbsp;없&lt;/b&gt;&lt;/span&gt;&lt;span&gt;다.(추가적인&amp;nbsp;Anti-Dump기법)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;-&amp;nbsp;다른&amp;nbsp;메모리로&amp;nbsp;복사해&amp;nbsp;둔&amp;nbsp;코드는&amp;nbsp;같은&amp;nbsp;결국&amp;nbsp;같은&amp;nbsp;API를&amp;nbsp;가리킨다.(dll파일의&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;API&amp;nbsp;주소를&amp;nbsp;가리킴)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한&amp;nbsp;Opcode&amp;nbsp;&amp;lsquo;FF15&amp;rsquo;로&amp;nbsp;간접호출을&amp;nbsp;하던&amp;nbsp;원래완&amp;nbsp;다르게&amp;nbsp;&amp;lsquo;8E&amp;rsquo;로&amp;nbsp;직접호출을&amp;nbsp;하면서&amp;nbsp;남은&amp;nbsp;1바이트가&amp;nbsp;뒤로&amp;nbsp;밀리게&amp;nbsp;된다.&lt;span style=&quot;color: #666666;&quot;&gt;(Breaking&amp;nbsp;Code&amp;nbsp;Alignment&amp;nbsp;기법이&amp;nbsp;이루어짐)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;※&amp;nbsp;ASProtect의&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;/span&gt;&lt;span&gt;&lt;b&gt;같은&amp;nbsp;결과를&amp;nbsp;내는&amp;nbsp;다른&amp;nbsp;모양의&amp;nbsp;코드를&amp;nbsp;다형성&amp;nbsp;코드(Polymorphic&amp;nbsp;Code)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라고&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;API&amp;nbsp;Redirction&amp;nbsp;기법은&amp;nbsp;구조상&amp;nbsp;API&amp;nbsp;Hooking과&amp;nbsp;비슷한&amp;nbsp;면이&amp;nbsp;많다.&amp;nbsp;둘의&amp;nbsp;차이점은&amp;nbsp;목적.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;API&amp;nbsp;Redirection은&amp;nbsp;디버깅을&amp;nbsp;어렵게&amp;nbsp;만드는&amp;nbsp;것이&amp;nbsp;목적&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이고,&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;API&amp;nbsp;후킹은&amp;nbsp;API&amp;nbsp;호출&amp;nbsp;전/후에&amp;nbsp;추가적인&amp;nbsp;기능을&amp;nbsp;제공하는&amp;nbsp;것이&amp;nbsp;목적&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;6.&amp;nbsp;Debug&amp;nbsp;Blocker(Self&amp;nbsp;Debugging)&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;자신을&amp;nbsp;디버깅&amp;nbsp;모드로&amp;nbsp;실행시키는&amp;nbsp;기법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;동일한&amp;nbsp;프로세스를&amp;nbsp;부모/자식&amp;nbsp;구조로&amp;nbsp;실행하는&amp;nbsp;것으로&amp;nbsp;디버거/디버기&amp;nbsp;관계가&amp;nbsp;되는&amp;nbsp;것&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파일이&amp;nbsp;실행되면&amp;nbsp;자신의&amp;nbsp;실행&amp;nbsp;파일을&amp;nbsp;찾아서&amp;nbsp;DEBUG&amp;nbsp;모드로&amp;nbsp;실행&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;자기&amp;nbsp;자신을&amp;nbsp;자식&amp;nbsp;프로세스로&amp;nbsp;실행시키는&amp;nbsp;Self&amp;nbsp;Creating&amp;nbsp;기법의&amp;nbsp;발전&amp;nbsp;형태.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Self&amp;nbsp;Creating&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;EP&amp;nbsp;주소&amp;nbsp;변경&amp;nbsp;등의&amp;nbsp;작업을&amp;nbsp;수행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;rarr; 부모 프로세스만을 디버깅해서는 OEP로 갈 수 없다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;rarr; 디버거를 자식 프로세스에 Attach시키는 디버깅 방법으로 무력화된다는 단점이 있으며, 이 &lt;b&gt;단점을&amp;nbsp;보완한&amp;nbsp;것이&amp;nbsp;Debug&amp;nbsp;Blocker&amp;nbsp;기법&lt;/b&gt;이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Debug&amp;nbsp;Blocker&amp;nbsp;기법의&amp;nbsp;장점은&amp;nbsp;두 가지(목적&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;관점에서)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;1.&amp;nbsp;디버깅&amp;nbsp;방지&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 원본 코드를 실행하는 자식 프로세는 이미 디버깅 중이므로 원칙적으로 다른 디버거를 Attach할 수 없다. &lt;span style=&quot;color: #666666;&quot;&gt;(디버깅하는 방법은 디버깅 실습 참고)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;2.&amp;nbsp;자식(Debuggee)&amp;nbsp;프로세스를&amp;nbsp;제어(Control)&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디버거-디버기 관계에서 디버거는 막강한 권한을 가지고 있다. 즉, 디버기 프로세스의 예외를 처리하고 실행 흐름을 제어하는 등의 작업을 수행할 수 있다. 이로 인해 디버깅이 까다로워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;rarr;&amp;nbsp;디버기에&amp;nbsp;발생항&amp;nbsp;예외에&amp;nbsp;대한&amp;nbsp;우선&amp;nbsp;처리권은&amp;nbsp;디버거에게&amp;nbsp;있다.&amp;nbsp;따라서&amp;nbsp;자식(Debuggee)&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;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Debug&amp;nbsp;Blocker&amp;nbsp;기법에서&amp;nbsp;발전된&lt;b&gt;&amp;nbsp;&amp;lsquo;Nanomite&amp;rsquo;&amp;nbsp;기법&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;디버기&amp;nbsp;프로세스의&amp;nbsp;내부&amp;nbsp;코드에서&amp;nbsp;&lt;b&gt;Jcc&amp;nbsp;명령어를&amp;nbsp;전부&amp;nbsp;INT3(0xCC)&amp;nbsp;명령어(SWBP)&amp;nbsp;또는&amp;nbsp;기타&amp;nbsp;예외를&amp;nbsp;발생시키는&amp;nbsp;코드로&amp;nbsp;패치&lt;/b&gt;한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;패치시킨&amp;nbsp;Jcc&amp;nbsp;명령어의&amp;nbsp;실제&amp;nbsp;주소&amp;nbsp;위치와&amp;nbsp;점프할&amp;nbsp;주소를&amp;nbsp;&lt;b&gt;디버거&amp;nbsp;내부에&amp;nbsp;테이블&amp;nbsp;형태&lt;/b&gt;로&amp;nbsp;가지고&amp;nbsp;있다가&amp;nbsp;기버기에서&amp;nbsp;패치된&amp;nbsp;명령이&amp;nbsp;실행되면&amp;nbsp;&lt;b&gt;예외가&amp;nbsp;발생하여&amp;nbsp;디버거에게&amp;nbsp;제어권이&amp;nbsp;넘어&lt;/b&gt;오면,&amp;nbsp;예외가&amp;nbsp;발생한&amp;nbsp;&lt;b&gt;주소를&amp;nbsp;이용해&amp;nbsp;테이블에서&amp;nbsp;점프해야&amp;nbsp;할&amp;nbsp;주소를&amp;nbsp;얻&lt;/b&gt;어서&amp;nbsp;디버기에게&amp;nbsp;알려준다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;Nanomite&amp;rsquo;&amp;nbsp;기법을&amp;nbsp;제대로&amp;nbsp;디버깅하기&amp;nbsp;위해서는&amp;nbsp;패치된&amp;nbsp;코드를&amp;nbsp;원본과&amp;nbsp;똑같이&amp;nbsp;복구시켜야 된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #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;높다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>Advanced안티디버깅</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <category>안티디버깅</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/42</guid>
      <comments>https://honorlog.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 10 Jan 2024 15:29:18 +0900</pubDate>
    </item>
    <item>
      <title>Dynamic 안티 디버깅</title>
      <link>https://honorlog.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;내부&amp;nbsp;코드와&amp;nbsp;데이터를&amp;nbsp;리버싱으로부터&amp;nbsp;감추고&amp;nbsp;보호하는&amp;nbsp;것이&amp;nbsp;목적으로,&amp;nbsp;PE&amp;nbsp;프로텍터들에서&amp;nbsp;많이&amp;nbsp;사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원본&amp;nbsp;프로그램의&amp;nbsp;핵심&amp;nbsp;알고리즘을&amp;nbsp;보호하기&amp;nbsp;위해&amp;nbsp;사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거로&amp;nbsp;프로그램을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있을지언정&amp;nbsp;원본&amp;nbsp;프로그램의&amp;nbsp;핵심&amp;nbsp;코드(OEP)를&amp;nbsp;트레이싱으로&amp;nbsp;찾지&amp;nbsp;못하도록&amp;nbsp;방해&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1.&amp;nbsp;예외(Exception)&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;안티&amp;nbsp;디버깅의&amp;nbsp;단골&amp;nbsp;메뉴&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예외가&amp;nbsp;발생하면&amp;nbsp;일반&amp;nbsp;실행은&amp;nbsp;SEH(Structured&amp;nbsp;Exception&amp;nbsp;Handling)&amp;nbsp;메커니즘에&amp;nbsp;의해&amp;nbsp;처리되고,&amp;nbsp;디버깅&amp;nbsp;중이면&amp;nbsp;디버거가&amp;nbsp;예외&amp;nbsp;처리를&amp;nbsp;담당한다.&amp;nbsp;이&amp;nbsp;특징을&amp;nbsp;이용해서&amp;nbsp;정상&amp;nbsp;실행&amp;nbsp;경우와&amp;nbsp;디버깅당하는&amp;nbsp;경우를&amp;nbsp;판별해서&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;동작을&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;안티&amp;nbsp;디버깅&amp;nbsp;기법.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;SEH(Structured&amp;nbsp;Exception&amp;nbsp;Handling)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SEH의&amp;nbsp;대표적인&amp;nbsp;예외&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;79.5944mm&quot;&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_DATATYPE_MISALIGNMRNT&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_BREAKPOINT&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_SINGLE_STEP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_ACCESS_BIOLATION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_IN_PAGE_ERROR&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_ILLEGAL_INSTRTUCTION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_NONCONTINUABLE_EXCEPTION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_INVALID_DISPOSITION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_ARRAY_BOUNDS_EXCEEDED&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLT_DENORMAL_OPERAND&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLR_DIVIDE_BY_ZERO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLT_INEXACT_RESULT&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLT_INVALID_OPERATION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLT_OVERATION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLT_STACK_CHECK&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_FLT_UNDERFLOW&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_INT_DIVIDE_BY_ZERO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_INT_OVERFLOW&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCPETION_PRIV_INSTRUCTION&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EXCEPTION_STACK_OVERFLOW&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;79.5944mm&quot;&gt;&lt;span&gt;&lt;span&gt;(0x80000002)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0x80000003)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0x80000004)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000005)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000006)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC000001D)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000025)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000026)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC000008C)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC000008D)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC000008E)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC000008F)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000090)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000091)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000092)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000093)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000094)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000095)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC0000096)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(0xC00000FD)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가장&amp;nbsp;대표적인&amp;nbsp;예외는&amp;nbsp;BP(Break&amp;nbsp;Point)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SEH에&amp;nbsp;Static&amp;nbsp;안티&amp;nbsp;디버깅을&amp;nbsp;삽입하여&amp;nbsp;프로그래밍&amp;nbsp;디버깅&amp;nbsp;중인지를&amp;nbsp;판단해&amp;nbsp;EIP를&amp;nbsp;변경하는&amp;nbsp;코드로&amp;nbsp;실행된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;SS:[ESP+C]&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;SEH+C&amp;nbsp;==&amp;nbsp;세&amp;nbsp;번째&amp;nbsp;파라미터&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;CONTEXT&amp;nbsp;*pContext&amp;nbsp;구조체&amp;nbsp;포인터&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;DS:[EAX+B8]&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;:&amp;nbsp;pContext&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;Eip&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;디버거&amp;nbsp;프로그램의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;INT3&amp;nbsp;예외&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;를&amp;nbsp;무시하고&amp;nbsp;자체&amp;nbsp;SEH에서&amp;nbsp;처리되도록&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;&amp;nbsp;옵션&amp;nbsp;설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;가끔&amp;nbsp;INT3&amp;nbsp;명령어를&amp;nbsp;트레이싱&amp;nbsp;중&amp;nbsp;디버거가&amp;nbsp;꼬이면서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;비정상&amp;nbsp;종료&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;가&amp;nbsp;되는&amp;nbsp;경우가&amp;nbsp;있다.&amp;nbsp;이&amp;nbsp;때는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;SEH와&amp;nbsp;정상실행코드(SEH에서&amp;nbsp;지정해준&amp;nbsp;EIP)에&amp;nbsp;BP&amp;nbsp;설치&amp;nbsp;후&amp;nbsp;실행&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;하면&amp;nbsp;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;-&amp;nbsp;디버깅&amp;nbsp;실전에서&amp;nbsp;매우&amp;nbsp;자주&amp;nbsp;사용된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-2.&amp;nbsp;SetUnhandledExceptionFilter()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SEH에서&amp;nbsp;예외&amp;nbsp;처리가&amp;nbsp;되지&amp;nbsp;않았거나&amp;nbsp;등록된&amp;nbsp;SEH가&amp;nbsp;없을&amp;nbsp;경우,&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;kernel32!UnhandledExceptionFilter()&amp;nbsp;API가&amp;nbsp;호출&lt;/b&gt;&lt;/span&gt;&lt;span&gt;된다.&amp;nbsp;이&amp;nbsp;함수&amp;nbsp;내부에서&amp;nbsp;Top&amp;nbsp;Level&amp;nbsp;Exception&amp;nbsp;Filter(혹은&amp;nbsp;Last&amp;nbsp;Exception&amp;nbsp;Filter)라&amp;nbsp;불리는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;시스템의&amp;nbsp;마지막&amp;nbsp;예외처리기를&amp;nbsp;실행&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;(마지막&amp;nbsp;예외처리기는&amp;nbsp;&amp;lsquo;작동이&amp;nbsp;중지되었습니다.&amp;rsquo;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;경고창을&amp;nbsp;띄운&amp;nbsp;후&amp;nbsp;종료&lt;/b&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;kernel32!UnhandledExceptionFilter() 내부에서 Static 안티 디버깅 기법인&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;ntdll!NtQueryInformaionProcess(ProcessDebugPort)&amp;nbsp;API를&amp;nbsp;호출&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하여&amp;nbsp;디버깅&amp;nbsp;여부&amp;nbsp;판별&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;rarr;일반&amp;nbsp;실행이면&amp;nbsp;시스템&amp;nbsp;예외처리기에&amp;nbsp;넘기고,&amp;nbsp;디버깅&amp;nbsp;중이면&amp;nbsp;디버거에게&amp;nbsp;넘긴다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;SetUnhandledExceptionFilter()&amp;nbsp;API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;LPTOP_LEVEL_EXCEPTION_FILTER&amp;nbsp;SetUnhandledExceptionFilter( &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp;&lt;b&gt;LPTOP_LEVEL_EXCEPTION_FILTER&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lpTopLevelExceptionFilter&lt;/b&gt; &lt;br /&gt;);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;출처 : MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;kernel32!SetUnhandledExceptionFilter()&amp;nbsp;API를&amp;nbsp;이용하면&amp;nbsp;시스템의&amp;nbsp;마지막&amp;nbsp;예외처리기(Top&amp;nbsp;Level&amp;nbsp;Exception&amp;nbsp;Filter)를&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;lpTopLevelExceptionFilter&amp;nbsp;파라미터에&amp;nbsp;새로운&amp;nbsp;Top&amp;nbsp;Level&amp;nbsp;Exception&amp;nbsp;Filter&amp;nbsp;함수&amp;nbsp;주소를&amp;nbsp;넘기면&amp;nbsp;된다.(&lt;/span&gt;&lt;span&gt;&lt;b&gt;SetUnhandledExceptionFilter()&amp;nbsp;API의&amp;nbsp;파라미터&lt;/b&gt;&lt;/span&gt;&lt;span&gt;/리턴값은&amp;nbsp;이전&amp;nbsp;Last&amp;nbsp;Exception&amp;nbsp;Filter&amp;nbsp;함수&amp;nbsp;주소)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;안티&amp;nbsp;디버깅&amp;nbsp;기법은&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;고의로&amp;nbsp;예외를&amp;nbsp;발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시켜&amp;nbsp;새로&amp;nbsp;등록한&amp;nbsp;Last&amp;nbsp;Exception&amp;nbsp;Filter&amp;nbsp;내에서&amp;nbsp;일반&amp;nbsp;실행과&amp;nbsp;디버깅&amp;nbsp;실행을&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;판단하여&amp;nbsp;EIP&amp;nbsp;값을&amp;nbsp;변경&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;SetUnhandledExceptionFilter()&amp;nbsp;API를&amp;nbsp;이용한&amp;nbsp;안티&amp;nbsp;디버깅&amp;nbsp;기법은&amp;nbsp;Static&amp;nbsp;&amp;amp;&amp;nbsp;Dynamic&amp;nbsp;기법이&amp;nbsp;혼합된&amp;nbsp;형태이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;1.&amp;nbsp;Static&amp;nbsp;기법인&amp;nbsp;kernel32!UnhandledExceptionFilter()&amp;nbsp;내부에&amp;nbsp;호출되는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;ntdll!ZwQueryInformationProcess()&amp;nbsp;API&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;를&amp;nbsp;(API&amp;nbsp;후킹&amp;nbsp;등의&amp;nbsp;방법으로)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;무력화&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;2.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;SetUnhandledExceptionFilter()&amp;nbsp;API&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;호출에&amp;nbsp;의해&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;등록된&amp;nbsp;Exception&amp;nbsp;Filter&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;를&amp;nbsp;따라가서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;정상&amp;nbsp;실행인&amp;nbsp;경우&amp;nbsp;어느&amp;nbsp;주소로&amp;nbsp;분기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;하는지&amp;nbsp;확인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2.&amp;nbsp;Timing&amp;nbsp;Check&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&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;&lt;/span&gt;&lt;span&gt;&lt;b&gt;실행&amp;nbsp;시간의&amp;nbsp;차이를&amp;nbsp;측정하여&amp;nbsp;디버깅&amp;nbsp;여부를&amp;nbsp;판별&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는&amp;nbsp;기법&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Timing&amp;nbsp;Check&amp;nbsp;기법은&amp;nbsp;단순한&amp;nbsp;원리에&amp;nbsp;단순한&amp;nbsp;회피&amp;nbsp;기법을&amp;nbsp;가지고&amp;nbsp;있지만&amp;nbsp;보통&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;다른&amp;nbsp;안티&amp;nbsp;디버깅&amp;nbsp;기법들과&amp;nbsp;같이&amp;nbsp;사용되며&amp;nbsp;회피하는&amp;nbsp;것이&amp;nbsp;까다로울&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;수&amp;nbsp;있다.(특히&amp;nbsp;코드가&amp;nbsp;명확하게&amp;nbsp;눈에&amp;nbsp;보이지&amp;nbsp;않는&amp;nbsp;경우)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;안티&amp;nbsp;에뮬레이팅(Anti-Emulation)&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;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;시간&amp;nbsp;간격&amp;nbsp;측정&amp;nbsp;방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;Counter&amp;nbsp;based&amp;nbsp;method&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;RDTSC&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;kernel32!QueryPerformanceCounter&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;kernel32!GetTickCount()&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;Time&amp;nbsp;based&amp;nbsp;method&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;timeGetTime()&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;_ftime()&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;CPU의&amp;nbsp;(Counter)를&amp;nbsp;이용하는&amp;nbsp;방법&lt;/b&gt;&lt;/span&gt;&lt;span&gt;과&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;시스템의&amp;nbsp;실제&amp;nbsp;시간(Time)을&amp;nbsp;이용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는&amp;nbsp;두 가지&amp;nbsp;방법이&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;RDTSC(Read&amp;nbsp;Timp&amp;nbsp;Stamp&amp;nbsp;Counter)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;x86&amp;nbsp;CPU에는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;TSC(Time&amp;nbsp;Stamp&amp;nbsp;Counter)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;64비트&amp;nbsp;레지스터&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가&amp;nbsp;존재&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CPU는&amp;nbsp;매&amp;nbsp;순간&amp;nbsp;Clock&amp;nbsp;Cycle을&amp;nbsp;카운트하여&amp;nbsp;TSC에&amp;nbsp;저장&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;RDTSC(ReaD&amp;nbsp;Time&amp;nbsp;Stamp&amp;nbsp;Counter)는&amp;nbsp;그&amp;nbsp;TSC의&amp;nbsp;값을&amp;nbsp;EDX:EAX&amp;nbsp;형식으로&amp;nbsp;읽&lt;/b&gt;&lt;/span&gt;&lt;span&gt;어오는&amp;nbsp;어셈블리&amp;nbsp;명령어&amp;nbsp;(상위&amp;nbsp;32bit&amp;nbsp;-&amp;nbsp;EDX,&amp;nbsp;하위&amp;nbsp;32bit&amp;nbsp;-&amp;nbsp;EAX)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;1.&amp;nbsp;트레이싱하지&amp;nbsp;말고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;RUN으로&amp;nbsp;해당&amp;nbsp;코드&amp;nbsp;넘기기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;(BP&amp;nbsp;설치&amp;nbsp;후&amp;nbsp;RUN))&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;2.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;두&amp;nbsp;번째&amp;nbsp;RDTSC&amp;nbsp;결과&amp;nbsp;값(EDX:EAX)&amp;nbsp;조작&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;(첫&amp;nbsp;번째&amp;nbsp;값과&amp;nbsp;비슷하게&amp;nbsp;조작하여&amp;nbsp;CMP&amp;nbsp;넘기기)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;3.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;조건&amp;nbsp;분기&amp;nbsp;명령어(CMP/Jcc)&amp;nbsp;실행을&amp;nbsp;조작&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;Flags&amp;nbsp;값을&amp;nbsp;강제로&amp;nbsp;변경&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Jcc 명령어는 CF(Carry Flag)와 ZF(Zero Flag)의 영행을 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;JA 명령어는 CF와 ZF가 모두 0인 경우 점프&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;4.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;커널&amp;nbsp;드라이버를&amp;nbsp;이용하여&amp;nbsp;RDTSC&amp;nbsp;명령을&amp;nbsp;무력화&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;(커널&amp;nbsp;모드&amp;nbsp;드라이버를&amp;nbsp;이용해&amp;nbsp;원천젓으로&amp;nbsp;무력화시킬&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;Olly&amp;nbsp;Advanced&amp;nbsp;PlugIn&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;에&amp;nbsp;이러한&amp;nbsp;기능이&amp;nbsp;탑재되어&amp;nbsp;있다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;실제로는&amp;nbsp;RDTSC&amp;nbsp;명령어나&amp;nbsp;CMP/Jcc&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;디버깅(SEH,&amp;nbsp;Static&amp;nbsp;Method)&amp;nbsp;기법들과&amp;nbsp;조합되어&amp;nbsp;매우&amp;nbsp;강력한&amp;nbsp;힘을&amp;nbsp;발휘&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3.&amp;nbsp;Trap&amp;nbsp;Flag&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Trap&amp;nbsp;Flag(TF)란&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;EFLAGS&amp;nbsp;레지스터의&amp;nbsp;9번째(Index&amp;nbsp;8)&amp;nbsp;비트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;Single&amp;nbsp;Step&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;TF를&amp;nbsp;1로&amp;nbsp;세팅&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;하면&amp;nbsp;CPU는&amp;nbsp;Sing&amp;nbsp;Step&amp;nbsp;모드로&amp;nbsp;변경&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CPU는&amp;nbsp;Single&amp;nbsp;Step&amp;nbsp;모드에서&amp;nbsp;하나의&amp;nbsp;명령어를&amp;nbsp;실행&amp;nbsp;후&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;EXCEPTION_SINGLE_STEP&amp;nbsp;예외를&amp;nbsp;발생&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후&amp;nbsp;TF는&amp;nbsp;자동으로&amp;nbsp;최기화(0)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;EXCEPTION_SINGLE_STEP&amp;nbsp;예외는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;SEH&amp;nbsp;기법과&amp;nbsp;결합하여&amp;nbsp;디버거를&amp;nbsp;탐지&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는&amp;nbsp;안티&amp;nbsp;디버깅&amp;nbsp;기법으로&amp;nbsp;사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;EXCEPTION_SINGLE_STEP&amp;nbsp;예외를&amp;nbsp;디버기에서&amp;nbsp;직접&amp;nbsp;처리하도록&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;OllyDbg의&amp;nbsp;옵션을&amp;nbsp;변경&amp;nbsp;(EXCEPTION_SINGLE_STEP&amp;nbsp;예외&amp;nbsp;무시)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-2.&amp;nbsp;INT&amp;nbsp;2D&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;INT&amp;nbsp;2D는&amp;nbsp;본래&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;커널&amp;nbsp;모드에서&amp;nbsp;작동하는&amp;nbsp;Break&amp;nbsp;Point&amp;nbsp;예외를&amp;nbsp;발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시키는&amp;nbsp;명령어로&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;유저&amp;nbsp;모드에서도&amp;nbsp;예외를&amp;nbsp;발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅&amp;nbsp;실행의&amp;nbsp;경우&amp;nbsp;무시하고&amp;nbsp;넘어간다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;INT&amp;nbsp;2D&amp;nbsp;명령어&amp;nbsp;디버깅&amp;nbsp;시&amp;nbsp;특징&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;1바이트&amp;nbsp;무시&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 디버깅 모드에서 &lt;b&gt;INT&amp;nbsp;2D를&amp;nbsp;실행&lt;/b&gt;(혹은&amp;nbsp;StepInto/StepOver)하면&amp;nbsp;&lt;b&gt;다음&amp;nbsp;명령어의&amp;nbsp;첫&amp;nbsp;바이트는&amp;nbsp;무시&lt;/b&gt;되고,&amp;nbsp;그다음&amp;nbsp;바이트부터&amp;nbsp;새로운&amp;nbsp;명령어로&amp;nbsp;인식하여&amp;nbsp;실행&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;b&gt;전혀&amp;nbsp;다른&amp;nbsp;명령어를&amp;nbsp;실행&lt;/b&gt;하는&amp;nbsp;셈&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - INT 2D 기반의 안티 디버깅 기법은 일종의 &lt;b&gt;Obfuscated Code 효과&lt;/b&gt;를 보여준다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - 이런 식의 Code Byte Ordering을 변경해서 프로그램의 코드를 혼란스럽게 만드는 것은 Code Obfuscating 기법이라고 하며, &lt;b&gt;Dynamic 안티 디버깅 기법으로 자주 사용&lt;/b&gt;된다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;BP까지&amp;nbsp;그대로&amp;nbsp;실행&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - INT 2D 명령을 Trace하면, &lt;b&gt;그 다음 명령어 시작에서 멈추지 않&lt;/b&gt;는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;b&gt;OllyDbg만의 특징&lt;/b&gt;이며, 디버거 별로 동작이 조금씩 다르게 나타난다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - INT 2D 실행 과정에서 발생한 &lt;b&gt;Code Byte Ordering이 깨지는 문제&lt;/b&gt;때문(일종의 &lt;b&gt;버그&lt;/b&gt;)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;실전에서는&amp;nbsp;SEH를&amp;nbsp;반드시&amp;nbsp;따라가서&amp;nbsp;코드를&amp;nbsp;한&amp;nbsp;줄씩&amp;nbsp;디버깅해야 하는&amp;nbsp;경우가&amp;nbsp;있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;TF를&amp;nbsp;사용하여&amp;nbsp;SEH로&amp;nbsp;쉽게&amp;nbsp;가는&amp;nbsp;방법&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEPTION_SINFLE_STEP&amp;nbsp;예외를&amp;nbsp;무시하는&amp;nbsp;디버거&amp;nbsp;옵션&amp;nbsp;설정&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;SEH에&amp;nbsp;BP&amp;nbsp;설치&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;2D&amp;nbsp;명령어&amp;nbsp;실행&amp;nbsp;전에&amp;nbsp;TF를&amp;nbsp;1로&amp;nbsp;세팅&lt;/b&gt;&amp;nbsp;(Single&amp;nbsp;Step&amp;nbsp;예외를&amp;nbsp;사용)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;두 번&amp;nbsp;Trace&lt;/b&gt;&amp;nbsp;(kernel&amp;nbsp;명령어이기&amp;nbsp;때문에&amp;nbsp;User&amp;nbsp;모드&amp;nbsp;디버거에서는&amp;nbsp;정상적인&amp;nbsp;명령으로&amp;nbsp;인식되지&amp;nbsp;않음)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;SEH의&amp;nbsp;BP에&amp;nbsp;멈추고,&amp;nbsp;TF&amp;nbsp;=&amp;nbsp;0으로&amp;nbsp;변경됨&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4.&amp;nbsp;0xCC&amp;nbsp;Detection&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Software&amp;nbsp;BP(0xCC)&amp;nbsp;탐지&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;BP는&amp;nbsp;Opcode의&amp;nbsp;0xCC로&amp;nbsp;사용되지만,&amp;nbsp;프로세스&amp;nbsp;메모리의&amp;nbsp;코드&amp;nbsp;영역에서&amp;nbsp;단순히&amp;nbsp;0xCC를&amp;nbsp;검색하기에는&amp;nbsp;Displacement,&amp;nbsp;Immediate,&amp;nbsp;데이터,&amp;nbsp;주소&amp;nbsp;등으로&amp;nbsp;사용될&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;정확성이&amp;nbsp;매우&amp;nbsp;떨어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;API&amp;nbsp;Break&amp;nbsp;Point&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원하는&amp;nbsp;기능만&amp;nbsp;빠르게&amp;nbsp;디버깅하는&amp;nbsp;방법&amp;nbsp;중&amp;nbsp;하나는&amp;nbsp;해당&amp;nbsp;프로그램이&amp;nbsp;사용할&amp;nbsp;만한&amp;nbsp;API에&amp;nbsp;BP를&amp;nbsp;설치&amp;nbsp;후&amp;nbsp;실행하는&amp;nbsp;것이다.&amp;nbsp;만약&amp;nbsp;해당&amp;nbsp;BP에서&amp;nbsp;멈추면&amp;nbsp;저장된&amp;nbsp;복귀&amp;nbsp;주소(Return&amp;nbsp;Address)를&amp;nbsp;확인해서&amp;nbsp;복귀&amp;nbsp;주소로&amp;nbsp;따라가&amp;nbsp;그&amp;nbsp;부분을&amp;nbsp;디버깅하는&amp;nbsp;식&amp;nbsp;&amp;rarr;&amp;nbsp;디버깅&amp;nbsp;범위를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이와&amp;nbsp;같은&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;API에&amp;nbsp;설치된&amp;nbsp;BP를&amp;nbsp;확인해서&amp;nbsp;디버깅을&amp;nbsp;판단&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;(API&amp;nbsp;코드의&amp;nbsp;첫&amp;nbsp;바이트가&amp;nbsp;CC인지&amp;nbsp;검사)&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot; width=&quot;159.153mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;리버서가&amp;nbsp;관심을&amp;nbsp;가지는&amp;nbsp;API&amp;nbsp;리스트&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;[프로세스]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;CreateProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CreateThread&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EunmProcesses&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CreateToolhelp32Snapshot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ShellExecuteA&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;CreateProcessAsUser&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetThreadContext&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;EnumProcessModules&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Process32First&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;WinExec&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;CreateRemoteThread&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;SetThreadContext&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;OpenProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Process32Next&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;TerminateProcess&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;[메모리]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;ReadProcessMemory&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;VirtualAllocEx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;VirtualQuery&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;WriteProcessMemory&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;VirtualProtect&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;VirtualQueryEx&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;VirtualAlloc&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;VirtualProtectEx&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;[파일]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;CreateFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CopyFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MeveFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;FindNextFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetSystemDirectory&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;SetFilePointer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MapViewOfFileEx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;_write&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;_tell&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;ReadFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CreateDirectory&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MoveFileEx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetFileSize&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetFileAttributes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CreateFileMapping&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;UnmapViewOfFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;_read&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;WriteFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;DeleteFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;FindFirstFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetWindowsDirectory&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;SetFileAttributes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MapViewOfFile&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;_open&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;_lseek&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;[레지스트리]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;RegCreateKeyEx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RegEnumKeyEx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RegSetValueEx&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;RegDeleteKey&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RegQueryValueEx&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;RegDeleteValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RegSetValue&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;[네트워크]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;WSAStartup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;closedocket&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;htons&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;recv&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;HttpSendRequst&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;InternetConnet&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;InternetOpenUrl&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;getservbyname&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;connet&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;send&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;HttpQueryInfo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;InternetGetConnetedState&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;InternetReadFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;inet_addr&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;gethostbybname&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;inet_htoa&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;HttpOpenRequest&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;InternetCloseHandle&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;InernetOpen&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;URLDownloadToFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;[기타]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;OpenProcessToken&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;OpenSCManager&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ControlService&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;SetServiceStatus&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;OpenMutex&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetProcAddress&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;OutputDebugString&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;LookupPrivilegeValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CreateService&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;DeleteService&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;QueryServiceStatusEx&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;FindWindow&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetModuleFileNameA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;53.0511mm&quot;&gt;&lt;span&gt;&lt;span&gt;AdjustTokenPrivileges&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;OpenService&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RegisterServiceCtrlHandler&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;CreateMutex&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;LoadLibrary&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;GetCommandLine&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;코드의&amp;nbsp;첫&amp;nbsp;바이트를&amp;nbsp;피해서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;중간쯤&amp;nbsp;BP를&amp;nbsp;설치&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;-2.&amp;nbsp;Checksum&amp;nbsp;비교&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;특정&amp;nbsp;코드&amp;nbsp;영역의&amp;nbsp;Checksum&amp;nbsp;값을&amp;nbsp;비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;1byte라도&amp;nbsp;변경되면&amp;nbsp;바뀌는&amp;nbsp;Checksum&amp;nbsp;특징&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을&amp;nbsp;이용하여&amp;nbsp;특정&amp;nbsp;코드&amp;nbsp;내에서&amp;nbsp;CC&amp;nbsp;패치가&amp;nbsp;되었을&amp;nbsp;때&amp;nbsp;변경된&amp;nbsp;Checksum을&amp;nbsp;기존의&amp;nbsp;Checksum과&amp;nbsp;비교하여&amp;nbsp;디버깅&amp;nbsp;여부&amp;nbsp;판단&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드&amp;nbsp;버퍼에&amp;nbsp;대한&amp;nbsp;Checksum을&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;/span&gt;&lt;span&gt;&lt;b&gt;속도가&amp;nbsp;빠르고&amp;nbsp;충돌이&amp;nbsp;적은&amp;nbsp;CRC32(Cyclic&amp;nbsp;Redundancy&amp;nbsp;Check)를&amp;nbsp;많이&amp;nbsp;사용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;원론적으로&amp;nbsp;CRC&amp;nbsp;계산&amp;nbsp;영역에&amp;nbsp;BP를&amp;nbsp;걸지&amp;nbsp;않거나&amp;nbsp;패치를&amp;nbsp;하지&amp;nbsp;않으면&amp;nbsp;무력화된다.&amp;nbsp;&amp;rarr;&amp;nbsp;디버깅이&amp;nbsp;어려워지므로&amp;nbsp;안티&amp;nbsp;디버깅의&amp;nbsp;노림수.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;가장&amp;nbsp;좋은&amp;nbsp;방법은&amp;nbsp;CRC&amp;nbsp;비교&amp;nbsp;구문&amp;nbsp;패치.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp; &amp;nbsp; but, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;교묘하게&amp;nbsp;코드를&amp;nbsp;숨기고&amp;nbsp;수십~수백&amp;nbsp;개의&amp;nbsp;Checksum&amp;nbsp;비교&amp;nbsp;코드가&amp;nbsp;존재한다면,&amp;nbsp;디버깅하기&amp;nbsp;매우&amp;nbsp;까다롭다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>Dynamic안티디버깅</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <category>안티디버깅</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/41</guid>
      <comments>https://honorlog.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 10 Jan 2024 15:13:45 +0900</pubDate>
    </item>
    <item>
      <title>Static 안티 디버깅</title>
      <link>https://honorlog.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거&amp;nbsp;탐지, 디버깅&amp;nbsp;환경&amp;nbsp;탐지,&amp;nbsp;디버거&amp;nbsp;강제&amp;nbsp;분리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;많은 static 안티 디버깅은 OS 의존성을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;1. PEB&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재&amp;nbsp;프로세스의&amp;nbsp;디버깅&amp;nbsp;여부&amp;nbsp;판단에&amp;nbsp;사용.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;PEB&amp;nbsp;구조체&amp;nbsp;정보&amp;nbsp;이용&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;+0x002&amp;nbsp;BeingDebugged&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;+0x00C&amp;nbsp;Ldr&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;+0x018&amp;nbsp;ProcessHeap&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;+0x068&amp;nbsp;NtGlobalFlag&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;BeingDebugged&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;디버깅&amp;nbsp;여부를&amp;nbsp;표시하는&amp;nbsp;Flag&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Ldr,&amp;nbsp;ProcessHeap,&amp;nbsp;NtGlobalFlag&amp;nbsp;-&amp;nbsp;디버깅&amp;nbsp;프로세스의&amp;nbsp;독특한&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;힙(Heap)&amp;nbsp;메모리&amp;nbsp;특성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;과&amp;nbsp;관련&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;TEB.ProsessEnvironmentBlock&amp;nbsp;(+&amp;nbsp;0x30)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;==&amp;nbsp;PEB&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PEB&amp;nbsp;구조체구하는법&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바로&amp;nbsp;PEB&amp;nbsp;구하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOV&amp;nbsp;EAX,&amp;nbsp;DWORD&amp;nbsp;PTR&amp;nbsp;FS:[0x30];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;&lt;span style=&quot;color: #ee2323;&quot;&gt; FS:[0x30]&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=address&amp;nbsp;of&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;PEB&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TEB&amp;nbsp;주소를&amp;nbsp;구하고&amp;nbsp;ProcessEnvironmentBlock(+0x30)&amp;nbsp;이용하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOV&amp;nbsp;EAX,&amp;nbsp;DWORD&amp;nbsp;PTR&amp;nbsp;FS:[0x18];&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;span style=&quot;color: #ee2323;&quot;&gt; FS:[0x18]&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;nbsp;address&amp;nbsp;of&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;TEB&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;MOU EAX, DWORD PTR DS: [EAX+0x30];&amp;nbsp;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;DS:[eax+0x30]&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=address of&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;PEB&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;BeingDebugged&amp;nbsp;(+0x2)&amp;nbsp;-&amp;nbsp;IsDebuggerPresent()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅&amp;nbsp;중일 때&amp;nbsp;1(TRUE)로 세팅&amp;nbsp;/&amp;nbsp;일반실행의&amp;nbsp;경우&amp;nbsp;0(false)으로&amp;nbsp;세팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;OllyDbg의&amp;nbsp;edit&amp;nbsp;명령어를&amp;nbsp;사용하여&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;PEB.BeingDebugged&amp;nbsp;값을&amp;nbsp;0(FALSE)으로&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;변경&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-2.&amp;nbsp;Ldr&amp;nbsp;(+0xC)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅&amp;nbsp;프로세스는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;힙(Heap)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;메모리에&amp;nbsp;디버&lt;/span&gt;&lt;span&gt;기&lt;/span&gt;&lt;span&gt;가&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;디버&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;기&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;라는&amp;nbsp;것을&amp;nbsp;표기&lt;/b&gt;&lt;/span&gt;&lt;span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이때,&amp;nbsp;눈에&amp;nbsp;띄는&amp;nbsp;특징은&amp;nbsp;힙&amp;nbsp;메모리의&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;사용되지&amp;nbsp;않는&amp;nbsp;영역을&amp;nbsp;0xFEEEFEEE&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;값으로&amp;nbsp;채운다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PEB.Ldr은&lt;/span&gt;&lt;span&gt;&lt;b&gt;&amp;nbsp;_PEB_LDR_DATA&amp;nbsp;구조체&amp;nbsp;포인터&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;_PEB_LDR_DATA&amp;nbsp;구조체는&amp;nbsp;힙&amp;nbsp;메모리&amp;nbsp;영역에&amp;nbsp;생성&amp;nbsp;따라서&amp;nbsp;이&amp;nbsp;영역을&amp;nbsp;스캔(Scan)하면&amp;nbsp;쉽게&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;0xFEEEFEEE로&amp;nbsp;채워진&amp;nbsp;영역을&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;&amp;nbsp;NULL로&amp;nbsp;덮어&amp;nbsp;씌운다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;but,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;XP이하에서만&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;동작,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;&amp;nbsp;Attach의&amp;nbsp;경우&amp;nbsp;힙&amp;nbsp;메모리&amp;nbsp;특성이&amp;nbsp;나타나지&amp;nbsp;않&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-3.&amp;nbsp;ProcessHeap&amp;nbsp;(+0x18)&amp;nbsp;-&amp;nbsp;GetProcessHeap()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Heap&amp;nbsp;구조체&amp;nbsp;포인터&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Heap&amp;nbsp;구조체&amp;nbsp;중&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Flags(+0xC)와&amp;nbsp;Force&amp;nbsp;Flags(+0x10)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;은&amp;nbsp;디버깅&amp;nbsp;중&amp;nbsp;특정한&amp;nbsp;값으로&amp;nbsp;세팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;Heap.Flags&amp;nbsp;=&amp;nbsp;2,&amp;nbsp;Heap.ForceFlags&amp;nbsp;=&amp;nbsp;0으로&amp;nbsp;세팅&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;(defulat&amp;nbsp;값으로&amp;nbsp;세팅)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;but,&amp;nbsp;XP에서만&amp;nbsp;효과,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;7에선 없어진 특성이며&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;Attach의&amp;nbsp;경우&amp;nbsp;이&amp;nbsp;특성이&amp;nbsp;나타나지&amp;nbsp;않&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-4.&amp;nbsp;NtGlobalFlag(+0x68)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;디버깅&amp;nbsp;중이면&amp;nbsp;0x70으로&amp;nbsp;세팅&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;PEB.NtGrobalFlag&amp;nbsp;=&amp;nbsp;0으로&amp;nbsp;세팅&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;(defualt&amp;nbsp;값으로&amp;nbsp;세팅)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;but,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;Attach의&amp;nbsp;경우&amp;nbsp;변하지&amp;nbsp;않&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2.&amp;nbsp;NtQueryInformationProcess()&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ntdll!NtQueryInformationProcess()&amp;nbsp;API로&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;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;NtQueryInformationProcess()&amp;nbsp;API&lt;br /&gt;&amp;nbsp;- &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #161616; text-align: start;&quot;&gt;지정된 프로세스에 대한 정보를 검색&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;__kernel_entry&amp;nbsp;NTSTATUS&amp;nbsp;NtQueryInformationProcess( &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HANDLE&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; ProcessHandle, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;PROCESSINFOCLASS&amp;nbsp; &amp;nbsp; &amp;nbsp; ProcessInformationClass,&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; [out]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PVOID&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;ProcessInformation, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ULONG&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;ProcessInformationLength, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [out, optional]&amp;nbsp; &amp;nbsp;PULONG&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;ReturnLength &lt;br /&gt;);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: right;&quot;&gt;출처 : MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NtQueryInformationProcess()의&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;파라미터&amp;nbsp;PROCESSINFOCLASS&amp;nbsp;ProcessInformaionClass에&amp;nbsp;해당&amp;nbsp;정보가&amp;nbsp;세팅된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PROCESSINFOCLASS는&amp;nbsp;열거형(enum)으로&amp;nbsp;여러 가지&amp;nbsp;정보를&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;그중&amp;nbsp;디버거&amp;nbsp;탐지에&amp;nbsp;사용되는&amp;nbsp;것은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;ProcessDebugPort(0x7),&amp;nbsp;ProcessDebugObjectHandle(0x1E),&amp;nbsp;ProcessDebugFlags(0x1F)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-1.&amp;nbsp;ProcessDebugPort(0x7)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅&amp;nbsp;중일&amp;nbsp;때는&amp;nbsp;Debug&amp;nbsp;Port가&amp;nbsp;할당된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ProcessInformationClass&amp;nbsp;파라미터에&amp;nbsp;ProcessDebugProt(0x7)을&amp;nbsp;입력하면&amp;nbsp;Debug&amp;nbsp;Port를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;dwDebugPort에&amp;nbsp;디버깅&amp;nbsp;중이면&amp;nbsp;0xFFFFFFFF,&amp;nbsp;아니면&amp;nbsp;0이&amp;nbsp;세팅&lt;/b&gt;&lt;/span&gt;&lt;span&gt;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CheckRemoteDebugPresent()&amp;nbsp;API는&amp;nbsp;IsDebuggerPresent()&amp;nbsp;API와&amp;nbsp;비슷하게&amp;nbsp;디버깅&amp;nbsp;여부를&amp;nbsp;판별&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;차이점은&amp;nbsp;CheckRemoteDebugPresent()의&amp;nbsp;경우&amp;nbsp;다른&amp;nbsp;프로세스의&amp;nbsp;디버깅&amp;nbsp;여부까지&amp;nbsp;판단&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;CheckRemoteDebugPresent()의&amp;nbsp;내부에서&amp;nbsp;NtQueryInformationProcess(ProcessDebugPort)&amp;nbsp;API를&amp;nbsp;사용 중이다.&lt;/b&gt;중이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-2.&amp;nbsp;ProcessDebugObjectHandle(0x1E)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;프로세스가&amp;nbsp;디버깅될&amp;nbsp;때&amp;nbsp;Debug&amp;nbsp;Object가&amp;nbsp;생성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ProcessDebugObjectHandle(0x1E)을&amp;nbsp;입력하면,&amp;nbsp;Debug&amp;nbsp;Object&amp;nbsp;Handle을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;디버깅&amp;nbsp;중이면&amp;nbsp;Debug&amp;nbsp;Object&amp;nbsp;Handle의&amp;nbsp;값이&amp;nbsp;존재할&amp;nbsp;것이고,&amp;nbsp;아니면&amp;nbsp;NULL&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;-3.&amp;nbsp;ProcessDebugFlags(0x1F)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;디버깅&amp;nbsp;중이면&amp;nbsp;Debug&amp;nbsp;Flags&amp;nbsp;값이&amp;nbsp;0,&amp;nbsp;아니면&amp;nbsp;1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3.&amp;nbsp;NtQuerySystemInformation()&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅 환경을 체크 - 현재 OS가 Debug Mode로 부팅되었는지 판단&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(디버깅을 당하는지 체크하는 것은 직접적인 디버거 탐지 방법&amp;nbsp;/ 디버깅 환경을 체크하는 것은 간접적인 디버거 탐지 방법)&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ntdll!NtQyerySystemInformation()&amp;nbsp;API는&amp;nbsp;현재&amp;nbsp;동작&amp;nbsp;중이&amp;nbsp;OS&amp;nbsp;시스템에&amp;nbsp;대한&amp;nbsp;다양한&amp;nbsp;정보를&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;시스템&amp;nbsp;함수&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;NtQyerySystemInformation()&amp;nbsp;API&lt;br /&gt;&amp;nbsp;- &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #161616; text-align: start;&quot;&gt;지정된 시스템 정보를 검색&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;__kernel_entry&amp;nbsp;NTSTATUS&amp;nbsp;NtQuerySystemInformation( &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SYSTEM_INFORMATION_CLASS&amp;nbsp; &amp;nbsp; &amp;nbsp; SystemInformationClass, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in, out]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PVOID&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SystemInformation, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ULONG&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SystemInformationLength, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [out, optional]&amp;nbsp; &amp;nbsp; PULONG&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReturnLength &lt;br /&gt;);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: right;&quot;&gt;출처 : MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫&amp;nbsp;번째&amp;nbsp;파라미터인&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;SYSTEM_INFORMATION_CLASS&amp;nbsp;SystemInformationClass&amp;nbsp;파라미터에&amp;nbsp;원하는&amp;nbsp;시스템&amp;nbsp;정보를&amp;nbsp;입력,&amp;nbsp;PVOID&amp;nbsp;SystemInformation&amp;nbsp;파라미터에&amp;nbsp;관련&amp;nbsp;구조체&amp;nbsp;주소를&amp;nbsp;넘기면&amp;nbsp;API가&amp;nbsp;리턴&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하며&amp;nbsp;그&amp;nbsp;구조체의&amp;nbsp;관련&amp;nbsp;정보를&amp;nbsp;채워준다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SYSTEMP_INGOTMATION_CLASS는&amp;nbsp;열거형(enum)으로&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;SystemInformationClass&amp;nbsp;파라미터에&amp;nbsp;SystemKernelDebuggerInformation(0x23)을&amp;nbsp;입력하면&amp;nbsp;현재&amp;nbsp;OS&amp;nbsp;시스템이&amp;nbsp;디버그&amp;nbsp;모드로&amp;nbsp;부팅되었는지&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피방법&amp;nbsp;-&amp;nbsp;wimdows&amp;nbsp;XP의&amp;nbsp;경우,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;boot.ini를&amp;nbsp;편집(&amp;rsquo;/debugport=com1&amp;nbsp;/baudarate=115200&amp;nbsp;/Debug&amp;rsquo;&amp;nbsp;값&amp;nbsp;삭제)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;windows&amp;nbsp;7의&amp;nbsp;경우,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;cmd에&amp;nbsp;&amp;lsquo;bcdedit&amp;nbsp;/debug&amp;nbsp;off&amp;rsquo;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;명령어&amp;nbsp;입력&amp;nbsp;후&amp;nbsp;재부팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4.&amp;nbsp;NtQueryObject()&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버깅&amp;nbsp;중&amp;nbsp;생성되는&amp;nbsp;DebugObject&amp;nbsp;타입의&amp;nbsp;커널&amp;nbsp;객체의&amp;nbsp;존재를&amp;nbsp;확인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ntdll!NtQueryObject()&amp;nbsp;API는&amp;nbsp;시스템의&amp;nbsp;다양한&amp;nbsp;종류의&amp;nbsp;커널&amp;nbsp;객체&amp;nbsp;정보를&amp;nbsp;구해오는&amp;nbsp;함수&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 140px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;NtQueryObject()&amp;nbsp;API&lt;br /&gt;&amp;nbsp;- &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #161616; text-align: start;&quot;&gt;다양한 종류의 개체 정보를 검색&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 123px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 123px;&quot;&gt;__kernel_entry&amp;nbsp;NTSYSCALLAPI&amp;nbsp;NTSTATUS&amp;nbsp;NtQueryObject( &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in, optional]&amp;nbsp; &amp;nbsp; &amp;nbsp;HANDLE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Handle, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; OBJECT_INFORMATION_CLASS&amp;nbsp; &amp;nbsp; ObjectInformationClass,&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; [out, optional]&amp;nbsp; &amp;nbsp;&lt;b&gt;PVOID&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ObjectInformation,&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ULONG&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ObjectInformationLength, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [out, optional]&amp;nbsp; &amp;nbsp;PULONG&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReturnLength &lt;br /&gt;);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: right;&quot;&gt;출처 : MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;두&amp;nbsp;번째&amp;nbsp;파라미터&amp;nbsp;OBJECT_INFORMATION_CLASS&amp;nbsp;ObjectInformationClass에&amp;nbsp;원하는&amp;nbsp;값을&amp;nbsp;입력하고&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;API를&amp;nbsp;호출하면&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&amp;nbsp;세&amp;nbsp;번째&amp;nbsp;파라미터&amp;nbsp;PVOID&amp;nbsp;ObjectInformation에&amp;nbsp;관련&amp;nbsp;정보의&amp;nbsp;구조체&amp;nbsp;포인터를&amp;nbsp;리턴&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;ObjectAllTypeInformation(3)&amp;nbsp;항목을&amp;nbsp;이용하여&amp;nbsp;시스템의&amp;nbsp;모든&amp;nbsp;객체&amp;nbsp;정보를&amp;nbsp;구하고&amp;nbsp;그중&amp;nbsp;DebugObject의&amp;nbsp;존재&amp;nbsp;확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;NtQueryObject()&amp;nbsp;API&amp;nbsp;사용법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;커널 객체(Kernel Object) 정보 리스트의 크기 얻기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메모리 할당&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;커널 객체 정보 리스트 구하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DebugObject 객체 타입 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피방법&amp;nbsp;-&amp;nbsp;ZwQueryObject의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;호출&amp;nbsp;부분을&amp;nbsp;찾아&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;파라미터의&amp;nbsp;값을&amp;nbsp;변경하면&amp;nbsp;해결&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5.&amp;nbsp;ZwSetInformationThread()&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버기가&amp;nbsp;강제로&amp;nbsp;디버거를&amp;nbsp;떼어내는(Detach)&amp;nbsp;기법&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;스레드에게&amp;nbsp;정보를&amp;nbsp;세팅하는&amp;nbsp;System&amp;nbsp;Native&amp;nbsp;API이다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;ZwSetInformationThread() API&lt;br /&gt;&lt;span&gt;&amp;nbsp;- &lt;/span&gt;&lt;b&gt;스레드의 우선순위를 설정 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;NTSYSAPI&amp;nbsp;NTSTATUS&amp;nbsp;ZwSetInformationThread( &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp;&lt;b&gt;HANDLE&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;ThreadHandle,&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp;&lt;b&gt;THREADINFOCLASS&amp;nbsp; &amp;nbsp; &amp;nbsp;ThreadInformationClass,&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp;PVOID&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;ThreadInformation, &lt;br /&gt;&amp;nbsp; &amp;nbsp; [in]&amp;nbsp; &amp;nbsp;ULONG&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;ThreadInformationLength &lt;br /&gt;);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: right;&quot;&gt;출처 : MSDN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;첫&amp;nbsp;번째&amp;nbsp;파라미터&amp;nbsp;ThreadHandle에&amp;nbsp;현재&amp;nbsp;스레드의&amp;nbsp;핸들을&amp;nbsp;넘겨주고,&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;파라미터&amp;nbsp;ThreadInformationClass에&amp;nbsp;ThreadHideFormDebugger(0x11)&amp;nbsp;값을&amp;nbsp;입력&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하면 디버거 프로세스가 분리된다.&lt;span style=&quot;color: #666666;&quot;&gt; -&amp;gt; 일반 실행의 경우 아무런 영향을 주지 않지만, 디버거 실행인 경우에는 디버거를 종료시킨다.(자신의 프로세스도 같이)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피&amp;nbsp;방법&amp;nbsp;-&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;파라미터&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;&amp;nbsp;ThreadHideFromDebugger(0x11)을&amp;nbsp;0으로&amp;nbsp;변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;ZwSetInformationThread()&amp;nbsp;API&lt;/b&gt;&lt;/span&gt;&lt;span&gt;의&amp;nbsp;원리는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;u&gt;Thread가&amp;nbsp;숨김(Hide)&amp;nbsp;생태가&amp;nbsp;되어&amp;nbsp;디버깅이&amp;nbsp;불가능&lt;/u&gt;&lt;/span&gt;&lt;span&gt;해지는&amp;nbsp;것으로&amp;nbsp;XP이후로는&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;DebugActiveProcessStop()&amp;nbsp;API가&amp;nbsp;추가&lt;/b&gt;&lt;/span&gt;&lt;span&gt;되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;6.&amp;nbsp;DebugActiveProcessStop()&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디버거에서&amp;nbsp;디버깅을&amp;nbsp;멈추고&amp;nbsp;싶을&amp;nbsp;때&amp;nbsp;호출&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;span&gt;Detach&amp;nbsp;시&amp;nbsp;주체에&amp;nbsp;따른&amp;nbsp;호출&amp;nbsp;API&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;디버기&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가&amp;nbsp;디버깅&amp;nbsp;멈추기&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;ZwSetInformationThread()&amp;nbsp;API&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;디버거&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가&amp;nbsp;디버깅&amp;nbsp;멈추기&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;DebugActiveProcessStop() API&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;7.&amp;nbsp;TLS&amp;nbsp;콜백&amp;nbsp;함수&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자체로는&amp;nbsp;안티&amp;nbsp;디버깅&amp;nbsp;기법이라고&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;없지만&amp;nbsp;프로그램의&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;EntryPoint코드보다&amp;nbsp;먼저&amp;nbsp;실행&lt;/b&gt;&lt;/span&gt;&lt;span&gt;되는&amp;nbsp;특징&amp;nbsp;때문에&amp;nbsp;안티&amp;nbsp;디버깅에&amp;nbsp;많이&amp;nbsp;활용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;TLS&amp;nbsp;콜백&amp;nbsp;함수&amp;nbsp;내에서&amp;nbsp;IsDebuggerPresent()&amp;nbsp;등의&amp;nbsp;함수로&amp;nbsp;간단히&amp;nbsp;디버깅&amp;nbsp;여부를&amp;nbsp;판별&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하여&amp;nbsp;프로그램의&amp;nbsp;실행&amp;nbsp;여부를&amp;nbsp;결정할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;8.&amp;nbsp;ETC&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재의 시스템이 (일반적인 시스템이 아니라) 리버싱을 위한 전용 시스템이라는 판단으로 실행을 멈추는 것도 좋은 방법이다. 이를 위해서 시스템에서 쉽게 구할 수 있는 일반적인 정보(Process, File, Window, Registry, host name, computer name, user name, Environment Variable 등)들을 활용하는 다양한 안티디버깅 기법들이 존재&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;대부분의&amp;nbsp;경우&amp;nbsp;Win32&amp;nbsp;API를&amp;nbsp;이용하여&amp;nbsp;구현되어&amp;nbsp;있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;OllyDbg 창 검색&lt;/span&gt; &amp;larr;FindWindow()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;OllyDbg 프로세스 검색&lt;/span&gt; &amp;larr; CreateToolhepl32Snapshot()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;컴퓨터 이름이 &amp;ldquo;TEST&amp;rdquo;, &amp;ldquo;ANALYSIS&amp;rdquo; 등의 이름&lt;/span&gt;인지 확인 &amp;larr; GetComputerName()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;프로그램 실행 경로를 검사하여 &amp;ldquo;TEST&amp;rdquo;, &amp;ldquo;SAMPLE&amp;rdquo; 등의 이름&lt;/span&gt;인지 확인 &amp;larr; GetCommandLine()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;가상 머신에서 실행 중&lt;/span&gt;인지 확인(가상 머신 특유의 &lt;span style=&quot;color: #ee2323;&quot;&gt;프로세스 이름 확인&lt;/span&gt; &amp;larr; &lt;span style=&quot;color: #ee2323;&quot;&gt;VMWareService.exe, VMWareTray.exe, VMWareUser.exe&lt;/span&gt; 등)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;회피방법&amp;nbsp;-&amp;nbsp;FindWindow()에서&amp;nbsp;찾는&amp;nbsp;문자열의&amp;nbsp;주소로&amp;nbsp;이동하여&amp;nbsp;Window&amp;nbsp;Class&amp;nbsp;이름&amp;nbsp;문자열&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;버퍼를&amp;nbsp;NULL로&amp;nbsp;덮어씌우&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;거나&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;함수를&amp;nbsp;실행하지&amp;nbsp;않도록&amp;nbsp;JMP&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;로&amp;nbsp;명령어를&amp;nbsp;수정,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;파라미터&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;로&amp;nbsp;사용되는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;이전&amp;nbsp;함수의&amp;nbsp;리턴&amp;nbsp;값을&amp;nbsp;NULL&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;로&amp;nbsp;수정,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;b&gt;API&amp;nbsp;후킹&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt; 등의&amp;nbsp;방법들이&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;회피&amp;nbsp;방법이&amp;nbsp;어렵지&amp;nbsp;않아&amp;nbsp;유명&amp;nbsp;Protector들은&amp;nbsp;쓰지&amp;nbsp;않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;하지만&amp;nbsp;의외로&amp;nbsp;잘&amp;nbsp;알려지지&amp;nbsp;않은&amp;nbsp;Protector/Packer에서&amp;nbsp;사용되는&amp;nbsp;경우가&amp;nbsp;종종&amp;nbsp;있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>Static안티디버깅</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <category>안티디버깅</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/40</guid>
      <comments>https://honorlog.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 10 Jan 2024 14:52:48 +0900</pubDate>
    </item>
    <item>
      <title>디버깅 실습1 - 서비스 (서비스 프로세스 디버깅)</title>
      <link>https://honorlog.tistory.com/39</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서비스 프로세스 동작 원리&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- 서비스 시스템 개요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스(Service) 프로그램은 SCM(Service Control Manager)에 의해서 관리된다. 서비스 애플리케이션이 실행되기 위해서는 시작 명령을 내려줄 수 있는 서비스 제어기(Service Contro-ller)가 필요하다. 서비스 제어기는 SCM에게 서비스 제어를 요청하면 SCM이 서비스 프로그램에게 제어 명령을 전달하고 리턴 값을 돌려받는 구조로 되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/69bau/btsC8TKgZsj/8xmHnEBDmKGgmq7KOMZf8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/69bau/btsC8TKgZsj/8xmHnEBDmKGgmq7KOMZf8K/img.png&quot; data-alt=&quot;그림1 서비스 시스템 개요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/69bau/btsC8TKgZsj/8xmHnEBDmKGgmq7KOMZf8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F69bau%2FbtsC8TKgZsj%2F8xmHnEBDmKGgmq7KOMZf8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;317&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 서비스 시스템 개요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 제어기에서 서비스 프로그램에 직접 명령을 내릴 수 없고, SCM을 통해서 명령을 내려야 된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- 서비스 시작 과정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 프로그램의 시작 과정을 간략히 정리해 보면 아래 그림 2와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5V5P5/btsDd2fBTm1/tbubwqBu3q97WMcVU83pi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5V5P5/btsDd2fBTm1/tbubwqBu3q97WMcVU83pi0/img.png&quot; data-alt=&quot;그림2 서비스 시작 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5V5P5/btsDd2fBTm1/tbubwqBu3q97WMcVU83pi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5V5P5%2FbtsDd2fBTm1%2FtbubwqBu3q97WMcVU83pi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;897&quot; height=&quot;630&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 서비스 시작 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 서비스 프로그램은 외부(서비스 제어기)에서 StartService() API를 호출하면서 시작되며, &amp;lsquo;자동 실행&amp;rsquo; 서비스의 경우 SCM에서 StartSevice()를 호출해 준다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서비스 프로세스 시작 과정&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 서비스 제어기에서&amp;nbsp;StartService()&amp;nbsp;호출&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스 제어기에서&amp;nbsp;StartService()를 호출하면&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;SCM은 해&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;당 서비스 프로세스를 생성&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한다.&amp;nbsp;그리고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서비스 프로세스의&amp;nbsp;EP&amp;nbsp;코드가 실행&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;된다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.&amp;nbsp;서비스 프로세스에서&amp;nbsp;StartServiceCtrlDispatcher()&amp;nbsp;호출&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스 프로세스 내부에서&amp;nbsp;StartServiceCtrlDispatcher()가 호출되면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서비스 제어기의&amp;nbsp;StartService()&amp;nbsp;함수가 리턴&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;된다.&amp;nbsp;그리고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SCM은 서비스 프로세스의 서비스 메인 함수&amp;nbsp;SvcMain()을 호출하여 주소를 등록&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(StartService()는&amp;nbsp;SCM이&amp;nbsp;StartServiceCtrlDispatcher()로부터&amp;nbsp;SvcMain()가 성공적으로 생성되었다는 알림을 받으면 반환)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.&amp;nbsp;서비스 프로세스에서&amp;nbsp;SetServiceStatus(SERVICE_RUNNING)&amp;nbsp;호출&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현재는&amp;nbsp;SERVICE_START_PENFING&amp;nbsp;상태이다. SvcMain()&amp;nbsp;내부에서&amp;nbsp;SetServiceStatus(SERVICE_RUNNING) API를 호출해야 정상적인 서비스 프로세스로서 동작할 수 있다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 프로그램은 결국 SCM에 의해서 프로세스가 생성되고 SvcMain() 함수로 제어가 넘어오면서 SetServiceStatus(SERVICE_RUNNING) API를 호출해야 정상적인 서비스 프로세스로 동작할 수 있다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 서비스 프로세스의 디버깅 이슈&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 프로그램을 정확히 디버깅하려면 SCM에 의해 실행되는 서비스 프로세스에 디버거를 Attach 해서 디버깅을 해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- 문제는 SCM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 프로세스 디버깅의 핵심은 서비스 프로세스가 SCM에 의해 실행된다는 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 프로세스는 SCM에 의해서 실행됨&lt;/li&gt;
&lt;li&gt;서비스 핵심 코드는 주로 서비스 메인 함수(SvcMain())에 존재&lt;/li&gt;
&lt;li&gt;서비스 메인 함수(SvcMain())는 SCM에 의해서 정상 호출됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 메인 함수(SvcMain())를 디버깅해야 한다. 디버거로 서비스 프로그램의 실행 파일을 열고 디버깅을 시작하면 서비스 메인 함수가 실행되지 않는다. 따라서 &lt;b&gt;SCM&lt;/b&gt;&lt;b&gt;을 통해서 정상 실행된 서비스 프로세스에 Attach해서 디버깅&lt;/b&gt;을 해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- 디버거로 안 되는 것은 없다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버거로 서비스 실행 파일을 열어서 디버깅을 하면 SCM이 서비스 메인 함수를 호출하지 않아 디버깅할 수 없다(SCM에 의한 실행이 아니므로 실행을 못 시킴).&lt;br /&gt;디버거는 디버기 프로세스에 대한 막강한 권한을 가지므로 강제로 디버깅 위치를 서비스 메인 함수로 지정한 후 디버깅을 할 수 있다(예, OllyDbg의 &amp;lsquo;New origin here&amp;rsquo;). 이 방법으로 서비스 메인 함수를 디버깅해도 큰 무리가 없으며, 간단해서 추천하는 방법이다.&lt;br /&gt;하지만 편법이므로 복잡하게 동작하는 서비스 프로세스의 경우 완벽하게 디버깅할 수 없는 경우도 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp; - 정석대로&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정석은 SCM에 의해 실행된 서비스 프로세스에 디버거를 Attach하여 디버깅하는 방법이다.&lt;br /&gt;문제는 SCM이 서비스를 실행시킨 이후에 Attach를 하면 핵심 코드(서비스 메인 함수)가 이미 실행된 이후라는 점이다. 따라서 SCM이 서비스 프로세스를 생성하고 EP 코드를 실행시키기 직전에 디버거를 Attach해야 한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 서비스 디버깅 실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리버싱 핵심 원리의 간단한 실습 파일(DebugMe1.exe)을 설치&lt;br /&gt;(예제 서비스(SvcTest)의 기능은 OutputDebugString() API를 사용한 디버그 문자열 출력)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eo0V9/btsDiai6HFp/FaAokk4hEbv1AQJ8kng3cK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eo0V9/btsDiai6HFp/FaAokk4hEbv1AQJ8kng3cK/img.jpg&quot; data-alt=&quot;그림3 서비스 설치 및 SvcTest 서비스 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eo0V9/btsDiai6HFp/FaAokk4hEbv1AQJ8kng3cK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEo0V9%2FbtsDiai6HFp%2FFaAokk4hEbv1AQJ8kng3cK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;373&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 서비스 설치 및 SvcTest 서비스 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3cGV0/btsDhLqmfAo/IeA3SwmCXTLWj07xsskG51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3cGV0/btsDhLqmfAo/IeA3SwmCXTLWj07xsskG51/img.jpg&quot; data-alt=&quot;그림4 SvcTest 서비스 속성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3cGV0/btsDhLqmfAo/IeA3SwmCXTLWj07xsskG51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3cGV0%2FbtsDhLqmfAo%2FIeA3SwmCXTLWj07xsskG51%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;443&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 SvcTest 서비스 속성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blbG3t/btsDhjOoENR/SgFDY5lCRbIkyJCOHzH3qK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blbG3t/btsDhjOoENR/SgFDY5lCRbIkyJCOHzH3qK/img.jpg&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;393&quot; style=&quot;width: 27.6626%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blbG3t/btsDhjOoENR/SgFDY5lCRbIkyJCOHzH3qK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblbG3t%2FbtsDhjOoENR%2FSgFDY5lCRbIkyJCOHzH3qK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqWLQR/btsC9ocdTzG/3MkkSkTfiG2U12WTw2GKY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqWLQR/btsC9ocdTzG/3MkkSkTfiG2U12WTw2GKY1/img.jpg&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;297&quot; style=&quot;width: 71.1746%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqWLQR/btsC9ocdTzG/3MkkSkTfiG2U12WTw2GKY1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqWLQR%2FbtsC9ocdTzG%2F3MkkSkTfiG2U12WTw2GKY1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;그림5 SvcTest 서비스 프로세스(DebugMe1.exe) 및 출력하는 디버그 문자열&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- EP 강제 세팅&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버거로 서비스 파일을 직접 열고 디버깅하는 방법&lt;br /&gt;보통 서비스 프로그램의 주요 코드는 서비스 메인(SvcMain()) 함수와 서비스 핸들러(SvcHandler()) 함수에 존재한다. SCM에 의해 실행되지 않고 디버거에 의해서 실행된 서비스 프로세스는 SvcMain()과 SvcHandler()가 호출되지 않는다. 따라서 그 함수들의 주소를 알아내서 그곳으로 디버깅 위치를 옮겨야 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yu2Lw/btsDhVfcXYm/WY2KOtXr8sjknajJEL9lWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yu2Lw/btsDhVfcXYm/WY2KOtXr8sjknajJEL9lWK/img.jpg&quot; data-alt=&quot;그림6 DebugMe1.exe 파일의 Main()&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yu2Lw/btsDhVfcXYm/WY2KOtXr8sjknajJEL9lWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyu2Lw%2FbtsDhVfcXYm%2FWY2KOtXr8sjknajJEL9lWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1163&quot; height=&quot;451&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 DebugMe1.exe 파일의 Main()&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;40106C주소의 StartServiceCtrlDispatcher()를 확인할 수 있다.&lt;br /&gt;EXE 파일 형태의 Windows 서비스 프로그램은 반드시 EP 코드에서 StartServiceCtrlDispatcher() API를 호출하여 서비스 메인 함수 SvcMain()주소를 등록한다. 따라서 이 API를 찾으면 SvcMain()의 주소를 알아낼 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DLL 파일 형태의 Windows 서비스의 경우 서비스 메인 함수(기본으로 ServiceMain)를 Export하고, SCM은 그 Export 함수를 실행한다. 따라서 DLL의 경우에는 StartServiceCtrlDispatcher() API를 따로 호출할 필요가 없다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;- 서비스 메인 함수의 이름을 ServiceMain이 아닌 다른 이름으로 지정하고 싶으면 관련 레지스트리에 등록하면 된다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StartServiceCtrlDispatcher() API의 파라미터 pServiceTable은 SERVICE_TABLE_ENTRY 구조체 포인터이다. 이 구조체에서 서비스의 이름 문자열과 서비스 메인 함수의 주소를 알 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SERVICE_TABLE_ENTRY 구조체 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;typedef struct _SERVICE_TABLE_ENTRYA {&lt;br /&gt;&amp;nbsp; &amp;nbsp; LPSTR&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lpServiceName;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 서비스 이름&lt;br /&gt;&amp;nbsp; &amp;nbsp; LPSERVICE_MAIN_FUNCTIONA&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lpServiceProc;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 서비스 메인 함수 주소&lt;br /&gt;} SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : MSDN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pServiceTable(18FD24)의 첫 번째 멤버(40A9CC)는 &amp;ldquo;SvcTest&amp;rdquo; 문자열이고, 두 번째 멤버(401320)가 SvcMain()함수의 주소이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vmWvK/btsC8R6KWWE/OrCle7L3jOJa9uVV98oTb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vmWvK/btsC8R6KWWE/OrCle7L3jOJa9uVV98oTb0/img.jpg&quot; data-alt=&quot;그림7 StartServiceCtrlDispatcher() API의 파라미터 pServiceTable&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vmWvK/btsC8R6KWWE/OrCle7L3jOJa9uVV98oTb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvmWvK%2FbtsC8R6KWWE%2FOrCle7L3jOJa9uVV98oTb0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;977&quot; height=&quot;287&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 StartServiceCtrlDispatcher() API의 파라미터 pServiceTable&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SvcMain()으로 이동하면 OutputDebugString() API를 사용하여 디버그 문자열을 출력하는 코드를 확인할 수 있다.&lt;br /&gt;이제 디버기 프로세스의 EIP를 SvcMain()으로 변경하여 디버깅하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm5qDB/btsDfPz1A5Z/BG0BvGo8IUKpOkKeQs2Krk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm5qDB/btsDfPz1A5Z/BG0BvGo8IUKpOkKeQs2Krk/img.jpg&quot; data-alt=&quot;그림8 SvcMain()&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm5qDB/btsDfPz1A5Z/BG0BvGo8IUKpOkKeQs2Krk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm5qDB%2FbtsDfPz1A5Z%2FBG0BvGo8IUKpOkKeQs2Krk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;333&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 SvcMain()&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- SvcMain()으로 이동하여 디버깅하기 위해서는 &amp;lsquo;New origin here&amp;rsquo;로 디버기 프로세스의 EIP 값을 SvcMain()의 시작 주소로 변경해야 된다. 이때 EIP 레지스터 외에 다른 것들(스택, EIP를 제외한 레지스터)은 모두 그대로이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- SCM으로부터 정상적으로 실행된 서비스 프로세스가 아니기 때문에 일부 서비스 관련 API룰 호출할 때 EXCEPTION이 발생할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; (예외처리 옵션이나 Plugin 사용)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 간혹 EP 강제 세팅으로 정확한 디버깅을 할 수 없는 경우가 있다. 이때는 정석(Attach) 방법으로 디버깅해야 된다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- Attach 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SCM을 통해서 정식으로 실행되는 서비스 프로세스를 디버거로 Attach해서 디버깅해야 하는 경우 간단한 디버깅 기법이 사용된다. 디버깅 기법의 작업 흐름을 EP 코드 디버깅 기준으로 간단히 표현하면 아래와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 407px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;[서비스 설치]&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[파일 패치]&lt;br /&gt;EP코드에 무한루프 설치&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[서비스 실행]&lt;br /&gt;무한루프에 걸림&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&amp;larr;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;SCM은 대기 상태&lt;br /&gt;(SERVICE_RUNNING을 기다림)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;height: 37px; text-align: center;&quot;&gt;[Attach]&lt;br /&gt;디버기를 Attach 시킴&lt;/td&gt;
&lt;td style=&quot;height: 37px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 37px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[프로세스 패치]&lt;br /&gt;EP 코드를 원래대로 복구&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[프로세스 패치]&lt;br /&gt;EP 코드부터 디버깅&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&amp;larr;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;서비스 프로세스의&lt;br /&gt;EP 코드부터 디버깅 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 디버거를 Attach시킬 때까지 서비스 프로세스의 중요 코드가 실행되지 못하도록 무한루프에 빠트리는 것이며, 고려할 사항은 Service Start Timeout(기본 30초) 이내에 완료하는 것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SCM은 서비스를 실행시킨 후 일정 시간(Service Start Timeout) 동안 서비스의 상태가 STATUS_RUNNING으로 변경되길 기다린다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 그 시간 내에 서비스의 상태가 변경되지 않는다면, SCM은 ERROR_SERVICE_REQUEST_TIMEOUT 에러를 발생시키고 해당 서비스 프로세스를 종료한다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1) &lt;/b&gt;&lt;b&gt;서비스 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 서비스 파일을 설치한다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2) Service Start Timeout &lt;/b&gt;&lt;b&gt;시간 증가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 상태를 변경하려면, 서비스 메인 함수 내에 존재하는 SetServiceStatus() API를 호출해야 된다. 하지만 30초 내의 작업은 매우 어려움으로 서비스 상태 변경 전 Service Start Timeout의 시간을 늘려야 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Service Start Timeout 시간 증가&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레지스트리 에디터(regedit.exe)를 실행하여 DWORD 값 생성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control] ServicesPipeTimeout&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ServicePipeTimeout은 기본값이 아니므로 생성해야 되며, 값은 밀리세컨드(millisecond)를 의미하며 시스템을 재부팅하면 적용된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Service Start Timeout을 늘리는 것은 모든 서비스에 영향을 미치므로 중요한 업무용 컴퓨터가 아닌 디버깅용 테스트 컴퓨터에만 적용하는 걸 권장&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeQIl/btsDfWscETz/PTSbAm9begMJeY7uECUnhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeQIl/btsDfWscETz/PTSbAm9begMJeY7uECUnhk/img.jpg&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;427&quot; style=&quot;width: 49.802%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeQIl/btsDfWscETz/PTSbAm9begMJeY7uECUnhk/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeQIl%2FbtsDfWscETz%2FPTSbAm9begMJeY7uECUnhk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tSBSP/btsDhOgi2qT/DPFCf0wL5kvMz2vITOho61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tSBSP/btsDhOgi2qT/DPFCf0wL5kvMz2vITOho61/img.jpg&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;432&quot; style=&quot;width: 49.0352%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tSBSP/btsDhOgi2qT/DPFCf0wL5kvMz2vITOho61/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtSBSP%2FbtsDhOgi2qT%2FDPFCf0wL5kvMz2vITOho61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;그림9 레지스트리에 ServicesPipeTimeout 값 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3) &lt;/b&gt;&lt;b&gt;파일 패치&lt;/b&gt;&lt;b&gt;: &lt;/b&gt;&lt;b&gt;무한루프 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 실행 파일(EXE 혹은 DLL)의 EP(Entry Point) 주소에 무한루프(Infinite Loop) 코드를 덮어씌운다.&lt;br /&gt;Stud_PE 같은 PE 관련 유틸리티를 이용하여 파일의 EP 주소(RVA/RAW)를 확인한다.&lt;br /&gt;Address of Entry Point 가 00001824이다. EP이므로 첫 번째 섹션(.text)이다. 따라서 RAW는 1824 &amp;ndash; 1000 + 400 = C24이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3moCE/btsDiQrayzk/i143T05GA252h33pOJWDW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3moCE/btsDiQrayzk/i143T05GA252h33pOJWDW1/img.jpg&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;307&quot; style=&quot;width: 41.6227%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3moCE/btsDiQrayzk/i143T05GA252h33pOJWDW1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3moCE%2FbtsDiQrayzk%2Fi143T05GA252h33pOJWDW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CM1yW/btsDd3r0XCG/u8RYz2z5yPDtuzrn5Gh831/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CM1yW/btsDd3r0XCG/u8RYz2z5yPDtuzrn5Gh831/img.jpg&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;198&quot; style=&quot;width: 57.2145%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CM1yW/btsDd3r0XCG/u8RYz2z5yPDtuzrn5Gh831/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCM1yW%2FbtsDd3r0XCG%2Fu8RYz2z5yPDtuzrn5Gh831%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;그림10 PEView로 EP 주소 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;EP(Entry Point)의 파일 옵셋(File Offset = RAW)이 C24인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byRKZx/btsC9l0PkEz/d5BwHBaI93ndrgAlMVkOHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byRKZx/btsC9l0PkEz/d5BwHBaI93ndrgAlMVkOHk/img.jpg&quot; data-alt=&quot;그림11 Stud_PE로 EP 주소 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byRKZx/btsC9l0PkEz/d5BwHBaI93ndrgAlMVkOHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyRKZx%2FbtsC9l0PkEz%2Fd5BwHBaI93ndrgAlMVkOHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;321&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 Stud_PE로 EP 주소 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HxD 유틸리티를 이용하여 해당 위치로 이동하면 원본 EP 코드의 첫 바이트를 찾을 수 있다. 이때, 첫 2바이트를 따로 적어두고, 해당 두 바이트를 0xEB, 0xFE로 패치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LrETS/btsC9BQkd3a/wil40x7NykfOyfwDalFbk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LrETS/btsC9BQkd3a/wil40x7NykfOyfwDalFbk0/img.jpg&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;277&quot; style=&quot;width: 41.2319%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LrETS/btsC9BQkd3a/wil40x7NykfOyfwDalFbk0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLrETS%2FbtsC9BQkd3a%2Fwil40x7NykfOyfwDalFbk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpPfK0/btsDiuPdsxE/YSIkwaSZXnBLk6ByWhhl2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpPfK0/btsDiuPdsxE/YSIkwaSZXnBLk6ByWhhl2K/img.jpg&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;197&quot; style=&quot;width: 57.6053%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpPfK0/btsDiuPdsxE/YSIkwaSZXnBLk6ByWhhl2K/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpPfK0%2FbtsDiuPdsxE%2FYSIkwaSZXnBLk6ByWhhl2K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;그림12 HxD: 패치된 EP 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OpCode 0xEB는 근거리(Short Distance) JMP 명령어이고 1바이트 크기의 값을 가진다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 이 값은 Signed Value(부호 있는 수)이며 &amp;lsquo;Next EIP와의 상대적인 거리&amp;rsquo;를 의미한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Jump Address = Next EIP(401826) + 0xFE(-2) = 401824&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패치된 코드를 OllyDbg로 확인하면 무한루프 명령어(자신의 주소 401824로 점프)를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xCHZn/btsDh9YOnWF/ZBfqD5UT3bCWjT2NAVYh80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xCHZn/btsDh9YOnWF/ZBfqD5UT3bCWjT2NAVYh80/img.jpg&quot; data-alt=&quot;그림13 OllyDbg: 패치된 EP 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xCHZn/btsDh9YOnWF/ZBfqD5UT3bCWjT2NAVYh80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxCHZn%2FbtsDh9YOnWF%2FZBfqD5UT3bCWjT2NAVYh80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;165&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 OllyDbg: 패치된 EP 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;4) &lt;/b&gt;&lt;b&gt;서비스 시작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스를 시작하면 서비스 프로세스는 무한루프에 빠져서 CPU 점유율이 100%에 가깝게 상승한다. &lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;오류 1053이 발생하면 그것이 ERROR_SERVICE_REQUEST_TIMEOUT 에러이다. 앞에서 Service Start Timeout의 시간을 늘려서 서비스 프로세스가 종료된 것은 아니므로 계속 진행하면 된다.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5) Attach &lt;/b&gt;&lt;b&gt;디버거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버거를 Attach 시키면 시스템 라이브러리(ntdll.DbgBreakPoint) 영역에서 멈춘다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DM1a6/btsDhzjbkEg/krD1K2nRcw3Y5niW1nL4Gk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DM1a6/btsDhzjbkEg/krD1K2nRcw3Y5niW1nL4Gk/img.jpg&quot; data-alt=&quot;그림14 OllyDbg: Attach된 후 시스템 라이브러리에서 멈춤&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DM1a6/btsDhzjbkEg/krD1K2nRcw3Y5niW1nL4Gk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDM1a6%2FbtsDhzjbkEg%2FkrD1K2nRcw3Y5niW1nL4Gk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;167&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 OllyDbg: Attach된 후 시스템 라이브러리에서 멈춤&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6) &lt;/b&gt;&lt;b&gt;프로세스 패치&lt;/b&gt;&lt;b&gt;: &lt;/b&gt;&lt;b&gt;무한루프 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+G 명령으로 프로세스의 EP 주소(VA: 401824)로 이동하여 BP 설치 후 실행한다.&lt;br /&gt;401824 주소에서 &amp;lsquo;Edit&amp;rsquo;기능을 이용하여 (앞에서 기록해 둔) 원본 코드(0xE8, 0xC0)으로 복원한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpxjX5/btsDfMJ5abb/MgKBqvZTK4f6D5MmGMFMyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpxjX5/btsDfMJ5abb/MgKBqvZTK4f6D5MmGMFMyk/img.jpg&quot; data-alt=&quot;그림15 EP 코드 복원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpxjX5/btsDfMJ5abb/MgKBqvZTK4f6D5MmGMFMyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpxjX5%2FbtsDfMJ5abb%2FMgKBqvZTK4f6D5MmGMFMyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;150&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 EP 코드 복원&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;7) &lt;/b&gt;&lt;b&gt;디버깅 시작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 서비스 메인 함수에서 SetServiceStatus() API를 호출하여 SERVICE_RUNNING 상태로 변경되어야 서비스 프로세스가 정삭적으로 실행된다.&lt;span style=&quot;color: #666666;&quot;&gt; (프로세스 시작 과정 3)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/slA7E/btsDfWlrJmI/RLkd9cw29pzSvZqoqkWbWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/slA7E/btsDfWlrJmI/RLkd9cw29pzSvZqoqkWbWK/img.jpg&quot; data-alt=&quot;그림16 SetServiceStatus() API 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/slA7E/btsDfWlrJmI/RLkd9cw29pzSvZqoqkWbWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FslA7E%2FbtsDfWlrJmI%2FRLkd9cw29pzSvZqoqkWbWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1041&quot; height=&quot;172&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16 SetServiceStatus() API 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SetServiceStatus() API 두 번째 파라미터 구조체의 dwCurrentState가 40134D에서 4(SERVICE_RUNNING)로 세팅되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SetServiceStatus() API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BOOL SetServiceStatus(&lt;br /&gt;&amp;nbsp; [in] SERVICE_STATUS_HANDLE&amp;nbsp; &amp;nbsp; hServiceStatus,&lt;br /&gt;&amp;nbsp; [in] LPSERVICE_STATUS&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lpServiceStatus&lt;br /&gt;);&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : MSDN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[in] hServiceStatus - 현재 서비스의 상태 정보 구조에 대한 핸들입니다.&lt;br /&gt;[in] lpServiceStatus - SERVICE_STATUS 구조에 대한 포인터는 호출 서비스에 대한 최신 상태 정보를 포함합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : MSDN&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzwFvA/btsDfoCrQpC/ENamFK9KTbPSqxnLxehNkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzwFvA/btsDfoCrQpC/ENamFK9KTbPSqxnLxehNkk/img.jpg&quot; data-alt=&quot;그림17 dwCurrentState 멤버 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzwFvA/btsDfoCrQpC/ENamFK9KTbPSqxnLxehNkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzwFvA%2FbtsDfoCrQpC%2FENamFK9KTbPSqxnLxehNkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;731&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림17 dwCurrentState 멤버 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : MSDN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SetServiceStatus(SERVICE_RUNNING) API가 실행되면 해당 서비스가 시작됨으로 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEddZe/btsC9yszhxg/BY34KELuJUXr4UblPqYDSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEddZe/btsC9yszhxg/BY34KELuJUXr4UblPqYDSk/img.jpg&quot; data-alt=&quot;그림18 SvcTest 서비스 시작됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEddZe/btsC9yszhxg/BY34KELuJUXr4UblPqYDSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEddZe%2FbtsC9yszhxg%2FBY34KELuJUXr4UblPqYDSk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;532&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림18 SvcTest 서비스 시작됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 서비스 프로세스 Attach 방식 디버깅을 정리하면 아래와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 357px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;[서비스 설치]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;[Service Start Timeout 시간 증가]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;height: 35px; text-align: center;&quot;&gt;&amp;nbsp;&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[파일 패치]&lt;br /&gt;EP코드에 무한루프 설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[서비스 실행]&lt;br /&gt;무한루프에 걸림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;height: 37px; text-align: center;&quot;&gt;[Attach]&lt;br /&gt;디버기를 Attach 시킴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[프로세스 패치]&lt;br /&gt;EP 코드를 원래대로 복구 (무한루프 제거)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; text-align: center;&quot;&gt;[프로세스 패치]&lt;br /&gt;EP 코드부터 디버깅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 프로세스의 동작 원리와 디버깅 방법을 정리하였는데, 서비스 동작 원리를 이해하지 못하면 서비스 메인 함수를 정확히 디버깅할 수 없다.&lt;br /&gt;따라서 동작 원리를 이해하는데 중점을 두어야 된다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ceBbAj/btsDh6PyD49/LaiEPq95kEKt9i6uDZbOPk/%EB%A6%AC%EB%B2%84%EC%8B%B1%20%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC%20-%20%EB%94%94%EB%B2%84%EA%B9%85%20%EC%8B%A4%EC%8A%B51_%EC%97%85%EB%A1%9C%EB%93%9C%EC%9A%A9.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;리버싱 핵심원리 - 디버깅 실습1_업로드용.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.76MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>리버싱 핵심원리</category>
      <category>디버깅</category>
      <category>리버싱</category>
      <category>리버싱핵심원리</category>
      <category>서비스</category>
      <category>서비스디버깅</category>
      <category>서비스프로세스</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/39</guid>
      <comments>https://honorlog.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 10 Jan 2024 02:59:15 +0900</pubDate>
    </item>
    <item>
      <title>[CodeEngn] Advance RCE L15</title>
      <link>https://honorlog.tistory.com/37</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;● CodeEngn Advance RCE L15 문제&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1 문제.jpg&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;361&quot; width=&quot;474&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NQ2eA/btq2MAT9Cj1/PMD30kygb6ab7r9WBNJkzK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NQ2eA/btq2MAT9Cj1/PMD30kygb6ab7r9WBNJkzK/img.jpg&quot; data-alt=&quot;CodeEngn Advance RCE L15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NQ2eA/btq2MAT9Cj1/PMD30kygb6ab7r9WBNJkzK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNQ2eA%2Fbtq2MAT9Cj1%2FPMD30kygb6ab7r9WBNJkzK%2Fimg.jpg&quot; data-filename=&quot;1 문제.jpg&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;361&quot; width=&quot;474&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CodeEngn Advance RCE L15&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◎ 파일 실행 화면&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy2cTu/btq2SL7vugb/O9lX4K4sK20ffWaRkFt4R1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy2cTu/btq2SL7vugb/O9lX4K4sK20ffWaRkFt4R1/img.jpg&quot; data-filename=&quot;2 실행 화면.jpg&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;328&quot; style=&quot;width: 49.6573%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy2cTu/btq2SL7vugb/O9lX4K4sK20ffWaRkFt4R1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy2cTu%2Fbtq2SL7vugb%2FO9lX4K4sK20ffWaRkFt4R1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVqQBC/btq2Nq4AXbv/TA5hJNL7Z0l8gRie9qXwR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVqQBC/btq2Nq4AXbv/TA5hJNL7Z0l8gRie9qXwR1/img.jpg&quot; data-filename=&quot;2-1 code 실패 화면.jpg&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;332&quot; style=&quot;width: 49.1799%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVqQBC/btq2Nq4AXbv/TA5hJNL7Z0l8gRie9qXwR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVqQBC%2Fbtq2Nq4AXbv%2FTA5hJNL7Z0l8gRie9qXwR1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[그림 1] 파일 실행 화면 및 Unlock Code Error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Username and Serial Validation으로 넘어가려면 리버싱으로 Unlock Code를 찾아야 되는 것으로 확인됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◎&amp;nbsp;&lt;b&gt;패킹 및 난독화 여부 확인&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA1sAO/btq2W91pdSy/vi9C8BwstEeuE4nxjcX8ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA1sAO/btq2W91pdSy/vi9C8BwstEeuE4nxjcX8ck/img.png&quot; data-alt=&quot;[그림 2] exeinfo PE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA1sAO/btq2W91pdSy/vi9C8BwstEeuE4nxjcX8ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA1sAO%2Fbtq2W91pdSy%2Fvi9C8BwstEeuE4nxjcX8ck%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] exeinfo PE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;● CodeEngn Advance RCE L15 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4 디버그 올린거 2.jpg&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;880&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccbREw/btq2TbFeeBn/kz0du5izb2bfozhgmCqrGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccbREw/btq2TbFeeBn/kz0du5izb2bfozhgmCqrGk/img.jpg&quot; data-alt=&quot;[그림 3]&amp;amp;amp;nbsp;디버거 - x32dbg / 디버기 - 15.exe (Advance RCE L15 실행파일)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccbREw/btq2TbFeeBn/kz0du5izb2bfozhgmCqrGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccbREw%2Fbtq2TbFeeBn%2Fkz0du5izb2bfozhgmCqrGk%2Fimg.jpg&quot; data-filename=&quot;4 디버그 올린거 2.jpg&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;880&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3]&amp;nbsp;디버거 - x32dbg / 디버기 - 15.exe (Advance RCE L15 실행파일)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 모듈에서 호출되는 함수를 찾아보면 없다고 뜹니다. [그림 2]에서 패킹이 없다는 것을 확인했으니 파일이 암호화되어있을 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;132&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1xrey/btq21pbUgrt/uvvK6kHD16ZTvjeCmqjAhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1xrey/btq21pbUgrt/uvvK6kHD16ZTvjeCmqjAhk/img.png&quot; data-alt=&quot;[그림 4] Search for &amp;amp;amp;gt; Current module &amp;amp;amp;gt; Intermodular calls&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1xrey/btq21pbUgrt/uvvK6kHD16ZTvjeCmqjAhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1xrey%2Fbtq21pbUgrt%2FuvvK6kHD16ZTvjeCmqjAhk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;132&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] Search for &amp;gt; Current module &amp;gt; Intermodular calls&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 3]에서 진행하면, [그림 5]를 걸치면서 코드가 복호화됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZ9FF/btq2197B5Gr/ldGb04ZKNvg7pE2DRgmnp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZ9FF/btq2197B5Gr/ldGb04ZKNvg7pE2DRgmnp1/img.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;415&quot; style=&quot;width: 58.2017%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZ9FF/btq2197B5Gr/ldGb04ZKNvg7pE2DRgmnp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZ9FF%2Fbtq2197B5Gr%2FldGb04ZKNvg7pE2DRgmnp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mApxf/btq2NE27SLd/agfsIJEok2eC1JFSGs3k4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mApxf/btq2NE27SLd/agfsIJEok2eC1JFSGs3k4k/img.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;743&quot; style=&quot;width: 40.6355%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mApxf/btq2NE27SLd/agfsIJEok2eC1JFSGs3k4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmApxf%2Fbtq2NE27SLd%2FagfsIJEok2eC1JFSGs3k4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1140&quot; height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[그림 5] 00401400 코드 복호화 및 00401000 코드 복호화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복호화가 된 최종 결과는 [그림 6]이며, 이 곳이 OEP입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;853&quot; data-filename=&quot;5 OEP.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBBVxc/btq21n6eCFw/LWVFcEsWGZMGtzYNCZ9sN0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBBVxc/btq21n6eCFw/LWVFcEsWGZMGtzYNCZ9sN0/img.jpg&quot; data-alt=&quot;[그림 6] OEP&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBBVxc/btq21n6eCFw/LWVFcEsWGZMGtzYNCZ9sN0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBBVxc%2Fbtq21n6eCFw%2FLWVFcEsWGZMGtzYNCZ9sN0%2Fimg.jpg&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;853&quot; data-filename=&quot;5 OEP.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] OEP&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 6]에서 &lt;span style=&quot;color: #333333;&quot;&gt;[Plugins &amp;gt; Scylla]에서 &lt;/span&gt;DUMP 파일을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;907&quot; data-filename=&quot;5-1 dump파일 생성.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RcKQY/btq2YRGLr5v/MzGcTesUhJ5BT94GXJSMA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RcKQY/btq2YRGLr5v/MzGcTesUhJ5BT94GXJSMA0/img.jpg&quot; data-alt=&quot;[그림 7] DUMP&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RcKQY/btq2YRGLr5v/MzGcTesUhJ5BT94GXJSMA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRcKQY%2Fbtq2YRGLr5v%2FMzGcTesUhJ5BT94GXJSMA0%2Fimg.jpg&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;907&quot; data-filename=&quot;5-1 dump파일 생성.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] DUMP&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;현재 모듈에서 호출되는 함수를 찾아보면 GetDlgItemTextA 함수를 확인할 수 있습니다. 이 함수를 사용하여 프로그램이 입력받은 Unlock Code와 Name, Serial을 입력받는 것으로 추측됩니다. BP를 걸고 실행을 하여 해당 주소로 이동합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7 입력받아오는 함수에 BP 후 실행.jpg&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;486&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O8Ajb/btq2Oqqd0KV/YkN93ysgCuqjq921nHAMr0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O8Ajb/btq2Oqqd0KV/YkN93ysgCuqjq921nHAMr0/img.jpg&quot; data-alt=&quot;[그림 8] Search for &amp;amp;amp;gt; Current module &amp;amp;amp;gt; Intermodular calls &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O8Ajb/btq2Oqqd0KV/YkN93ysgCuqjq921nHAMr0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO8Ajb%2Fbtq2Oqqd0KV%2FYkN93ysgCuqjq921nHAMr0%2Fimg.jpg&quot; data-filename=&quot;7 입력받아오는 함수에 BP 후 실행.jpg&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;486&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Search for &amp;gt; Current module &amp;gt; Intermodular calls &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unlock Code 입력 후 디버거를 보면 CMP eax, 7을 하여 비교하는 것을 확인할 수 있습니다. 즉, Unlock Code는 8자 이상이어야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;375&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7v47y/btq2Tdp6ix0/ubTT1E4kk6utrJyWul2kJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7v47y/btq2Tdp6ix0/ubTT1E4kk6utrJyWul2kJK/img.png&quot; data-alt=&quot;[그림 9] Unlock Code&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7v47y/btq2Tdp6ix0/ubTT1E4kk6utrJyWul2kJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7v47y%2Fbtq2Tdp6ix0%2FubTT1E4kk6utrJyWul2kJK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;375&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 9] Unlock Code&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unlock Code가 8자 이상이라는 것을 알았으니 실행하여 Name과 Serial을 입력하면 어떤 창이 뜰지 실행해봅시다. [그림 10]처럼 작성하여 &lt;b&gt;Check를 누르면 화면이 꺼집니다.&lt;/b&gt; 즉, 제대로 된 실행이 아닌 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8-1 코드 입력후 이름비번 입력 체크 시 사라짐.jpg&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;351&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rx5XO/btq2Rk36cp4/2yGRunohOqLKmssBLSEkmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rx5XO/btq2Rk36cp4/2yGRunohOqLKmssBLSEkmk/img.jpg&quot; data-alt=&quot;[그림 10] Name, Serial 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rx5XO/btq2Rk36cp4/2yGRunohOqLKmssBLSEkmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frx5XO%2Fbtq2Rk36cp4%2F2yGRunohOqLKmssBLSEkmk%2Fimg.jpg&quot; data-filename=&quot;8-1 코드 입력후 이름비번 입력 체크 시 사라짐.jpg&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;351&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 10] Name, Serial 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unlock Code를 입력받은 후 CALL 4012D2의 내부를 확인하면 입력받은 Code를 사용하여 ECX(10h)와 곱하며 합을 만들어가는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;404&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DJJ3k/btq2OOEngMa/O8sJcsvrtbnWhO0evOfmu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DJJ3k/btq2OOEngMa/O8sJcsvrtbnWhO0evOfmu1/img.png&quot; data-alt=&quot;[그림 11] CALL 4012D2 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DJJ3k/btq2OOEngMa/O8sJcsvrtbnWhO0evOfmu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDJJ3k%2Fbtq2OOEngMa%2FO8sJcsvrtbnWhO0evOfmu1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;404&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 11] CALL 4012D2 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;'ABCDABCD'가 입력될 경우 'F0'이 생성되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;114&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lrs41/btq2OPwvTbN/1TRyQY9NnHx2BhfXRmaj4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lrs41/btq2OPwvTbN/1TRyQY9NnHx2BhfXRmaj4K/img.png&quot; data-alt=&quot;[그림 12] CALL 4012D2 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lrs41/btq2OPwvTbN/1TRyQY9NnHx2BhfXRmaj4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLrs41%2Fbtq2OPwvTbN%2F1TRyQY9NnHx2BhfXRmaj4K%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;114&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 12] CALL 4012D2 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CALL 4012D2의 결과를 사용하여 CALL 4012F7 내부에서 [004011C1 ~ 0040123C]까지 XOR을 하는 코드가 있습니다. 이는 [&lt;span style=&quot;color: #333333;&quot;&gt;004011C1 ~ 0040123C]가 암호화되어있다는 것이며, CALL 4012D2의 결과와 XOR 하는 것으로 복호화하는 것을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;403&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLPWsy/btq2OORVfTu/hJdXMmlbVzTtJkgLjSDf21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLPWsy/btq2OORVfTu/hJdXMmlbVzTtJkgLjSDf21/img.png&quot; data-alt=&quot;[그림 13] 4011C1 복호화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLPWsy/btq2OORVfTu/hJdXMmlbVzTtJkgLjSDf21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLPWsy%2Fbtq2OORVfTu%2FhJdXMmlbVzTtJkgLjSDf21%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;403&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 13] 4011C1 복호화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12 11 결과.jpg&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;443&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FtZjB/btq2XatfCui/B0hkk9L1YBwk3cZQRmKnOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FtZjB/btq2XatfCui/B0hkk9L1YBwk3cZQRmKnOk/img.jpg&quot; data-alt=&quot;[그림 14] 복호화 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FtZjB/btq2XatfCui/B0hkk9L1YBwk3cZQRmKnOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFtZjB%2Fbtq2XatfCui%2FB0hkk9L1YBwk3cZQRmKnOk%2Fimg.jpg&quot; data-filename=&quot;12 11 결과.jpg&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;443&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 14] 복호화 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 진행하면 Name과 Serial을 입력받습니다. [그림 15]를 설명하면, 004010F1에서 입력받은 Name을 찾아오고, 1자에서 16자 사이의 길이를 가지는지 확인합니다. 00401135 CALL 4011E8에서 입력받은 Name을 사용하여 Serial을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;445&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JcVpd/btq2SMzfSsr/cTHJgKSHsE7EUCQ3xMYK80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JcVpd/btq2SMzfSsr/cTHJgKSHsE7EUCQ3xMYK80/img.png&quot; data-alt=&quot;[그림 15] Name 및 Serial&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JcVpd/btq2SMzfSsr/cTHJgKSHsE7EUCQ3xMYK80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcVpd%2Fbtq2SMzfSsr%2FcTHJgKSHsE7EUCQ3xMYK80%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;445&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 15] Name 및 Serial&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CALL 4011E8의 내부를 확인하면 코드가 이상한 것을 볼 수 있습니다. 이 코드는 [그림 14]에서 확인한 XOR 해서 만들어진 코드입니다. 즉, 제대로 복호화 Key가 잘 못되었다는 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;14 CALL 4011E8로 들어간 부분의 코드가 12번이라는 것을 알수 있음- 함수 프롤로그에 맞추어 변경해보자.jpg&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;757&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs50wq/btq2P3BEL4b/FjdTUFvnvjzkj2XLKkwvkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs50wq/btq2P3BEL4b/FjdTUFvnvjzkj2XLKkwvkk/img.jpg&quot; data-alt=&quot;[그림 16] 잘못된 Key로 복호화된 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs50wq/btq2P3BEL4b/FjdTUFvnvjzkj2XLKkwvkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs50wq%2Fbtq2P3BEL4b%2FFjdTUFvnvjzkj2XLKkwvkk%2Fimg.jpg&quot; data-filename=&quot;14 CALL 4011E8로 들어간 부분의 코드가 12번이라는 것을 알수 있음- 함수 프롤로그에 맞추어 변경해보자.jpg&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;757&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 16] 잘못된 Key로 복호화된 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;함수의 프롤로그는 '55h'로 시작합니다. [그림 13]에서 처음 hex 값은 '70h'입니다. '70h'과 XOR 하여 '55h'를 만드는 값은 '25h'입니다. 따라서 코드 복호화 Key는 '25h'가 되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;266&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsrRub/btq21oxuk98/kk4HGz7JkNfbGcqAkZMSN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsrRub/btq21oxuk98/kk4HGz7JkNfbGcqAkZMSN0/img.png&quot; data-alt=&quot;[그림 17] 70 XOR 55 = 25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsrRub/btq21oxuk98/kk4HGz7JkNfbGcqAkZMSN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsrRub%2Fbtq21oxuk98%2Fkk4HGz7JkNfbGcqAkZMSN0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;266&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 17] 70 XOR 55 = 25&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unlock Code를 사용하여 Key를 만들고 난 후 Key의 값을 '25h'로 변경하고 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;375&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpuLTj/btq2N1Rtofj/8eerKAE1kWbDDpr3g5tB8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpuLTj/btq2N1Rtofj/8eerKAE1kWbDDpr3g5tB8K/img.png&quot; data-alt=&quot;[그림 18] 코드 복호화 Key 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpuLTj/btq2N1Rtofj/8eerKAE1kWbDDpr3g5tB8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpuLTj%2Fbtq2N1Rtofj%2F8eerKAE1kWbDDpr3g5tB8K%2Fimg.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;375&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 18] 코드 복호화 Key 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;004011E8까지 진행하면 정상적으로 복호화된 코드를 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;757&quot; width=&quot;774&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl9MyT/btq22FFw2KS/JAMZ8pMIvu2kWFlR9WBi40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl9MyT/btq22FFw2KS/JAMZ8pMIvu2kWFlR9WBi40/img.png&quot; data-alt=&quot;[그림 19] 정상적으로 복호화된 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl9MyT/btq22FFw2KS/JAMZ8pMIvu2kWFlR9WBi40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl9MyT%2Fbtq22FFw2KS%2FJAMZ8pMIvu2kWFlR9WBi40%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;757&quot; width=&quot;774&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 19] 정상적으로 복호화된 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 19]의 CALL 4011C1에서 입력된 Name을 사용하여 Serial을 만드는 Key를 생성합니다. 생성과정은 [그림 11]에서 Unlock Code로 코드 복호화 Key를 생성하는 과정과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;387&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MwVHO/btq2QUYEF1G/QBnTMKToKvBnMCdd23YF4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MwVHO/btq2QUYEF1G/QBnTMKToKvBnMCdd23YF4K/img.png&quot; data-alt=&quot;[그림 20] Serial을 만드는 Key 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MwVHO/btq2QUYEF1G/QBnTMKToKvBnMCdd23YF4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwVHO%2Fbtq2QUYEF1G%2FQBnTMKToKvBnMCdd23YF4K%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;387&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 20] Serial을 만드는 Key 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CALL 4011C1에서 생성된 Key를 사용하여 Serial을 생성합니다. Serial 생성은 &lt;span style=&quot;color: #333333;&quot;&gt;[그림 11]에서 Unlock Code로 코드 복호화 Key를 생성하는 과정과 유사하며, 이후 생성된 값을 16진수로 변환하는 코드가 추가되어있습니다. (Ex. 0Ah -&amp;gt; 41h(A))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;585&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eB529k/btq20FsI4rS/kq7Nm6ckTEKvjaT7ohO6M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eB529k/btq20FsI4rS/kq7Nm6ckTEKvjaT7ohO6M0/img.png&quot; data-alt=&quot;[그림 21] Serial 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eB529k/btq20FsI4rS/kq7Nm6ckTEKvjaT7ohO6M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeB529k%2Fbtq20FsI4rS%2Fkq7Nm6ckTEKvjaT7ohO6M0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;585&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 21] Serial 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 21]에서 &lt;span&gt;CodeEngn Advance RCE L15의 답 &lt;/span&gt;Name(CodeEngn.com)의 Serial을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램의 흐름을 좀 더 살펴보면, Serial이 생성된 후 입력받은 Serial을 찾아와 CALL 401280에서 비교하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;21 시리얼 비교.jpg&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;277&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx9p6c/btq22a6JioU/qkckfI9ZeGCu83HvMIQH8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx9p6c/btq22a6JioU/qkckfI9ZeGCu83HvMIQH8k/img.jpg&quot; data-alt=&quot;[그림 22] Serial 비교 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx9p6c/btq22a6JioU/qkckfI9ZeGCu83HvMIQH8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx9p6c%2Fbtq22a6JioU%2FqkckfI9ZeGCu83HvMIQH8k%2Fimg.jpg&quot; data-filename=&quot;21 시리얼 비교.jpg&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;277&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 22] Serial 비교 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CALL 401280의 내부는 [그림 23]과 같으며, 입력받은 Serial과 생성된 Serial을 한자씩 비교합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;21-1 한자씩 비교해서 성공 실패 분기.jpg&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oe0Co/btq2TcLH0vO/OxGPclq3siWHpAfyQ7E11K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oe0Co/btq2TcLH0vO/OxGPclq3siWHpAfyQ7E11K/img.jpg&quot; data-alt=&quot;[그림 23] CALL 401280의 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oe0Co/btq2TcLH0vO/OxGPclq3siWHpAfyQ7E11K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foe0Co%2Fbtq2TcLH0vO%2FOxGPclq3siWHpAfyQ7E11K%2Fimg.jpg&quot; data-filename=&quot;21-1 한자씩 비교해서 성공 실패 분기.jpg&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 23] CALL 401280의 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -96px / 200px 420px no-repeat; width: 64px; height: 8px; padding: 18px 20px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;+&amp;alpha;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;[그림 22]에서 입력받은 Serial은 [00403329]에서 찾을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;312&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bREUcG/btq2ZoSeg0z/QdbU60AeZFXGZVKk55NkqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bREUcG/btq2ZoSeg0z/QdbU60AeZFXGZVKk55NkqK/img.png&quot; data-alt=&quot;[그림 24] 입력받은 Serial&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bREUcG/btq2ZoSeg0z/QdbU60AeZFXGZVKk55NkqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbREUcG%2Fbtq2ZoSeg0z%2FQdbU60AeZFXGZVKk55NkqK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;312&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 24] 입력받은 Serial&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;입력받은 Serial이 16Byte보다 많아도 GetDlgItemTextA 함수에서 16Byte까지만 찾아옵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;● CodeEngn Advance RCE L15 확인&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;22 찾은 시리얼 작성 성공.jpg&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;347&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdbu56/btq2TdjzT5G/LG55gKLHcNF5Tz5t7uEL21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdbu56/btq2TdjzT5G/LG55gKLHcNF5Tz5t7uEL21/img.jpg&quot; data-alt=&quot;[그림 25] You hace entered valid valuse!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdbu56/btq2TdjzT5G/LG55gKLHcNF5Tz5t7uEL21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdbu56%2Fbtq2TdjzT5G%2FLG55gKLHcNF5Tz5t7uEL21%2Fimg.jpg&quot; data-filename=&quot;22 찾은 시리얼 작성 성공.jpg&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;347&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 25] You hace entered valid valuse!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CodeEngn/Advance</category>
      <category>CodeEngn</category>
      <category>x32dbg</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/37</guid>
      <comments>https://honorlog.tistory.com/37#entry37comment</comments>
      <pubDate>Mon, 19 Apr 2021 18:02:43 +0900</pubDate>
    </item>
    <item>
      <title>[CodeEngn] Advance RCE L14</title>
      <link>https://honorlog.tistory.com/36</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;● CodeEngn Advance RCE L14&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 문제&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1 문제.jpg&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;332&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eTnUOg/btq2E92WL4b/PrtxclwUzgap6mtTZiQ9L0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eTnUOg/btq2E92WL4b/PrtxclwUzgap6mtTZiQ9L0/img.jpg&quot; data-alt=&quot;CodeEngn Advance RCE L14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eTnUOg/btq2E92WL4b/PrtxclwUzgap6mtTZiQ9L0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeTnUOg%2Fbtq2E92WL4b%2FPrtxclwUzgap6mtTZiQ9L0%2Fimg.jpg&quot; data-filename=&quot;1 문제.jpg&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;332&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CodeEngn Advance RCE L14&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◎ 파일 실행 화면&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3WXeA/btq2GROAvca/Nb7XkKKwCkK1kmtQAWhImk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3WXeA/btq2GROAvca/Nb7XkKKwCkK1kmtQAWhImk/img.jpg&quot; data-filename=&quot;2 실행 화면.jpg&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;265&quot; style=&quot;width: 49.2733%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3WXeA/btq2GROAvca/Nb7XkKKwCkK1kmtQAWhImk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3WXeA%2Fbtq2GROAvca%2FNb7XkKKwCkK1kmtQAWhImk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnDm7l/btq2Im1ebs9/ZbgruQVLYsOdliATxsdyw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnDm7l/btq2Im1ebs9/ZbgruQVLYsOdliATxsdyw0/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 49.5639%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnDm7l/btq2Im1ebs9/ZbgruQVLYsOdliATxsdyw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnDm7l%2Fbtq2Im1ebs9%2FZbgruQVLYsOdliATxsdyw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[그림 1] 파일 실행 화면 / 실패 화면 (Name : ABCD , Serial : NH6-0-0091008D0052)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◎&amp;nbsp;&lt;b&gt;패킹 및 난독화 여부 확인&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqqeik/btq2JkopSxg/oR0qx5wa6TYsmX9PHNaYO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqqeik/btq2JkopSxg/oR0qx5wa6TYsmX9PHNaYO0/img.png&quot; data-alt=&quot;[그림 2] exeinfo PE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqqeik/btq2JkopSxg/oR0qx5wa6TYsmX9PHNaYO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqqeik%2Fbtq2JkopSxg%2FoR0qx5wa6TYsmX9PHNaYO0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] exeinfo PE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;● CodeEngn Advance RCE L14 분석 및 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5 디버거 올린거.jpg&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;872&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh0eyO/btq2Jy7XKxK/HpA8LEPPTpuAzy0XTxLBg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh0eyO/btq2Jy7XKxK/HpA8LEPPTpuAzy0XTxLBg0/img.jpg&quot; data-alt=&quot;[그림 3] 디버거 - OllyDbg / 디버기 - 14.exe (Advance RCE L14 실행파일)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh0eyO/btq2Jy7XKxK/HpA8LEPPTpuAzy0XTxLBg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh0eyO%2Fbtq2Jy7XKxK%2FHpA8LEPPTpuAzy0XTxLBg0%2Fimg.jpg&quot; data-filename=&quot;5 디버거 올린거.jpg&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;872&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] 디버거 - OllyDbg / 디버기 - 14.exe (Advance RCE L14 실행파일)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자열 검색에서 &lt;/span&gt;[그림 1] 실패 화면의 &quot;Invalid Registration Code&quot;문자열을 찾으면 성공 문자열과 함께 바로 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cduhcp/btq2INdkLIG/28qCsKLxQ2R62s68RMtnrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cduhcp/btq2INdkLIG/28qCsKLxQ2R62s68RMtnrK/img.png&quot; data-alt=&quot;[그림 4]&amp;amp;amp;nbsp;Search for &amp;amp;amp;gt; All referenced text strings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cduhcp/btq2INdkLIG/28qCsKLxQ2R62s68RMtnrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcduhcp%2Fbtq2INdkLIG%2F28qCsKLxQ2R62s68RMtnrK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4]&amp;nbsp;Search for &amp;gt; All referenced text strings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패 문자열 주소로 이동하면 성공 문자열과 함께 분기점(0047F448)을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7 분기점 확인.jpg&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLBVbG/btq2GR8Q5Xc/KtKghbDE1nmtCJlWkL3zI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLBVbG/btq2GR8Q5Xc/KtKghbDE1nmtCJlWkL3zI1/img.jpg&quot; data-alt=&quot;[그림 5] 분기 조건 및 분기점 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLBVbG/btq2GR8Q5Xc/KtKghbDE1nmtCJlWkL3zI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLBVbG%2Fbtq2GR8Q5Xc%2FKtKghbDE1nmtCJlWkL3zI1%2Fimg.jpg&quot; data-filename=&quot;7 분기점 확인.jpg&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] 분기 조건 및 분기점 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 조건의 파라미터를 확인하면 입력된 Serial의 숫자 부분과 Name으로 생성된 Serial 숫자를 비교하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 조건 앞의 CALL 00404B2C와 CALL 0047F0B8은 각각 입력된 Serial과 입력된 Name을 파라미터로 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 앞의 CALL 0047F0B8에서 Name으로 Serial을 만드는 것을 예상할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tbzkL/btq2GS7Kasv/bcTMcHloZu5nB6RmoXvDGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tbzkL/btq2GS7Kasv/bcTMcHloZu5nB6RmoXvDGK/img.png&quot; data-alt=&quot;[그림 6] 분기조건 : EAX, EDX 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tbzkL/btq2GS7Kasv/bcTMcHloZu5nB6RmoXvDGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtbzkL%2Fbtq2GS7Kasv%2FbcTMcHloZu5nB6RmoXvDGK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] 분기조건 : EAX, EDX 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CALL 0047F0B8의 내부를 확인해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9 serial 생성하는 부분.jpg&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;491&quot; width=&quot;734&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1PDLS/btq2DFVBsHq/4qc12QTCafRYwz4xPzCt51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1PDLS/btq2DFVBsHq/4qc12QTCafRYwz4xPzCt51/img.jpg&quot; data-alt=&quot;[그림 7] CALL 0047F0B8 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1PDLS/btq2DFVBsHq/4qc12QTCafRYwz4xPzCt51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1PDLS%2Fbtq2DFVBsHq%2F4qc12QTCafRYwz4xPzCt51%2Fimg.jpg&quot; data-filename=&quot;9 serial 생성하는 부분.jpg&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;491&quot; width=&quot;734&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] CALL 0047F0B8 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CALL 0047F0B8의 내부에는 Serial을 생성하는 3개의 반복문이 존재합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Name의 길이를 늘려주는 반복문&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10.jpg&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;442&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAcFRq/btq2D3aMgv6/jZkdFvzP5BazK6XvQNkN0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAcFRq/btq2D3aMgv6/jZkdFvzP5BazK6XvQNkN0k/img.jpg&quot; data-alt=&quot;[그림 8] Name의 길이를 늘려줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAcFRq/btq2D3aMgv6/jZkdFvzP5BazK6XvQNkN0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAcFRq%2Fbtq2D3aMgv6%2FjZkdFvzP5BazK6XvQNkN0k%2Fimg.jpg&quot; data-filename=&quot;10.jpg&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;442&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Name의 길이를 늘려줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 1에서 늘린 Name과 문자열(NH KeyGenMe6)의 합을 이어 붙이는 반복문 (1회 반복 결과 : 4byte)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;337&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DaaaL/btq2Imun0Mr/3KILuY98HXdUHnljEzhGXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DaaaL/btq2Imun0Mr/3KILuY98HXdUHnljEzhGXk/img.png&quot; data-alt=&quot;[그림 9] Serial = 1에서 늘린 Name과 문자열(NH KeyGenMe6)의 합&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DaaaL/btq2Imun0Mr/3KILuY98HXdUHnljEzhGXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDaaaL%2Fbtq2Imun0Mr%2F3KILuY98HXdUHnljEzhGXk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;337&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 9] Serial = 1에서 늘린 Name과 문자열(NH KeyGenMe6)의 합&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 2에서 생성된 Serial의 앞의 12자리를 자르는 반복문&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12.jpg&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;396&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RCWWT/btq2DshDpt7/DbXTBnGPFJmvqDYFDMXA41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RCWWT/btq2DshDpt7/DbXTBnGPFJmvqDYFDMXA41/img.jpg&quot; data-alt=&quot;[그림 10] Serial = 2에서 생성된 Serial의 앞에서 12자리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RCWWT/btq2DshDpt7/DbXTBnGPFJmvqDYFDMXA41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRCWWT%2Fbtq2DshDpt7%2FDbXTBnGPFJmvqDYFDMXA41%2Fimg.jpg&quot; data-filename=&quot;12.jpg&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;396&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 10] Serial = 2에서 생성된 Serial의 앞에서 12자리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Serial : &lt;span&gt;NH6-0-0091008D0052을 만족하는 Name을 찾으려면 Serial의 숫자 부분에서 문자열을 빼주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12-1 문자열.jpg&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;66&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTCkCO/btq2Drwa0IX/o8JqXQBgpcGwDoLTGVoOFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTCkCO/btq2Drwa0IX/o8JqXQBgpcGwDoLTGVoOFk/img.jpg&quot; data-alt=&quot;[그림 11] 문자열&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTCkCO/btq2Drwa0IX/o8JqXQBgpcGwDoLTGVoOFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTCkCO%2Fbtq2Drwa0IX%2Fo8JqXQBgpcGwDoLTGVoOFk%2Fimg.jpg&quot; data-filename=&quot;12-1 문자열.jpg&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;66&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 11] 문자열&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfxoye/btq2Ef3uEti/XAOBwAUlQk9BL8RFjQQcc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfxoye/btq2Ef3uEti/XAOBwAUlQk9BL8RFjQQcc1/img.jpg&quot; data-filename=&quot;13.jpg&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;258&quot; style=&quot;width: 32.0837%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfxoye/btq2Ef3uEti/XAOBwAUlQk9BL8RFjQQcc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfxoye%2Fbtq2Ef3uEti%2FXAOBwAUlQk9BL8RFjQQcc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M5OUH/btq2E8JK221/lgpAbE10oPa5kGayeJxwVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M5OUH/btq2E8JK221/lgpAbE10oPa5kGayeJxwVK/img.jpg&quot; data-filename=&quot;14.jpg&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;252&quot; style=&quot;width: 33.1891%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M5OUH/btq2E8JK221/lgpAbE10oPa5kGayeJxwVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM5OUH%2Fbtq2E8JK221%2FlgpAbE10oPa5kGayeJxwVK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHJNoK/btq2GWWvbii/08gmVQAKFlRa2RVHimiZDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHJNoK/btq2GWWvbii/08gmVQAKFlRa2RVHimiZDk/img.jpg&quot; data-filename=&quot;15.jpg&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;256&quot; style=&quot;width: 32.4016%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHJNoK/btq2GWWvbii/08gmVQAKFlRa2RVHimiZDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHJNoK%2Fbtq2GWWvbii%2F08gmVQAKFlRa2RVHimiZDk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[그림 12] 뺄셈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;● CodeEngn Advance RCE L14 확인&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 12]의 값을 문자로 변환하면 'CE2'입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NIM5J/btq2EU5GhFR/lqMkW3f4DZf9J2vqTh3eXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NIM5J/btq2EU5GhFR/lqMkW3f4DZf9J2vqTh3eXK/img.png&quot; data-alt=&quot;[그림 13] Name 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NIM5J/btq2EU5GhFR/lqMkW3f4DZf9J2vqTh3eXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNIM5J%2Fbtq2EU5GhFR%2FlqMkW3f4DZf9J2vqTh3eXK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 13] Name 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxho9/btq2DF87Byg/mFi2B0od1dxnxFiVW3Pwu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxho9/btq2DF87Byg/mFi2B0od1dxnxFiVW3Pwu0/img.png&quot; data-alt=&quot;[그림 14] Registereg Successfully&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxho9/btq2DF87Byg/mFi2B0od1dxnxFiVW3Pwu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsxho9%2Fbtq2DF87Byg%2FmFi2B0od1dxnxFiVW3Pwu0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 14] Registereg Successfully&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CodeEngn/Advance</category>
      <category>CodeEngn</category>
      <category>OllyDbg</category>
      <author>xii.xxv</author>
      <guid isPermaLink="true">https://honorlog.tistory.com/36</guid>
      <comments>https://honorlog.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 16 Apr 2021 16:27:01 +0900</pubDate>
    </item>
  </channel>
</rss>