<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>nitwit</title>
    <link>https://nitwit.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 11 Jul 2026 11:30:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>저학력자</managingEditor>
    <image>
      <title>nitwit</title>
      <url>https://tistory1.daumcdn.net/tistory/4086592/attach/f3e25145ea06480cb50e91bbe45690e5</url>
      <link>https://nitwit.tistory.com</link>
    </image>
    <item>
      <title>Direct2D C++ UI 라이브러리 &amp;quot;Foxhop.lib&amp;quot;</title>
      <link>https://nitwit.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/z85mqV4YdK0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/z85mqV4YdK0&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=z85mqV4YdK0&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/mhfQC/hySTUr1qvl/B7oWnLpBswkN9JshLPWmUK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/z85mqV4YdK0&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모션그래픽이 적용된 UI 라이브러리를 만들어보고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;영화 속에나 있던 화려한 그래픽 화면을 현실에서 실제 응용프로그램으로 충분히 쓸 수 있을법 한데, 그런게 없으니 직접 만들수밖에 없었다. Direct2D 기반이라 윈도우즈 환경에서밖에 사용할 수 없다는게 가장 아쉬운 부분이라 말할 수 있겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;과정은 상당히 험난했는데, 투명한 윈도우 위에서 반투명 오브젝트를 출력하기위한 갖은 노력의 일환으로 OpenGL을 이용하여 화면을 렌더링 해보는것이 시작이었다. 리눅스에서도 사용 할 수 있을테니 나쁘지 않은 선택으로 보였으나 텍스트 출력이 골자였다. Freetype 이라는 라이브러리로 폰트 파일을 로드해 글자 하나씩 직접 렌더링 하는 작업을 나는 감당 할 수 없었기에, DIrect2D의 도움을 받는것이 그 당시엔 가장 현명한 선택이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;두번째 난관은 텍스트입력UI였다. 글자마다 크기도 제각각이니 이를 고려하여 입력 이벤트가 날아올때마다 글자의 폭을 고려하여 커서를 적법한 위치에 옮겨넣어야했다. 더군다나 한글입력의 경우 조립중인 한글을 계속 표현 해주어야 하기 때문에 골치가 아팠다. 마우스 클릭을 통해 커서를 이동하는것도 골치다. 특정 좌표가 가리키는게 어떤 문자인지 일일히 계산 해주어야 했는데, 우리가 당연하게 사용하고 있던 만만한 메모장이 사실은 엄청난 기술의 산물이었던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;작업이 끝나고 만들어진 화면을 보니 생각보다 이쁘게 잘 뽑힌 것 같아 만족스럽지만 아직 갈 길이 멀다. 지금 있는 UI라고는 버튼, 리스트뷰(UI_Table 이라는 이름의 클래스다), 꺾은선그래프 (UI_LineChart 로 지었다), 장식용 구분선(UI_Line), 텍스트입력기(UI_TexInput) 가 전부인데, 기본적으로 제공되어야 할 또다른 UI로는 체크박스, 프로그래스바(다운로드 표시 그거), 트리뷰(파일 디렉터리 그거) 등이 있을텐데 아직 더 개발해야한다. 주식 차트를 표현할 UI도 있으면 화면이 볼 만 하겠지만 아직은 때가 아니다.&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;a href=&quot;https://github.com/devadversary/FoxHop&quot;&gt;https://github.com/devadversary/FoxHop&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689165933714&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - devadversary/FoxHop: Motion GUI Library&quot; data-og-description=&quot;Motion GUI Library. Contribute to devadversary/FoxHop development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/devadversary/FoxHop&quot; data-og-url=&quot;https://github.com/devadversary/FoxHop&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhFbLE/hyTiolY7F7/DAkclEp4quUVPuT2UlYRLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/devadversary/FoxHop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/devadversary/FoxHop&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhFbLE/hyTiolY7F7/DAkclEp4quUVPuT2UlYRLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - devadversary/FoxHop: Motion GUI Library&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Motion GUI Library. Contribute to devadversary/FoxHop development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>뻘짓</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/33</guid>
      <comments>https://nitwit.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 6 Jun 2023 20:50:53 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 리눅스 원격 디버깅</title>
      <link>https://nitwit.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;리눅스의 자유로운 개발 환경은 정말 매력적이다.&amp;nbsp; 특히 서버의 경우엔, 별도의 라이센스 없이도 무료로 사용 할 수 있는 프리웨어이기 때문에 기업의 경우 라이센스 유지 비용에 대해서 완전히 자유로워진다는 특장점이 있다. 또한 리눅스는 시키면 군 말 없이 다 한다. 윈도우즈의 &quot;알아서 하는&quot; 요소가 적고 정말 사용자의 의도대로 정확하게 동작한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSJ0rq/btrI2ZjMytO/3DL3H8igus1yJZFD2qmd20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSJ0rq/btrI2ZjMytO/3DL3H8igus1yJZFD2qmd20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSJ0rq/btrI2ZjMytO/3DL3H8igus1yJZFD2qmd20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSJ0rq%2FbtrI2ZjMytO%2F3DL3H8igus1yJZFD2qmd20%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;505&quot; height=&quot;476&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 그렇다고 윈도우 소프트웨어의 장점은 없는걸까? 강력한 GUI 환경과 MS의 강력한 개발 도구인 비주얼스튜디오는 막강한 디버깅 환경과, 코드 분석 환경을 제공한다. 개발 할 때도 편리한 기능이 많고 C/C++ 을 사용한다면 이것 말고는 사실상 대안이 없다고 말하고싶다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ESvMK/btrI2xgLXrs/swK4W4BuEKKXCeK0W9kUK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ESvMK/btrI2xgLXrs/swK4W4BuEKKXCeK0W9kUK0/img.png&quot; data-alt=&quot;다양한 디버깅 도구는 개발자의 든든한 무기가 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ESvMK/btrI2xgLXrs/swK4W4BuEKKXCeK0W9kUK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FESvMK%2FbtrI2xgLXrs%2FswK4W4BuEKKXCeK0W9kUK0%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;1920&quot; height=&quot;1054&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1054&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;p data-ke-size=&quot;size16&quot;&gt;이런 강력한 기능을 당연히 리눅스에서도 사용 할 수 있다. SSH 연결만 된다면 말이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;1. 리눅스 환경에서 작업&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우분투 시스템 기준으로 설명한다. 리눅스 시스템쪽에서 몇가지 작업 해 주어야 할 것이 있는데 SSH가 열려 있지 않다면 SSH 데몬을 올려주자.&lt;/p&gt;
&lt;pre id=&quot;code_1659806912523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install ssh
systemctl enable ssh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;꼭 필요한 작업은 아니지만, 추후에 높은 권한이 요구되는 프로그램을 개발/디버깅 해야 한다면 (드라이버 조작, Raw소켓 등) SSH 설정 파일을 수정해 root 로그인이 가능하도록 바꿔주고 여기서 로그인 해 작업 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1659807219038&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vim /etc/ssh/sshd_config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다 알겠지만, 이 파일 내에서 PermitRootLogin 옵션을 찾아 yes 로 바꿔주면 된다. systemctl 로 ssh 서비스를 restart 해주는것도 잊지 말자.&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;SSH 작업이 끝났다면 비주얼스튜디오와의 통신을 위해 몇가지 패키지를 인스톨 해줘야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659807391396&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install g++ gdb cmake make ninja-build rsync zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;인스톨 항목을 보다보면 cmake 가 중간에 껴있는데, 이는 비주얼스튜디오에서 사용할 리눅스 개발환경으로 CMake 를 사용하기 때문이다. 이러면 리눅스는 일단 작업이 끝났다. 너무 쉽다.&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;2. 윈도우 환경에서 작업&lt;/b&gt;&lt;/span&gt;&lt;/h3&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sz2mw/btrIXXOcyg9/JrVKWvvDFZPI4FCz3FXhr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sz2mw/btrIXXOcyg9/JrVKWvvDFZPI4FCz3FXhr1/img.png&quot; data-alt=&quot;이미 설치가 되었다면 이렇게 추가로 변경을 할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sz2mw/btrIXXOcyg9/JrVKWvvDFZPI4FCz3FXhr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsz2mw%2FbtrIXXOcyg9%2FJrVKWvvDFZPI4FCz3FXhr1%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;617&quot; height=&quot;311&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;311&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbVhFh/btrI6q110Cz/rrC6pfPNDlWtkbC05yaZek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbVhFh/btrI6q110Cz/rrC6pfPNDlWtkbC05yaZek/img.png&quot; data-alt=&quot;리눅스 개발도구를 추가로 설치 해주자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbVhFh/btrI6q110Cz/rrC6pfPNDlWtkbC05yaZek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbVhFh%2FbtrI6q110Cz%2FrrC6pfPNDlWtkbC05yaZek%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;1274&quot; height=&quot;706&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;706&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;p data-ke-size=&quot;size16&quot;&gt;설치가 완료 되었다면 VS의 설정을 건드려보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z1k3D/btrI1iSbfbj/xJbkyso9L2bHPhUwAp1S81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z1k3D/btrI1iSbfbj/xJbkyso9L2bHPhUwAp1S81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z1k3D/btrI1iSbfbj/xJbkyso9L2bHPhUwAp1S81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz1k3D%2FbtrI1iSbfbj%2FxJbkyso9L2bHPhUwAp1S81%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;983&quot; height=&quot;515&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dL0for/btrI1jctCA1/PLhgPKzklLhiEAtd168t51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dL0for/btrI1jctCA1/PLhgPKzklLhiEAtd168t51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dL0for/btrI1jctCA1/PLhgPKzklLhiEAtd168t51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdL0for%2FbtrI1jctCA1%2FPLhgPKzklLhiEAtd168t51%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;830&quot; height=&quot;486&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EzfHv/btrI2pilb91/oMAXFzNn5wQhTzN3q6aYJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EzfHv/btrI2pilb91/oMAXFzNn5wQhTzN3q6aYJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EzfHv/btrI2pilb91/oMAXFzNn5wQhTzN3q6aYJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzfHv%2FbtrI2pilb91%2FoMAXFzNn5wQhTzN3q6aYJK%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;758&quot; height=&quot;453&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&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-origin-width=&quot;744&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjIunh/btrI1Vibzv9/lDalVuooaY0UUp3HtIWUQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjIunh/btrI1Vibzv9/lDalVuooaY0UUp3HtIWUQK/img.png&quot; data-alt=&quot;대충 이렇게 연결하고싶은 호스트 선택 후 확인을 눌러주자.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjIunh/btrI1Vibzv9/lDalVuooaY0UUp3HtIWUQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjIunh%2FbtrI1Vibzv9%2FlDalVuooaY0UUp3HtIWUQK%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;744&quot; height=&quot;438&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;438&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이렇게 해두면 환경 구성 자체는 끝났다. 이제 리눅스를 연결해서 사용 할 프로젝트는 아래와같이 CMake 프로젝트로 만들어서 사용하면 된다. 물론 이렇게 되면 CMake 의 사용 방법또한 알아야겠지만 이 내용은 추후에 이어서 포스팅 하도록 하겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK92Hf/btrI1idz1p7/6JGOgo8mHCeleQe5ipFBtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK92Hf/btrI1idz1p7/6JGOgo8mHCeleQe5ipFBtk/img.png&quot; data-alt=&quot;사실 CMake 는 리눅스 뿐만 아니라, 윈도우 환경에서도 그대로 쓸 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK92Hf/btrI1idz1p7/6JGOgo8mHCeleQe5ipFBtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK92Hf%2FbtrI1idz1p7%2F6JGOgo8mHCeleQe5ipFBtk%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;1005&quot; height=&quot;662&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사실 CMake 는 리눅스 뿐만 아니라, 윈도우 환경에서도 그대로 쓸 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>환경</category>
      <category>비주얼스튜디오</category>
      <category>원격 개발</category>
      <category>원격 디버깅</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/32</guid>
      <comments>https://nitwit.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 7 Aug 2022 02:56:25 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Raw소켓으로 Ping 보내기 (ICMP 스캐너)</title>
      <link>https://nitwit.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Ping 좀 보내본 사람이라면 아마 ICMP 패킷에 대해 알고 있을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rC2Ql/btrIYBRefbL/sL0k0PgHcV2yfILzCXl5XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rC2Ql/btrIYBRefbL/sL0k0PgHcV2yfILzCXl5XK/img.png&quot; data-alt=&quot;Ping 요청과 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rC2Ql/btrIYBRefbL/sL0k0PgHcV2yfILzCXl5XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrC2Ql%2FbtrIYBRefbL%2FsL0k0PgHcV2yfILzCXl5XK%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;1183&quot; height=&quot;184&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ping 요청과 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ICMP 프로토콜의 구조는 다음과 같은데, 핵심은 Type과 Code 로 내가 수행할 행동을 정의 하는 것이다. nmap 에서는 이런 프로토콜들의 다이어그램을 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRvKWM/btrIYneTDSK/O9ZSJgahaRqYUUWYhVncz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRvKWM/btrIYneTDSK/O9ZSJgahaRqYUUWYhVncz0/img.png&quot; data-alt=&quot;사랑해요 nmap ! : https://nmap.org/book/tcpip-ref.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRvKWM/btrIYneTDSK/O9ZSJgahaRqYUUWYhVncz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRvKWM%2FbtrIYneTDSK%2FO9ZSJgahaRqYUUWYhVncz0%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;800&quot; height=&quot;392&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 nmap ! : https://nmap.org/book/tcpip-ref.html&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;여기서 내가 Type:8, Code:0 으로 ICMP 메세지를 보내면, 이걸 받은 상대는 Type:0, Code:0 으로 응답을 해주게 되고, 이것이 Ping 명령의 실체인 것이다. 덧붙여 tracert 명령같은 경로 추적 기능은 IP헤더의 TTL을 일부러 작게 설정해 경로상에 놓인 장비들이 TTL을 보고 패킷을 드롭 시킬때 ICMP의 TTL Exceed 메세지를 보내는 매커니즘을 이용하게 된다. (Type:11, Code:0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 말 않고 한번 코드를 살펴보자.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;socket&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;struct&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;ipaddress&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;time&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;threading&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;PingResponse&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;{}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;Running:bool&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;checksum(data)&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&amp;nbsp;n&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;len&lt;/span&gt;(data)&amp;nbsp;%&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;range&lt;/span&gt;(&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;len&lt;/span&gt;(data)&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;n,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;.from_bytes(data[i:i&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;],&amp;nbsp;byteorder&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;'big'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;n&amp;nbsp;:&amp;nbsp;s&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;.from_bytes(data[i:i&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;],&amp;nbsp;byteorder&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;'big'&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;잔여&amp;nbsp;바이트&amp;nbsp;처리&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;while&lt;/span&gt;&amp;nbsp;(s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;16&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xFFFF&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;(s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;16&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;~s&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xFFFF&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;s&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;SendICMP(sock:socket.socket,&amp;nbsp;ip:&lt;span style=&quot;color: #066de2;&quot;&gt;str&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;8&lt;/span&gt;;&amp;nbsp;code&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&amp;nbsp;csum&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&amp;nbsp;icmpid&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&amp;nbsp;seq&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TmpData&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;struct.pack(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;!BBHHH&quot;&lt;/span&gt;,&amp;nbsp;type,&amp;nbsp;code,&amp;nbsp;csum,&amp;nbsp;icmpid,&amp;nbsp;seq)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;csum&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;checksum(TmpData)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RealData&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;struct.pack(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;!BBHHH&quot;&lt;/span&gt;,&amp;nbsp;type,&amp;nbsp;code,&amp;nbsp;csum,&amp;nbsp;icmpid,&amp;nbsp;seq)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock.sendto(RealData,&amp;nbsp;(ip,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;isPrefix(Mask:&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;bool:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;Mask&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;or&lt;/span&gt;&amp;nbsp;Mask&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;32&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;False&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;Prefix2Range(Mask:&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;넷마스크를&amp;nbsp;범위로&amp;nbsp;바꾼다.\n&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex&amp;nbsp;:&amp;nbsp;22&amp;nbsp;-&amp;gt;&amp;nbsp;1024&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex&amp;nbsp;:&amp;nbsp;24&amp;nbsp;-&amp;gt;&amp;nbsp;256&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;isPrefix(Mask)&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;False&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inverse&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&amp;nbsp;Mask&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;inverse&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;PrintUsage():&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;인자를&amp;nbsp;잘못&amp;nbsp;넣었을때&amp;nbsp;출력할&amp;nbsp;도움말&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;wrong&amp;nbsp;command.\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&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: #63a35c;&quot;&gt;&quot;usage&amp;nbsp;:&amp;nbsp;pingtest&amp;nbsp;&amp;lt;ip[/prefix]&amp;gt;\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&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: #63a35c;&quot;&gt;&quot;ex&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;pingtest&amp;nbsp;8.8.8.8\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&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: #63a35c;&quot;&gt;&quot;ex&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;pingtest&amp;nbsp;192.168.0.0/24\n&quot;&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;PingListenThread():&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;socket.socket(socket.AF_INET,socket.SOCK_RAW,&amp;nbsp;socket.IPPROTO_ICMP)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock.bind((&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;while&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;True&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data,&amp;nbsp;address&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;sock.recvfrom(&lt;span style=&quot;color: #0099cc;&quot;&gt;1500&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;address[&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;in&lt;/span&gt;&amp;nbsp;PingResponse&amp;nbsp;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;PingResponse[address[&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;]]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;def&lt;/span&gt;&amp;nbsp;main():&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;socket.socket(socket.AF_INET,&amp;nbsp;socket.SOCK_RAW,&amp;nbsp;socket.IPPROTO_ICMP)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#ICMP&amp;nbsp;로우소켓&amp;nbsp;만들기&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(sys.argv)&amp;nbsp;!=&amp;nbsp;2:&amp;nbsp;PrintUsage();&amp;nbsp;exit()&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address:str&amp;nbsp;=&amp;nbsp;sys.argv[1]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintUsage()&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit()&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;172.30.1.0/24&quot;&lt;/span&gt;.split(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;/&quot;&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;&amp;lt;=&amp;nbsp;input&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;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;len&lt;/span&gt;(address)&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&amp;nbsp;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip,&amp;nbsp;prefixStr&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;address&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prefix:&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;(prefixStr)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;else&lt;/span&gt;&amp;nbsp;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;address[&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;];&amp;nbsp;prefix:&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;32&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HostRange:&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Prefix2Range(prefix)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;이&amp;nbsp;대역&amp;nbsp;안에&amp;nbsp;총&amp;nbsp;몇개의&amp;nbsp;IP&amp;nbsp;가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있는지?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;not&lt;/span&gt;&amp;nbsp;HostRange:&amp;nbsp;PrintUsage();&amp;nbsp;exit()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mask:&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xffffffff&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;~((&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;(&lt;span style=&quot;color: #0099cc;&quot;&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&amp;nbsp;prefix))&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;네트워크ID&amp;nbsp;마스크&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RawIP&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;(ipaddress.ip_address(ip))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NetworkID&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;mask&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;RawIP&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;for&lt;/span&gt;&amp;nbsp;HostID&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;range&lt;/span&gt;(HostRange):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;socket.inet_ntoa(&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;.to_bytes(NetworkID&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;HostID,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;4&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;big&quot;&lt;/span&gt;))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;네트워크&amp;nbsp;ID와&amp;nbsp;호스트ID를&amp;nbsp;합치면&amp;nbsp;IP가&amp;nbsp;됨&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PingResponse[ip]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;False&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;응답&amp;nbsp;받을&amp;nbsp;목록&amp;nbsp;초기화&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Listener&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;threading.Thread(target&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;PingListenThread,&amp;nbsp;daemon&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;True&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#핑&amp;nbsp;응답&amp;nbsp;받을&amp;nbsp;스레드&amp;nbsp;생성&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Listener.start()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;for&lt;/span&gt;&amp;nbsp;HostID&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;range&lt;/span&gt;(HostRange):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;socket.inet_ntoa(&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;.to_bytes(NetworkID&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;HostID,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;4&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;big&quot;&lt;/span&gt;))&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;네트워크&amp;nbsp;ID와&amp;nbsp;호스트ID를&amp;nbsp;합치면&amp;nbsp;IP가&amp;nbsp;됨&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendICMP(sock,&amp;nbsp;ip)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;Ping&amp;nbsp;전송&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(&lt;span style=&quot;color: #0099cc;&quot;&gt;3&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;응답&amp;nbsp;3초&amp;nbsp;대기&amp;nbsp;~~&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;for&lt;/span&gt;&amp;nbsp;tmp&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;in&lt;/span&gt;&amp;nbsp;PingResponse&amp;nbsp;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp:dict&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;PingResponse[tmp]&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;True&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;print&lt;/span&gt;(tmp)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;main()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;quit()&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLv8N/btrI2Yj8PEX/pkgDrvKpio2DKJfG5Xn73K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLv8N/btrI2Yj8PEX/pkgDrvKpio2DKJfG5Xn73K/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLv8N/btrI2Yj8PEX/pkgDrvKpio2DKJfG5Xn73K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLv8N%2FbtrI2Yj8PEX%2FpkgDrvKpio2DKJfG5Xn73K%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;925&quot; height=&quot;385&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;문제점 # 1&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;결과적으로 보면, 되긴 된다. 현재 코드에서는 IP주소와 대역을 하드코딩 하였지만, 코드의 주석에 쓰여진대로 약간의 수정을 거치면 명령 행 인자로 입력받아 손쉽게 사용 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;문제는 이 코드를 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;윈도우에서 실행&lt;/span&gt;&lt;/b&gt;하면 여러가지 애로사항이 꽃핀다는 것이다. 이 코드는 ICMP 를 직접 만들어 전송 하게 되는데 이러한 데이터를 전송 하려면 Raw 소켓을 생성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;자... 윈도우와 Raw 소켓? 지난 포스팅 했던 글이 생각난다. &lt;a href=&quot;https://nitwit.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nitwit.tistory.com/18&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1659703931267&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;로우소켓에 대해서...&quot; data-og-description=&quot;&amp;nbsp;소켓 프로그래밍을 배우다보면 로우소켓이라는 신비한 존재를 접하게 된다. 처음 이 로우소켓을 보고나면 재밌는것들이 꽤 많이 떠오른다 TCP - SYN Flood 공격, 공격이 아닌 SYN 스캔, TCP의 다양한&quot; data-og-host=&quot;nitwit.tistory.com&quot; data-og-source-url=&quot;https://nitwit.tistory.com/18&quot; data-og-url=&quot;https://nitwit.tistory.com/18&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djo2aj/hyPkIBUSYd/UBBLCFBCNgtYnPEpzHBc91/img.png?width=800&amp;amp;height=139&amp;amp;face=0_0_800_139,https://scrap.kakaocdn.net/dn/cCOXx5/hyPkx8ebEe/KusOGXKpwRqCNvtRh5eIL1/img.png?width=800&amp;amp;height=139&amp;amp;face=0_0_800_139,https://scrap.kakaocdn.net/dn/b84GbM/hyPkARqrN4/mcHayxCAJus2JWi1k1KFQk/img.png?width=916&amp;amp;height=696&amp;amp;face=0_0_916_696&quot;&gt;&lt;a href=&quot;https://nitwit.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nitwit.tistory.com/18&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djo2aj/hyPkIBUSYd/UBBLCFBCNgtYnPEpzHBc91/img.png?width=800&amp;amp;height=139&amp;amp;face=0_0_800_139,https://scrap.kakaocdn.net/dn/cCOXx5/hyPkx8ebEe/KusOGXKpwRqCNvtRh5eIL1/img.png?width=800&amp;amp;height=139&amp;amp;face=0_0_800_139,https://scrap.kakaocdn.net/dn/b84GbM/hyPkARqrN4/mcHayxCAJus2JWi1k1KFQk/img.png?width=916&amp;amp;height=696&amp;amp;face=0_0_916_696');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;로우소켓에 대해서...&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;소켓 프로그래밍을 배우다보면 로우소켓이라는 신비한 존재를 접하게 된다. 처음 이 로우소켓을 보고나면 재밌는것들이 꽤 많이 떠오른다 TCP - SYN Flood 공격, 공격이 아닌 SYN 스캔, TCP의 다양한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nitwit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Raw 소켓은 윈도우에서 상상도 못할 방법으로 제약이 걸린다. 가령, Raw 소켓을 열어, ICMP 요청을 의미하는 &lt;b&gt;Type:8, Code:0 셋팅으로 데이터를 보내면 관리자권한이 없어도 정상적으로 패킷이 나간다.&lt;/b&gt; 그런데 ICMP 응답을 의미하는 &lt;b&gt;Type:0, Code:0 을 보내려 하면 이때는 관리자권한이 아닌 이상 권한 관련 오류를 내게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서 VSCode 로 ICMP 필드를 원하는 대로 조작해서 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;테스트 해보고싶다면, VSCode를 관리자 권한으로 실행&lt;/span&gt;&lt;/b&gt; 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;문제점 # 2&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;윈도우는 악성코드의 감염 및 확산을 방지 하기 위해 운영체제 레벨에서 매우 깐깐한 트래픽 관리를 한다. 이 코드를 그대로 실행 하게 되면, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;자기 자신의 IP 주소밖에 보이지 않는다.&lt;/b&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;860&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIy4tg/btrI3ub2Uda/uPFUxRjFzqKE9rmTLtAHnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIy4tg/btrI3ub2Uda/uPFUxRjFzqKE9rmTLtAHnK/img.png&quot; data-alt=&quot;윈도우 디펜더는 홈 네트워크가 아니거나, 내가 모르는 IP 로부터 온 데이터를 드랍 시킨다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIy4tg/btrI3ub2Uda/uPFUxRjFzqKE9rmTLtAHnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIy4tg%2FbtrI3ub2Uda%2FuPFUxRjFzqKE9rmTLtAHnK%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;860&quot; height=&quot;419&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도우 디펜더는 홈 네트워크가 아니거나, 내가 모르는 IP 로부터 온 데이터를 드랍 시킨다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;윈도우 기본 방화벽은 커널이 받은 데이터를 응용프로그램으로 넘겨주기 전에 깐깐한 필터링을 한다. 실제로 와이어샤크를 켜서 보면 ICMP Reply 패킷을 잘 온 것을 확인할 수 있지만, 이 프로그램에서는 받지 못한 것 처럼 멀뚱히 아무 동작도 하지 않는다. 따라서 이 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;방화벽을 전부 내려줘야 제대로 받아 볼 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 소스의 ICMP 리스너 스레드 코드를 한번 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LCrh6/btrI1V9xyja/Rdvqaal36zlKIaZXUz0vM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LCrh6/btrI1V9xyja/Rdvqaal36zlKIaZXUz0vM0/img.png&quot; data-alt=&quot;bind 함수의 인자를 주목하자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LCrh6/btrI1V9xyja/Rdvqaal36zlKIaZXUz0vM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLCrh6%2FbtrI1V9xyja%2FRdvqaal36zlKIaZXUz0vM0%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;753&quot; height=&quot;177&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bind 함수의 인자를 주목하자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;통상, 소켓이라 함은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0번 포트에 bind 시키면 시스템에 흘러다니는 모든 패킷을 전부 볼 수 있다&lt;/span&gt;.&lt;/b&gt; (이더넷 프레임이나 802.11 은 제외하고). 하지만 파이썬은 이렇게 소켓을 열어도 방화벽을 내리기 전 까진 모든 데이터를 전부 받아오지 않는다. 사실 이러한 현상은&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;C/C++ 로 짰을때는 전혀 발생하지 않는다. &lt;/span&gt;&lt;/b&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: #9d9d9d;&quot;&gt;결론 : 윈도우가 윈도우 했다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>뻘짓</category>
      <category>ICMP</category>
      <category>PYTHON</category>
      <category>스캐너</category>
      <category>파이썬</category>
      <category>핑</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/31</guid>
      <comments>https://nitwit.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 5 Aug 2022 22:08:30 +0900</pubDate>
    </item>
    <item>
      <title>유니코드 - UTF8 변환 코드</title>
      <link>https://nitwit.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내가 귀찮아서 올려두는 코드이다. 코드가 진짜 마음에 안든다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;#pragma&lt;/span&gt;&amp;nbsp;once&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;windows.h&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;math.h&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;LPWSTR&amp;nbsp;&amp;nbsp;AnsiToUnicode(LPSTR&amp;nbsp;szAnsi)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LPWSTR&amp;nbsp;szUniStr;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;유니코드로&amp;nbsp;변환&amp;nbsp;전&amp;nbsp;return&amp;nbsp;되는&amp;nbsp;길이얻기&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;MultiByteToWideChar(CP_ACP,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;szAnsi,&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;sizeof&lt;/span&gt;(WCHAR);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;szUniStr&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(LPWSTR)&lt;span style=&quot;color: #066de2;&quot;&gt;malloc&lt;/span&gt;(nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;);&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메모리를&amp;nbsp;할당한다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(szUniStr,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;이제&amp;nbsp;변환을&amp;nbsp;수행한다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MultiByteToWideChar(CP_ACP,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;szAnsi,&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;szUniStr,&amp;nbsp;nLen);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;szUniStr;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//유니코드에서&amp;nbsp;ANSI&amp;nbsp;문자열로&amp;nbsp;변환&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;UnicodeToAnsi(LPWSTR&amp;nbsp;szUniStr,&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;*&lt;/span&gt;&amp;nbsp;output)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;WideCharToMultiByte(CP_ACP,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;szUniStr,&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WideCharToMultiByte(CP_ACP,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;szUniStr,&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;output,&amp;nbsp;nLen,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//유니코드에서&amp;nbsp;UTF8&amp;nbsp;문자열로&amp;nbsp;변환&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;LPWSTR&amp;nbsp;UnicodeToUTF8(LPWSTR&amp;nbsp;szUniStr)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;idx&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WCHAR&amp;nbsp;uc;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LPWSTR&amp;nbsp;&amp;nbsp;szUtf8;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;sizeof&lt;/span&gt;(WCHAR)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;*&lt;/span&gt;&amp;nbsp;wcslen(szUniStr);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;sizeof&lt;/span&gt;(WCHAR);&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//최대&amp;nbsp;값&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;szUtf8&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(LPWSTR)&lt;span style=&quot;color: #066de2;&quot;&gt;malloc&lt;/span&gt;(nLen);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(szUtf8,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;nLen);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LPSTR&amp;nbsp;pszUTF8&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(LPSTR)szUtf8;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&amp;nbsp;szUniStr[i];&amp;nbsp;i&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;szUniStr[i];&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x7f&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;pszUTF8[idx&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;)uc;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x7ff&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;pszUTF8[idx&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;0xc0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;/&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;wchar_t&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;pszUTF8[idx&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;0x80&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;uc&amp;nbsp;%&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;wchar_t&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xffff&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;pszUTF8[idx&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;0xe0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;/&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;wchar_t&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;12&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;pszUTF8[idx&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;0x80&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;uc&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;/&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;wchar_t&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;&amp;nbsp;%&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;wchar_t&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;pszUTF8[idx&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #066de2;&quot;&gt;char&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;0x80&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;uc&amp;nbsp;%&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;wchar_t&lt;/span&gt;)&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;szUtf8;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//유니코드에서&amp;nbsp;UTF8&amp;nbsp;문자열로&amp;nbsp;변환&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;UTF8ToUnicode(LPWSTR&amp;nbsp;szUtf8,&amp;nbsp;LPWSTR&amp;nbsp;output)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;sizeof&lt;/span&gt;(WCHAR)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;*&lt;/span&gt;&amp;nbsp;wcslen(szUtf8);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;nLen&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;sizeof&lt;/span&gt;(WCHAR);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LPSTR&amp;nbsp;src&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(LPSTR)szUtf8;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;p&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #066de2;&quot;&gt;int&lt;/span&gt;&amp;nbsp;q&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WCHAR&amp;nbsp;d;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;while&lt;/span&gt;&amp;nbsp;(src[p]){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;((src[p]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xE0&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xE0&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;d&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;((src[p]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x0f&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;12&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;|&lt;/span&gt;&amp;nbsp;((src[p&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x3F&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;|&lt;/span&gt;&amp;nbsp;(src[p&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x3F&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;p&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;3&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #010101;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;&amp;nbsp;((src[p]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xC0&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0xC0&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;d&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;((src[p]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x1F&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;6&lt;/span&gt;)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;|&lt;/span&gt;&amp;nbsp;(src[p&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x3F&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;p&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #010101;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;else&lt;/span&gt;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;d&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;src[p]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0x7F&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;p&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output[q]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;d;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;+&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output[q]&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;NULL&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>뻘짓</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/30</guid>
      <comments>https://nitwit.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 4 Jul 2022 15:04:45 +0900</pubDate>
    </item>
    <item>
      <title>디스어셈블 라이브러리 &amp;quot;Capstone&amp;quot; 빌드 및 사용법</title>
      <link>https://nitwit.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;자... 지난번에는 디스어셈블 라이브러리로 Zydis를 소개 했었다. 이 라이브러리는 속도가 빠르고 가벼우며, 인스트럭션의 상세정보를 확인하기가 비교적 수월하다는 평을 받는다. 이 라이브러리를 빌드해서 사용 해 보고 싶다면, 이 글이 도움이 될 것이다. &lt;a href=&quot;https://nitwit.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nitwit.tistory.com/15&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1651118798706&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;디스어셈블 라이브러리 &amp;quot;Zydis&amp;quot; 빌드하기&quot; data-og-description=&quot;분석가들과 개발자, 해커들의 영원한 친구 OllyDBG 그리고 그의 친구 X64DBG 의 그것이다. 얘네들은 내부적으로 Zydis, XED 라는 디스어셈블/어셈블 오픈소스 라이브러리를 사용하여 사용자에게 UI로 &quot; data-og-host=&quot;nitwit.tistory.com&quot; data-og-source-url=&quot;https://nitwit.tistory.com/15&quot; data-og-url=&quot;https://nitwit.tistory.com/15&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPdm36/hyOcxul3g0/TXlsSWFOFkCqkmS4BoL4b0/img.png?width=770&amp;amp;height=535&amp;amp;face=0_0_770_535,https://scrap.kakaocdn.net/dn/brKgU5/hyOcqosO9U/n6lfzFzArek4Pn5rTL7oZ1/img.png?width=770&amp;amp;height=535&amp;amp;face=0_0_770_535,https://scrap.kakaocdn.net/dn/gvM9b/hyOcwCclvj/WETaxqjzgrKbTPjKCzvPbk/img.png?width=1368&amp;amp;height=446&amp;amp;face=0_0_1368_446&quot;&gt;&lt;a href=&quot;https://nitwit.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nitwit.tistory.com/15&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPdm36/hyOcxul3g0/TXlsSWFOFkCqkmS4BoL4b0/img.png?width=770&amp;amp;height=535&amp;amp;face=0_0_770_535,https://scrap.kakaocdn.net/dn/brKgU5/hyOcqosO9U/n6lfzFzArek4Pn5rTL7oZ1/img.png?width=770&amp;amp;height=535&amp;amp;face=0_0_770_535,https://scrap.kakaocdn.net/dn/gvM9b/hyOcwCclvj/WETaxqjzgrKbTPjKCzvPbk/img.png?width=1368&amp;amp;height=446&amp;amp;face=0_0_1368_446');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;디스어셈블 라이브러리 &quot;Zydis&quot; 빌드하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;분석가들과 개발자, 해커들의 영원한 친구 OllyDBG 그리고 그의 친구 X64DBG 의 그것이다. 얘네들은 내부적으로 Zydis, XED 라는 디스어셈블/어셈블 오픈소스 라이브러리를 사용하여 사용자에게 UI로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nitwit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;하지만 단점을 굳이 뽑자면, X86-64 가 아닌 아키텍쳐들은 지원하지 않는다는 점 정도일 것이다. ARM 이나 MIPS 같은 다른 아키텍쳐의 인스트럭션을 해석하고 싶다면 다른 대안이 있다. &lt;a href=&quot;https://github.com/capstone-engine/capstone&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/capstone-engine/capstone&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1651118850566&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - capstone-engine/capstone: Capstone disassembly/disassembler framework: Core (Arm, Arm64, BPF, EVM, M68K, M680X, MOS65xx&quot; data-og-description=&quot;Capstone disassembly/disassembler framework: Core (Arm, Arm64, BPF, EVM, M68K, M680X, MOS65xx, Mips, PPC, RISCV, Sparc, SystemZ, TMS320C64x, Web Assembly, X86, X86_64, XCore) + bindings. - GitHub -...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/capstone-engine/capstone&quot; data-og-url=&quot;https://github.com/capstone-engine/capstone&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dOt8LO/hyOcAYWciU/l0E38kzgYEGW4DPou8x2k0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/capstone-engine/capstone&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/capstone-engine/capstone&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dOt8LO/hyOcAYWciU/l0E38kzgYEGW4DPou8x2k0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - capstone-engine/capstone: Capstone disassembly/disassembler framework: Core (Arm, Arm64, BPF, EVM, M68K, M680X, MOS65xx&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Capstone disassembly/disassembler framework: Core (Arm, Arm64, BPF, EVM, M68K, M680X, MOS65xx, Mips, PPC, RISCV, Sparc, SystemZ, TMS320C64x, Web Assembly, X86, X86_64, XCore) + bindings. - GitHub -...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 위 링크에서 라이브러리를 다운로드 받는다. 이 라이브러리는 Zydis 보다 빌드하기가 더 쉽고 친절하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XmIql/btrAIPhP3V1/TvpHIV3OnFroCHTuQDvtK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XmIql/btrAIPhP3V1/TvpHIV3OnFroCHTuQDvtK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XmIql/btrAIPhP3V1/TvpHIV3OnFroCHTuQDvtK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXmIql%2FbtrAIPhP3V1%2FTvpHIV3OnFroCHTuQDvtK0%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;1154&quot; height=&quot;638&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;msvc 폴더 밑에 비주얼스튜디오로 빌드 할 수 있도록, 이미 솔루션이 제공되어있다.&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;&amp;nbsp;솔루션 파일을 열어 프로젝트 목록을 확인해 보면 다양한 아키텍쳐별로 테스트코드와 함께 메인 라이브러리 2종이 제공됨을 확인 할 수 있다. 각각 정적/동적 라이브러리이다. 입맛대로 빌드해서 쓰면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6UGRc/btrAFOxvFIu/Kth021H6CAkG1mwdJZccn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6UGRc/btrAFOxvFIu/Kth021H6CAkG1mwdJZccn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6UGRc/btrAFOxvFIu/Kth021H6CAkG1mwdJZccn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6UGRc%2FbtrAFOxvFIu%2FKth021H6CAkG1mwdJZccn0%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;764&quot; height=&quot;595&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그대로 빌드 하면 아무 문제 없이 잘 빌드된다. static 라이브러리로 사용하고 싶으면 capstone_static 프로젝트, dll 링크 방식으로 사용하고 싶으면 capstone_dll 만 따로 빌드해도 된다. 잘 빌드 되었다면 아래와 같은 디렉터리에 출력물이 생긴다. 나는 64비트 릴리즈모드로 빌드 했으므로 ~capstone-master/msvc/x64/Release 경로에 출력되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg1OKv/btrAGf2TXTJ/mGunofiMZxHWOek1tzznBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg1OKv/btrAGf2TXTJ/mGunofiMZxHWOek1tzznBk/img.png&quot; data-alt=&quot;capstone.lib 파일은 static한 라이브러리 이고, capstone_dll.lib 는 dll과 같이 배포되는 동적 라이브러리이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg1OKv/btrAGf2TXTJ/mGunofiMZxHWOek1tzznBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg1OKv%2FbtrAGf2TXTJ%2FmGunofiMZxHWOek1tzznBk%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;815&quot; height=&quot;288&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;capstone.lib 파일은 static한 라이브러리 이고, capstone_dll.lib 는 dll과 같이 배포되는 동적 라이브러리이다.&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;style6&quot; /&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFbrp/btrAGfO9yyL/oPZGpbhErvyGMquk3EG9y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFbrp/btrAGfO9yyL/oPZGpbhErvyGMquk3EG9y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFbrp/btrAGfO9yyL/oPZGpbhErvyGMquk3EG9y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFbrp%2FbtrAGfO9yyL%2FoPZGpbhErvyGMquk3EG9y1%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;562&quot; height=&quot;584&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그럼 이번엔 테스트 프로젝트를 확인해보자. 이번엔 ARM 디스어셈블러를 테스트 해보자. &amp;nbsp;test_arm.c 파일을 열어보면, 아래와 같이 임의의 기계어코드를 넣어 둔 것을 확인 할 수 있다. 실제로 사용할때엔, ELF, PE 등을 해석해서 엔트리포인트로부터 기계어코드를 해독 하면 될 것이다. ARM 에는 일반 운용모드와 THUMB 모드 등으로 전환될 수도 있는데, 이러한 모드들에도 전부 대응이 가능한 강력한 라이브러리이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boAvUJ/btrAFiSBDeN/gqNIdkdMnMJShkXADDwcB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boAvUJ/btrAFiSBDeN/gqNIdkdMnMJShkXADDwcB0/img.png&quot; data-alt=&quot;ARM의 다양한 모드에서의 기계어코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boAvUJ/btrAFiSBDeN/gqNIdkdMnMJShkXADDwcB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboAvUJ%2FbtrAFiSBDeN%2FgqNIdkdMnMJShkXADDwcB0%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;845&quot; height=&quot;152&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ARM의 다양한 모드에서의 기계어코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1guMQ/btrAHkbDM8C/QEUfIpUPxkB4FiO6FPcTnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1guMQ/btrAHkbDM8C/QEUfIpUPxkB4FiO6FPcTnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1guMQ/btrAHkbDM8C/QEUfIpUPxkB4FiO6FPcTnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1guMQ%2FbtrAHkbDM8C%2FQEUfIpUPxkB4FiO6FPcTnK%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;966&quot; height=&quot;359&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;X86-64와는 다르게 레지스터 이름도 다르다. ARM 인스트럭션은 명령어 길이가 고정이라서 분석이 더 편하지 않을까 예상 했었는데, 오히려 그 고정된 길이안에 다양한 코드를 표현해야하므로 복잡성이 더 증가되는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;capstone 라이브러리는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_open&lt;/b&gt; &lt;/span&gt;함수로 디스어셈블러를 초기화하고, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_disasm&lt;/b&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;1149&quot; data-origin-height=&quot;1056&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ToktG/btrAG6jTXvW/mLWBqkWhbXsfT5Z3X3uKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ToktG/btrAG6jTXvW/mLWBqkWhbXsfT5Z3X3uKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ToktG/btrAG6jTXvW/mLWBqkWhbXsfT5Z3X3uKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FToktG%2FbtrAG6jTXvW%2FmLWBqkWhbXsfT5Z3X3uKY0%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;1149&quot; height=&quot;1056&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;1056&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&amp;nbsp;cs_open&lt;/b&gt; &lt;/span&gt;함수는 &lt;span style=&quot;color: #7fcea3;&quot;&gt;&lt;b&gt;cs_arch &lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #7fcea3;&quot;&gt;&lt;b&gt;cs_mode&lt;/b&gt;&lt;/span&gt; 에 맞는 디스어셈블러를 초기화하여 csh에 던져주게된다. 앞으로 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_disasm&lt;/b&gt; &lt;/span&gt;함수를 이용해 디스어셈블을 수행할땐, 이 csh 핸들이 필요하다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_option&lt;/b&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;381&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Pi76/btrAIfBnQhk/bKY4bxKDze9o5kwTb9A6e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Pi76/btrAIfBnQhk/bKY4bxKDze9o5kwTb9A6e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Pi76/btrAIfBnQhk/bKY4bxKDze9o5kwTb9A6e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Pi76%2FbtrAIfBnQhk%2FbKY4bxKDze9o5kwTb9A6e1%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;381&quot; height=&quot;107&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실질적으로 디스어셈블을 수행하는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_disasm&lt;/b&gt; &lt;/span&gt;함수의 원형이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;handle&lt;/span&gt; &lt;/b&gt;로는 아까 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_open&lt;/b&gt; &lt;/span&gt;함수로 얻어냈던 핸들을 넣어주면되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;code&lt;/span&gt; &lt;/b&gt;인자에는 디스어셈블할 데이터가 들어있는 포인터를 넘겨주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;code_size&lt;/span&gt; &lt;/b&gt;에는 해당 데이터의 전체 크기를 넣어주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;address&lt;/span&gt; &lt;/b&gt;인자는 주소 해석을 위해 사용하는 옵션인데 0을 넣어도 되지만 실제로 메모리에 올라간 실행파일을 디스어셈블 할때는 메모리 주소를 고려하여 디스어셈블 하는것이 좋을것이다. 그때 사용하는 옵션이다. 이 명령어가 어느 주소에 있는지 일러주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;count&lt;/span&gt; &lt;/b&gt;는 해석할 명령어의 갯수를 넣어주면 되는데, &lt;span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;code_size&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 에 맞게 되는대로 전부 디스어셈블 하고 싶으면 0을, 그렇지 않으면 원하는 갯수를 넣어주면 된다. (한개씩 디스어셈블 하고 싶으면 당연히 1을 넣으면 된다.)&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 style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;insn&lt;/b&gt; &lt;/span&gt;에는 &lt;b&gt;&lt;span style=&quot;color: #7fcea3;&quot;&gt;cs_insn&lt;/span&gt;&lt;/b&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;996&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vgQJa/btrAJAeeUcI/Y0VoE9H6iHJkoJtTbqGkxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vgQJa/btrAJAeeUcI/Y0VoE9H6iHJkoJtTbqGkxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vgQJa/btrAJAeeUcI/Y0VoE9H6iHJkoJtTbqGkxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvgQJa%2FbtrAJAeeUcI%2FY0VoE9H6iHJkoJtTbqGkxk%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;996&quot; height=&quot;220&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;인스트럭션의 니모닉과 오퍼랜드에 대한 정보, 그리고 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_option&lt;/b&gt;&lt;/span&gt; 함수로 상세정보까지 받도록 설정했다면 &lt;b&gt;detail&lt;/b&gt; 멤버에는 주소지정방식이나 읽기/쓰기모드에대한 정보까지도 기록된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKrREi/btrAJAefEPh/Lk040d4cdnH8e8d0mzjJ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKrREi/btrAJAefEPh/Lk040d4cdnH8e8d0mzjJ10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKrREi/btrAJAefEPh/Lk040d4cdnH8e8d0mzjJ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKrREi%2FbtrAJAefEPh%2FLk040d4cdnH8e8d0mzjJ10%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;858&quot; height=&quot;356&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;detail&lt;/b&gt; 멤버는 이러한 정보를 담고 있으며, x86 - arm64 - arm .... 부터 이어지는 멤버들은 union 으로 선언되어있다. 이 경우에는 ARM 32비트 코드에대한 인스트럭션이므로, arm 멤버만 참고하면 되고, 나머지 x86, arm64, mips 등등의 멤버는 유효하지 않으므로 무시하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이런 정보를 잘 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;사용하고나면 이 insn 을 해제해주어야 한다.&lt;/b&gt;&lt;/span&gt; 내부적으로 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;cs_malloc&lt;/span&gt; &lt;/b&gt;함수를 호출해서 할당받으므로, 이 과정을 빼먹으면 누수가 생길것이다. &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;cs_free&lt;/span&gt; &lt;/b&gt;함수로 해제하면 된다.&amp;nbsp;&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rx4WT/btrAJKujZjo/YFvWtBnMxKkaWwm4yiPWo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rx4WT/btrAJKujZjo/YFvWtBnMxKkaWwm4yiPWo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rx4WT/btrAJKujZjo/YFvWtBnMxKkaWwm4yiPWo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRx4WT%2FbtrAJKujZjo%2FYFvWtBnMxKkaWwm4yiPWo0%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;557&quot; height=&quot;156&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;insn&lt;/b&gt; &lt;/span&gt;인자엔 아까전에 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_disasm&lt;/b&gt; &lt;/span&gt;에서 받은 녀석을 올려주면 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;count&lt;/b&gt; &lt;/span&gt;인자는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_disasm&lt;/b&gt; &lt;/span&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctyTQv/btrADNfdX6J/uLKDpba4THmAKLlbXo07W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctyTQv/btrADNfdX6J/uLKDpba4THmAKLlbXo07W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctyTQv/btrADNfdX6J/uLKDpba4THmAKLlbXo07W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctyTQv%2FbtrADNfdX6J%2FuLKDpba4THmAKLlbXo07W0%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;833&quot; height=&quot;575&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_disasm&lt;/b&gt; &lt;/span&gt;함수는 해석한 인스트럭션 갯수를 반환하게 되는데, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;cs_free&lt;/b&gt; &lt;/span&gt;할때도 이 값을 그대로 넘겨주면 누수는 없다.&lt;/p&gt;</description>
      <category>뻘짓</category>
      <category>Capstone</category>
      <category>디스어셈블</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/29</guid>
      <comments>https://nitwit.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 28 Apr 2022 15:21:57 +0900</pubDate>
    </item>
    <item>
      <title>VSCode - Python 리눅스 원격 개발 환경</title>
      <link>https://nitwit.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VSCode 로 리눅스에 SSH로 붙어서 파이썬을 사용하고 싶다.&amp;nbsp; 그럼 당연히 파이썬과 SSH 확장이 있어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;install&lt;/b&gt;&lt;/span&gt; 누르면 vscode가 열리면서 설치 페이지가 뜬다. 귀찮은건 질색이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot;&gt;https://marketplace.visualstudio.com/items?itemName=ms-python.python&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1646718533590&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Python - Visual Studio Marketplace&quot; data-og-description=&quot;Extension for Visual Studio Code - IntelliSense (Pylance), Linting, Debugging (multi-threaded, remote), Jupyter Notebooks, code formatting, refactoring, unit tests, and more.&quot; data-og-host=&quot;marketplace.visualstudio.com&quot; data-og-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot; data-og-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yL7p4/hyNEeBX5qF/wxFWfKI5UHJnHx0xzSjbC0/img.png?width=600&amp;amp;height=607&amp;amp;face=0_0_600_607&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yL7p4/hyNEeBX5qF/wxFWfKI5UHJnHx0xzSjbC0/img.png?width=600&amp;amp;height=607&amp;amp;face=0_0_600_607');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Python - Visual Studio Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Extension for Visual Studio Code - IntelliSense (Pylance), Linting, Debugging (multi-threaded, remote), Jupyter Notebooks, code formatting, refactoring, unit tests, and more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;marketplace.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit&quot;&gt;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1646718551609&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Remote - SSH: Editing Configuration Files - Visual Studio Marketplace&quot; data-og-description=&quot;Extension for Visual Studio Code - Edit SSH configuration files&quot; data-og-host=&quot;marketplace.visualstudio.com&quot; data-og-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit&quot; data-og-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEEcoh/hyNEkCcpSL/79ykMOTJmX8PMIlVNwQKIk/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEEcoh/hyNEkCcpSL/79ykMOTJmX8PMIlVNwQKIk/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Remote - SSH: Editing Configuration Files - Visual Studio Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Extension for Visual Studio Code - Edit SSH configuration files&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;marketplace.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnW1SW/btrvqjwduSw/7C5ClHHD5Efz5BjIP2xsx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnW1SW/btrvqjwduSw/7C5ClHHD5Efz5BjIP2xsx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnW1SW/btrvqjwduSw/7C5ClHHD5Efz5BjIP2xsx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnW1SW%2FbtrvqjwduSw%2F7C5ClHHD5Efz5BjIP2xsx1%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;1358&quot; height=&quot;825&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌 하단 초록색 &amp;gt;&amp;lt; 애교버튼을 눌러주면 위쪽에 리스트가 열리면서 SSH 호스트 연결 선택지가 뜬다&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA69WT/btrvtB3IM0n/6P8nQOr8L3H3QPxRYnveqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA69WT/btrvtB3IM0n/6P8nQOr8L3H3QPxRYnveqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA69WT/btrvtB3IM0n/6P8nQOr8L3H3QPxRYnveqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA69WT%2FbtrvtB3IM0n%2F6P8nQOr8L3H3QPxRYnveqk%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;863&quot; height=&quot;270&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; SSH 계정 @ 연결할 호스트 주소 &amp;gt;&lt;/b&gt; 형식으로 접속을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size10&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ex)&amp;nbsp; &amp;nbsp;hello0301@192.168.0.3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size10&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ex2)&amp;nbsp; root@example.co.kr&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러고 나면 SSH 연결이 된 &lt;b&gt;*새 창*&lt;/b&gt; 이 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zor1j/btrvnWaC8uN/mAMwnVEqBb5oXyk4cnnLQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zor1j/btrvnWaC8uN/mAMwnVEqBb5oXyk4cnnLQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zor1j/btrvnWaC8uN/mAMwnVEqBb5oXyk4cnnLQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZor1j%2FbtrvnWaC8uN%2FmAMwnVEqBb5oXyk4cnnLQ0%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;1510&quot; height=&quot;878&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjrQGc/btrvqku4WEy/bN08JAgHWY0Vuui6MxWz01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjrQGc/btrvqku4WEy/bN08JAgHWY0Vuui6MxWz01/img.png&quot; data-alt=&quot;continue&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjrQGc/btrvqku4WEy/bN08JAgHWY0Vuui6MxWz01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjrQGc%2Fbtrvqku4WEy%2FbN08JAgHWY0Vuui6MxWz01%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;811&quot; height=&quot;212&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;continue&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEkW37/btrvvbcnEJY/Uq9BMJioUD4RPG6e73hTBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEkW37/btrvvbcnEJY/Uq9BMJioUD4RPG6e73hTBk/img.png&quot; data-alt=&quot;암호도 입력 해주자.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEkW37/btrvvbcnEJY/Uq9BMJioUD4RPG6e73hTBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEkW37%2FbtrvvbcnEJY%2FUq9BMJioUD4RPG6e73hTBk%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;734&quot; height=&quot;188&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;188&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGeW7S/btrvrfUDRaG/xeAMfkayZNS7KvLGyfw6gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGeW7S/btrvrfUDRaG/xeAMfkayZNS7KvLGyfw6gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGeW7S/btrvrfUDRaG/xeAMfkayZNS7KvLGyfw6gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGeW7S%2FbtrvrfUDRaG%2FxeAMfkayZNS7KvLGyfw6gK%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;1168&quot; height=&quot;843&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인까지 하고나면, 원격 환경에 자동으로 VSCode 연동 패키지를 구성해준다.&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biblu0/btrvqk2WL0K/gbhB5kQzowJcKw1NSMFdA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biblu0/btrvqk2WL0K/gbhB5kQzowJcKw1NSMFdA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biblu0/btrvqk2WL0K/gbhB5kQzowJcKw1NSMFdA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiblu0%2Fbtrvqk2WL0K%2FgbhB5kQzowJcKw1NSMFdA0%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;1193&quot; height=&quot;827&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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-origin-width=&quot;778&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blJFQo/btrvqi5bA76/JkmsQcnM7OJqzGzWyyDEmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blJFQo/btrvqi5bA76/JkmsQcnM7OJqzGzWyyDEmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blJFQo/btrvqi5bA76/JkmsQcnM7OJqzGzWyyDEmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblJFQo%2Fbtrvqi5bA76%2FJkmsQcnM7OJqzGzWyyDEmK%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;778&quot; height=&quot;258&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격측 리눅스에 기본적인 VSCode 통신 패키지가 자동으로 설치 되긴 했으나, 파이썬은 설치되지 않았기 때문인데 VSCode의 확장모듈을 보면 SSH를 통해 원격으로 확장 모듈을 설치하는 버튼으로 바뀌어있다.&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-origin-width=&quot;931&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x5uec/btrvoBxvx5y/I1tokTDKTEsGVxiux7KpQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x5uec/btrvoBxvx5y/I1tokTDKTEsGVxiux7KpQ0/img.png&quot; data-alt=&quot;설치 해준다. 시간이 좀 소요된다. (나는 라즈베리파이 위에서 한 2분 30초 걸렸다)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x5uec/btrvoBxvx5y/I1tokTDKTEsGVxiux7KpQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx5uec%2FbtrvoBxvx5y%2FI1tokTDKTEsGVxiux7KpQ0%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;931&quot; height=&quot;374&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 해준다. 시간이 좀 소요된다. (나는 라즈베리파이 위에서 한 2분 30초 걸렸다)&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z88WF/btrvvbp3nCX/TD5dk1nIUAlekTjKTFk3UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z88WF/btrvvbp3nCX/TD5dk1nIUAlekTjKTFk3UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z88WF/btrvvbp3nCX/TD5dk1nIUAlekTjKTFk3UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ88WF%2Fbtrvvbp3nCX%2FTD5dk1nIUAlekTjKTFk3UK%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;720&quot; height=&quot;259&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;259&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;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-origin-width=&quot;994&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BUnc9/btrvvD7HyM7/niGBHkEi7oCOEpER1KKzsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BUnc9/btrvvD7HyM7/niGBHkEi7oCOEpER1KKzsk/img.png&quot; data-alt=&quot;저장시 경로와 파일명을 지정한다. (없는 디렉터리는 SSH 셸에서 미리 만들어주자. 자동으로 안 만들어줌)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BUnc9/btrvvD7HyM7/niGBHkEi7oCOEpER1KKzsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBUnc9%2FbtrvvD7HyM7%2FniGBHkEi7oCOEpER1KKzsk%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;994&quot; height=&quot;358&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저장시 경로와 파일명을 지정한다. (없는 디렉터리는 SSH 셸에서 미리 만들어주자. 자동으로 안 만들어줌)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 파일을 저장할 경로와 이름을 지정하고 OK 하면 된다. 파이썬 인터프리터가 선택되지 않았다고 잔소리를 할 수도 있다. 그럴땐 F1 을 눌러 인터프리터를 선택해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd2Dim/btrvoQmWzDg/K5d0qCurCek7vkGDShz901/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd2Dim/btrvoQmWzDg/K5d0qCurCek7vkGDShz901/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd2Dim/btrvoQmWzDg/K5d0qCurCek7vkGDShz901/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd2Dim%2FbtrvoQmWzDg%2FK5d0qCurCek7vkGDShz901%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;1061&quot; height=&quot;384&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kw8qV/btrvqjC8RcZ/YmL0uOsnTy19BEqCkSmAJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kw8qV/btrvqjC8RcZ/YmL0uOsnTy19BEqCkSmAJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kw8qV/btrvqjC8RcZ/YmL0uOsnTy19BEqCkSmAJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkw8qV%2FbtrvqjC8RcZ%2FYmL0uOsnTy19BEqCkSmAJ1%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;637&quot; height=&quot;200&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;200&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 F5 눌러서 실행을 시도 해보면 디버깅 대상을 고를 수 있는데, 일단은 모듈도 아니고 그냥 소스 파일 하나이므로 그냥 파이썬 파일을 선택했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJaPO/btrvvbcxEhL/qnwVZ4tyCm7PEAdKRlubyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJaPO/btrvvbcxEhL/qnwVZ4tyCm7PEAdKRlubyK/img.png&quot; data-alt=&quot;단일 소스 디버깅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJaPO/btrvvbcxEhL/qnwVZ4tyCm7PEAdKRlubyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJaPO%2FbtrvvbcxEhL%2FqnwVZ4tyCm7PEAdKRlubyK%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;1015&quot; height=&quot;402&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;402&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zFKzT/btrvoPBAkzL/P7Pl8oZDs0IHfOBuV7wAS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zFKzT/btrvoPBAkzL/P7Pl8oZDs0IHfOBuV7wAS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zFKzT/btrvoPBAkzL/P7Pl8oZDs0IHfOBuV7wAS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzFKzT%2FbtrvoPBAkzL%2FP7Pl8oZDs0IHfOBuV7wAS0%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;1209&quot; height=&quot;633&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;633&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;p data-ke-size=&quot;size16&quot;&gt;이제 실행도 잘 되고, 디버깅도 잘 된다. F9로 브레이크포인트를 설정하고 F10으로 한줄씩 실행하면서 변수에 뭐가 들었나 확인도 잘 된다. 이제 원격 개발을 위한 가장 기본적인 셋팅은 다 되었다.&amp;nbsp;&lt;/p&gt;</description>
      <category>환경</category>
      <category>PYTHON</category>
      <category>vsCode</category>
      <category>원격개발</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/28</guid>
      <comments>https://nitwit.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 8 Mar 2022 17:15:35 +0900</pubDate>
    </item>
    <item>
      <title>FoxyNet - LAN 에서 파일 공유하기</title>
      <link>https://nitwit.tistory.com/27</link>
      <description>&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDFLgj/btrtTMmz5dT/biFoCp9AnKRmRK60KKzfq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDFLgj/btrtTMmz5dT/biFoCp9AnKRmRK60KKzfq0/img.png&quot; data-alt=&quot;엄청 옛날에 스스로 처음 만들어본 프로그램이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDFLgj/btrtTMmz5dT/biFoCp9AnKRmRK60KKzfq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDFLgj%2FbtrtTMmz5dT%2FbiFoCp9AnKRmRK60KKzfq0%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;595&quot; height=&quot;444&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;444&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Z4zZ/btrtYVo4QyU/GCW3JbhvMxPUGrVDupj0xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Z4zZ/btrtYVo4QyU/GCW3JbhvMxPUGrVDupj0xK/img.png&quot; data-alt=&quot;이렇게 생겼다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Z4zZ/btrtYVo4QyU/GCW3JbhvMxPUGrVDupj0xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Z4zZ%2FbtrtYVo4QyU%2FGCW3JbhvMxPUGrVDupj0xK%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;435&quot; height=&quot;625&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 생겼다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Dxrx4/btrtYcSbFAe/qUU4KfdjkTJFbLpnr5q8ZK/Foxy_Net.exe?attach=1&amp;amp;knm=tfile.exe&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;Foxy_Net.exe&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.26MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우선 이 파일 공유 프로그램에 사용된 일러스트는 666pigeon 작가님에게 사용 허가를 받고 삽입 했다. 물론 지금으로부터 거의 8년 전 일이라, 혹시라도 작가님 마음이 바뀌어 이 일러스트를 빼달라고 하면 즉시 제거 할 것이다. 작가님 덕분에 프로그램의 디자인 컨셉을 잡기가 굉장히 수월 했다. 감사합니다 작가님 !&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;동일한 네트워크 환경에서 서로 파일을 주고 받거나 채팅을 할 수 있는 프로그램이다. 갓 20살때 만든 프로그램이고 완전 초짜 시절에 만든거라 코드가 엄청 난잡해서, 지금의 나도 감히 건드릴 수 없는 상태가 되어버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 꽤 유용하게 잘 쓰고 있다. 작업할때 파일을 옮겨야 할 일이 있으면 굳이 USB로 옮기지 않아도 되니, 편리하긴 하다. 써본 사람만 안다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;LAN 상에서 이 프로그램을 서로 켜고 있으면, 접속자 IP 리스트가 위에 표시된다. 해당 리스트를 클릭하면, 밑쪽에 파일주기 버튼이 활성화 되고, 클릭 가능한 상태가 되는데, 이때 전송할 파일을 선택해서 전송 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;파일을 주고 받은 후엔 C:\ 밑에 Foxy_Net_Download 라는 이름의 폴더가 생성되는데, 여기로 파일이 모인다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스는 여기서 받아 볼 수 있다.&amp;nbsp; &lt;a href=&quot;https://github.com/devadversary/Foxy_Net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/devadversary/Foxy_Net&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645492696835&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - devadversary/Foxy_Net: 갓 스무살때 만든 LAN 파일공유 프로그램입니다.&quot; data-og-description=&quot;갓 스무살때 만든 LAN 파일공유 프로그램입니다. Contribute to devadversary/Foxy_Net development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/devadversary/Foxy_Net&quot; data-og-url=&quot;https://github.com/devadversary/Foxy_Net&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iRCww/hyNukQO008/kHbQsfQDhiD0QOi3uGVOfk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/devadversary/Foxy_Net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/devadversary/Foxy_Net&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iRCww/hyNukQO008/kHbQsfQDhiD0QOi3uGVOfk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - devadversary/Foxy_Net: 갓 스무살때 만든 LAN 파일공유 프로그램입니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;갓 스무살때 만든 LAN 파일공유 프로그램입니다. Contribute to devadversary/Foxy_Net development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>상점</category>
      <category>파일공유</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/27</guid>
      <comments>https://nitwit.tistory.com/27#entry27comment</comments>
      <pubDate>Tue, 22 Feb 2022 10:27:10 +0900</pubDate>
    </item>
    <item>
      <title>UDP 플러딩 - 스트레스테스트용</title>
      <link>https://nitwit.tistory.com/25</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9KKMq/btrtgsulcI0/dvauSdSEOb7oZxs6N4NldK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9KKMq/btrtgsulcI0/dvauSdSEOb7oZxs6N4NldK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9KKMq/btrtgsulcI0/dvauSdSEOb7oZxs6N4NldK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9KKMq%2FbtrtgsulcI0%2FdvauSdSEOb7oZxs6N4NldK%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;285&quot; height=&quot;148&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/yKCu7/btrs8Bsxoct/2WBINmED2bt1sGKKagsRVK/syslog_test.exe?attach=1&amp;amp;knm=tfile.exe&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;syslog_test.exe&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.13MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&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;스트레스 테스트시 사용 할 수 있는 UDP 플로더를 만들어 보았다. &lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;마우스 스크롤을 통해 트래픽 부하를 조절 할 수 있다.&lt;/b&gt;&lt;/span&gt; 최대 100Mbps 까지 지정 가능하나, 통상 70~80 정도가 한계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP와 포트번호를 지정 후 테스트를 진행 할 수 있으며, 전송되는 UDP 더미 데이터는 syslog 의 형태를 갖고있다. &lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;타이머가 필요 할 경우 초 단위로 셋팅&lt;/b&gt;&lt;/span&gt; 해주고 사용하면 된다. 물론, &lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;무한히 지속적으로 보내고 싶다면 타이머를 0으로 셋팅&lt;/b&gt;&lt;/span&gt;해주고 시작하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램의 소스는 깃허브에 올려두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/devadversary/UDPFlooder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/devadversary/UDPFlooder&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644809189143&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - devadversary/UDPFlooder: UDP flood for stress test.&quot; data-og-description=&quot;UDP flood for stress test. Contribute to devadversary/UDPFlooder development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/devadversary/UDPFlooder&quot; data-og-url=&quot;https://github.com/devadversary/UDPFlooder&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJiVhF/hyNpckQSs3/DqzJY30haBK2d0F5YFQpqk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/devadversary/UDPFlooder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/devadversary/UDPFlooder&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJiVhF/hyNpckQSs3/DqzJY30haBK2d0F5YFQpqk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - devadversary/UDPFlooder: UDP flood for stress test.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;UDP flood for stress test. Contribute to devadversary/UDPFlooder development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>상점</category>
      <category>Flooding</category>
      <category>UDP</category>
      <category>스트레스테스트</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/25</guid>
      <comments>https://nitwit.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 14 Feb 2022 12:26:49 +0900</pubDate>
    </item>
    <item>
      <title>Windows에서 FFmpeg 빌드하기 (빌드된 파일 첨부)</title>
      <link>https://nitwit.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm8bZs/btrsJLbhouP/mvW3a4nZhiRA1BYYTL7rJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm8bZs/btrsJLbhouP/mvW3a4nZhiRA1BYYTL7rJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm8bZs/btrsJLbhouP/mvW3a4nZhiRA1BYYTL7rJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm8bZs%2FbtrsJLbhouP%2FmvW3a4nZhiRA1BYYTL7rJk%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;1280&quot; height=&quot;343&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;FFmpeg 는 영상 및 사운드 인코딩/디코딩 전문 라이브러리이다. 이 라이브러리 안에는 x264, x265, VP8, VP9 와 같은 저명한 알고리즘들이 들어있다. 화면을 녹화하거나 실시간으로 전송 해야 할 일이 있다면, 2022년 현재로써도 x264 코덱 말고는 마땅히 뾰족한 대안이 없다. 다른 코덱을 쓸 수야 있긴 하지만 인코딩 성능이 &lt;b&gt;*아직은&lt;/b&gt;* 많이 부담된다. 예전 글에서도 VP9 인코딩 속도가 초당 5프레임도 안 나온다고 언급 한 바 있다. (라이브러리에서 하드웨어 가속을 못 받았기 때문이다. libvpx 에서 이를 지원 해주면 참 좋을텐데 참 아쉽다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아직까지도 수많은 기업들에게 이 MPEG 이라는 그룹은 골칫거리다. 자사 코덱을 배포한지 오래되어, 지원하는 하드웨어도 이미 많고, 당연히 하드웨어 가속을 애진작에 지원했으므로 속도도 가장 빠르고 품질도 좋기 때문에, 기술적으로는 가장 탁월한 선택이기 때문이다. 문제는 이것저것 특허깡패라 오만곳에 특허 침해의 소지가 있다. 로열티 내야된다 이말이다. 정확하게는 &lt;b&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;FFMPEG 는 그냥 GPL이 걸린 오픈소스&lt;/span&gt;&lt;/b&gt;일 뿐이고 (이 또한 감점 요소로 평가되기도 함), 이 안에서 사용되는 알고리즘들이 특허가 걸려있어서 굳이 FFMPEG이 아니어도 해당 코덱을 사용하는 라이브러리들은 전부 특허권에서 자유롭지 못하다. libx264 같은 라이브러리가 그렇다. x264 코덱 등에 사용되는 수학적인 방법론 그 자체의 핵심적인 파트에 온갖 특허는 다 걸려있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이렇게 복잡한 GPL/LGPL 라이센스와 특허 문제를 피하기 위해 구글과 어도비, 하여튼 당신이 알 만한 대부분의 기업이 libvpx, libaom 같은 차세대 코덱을 만들기 시작했다. 하지만 MPEG이 영상 압축에대한 핵심적인 알고리즘 자체에 특허를 다 걸어놔서, 작업이 쉽지는 않은 모양이다. 별로 놀랍지는 않지만 애플은 MPEG편인데, 아마 MPEG 특허권중 일부를 갖고 있어 이권을 유지하기 위함으로 보인다. 어쨋든 libvpx 를 빌드하는 방법을 알고 싶다면 아래 글을 참조 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nitwit.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nitwit.tistory.com/6&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644284350884&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;libvpx 빌드하기 (파일 첨부 되어있음)&quot; data-og-description=&quot;MPEG의 H.264 정말 너무 좋다. 왠만한 하드웨어 가속은 다 받을 수 있고, 화질도 좋고, 용량도 작고, 스트리밍에도 최적이다. 일반 사용자에게는 말이다. 문제는 개발 할 때 이다. 이놈들을 사용하기&quot; data-og-host=&quot;nitwit.tistory.com&quot; data-og-source-url=&quot;https://nitwit.tistory.com/6&quot; data-og-url=&quot;https://nitwit.tistory.com/6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TuHJy/hyNli6vicu/bKFgpogPXtIyyekdMgJ1B1/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/HANn6/hyNlrh5gdq/Ku9kWn1JvKjRkG76mqjNrK/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/oPpQq/hyNleiKiSs/89sYnrbkATLSJ1C0c8YZY1/img.png?width=848&amp;amp;height=871&amp;amp;face=0_0_848_871&quot;&gt;&lt;a href=&quot;https://nitwit.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nitwit.tistory.com/6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TuHJy/hyNli6vicu/bKFgpogPXtIyyekdMgJ1B1/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/HANn6/hyNlrh5gdq/Ku9kWn1JvKjRkG76mqjNrK/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/oPpQq/hyNleiKiSs/89sYnrbkATLSJ1C0c8YZY1/img.png?width=848&amp;amp;height=871&amp;amp;face=0_0_848_871');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;libvpx 빌드하기 (파일 첨부 되어있음)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MPEG의 H.264 정말 너무 좋다. 왠만한 하드웨어 가속은 다 받을 수 있고, 화질도 좋고, 용량도 작고, 스트리밍에도 최적이다. 일반 사용자에게는 말이다. 문제는 개발 할 때 이다. 이놈들을 사용하기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nitwit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;FFmpeg 라이브러리는 그럼에도 불구하고 많은 사랑을 받는 라이브러리기도 하다. 법인도 아니고, 대규모 서비스를 만들 일이 잘 없는 개인 입장에서는 갖다 쓰기도 쉽고 성능도 좋기 때문이다. 우선 빌드를 해보자. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;아 ! Visual Studio 는 당연히 설치 되어 있어야 한다 !&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여태 FFmpeg 빌드 방법을 알려주던 블로그 글이나 포럼 글들은 대부분은 도움이 안 됐고, 가장 크게 와닿고 실질적으로 큰 도움이 되었던 글은 바로 이것이었다. 이것저것 치덕치덕 설치해야되는게 별로 없어서 마음에 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644285047918&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Is it possible to build ffmpeg x64 on Windows?&quot; data-og-description=&quot;The real answer is probably &amp;quot;no&amp;quot;, but still, just to double check. Has anyone ever been able to build ffmpeg x64 on Windows (VS2013 or VS2015)? I know it is not possible with publicly available sou...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows&quot; data-og-url=&quot;https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctoYhW/hyNloTcCVi/eLVOyFqnj4BRc63mKZDnpK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctoYhW/hyNloTcCVi/eLVOyFqnj4BRc63mKZDnpK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Is it possible to build ffmpeg x64 on Windows?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The real answer is probably &quot;no&quot;, but still, just to double check. Has anyone ever been able to build ffmpeg x64 on Windows (VS2013 or VS2015)? I know it is not possible with publicly available sou...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문의 답변자가 작성한 가이드를 한번 따라가보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우선 &lt;b&gt;MSYS2&lt;/b&gt;(설치)와 &lt;b&gt;yasm&lt;/b&gt;(단일 exe), 그리고 &lt;b&gt;FFmpeg&lt;/b&gt;(이제 우리가 빌드할 소스) 부터 받아놓고 숨좀 돌리자. MinGW나 MSYS, Strawberry Perl 같은걸 설치해서 빌드하는 스타일은 정말 정말 싫어하지만, 그나마 FFmpeg 는 MSYS 하나만 설치하면 되기 때문에 부담이 적다. 그리고 이거 말고 마땅한 대안도 없다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.msys2.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.msys2.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644285698275&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MSYS2&quot; data-og-description=&quot;Software Distribution and Building Platform for Windows&quot; data-og-host=&quot;www.msys2.org&quot; data-og-source-url=&quot;https://www.msys2.org/&quot; data-og-url=&quot;https://www.msys2.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccwcsi/hyNlloCYsI/XqTXHJHKb0KzJlY2yIEMT1/img.png?width=250&amp;amp;height=250&amp;amp;face=0_0_250_250&quot;&gt;&lt;a href=&quot;https://www.msys2.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.msys2.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccwcsi/hyNlloCYsI/XqTXHJHKb0KzJlY2yIEMT1/img.png?width=250&amp;amp;height=250&amp;amp;face=0_0_250_250');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MSYS2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Software Distribution and Building Platform for Windows&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.msys2.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://yasm.tortall.net/Download.html&quot;&gt;http://yasm.tortall.net/Download.html&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1644285706101&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download - The Yasm Modular Assembler Project&quot; data-og-description=&quot;Latest Release: 1.3.0 Release Date: August 10, 2014 Visual Studio 2010+ Integration Download the appropriate VS2010 &amp;ldquo;vsyasm&amp;rdquo; zip file above for your system, and follow the readme.txt instructions for integrating yasm into Visual Studio 2010 (later vers&quot; data-og-host=&quot;yasm.tortall.net&quot; data-og-source-url=&quot;http://yasm.tortall.net/Download.html&quot; data-og-url=&quot;http://yasm.tortall.net/Download.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://yasm.tortall.net/Download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://yasm.tortall.net/Download.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download - The Yasm Modular Assembler Project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Latest Release: 1.3.0 Release Date: August 10, 2014 Visual Studio 2010+ Integration Download the appropriate VS2010 &amp;ldquo;vsyasm&amp;rdquo; zip file above for your system, and follow the readme.txt instructions for integrating yasm into Visual Studio 2010 (later vers&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yasm.tortall.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/FFmpeg/FFmpeg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/FFmpeg/FFmpeg&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644287607653&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git&quot; data-og-description=&quot;Mirror of https://git.ffmpeg.org/ffmpeg.git. Contribute to FFmpeg/FFmpeg development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/FFmpeg/FFmpeg&quot; data-og-url=&quot;https://github.com/FFmpeg/FFmpeg&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f86as/hyNlpxQ7v5/NGHErPezbOlPp4HZnII881/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/FFmpeg/FFmpeg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/FFmpeg/FFmpeg&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f86as/hyNlpxQ7v5/NGHErPezbOlPp4HZnII881/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mirror of https://git.ffmpeg.org/ffmpeg.git. Contribute to FFmpeg/FFmpeg development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;style6&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;&lt;b&gt;1.&lt;/b&gt;&amp;nbsp; 준비 되었다면 MSYS2 설치부터 하자. 나는 C:\ 바로 밑에 DEV 라는 폴더를 따로 만들어서 그 안에 설치 했다. 딱히 그래야만 되는건 아닌데, 그냥 나중에 관리하기 편할것 같아서 그렇게 만든것이니 편한대로 설치 하자. 그리고 받은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;yasm어쩌구.exe 는 얌전하게 yasm.exe 라는 이름으로 바꿔서 MSYS가 설치된 경로에 같이 넣어준다.&lt;/b&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;658&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XRhlX/btrsDQXD2s0/kBfriNi6rgfEHZGkWACQT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XRhlX/btrsDQXD2s0/kBfriNi6rgfEHZGkWACQT1/img.png&quot; data-alt=&quot;yasm 이름을 바꿔줘야 gcc가 그 이름을 찾아서 사용 할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XRhlX/btrsDQXD2s0/kBfriNi6rgfEHZGkWACQT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXRhlX%2FbtrsDQXD2s0%2FkBfriNi6rgfEHZGkWACQT1%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;658&quot; height=&quot;127&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;yasm 이름을 바꿔줘야 gcc가 그 이름을 찾아서 사용 할 수 있다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; 설치한 msys 폴더 안쪽에 usr\bin 에 들어가보면 link.exe 가 있다. 이 파일 이름을 아무거나 다른 이름으로 바꿔주자. 아니면 환경변수 우선순위를 조절 해줘도 되지만, 일단은 언급했던 스택오버플로 게시물을 따라보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqnsy/btrsQrhMwju/BuvsvQ3RUfyeSVDU4Y2oDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqnsy/btrsQrhMwju/BuvsvQ3RUfyeSVDU4Y2oDk/img.png&quot; data-alt=&quot;이렇게 이름을 깨트려줘야 MSYS에서 비주얼스튜디오의 링커가 대신 잡힌다. 바뀐 이름은 아무거나 상관없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqnsy/btrsQrhMwju/BuvsvQ3RUfyeSVDU4Y2oDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvqnsy%2FbtrsQrhMwju%2FBuvsvQ3RUfyeSVDU4Y2oDk%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;662&quot; height=&quot;130&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 이름을 깨트려줘야 MSYS에서 비주얼스튜디오의 링커가 대신 잡힌다. 바뀐 이름은 아무거나 상관없다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&lt;/b&gt; MSYS 실행해서 &amp;nbsp; &lt;b&gt;pacman -S make gcc diffutils&lt;/b&gt;&amp;nbsp; &amp;nbsp;명령 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diNd17/btrsNyovqFd/YwNzafJWK0oOtz2BGFVYrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diNd17/btrsNyovqFd/YwNzafJWK0oOtz2BGFVYrK/img.png&quot; data-alt=&quot;이거.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diNd17/btrsNyovqFd/YwNzafJWK0oOtz2BGFVYrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiNd17%2FbtrsNyovqFd%2FYwNzafJWK0oOtz2BGFVYrK%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;640&quot; height=&quot;216&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이거.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDGAF/btrsLwxZcaI/tKnkxwuRpU2DvFx9lG9KKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDGAF/btrsLwxZcaI/tKnkxwuRpU2DvFx9lG9KKK/img.png&quot; data-alt=&quot;중간에 Y/n 물어본다. 당연히 Y다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDGAF/btrsLwxZcaI/tKnkxwuRpU2DvFx9lG9KKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDGAF%2FbtrsLwxZcaI%2FtKnkxwuRpU2DvFx9lG9KKK%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;780&quot; height=&quot;386&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중간에 Y/n 물어본다. 당연히 Y다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 됐으면, 이 MSYS 는 종료 해준다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 비주얼스튜디오 프롬프트&lt;/b&gt;를 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;관리자 모드&quot; 로 실행&lt;/span&gt;&lt;/b&gt;한다. &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;x64 빌드를 하고싶다면 프롬프트도 x64 를 실행해야한다. x86_64 크로스를 하고싶다면 마찬가지로 x86_64 프롬프트로 열면 된다.&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-origin-width=&quot;774&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEOvGQ/btrsJLvl3sE/7m9jxVrZQLryBRraDDruCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEOvGQ/btrsJLvl3sE/7m9jxVrZQLryBRraDDruCK/img.png&quot; data-alt=&quot;왜냐면 아까 그냥 C:\ 바로 밑에 만들었기 때문이다. D:\ 나 다른곳에 만들었다면 관리자는 필요 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEOvGQ/btrsJLvl3sE/7m9jxVrZQLryBRraDDruCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEOvGQ%2FbtrsJLvl3sE%2F7m9jxVrZQLryBRraDDruCK%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;774&quot; height=&quot;454&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왜냐면 아까 그냥 C:\ 바로 밑에 만들었기 때문이다. D:\ 나 다른곳에 만들었다면 관리자는 필요 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그리고 이 프롬프트에서 MSYS를 실행하자. 그러면 MSYS도 관리자모드로 실행되어, 쉘에 $ 대신 #이 떨어진다. 굳이 프롬프트에서 다시 MSYS 를 실행 시키는 이유는, 비주얼스튜디오 개발 프롬프트가 가지고 있는 빌드 환경을 이 MSYS에 전달해주기 위함이다. 그래야 MSYS에서 gcc 를 실행할때 비주얼스튜디오의 컴파일러와 링커를 가져다 쓸테니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; &lt;b&gt;&amp;lt;MSYS 설치경로&amp;gt;\msys2_shell.cmd -msys -use-full-path&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ex : &lt;b&gt;&lt;b&gt;C:\DEV\msys64\msys2_shell.cmd -msys -use-full-path&lt;/b&gt;&lt;/b&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;977&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceHwm2/btrsLT0AFjt/oh9pK2zkKvo4AMySBIe8w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceHwm2/btrsLT0AFjt/oh9pK2zkKvo4AMySBIe8w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceHwm2/btrsLT0AFjt/oh9pK2zkKvo4AMySBIe8w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceHwm2%2FbtrsLT0AFjt%2Foh9pK2zkKvo4AMySBIe8w1%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;977&quot; height=&quot;518&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 실행된 MSYS 쉘에 &lt;b&gt;which cl&lt;/b&gt; 과&amp;nbsp; &lt;b&gt;which link&lt;/b&gt; 를 쳤을때, 비주얼스튜디오의 컴파일러와 링커가 잡혀있어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzJJd/btrsNyBN67W/kKuos1S7eNvYcAQHOnca91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzJJd/btrsNyBN67W/kKuos1S7eNvYcAQHOnca91/img.png&quot; data-alt=&quot;which 로 위치를 조사한다. 하하하 ~~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzJJd/btrsNyBN67W/kKuos1S7eNvYcAQHOnca91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvzJJd%2FbtrsNyBN67W%2FkKuos1S7eNvYcAQHOnca91%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;570&quot; height=&quot;221&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;which 로 위치를 조사한다. 하하하 ~~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아까 link.exe 이름을 다른것으로 바꾼것은 MSYS 자체 링커를 못 찾게 해서, 비주얼스튜디오의 링커로 대체시키기 위한 조치였다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5.&lt;/b&gt; 이제 이 MSYS 쉘에서 아까 받아둔 ffmpeg 소스 경로로 이동하자. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(ex : &lt;b&gt;cd /c/Users/nitwit/ffmpeg/&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; &lt;b&gt;cd &amp;lt;ffmpeg 경로&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l9eou/btrsDQDxxGa/MMj6klHJ894SvnMeKZu5L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l9eou/btrsDQDxxGa/MMj6klHJ894SvnMeKZu5L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l9eou/btrsDQDxxGa/MMj6klHJ894SvnMeKZu5L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl9eou%2FbtrsDQDxxGa%2FMMj6klHJ894SvnMeKZu5L1%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;559&quot; height=&quot;251&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;251&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;p data-ke-size=&quot;size16&quot;&gt;왠만한 오픈소스들이 다 그렇듯 configure 를 실행해서 make 환경을 구성해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./configure --help 를 쳐보면 이것저것 설명이 나오니까 추후에 세부 옵션 조정이 필요할때 천천히 둘러봐서 적당한 옵션을 켜고 끄면 된다. 나는 이렇게 실행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; &lt;b&gt;./configure --toolchain=msvc --arch=x86_64 --enable-yasm --disable-x86asm --enable-asm --enable-shared --enable-w32threads --disable-programs --disable-doc --disable-static --prefix=/c/ffmpeg3.3/DLLS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로가 C:\ 처럼 관리자 권한 있어야 접근 되는 경로일 경우, MSYS가 관리자모드로 실행중이지 않으면 당연히 에러가 난다. 당황하지 말고, 관리자모드로 다시 실행해주자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJj0nx/btrsMbgbjvB/QMZrdkQS2IZrOLV0cGYhfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJj0nx/btrsMbgbjvB/QMZrdkQS2IZrOLV0cGYhfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJj0nx/btrsMbgbjvB/QMZrdkQS2IZrOLV0cGYhfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJj0nx%2FbtrsMbgbjvB%2FQMZrdkQS2IZrOLV0cGYhfk%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;566&quot; height=&quot;290&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 조금 걸리는데, 정상적으로 실행 되고나면 이렇게 끝난다. 이제 make 해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; &lt;b&gt;make -j &amp;lt;스레드 갯수&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AnSAu/btrsMeQ9rUP/9I5YfBvQ0qoWMgMXycR1G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AnSAu/btrsMeQ9rUP/9I5YfBvQ0qoWMgMXycR1G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AnSAu/btrsMeQ9rUP/9I5YfBvQ0qoWMgMXycR1G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAnSAu%2FbtrsMeQ9rUP%2F9I5YfBvQ0qoWMgMXycR1G0%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;554&quot; height=&quot;153&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; VS의 컴파일러와 링커로 빌드가 시작된다. 빌드 중 warning 이 좀 보이긴 하지만, 큰 문제 없으므로 그냥 화면을 감상해주면 된다. 시간이 좀 걸린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di7OER/btrsQpSbSrP/Lg8U0kw4RAg8S02q2Tmzwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di7OER/btrsQpSbSrP/Lg8U0kw4RAg8S02q2Tmzwk/img.png&quot; data-alt=&quot;빌드 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di7OER/btrsQpSbSrP/Lg8U0kw4RAg8S02q2Tmzwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi7OER%2FbtrsQpSbSrP%2FLg8U0kw4RAg8S02q2Tmzwk%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;688&quot; height=&quot;154&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;154&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;마지막으로 make install 을 실행하면 빌드된 라이브러리들이 한데 모인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qcu4t/btrsAbIdvj2/Hn92EboKEwL8pqTyqoruOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qcu4t/btrsAbIdvj2/Hn92EboKEwL8pqTyqoruOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcu4t/btrsAbIdvj2/Hn92EboKEwL8pqTyqoruOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqcu4t%2FbtrsAbIdvj2%2FHn92EboKEwL8pqTyqoruOK%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;534&quot; height=&quot;230&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 되고나면 configure 실행시 지정했던 --prefix 경로에 이쁘게 정리 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZE83F/btrsL9QnzCn/OfYMnjEP2YyDkM9TkxhkGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZE83F/btrsL9QnzCn/OfYMnjEP2YyDkM9TkxhkGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZE83F/btrsL9QnzCn/OfYMnjEP2YyDkM9TkxhkGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZE83F%2FbtrsL9QnzCn%2FOfYMnjEP2YyDkM9TkxhkGK%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;575&quot; height=&quot;173&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;bin 안쪽에는 빌드된 .lib 와 .dll 들이 있고, include 에는 ffmpeg의 헤더파일이 있다. 오픈소스 많이 쓰는 사람에게는 익숙한 구성일 것이다. 이제 개발 환경에 맞게 입맛대로 링크 해서 쓰면 된다.&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;style6&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아무리 그래도 이건 너무 귀찮으므로 여기 그 결과물을 첨부 하니 받아서 사용 해도 좋다. &lt;b&gt;2022년 02월 08일 기준으로 빌드&lt;/b&gt; 되었으니, 시간이 지나 너무 오래 되었다 싶으면 새로 빌드해서 쓰도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2022.02.22 : 이 빌드된 버전은 SSE, AVX 같은 CPU 가속 명령어를 사용하지 않는 것으로 빌드 되어 sws_scale 같은 함수도 많이 느리다. (초당 5프레임) soen.kr 의 ffmpeg 강좌를 보면 사이트 운영자가 업로드해둔 ffmpeg 라이브러리가 있는데, 그 빌드 버전은 CPU 가속이 지원되어 속도가 빠르다 (100-120 프레임)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시간이 되면, 관련 옵션을 다시 찾아보고 적용하여 CPU 가속이 되도록 빌드하여 다시 올릴 예정이다... 어? 그러고보니 libvpx도 느렸던 이유가 설마?&lt;/b&gt;&lt;/span&gt;&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/blD7jM/btrsRaUVwRY/KTfAuF39xy15LzW2A1NYQk/ffmpeg3.3.zip?attach=1&amp;amp;knm=tfile.zip&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;ffmpeg3.3.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;10.80MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>뻘짓</category>
      <category>ffmpeg</category>
      <category>H.264</category>
      <category>vp8</category>
      <category>vp9</category>
      <category>VPX</category>
      <category>x264</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/24</guid>
      <comments>https://nitwit.tistory.com/24#entry24comment</comments>
      <pubDate>Tue, 8 Feb 2022 14:14:42 +0900</pubDate>
    </item>
    <item>
      <title>[짧은글] 블루투스 페어링 : sspmode 0</title>
      <link>https://nitwit.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 페어링을 &quot;하는 쪽&quot; 이 아니라, 페어링 요청을 &quot;받는 쪽&quot; 이야기이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 기기에서 페어링이 붙기 위해서는 &lt;b&gt;Discoverable&lt;/b&gt; 모드가 활성화 되어있어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기 자신의 존재를 외부에 알려서 나한테 붙으시오~ 하는거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴대폰에서 스캔된 장치를 눌러서 내 PC로 (또는 개발중인 임베디드 리눅스 장치로) 페어링 시도를 위해 PIN 입력 창을 띄우려면, sspmode 가 0으로 비활성화 되어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lv3nh/btrns3BIUky/ubUyk8gbEBCeGjPjDX9tdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lv3nh/btrns3BIUky/ubUyk8gbEBCeGjPjDX9tdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lv3nh/btrns3BIUky/ubUyk8gbEBCeGjPjDX9tdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flv3nh%2Fbtrns3BIUky%2FubUyk8gbEBCeGjPjDX9tdK%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;559&quot; height=&quot;79&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상태는 sspmode가 Enabled 상태. 그러니까 1 로 셋팅 되어있다는거다.&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-origin-width=&quot;472&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfYiky/btrnxk9NYpd/zOY516zQEU571QxCgbZGa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfYiky/btrnxk9NYpd/zOY516zQEU571QxCgbZGa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfYiky/btrnxk9NYpd/zOY516zQEU571QxCgbZGa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfYiky%2Fbtrnxk9NYpd%2FzOY516zQEU571QxCgbZGa0%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;472&quot; height=&quot;54&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IO에 에러가 있다면서 불만을 토로한다. 당연히, sspmode가 꺼지지도 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;우선 Discoverable 상태로 전환한다. piscan 옵션이다. 그리고 sspmode 를 설정 하는데, 이때 주의해야 할 것은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1&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-origin-width=&quot;505&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOghqt/btrnu7DAHZe/vPAOg58y5CFTUyeK4cMCgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOghqt/btrnu7DAHZe/vPAOg58y5CFTUyeK4cMCgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOghqt/btrnu7DAHZe/vPAOg58y5CFTUyeK4cMCgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOghqt%2Fbtrnu7DAHZe%2FvPAOg58y5CFTUyeK4cMCgk%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;505&quot; height=&quot;64&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Discoverable 상태에서는 sspmode 셋팅에 문제가 발생하게된다. 그러니까 지금 상황은, &lt;b&gt;&quot;키려고 했는데 에러를 고의로 낸 상황&quot;&lt;/b&gt; 인것이다. 이렇게되면 &lt;b&gt;sspmode가 켜지지 않은 상태&lt;/b&gt;가 되어버린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1G4HI/btrnwAd0RRW/q4exOZNVZPs6WcRsQrfOAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1G4HI/btrnwAd0RRW/q4exOZNVZPs6WcRsQrfOAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1G4HI/btrnwAd0RRW/q4exOZNVZPs6WcRsQrfOAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1G4HI%2FbtrnwAd0RRW%2Fq4exOZNVZPs6WcRsQrfOAk%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;520&quot; height=&quot;97&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 장치를 리셋 해주면 sspmode는 Disabled 상태가 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 noauth 설정도 먹이면 휴대폰에서 페어링을 시도할때 PIN 번호 입력 창까지 뜨게된다. (PIN 설정 방법은 이제 알아내야한다...)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# hciconfig hci0 piscan&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# hciconfig hci0 sspmode 1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# hciconfig hci0 reset&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서로 명령을 먹여주면 sspmode 설정에 버그인지 뭔지 확실하진 않지만, 어떤 사이드 이펙트 때문에 sspmode가 꺼지게된다.&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;+ 2021.12.16 : 그냥 dbus 쓰는게 나을것 같다. 조만간 dbus 를 통한 블루투스 페어링에 대해 포스팅 하겠다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>뻘짓</category>
      <author>저학력자</author>
      <guid isPermaLink="true">https://nitwit.tistory.com/23</guid>
      <comments>https://nitwit.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 10 Dec 2021 13:08:20 +0900</pubDate>
    </item>
  </channel>
</rss>