전체

    Direct2D C++ UI 라이브러리 "Foxhop.lib"

    https://youtu.be/z85mqV4YdK0 모션그래픽이 적용된 UI 라이브러리를 만들어보고 싶었다. 영화 속에나 있던 화려한 그래픽 화면을 현실에서 실제 응용프로그램으로 충분히 쓸 수 있을법 한데, 그런게 없으니 직접 만들수밖에 없었다. Direct2D 기반이라 윈도우즈 환경에서밖에 사용할 수 없다는게 가장 아쉬운 부분이라 말할 수 있겠다. 과정은 상당히 험난했는데, 투명한 윈도우 위에서 반투명 오브젝트를 출력하기위한 갖은 노력의 일환으로 OpenGL을 이용하여 화면을 렌더링 해보는것이 시작이었다. 리눅스에서도 사용 할 수 있을테니 나쁘지 않은 선택으로 보였으나 텍스트 출력이 골자였다. Freetype 이라는 라이브러리로 폰트 파일을 로드해 글자 하나씩 직접 렌더링 하는 작업을 나는 감당 할 수..

    Visual Studio 리눅스 원격 디버깅

    리눅스의 자유로운 개발 환경은 정말 매력적이다. 특히 서버의 경우엔, 별도의 라이센스 없이도 무료로 사용 할 수 있는 프리웨어이기 때문에 기업의 경우 라이센스 유지 비용에 대해서 완전히 자유로워진다는 특장점이 있다. 또한 리눅스는 시키면 군 말 없이 다 한다. 윈도우즈의 "알아서 하는" 요소가 적고 정말 사용자의 의도대로 정확하게 동작한다. 하지만 그렇다고 윈도우 소프트웨어의 장점은 없는걸까? 강력한 GUI 환경과 MS의 강력한 개발 도구인 비주얼스튜디오는 막강한 디버깅 환경과, 코드 분석 환경을 제공한다. 개발 할 때도 편리한 기능이 많고 C/C++ 을 사용한다면 이것 말고는 사실상 대안이 없다고 말하고싶다. 실시간으로 코드를 한줄 한줄 실행하며 변수의 값을 확인 할수도 있고, 호출 스택을 통해 어떤 ..

    [Python] Raw소켓으로 Ping 보내기 (ICMP 스캐너)

    Ping 좀 보내본 사람이라면 아마 ICMP 패킷에 대해 알고 있을 것이다. ICMP 프로토콜의 구조는 다음과 같은데, 핵심은 Type과 Code 로 내가 수행할 행동을 정의 하는 것이다. nmap 에서는 이런 프로토콜들의 다이어그램을 제공한다. 여기서 내가 Type:8, Code:0 으로 ICMP 메세지를 보내면, 이걸 받은 상대는 Type:0, Code:0 으로 응답을 해주게 되고, 이것이 Ping 명령의 실체인 것이다. 덧붙여 tracert 명령같은 경로 추적 기능은 IP헤더의 TTL을 일부러 작게 설정해 경로상에 놓인 장비들이 TTL을 보고 패킷을 드롭 시킬때 ICMP의 TTL Exceed 메세지를 보내는 매커니즘을 이용하게 된다. (Type:11, Code:0) 긴 말 않고 한번 코드를 살펴보자..

    유니코드 - UTF8 변환 코드

    내가 귀찮아서 올려두는 코드이다. 코드가 진짜 마음에 안든다. #pragma once #include #include LPWSTR AnsiToUnicode(LPSTR szAnsi) { LPWSTR szUniStr; // 유니코드로 변환 전 return 되는 길이얻기 int nLen = MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, NULL, NULL); nLen = nLen * sizeof(WCHAR); szUniStr = (LPWSTR)malloc(nLen + 1);// 메모리를 할당한다. memset(szUniStr, 0, nLen + 1); // 이제 변환을 수행한다. MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, szUniStr, nLe..

    디스어셈블 라이브러리 "Capstone" 빌드 및 사용법

    자... 지난번에는 디스어셈블 라이브러리로 Zydis를 소개 했었다. 이 라이브러리는 속도가 빠르고 가벼우며, 인스트럭션의 상세정보를 확인하기가 비교적 수월하다는 평을 받는다. 이 라이브러리를 빌드해서 사용 해 보고 싶다면, 이 글이 도움이 될 것이다. https://nitwit.tistory.com/15 디스어셈블 라이브러리 "Zydis" 빌드하기 분석가들과 개발자, 해커들의 영원한 친구 OllyDBG 그리고 그의 친구 X64DBG 의 그것이다. 얘네들은 내부적으로 Zydis, XED 라는 디스어셈블/어셈블 오픈소스 라이브러리를 사용하여 사용자에게 UI로 nitwit.tistory.com 하지만 단점을 굳이 뽑자면, X86-64 가 아닌 아키텍쳐들은 지원하지 않는다는 점 정도일 것이다. ARM 이나 M..

    VSCode - Python 리눅스 원격 개발 환경

    VSCode 로 리눅스에 SSH로 붙어서 파이썬을 사용하고 싶다. 그럼 당연히 파이썬과 SSH 확장이 있어야한다. 그냥 install 누르면 vscode가 열리면서 설치 페이지가 뜬다. 귀찮은건 질색이다. https://marketplace.visualstudio.com/items?itemName=ms-python.python Python - Visual Studio Marketplace Extension for Visual Studio Code - IntelliSense (Pylance), Linting, Debugging (multi-threaded, remote), Jupyter Notebooks, code formatting, refactoring, unit tests, and more. mark..

    FoxyNet - LAN 에서 파일 공유하기

    우선 이 파일 공유 프로그램에 사용된 일러스트는 666pigeon 작가님에게 사용 허가를 받고 삽입 했다. 물론 지금으로부터 거의 8년 전 일이라, 혹시라도 작가님 마음이 바뀌어 이 일러스트를 빼달라고 하면 즉시 제거 할 것이다. 작가님 덕분에 프로그램의 디자인 컨셉을 잡기가 굉장히 수월 했다. 감사합니다 작가님 ! 동일한 네트워크 환경에서 서로 파일을 주고 받거나 채팅을 할 수 있는 프로그램이다. 갓 20살때 만든 프로그램이고 완전 초짜 시절에 만든거라 코드가 엄청 난잡해서, 지금의 나도 감히 건드릴 수 없는 상태가 되어버렸다. 하지만 꽤 유용하게 잘 쓰고 있다. 작업할때 파일을 옮겨야 할 일이 있으면 굳이 USB로 옮기지 않아도 되니, 편리하긴 하다. 써본 사람만 안다. LAN 상에서 이 프로그램을 ..

    UDP 플러딩 - 스트레스테스트용

    스트레스 테스트시 사용 할 수 있는 UDP 플로더를 만들어 보았다. 마우스 스크롤을 통해 트래픽 부하를 조절 할 수 있다. 최대 100Mbps 까지 지정 가능하나, 통상 70~80 정도가 한계다. IP와 포트번호를 지정 후 테스트를 진행 할 수 있으며, 전송되는 UDP 더미 데이터는 syslog 의 형태를 갖고있다. 타이머가 필요 할 경우 초 단위로 셋팅 해주고 사용하면 된다. 물론, 무한히 지속적으로 보내고 싶다면 타이머를 0으로 셋팅해주고 시작하면 된다. 프로그램의 소스는 깃허브에 올려두었다. https://github.com/devadversary/UDPFlooder GitHub - devadversary/UDPFlooder: UDP flood for stress test. UDP flood for..

    Windows에서 FFmpeg 빌드하기 (빌드된 파일 첨부)

    FFmpeg 는 영상 및 사운드 인코딩/디코딩 전문 라이브러리이다. 이 라이브러리 안에는 x264, x265, VP8, VP9 와 같은 저명한 알고리즘들이 들어있다. 화면을 녹화하거나 실시간으로 전송 해야 할 일이 있다면, 2022년 현재로써도 x264 코덱 말고는 마땅히 뾰족한 대안이 없다. 다른 코덱을 쓸 수야 있긴 하지만 인코딩 성능이 *아직은* 많이 부담된다. 예전 글에서도 VP9 인코딩 속도가 초당 5프레임도 안 나온다고 언급 한 바 있다. (라이브러리에서 하드웨어 가속을 못 받았기 때문이다. libvpx 에서 이를 지원 해주면 참 좋을텐데 참 아쉽다.) 아직까지도 수많은 기업들에게 이 MPEG 이라는 그룹은 골칫거리다. 자사 코덱을 배포한지 오래되어, 지원하는 하드웨어도 이미 많고, 당연히 하..

    [짧은글] 블루투스 페어링 : sspmode 0

    이상한 버그를 발견하여, 긴급하게 작성하는 글이라 다듬어지지 않고, 정제되지 않은 표현이 나올 수 있음을 미리 양해를 구합니다. 내가 페어링을 "하는 쪽" 이 아니라, 페어링 요청을 "받는 쪽" 이야기이다. 외부 기기에서 페어링이 붙기 위해서는 Discoverable 모드가 활성화 되어있어야 한다. 자기 자신의 존재를 외부에 알려서 나한테 붙으시오~ 하는거다. 휴대폰에서 스캔된 장치를 눌러서 내 PC로 (또는 개발중인 임베디드 리눅스 장치로) 페어링 시도를 위해 PIN 입력 창을 띄우려면, sspmode 가 0으로 비활성화 되어야 한다. 현재 상태는 sspmode가 Enabled 상태. 그러니까 1 로 셋팅 되어있다는거다. 그런데 이놈을 끄려고 하면 안된다. IO에 에러가 있다면서 불만을 토로한다. 당연..

    ARP 포이즈닝(ARP 스푸핑) & MITM 공격

    ARP 스푸핑. 네트워크와 보안을 공부 하게되면 꼭 한번은 배우게되는 공격이다. 다른 말로는 ARP 테이블을 오염시킨다는 의미에서 ARP 포이즈닝 이라고 부르기도 한다. 개요만 짚고 넘어가자면 LAN 상에서 IP:MAC 쌍을 속이는 행위인데, 공격대상이 192.168.0.4 - AA:AA:AA:AA:AA:AA 쌍을 가지고 게이트웨이가 192.168.0.1 - BB:BB:BB:BB:BB:BB 쌍을 가진다고 할 때, 서로 IP:MAC 쌍을 교환하여 각자의 ARP테이블에 기록해두고, 앞으로 이를 참조하여 데이터를 주고받게된다. 이 둘의 통신에 192.168.0.66 - 66:66:66:66:66:66 이라는 해커가 중간에 개입하여 공격대상이 게이트웨이 주소쌍을 192.168.0.1 - 66:66:66:66:6..

    와이파이 끊김이 심하다면

    최근 블로그 유입 통계를 보니, 공유기때문에 골치깨나 썩는 사람들이 많은 모양이다. 그래서 오늘은 정보보안이나 프로그래밍이 아닌, 우리 일상에서 가장 골치아픈 문제를 다뤄보자. 짧게 가겠다. 와이파이 전파가 2.4Ghz 대역을 사용하고 있다면, 사실 가장 좋은 대안은 5Ghz 로 가는것이다. 하지만 이런 당연한 정보를 원하지는 않을것이다... 2.4 Ghz 전파는 혼선, 잡음이 많다. 서로 인접한 채널에서 데이터가 오갈시, 겹치는 주파수 영역의 데이터는 모두 파괴되고 재전송이 일어난다. 이 과정에서 회선이 극도로 불안정해진다. 이를 최소화 시키는것이 핵심이다. 공유기 채널을 1번 채널을 사용하는것을 권장한다. 그 이유는 다음과 같다. 예를 들어 5번 채널을 사용중이라고 가정하자. 5번 채널이 사용하는 주..

    Raw소켓에 대해서...

    소켓 프로그래밍을 배우다보면 로우소켓이라는 신비한 존재를 접하게 된다. 처음 이 로우소켓을 보고나면 재밌는것들이 꽤 많이 떠오른다 TCP - SYN Flood 공격, 공격이 아닌 SYN 스캔, TCP의 다양한 플래그를 건드려 보내보는것, IP위조 등등... 네트워크 이론을 공부하며 봐왔던 프로토콜 헤더를 입맛대로 수정해서 전송할 수 있다니 !! (물론 이런걸 타인의 시스템에 쏘면 위법이다...) 나도 윈도우에서 개발한지가 10년이 되었고 이제 막 리눅스에서 코드를 짜기 시작했는데, 아직도 MS에게 맞은 뒤통수가 얼얼하다. 본론으로 들어가기에 앞서, 나의 뒤통수 일대기를 들려주고자 한다... 내가 고3때, 소스 IP주소를 위조 해서 여러가지 테스트를 해보고 싶었다. 로우소켓의 존재를 알았고, 그 점을 적극..

    암호학 - 소수 판별

    프로그래밍 입문 단계에서 흔히들 과제로 많이 접해보는 문제이다. 특정 수를 입력했을때 이녀석이 소수인지 아닌지 판별하는 알고리즘을 짜보라는 식의 과제. 만약 여러분이라면 어떻게 풀겠는가? #include int main() { int i, a; a = 12312313; /*임의의 수를 입력 받는다. (귀찮)*/ for ( i=2 ; i

    스타크래프트 배틀태그뷰어 (닉네임 변경에 대응 가능)

    www.youtube.com/watch?v=TFBBbpXEigU&ab_channel=TESTROOM-19- 욕하고 어그로 끌고 도배하고... 매너게임 합시다 여러분... 배틀태그로 악성유저를 걸러내세요. 방 입장까지는 막지 못하더라도 누구를 추방해야하는지 정도는 알 수 있습니다. 배포중입니다 ! github.com/devadversary/StarCraft_GetBattleTag devadversary/StarCraft_GetBattleTag 방장 입장에서 IP 기반으로 악성 유저를 걸러내는것이 쉽지 않다는 사실을 알고 있습니다. 이제는 방장도 일반 유저도 모두 상대의 배틀태그를 알아낼 수 있습니다. 악성 유저가 닉네임을 바꿔 github.com 다운로드 방법을 잘 모르시는 분들도 계셔서 알려 드립니다.

    디스어셈블 라이브러리 "Zydis" 빌드하기

    분석가들과 개발자, 해커들의 영원한 친구 OllyDBG 그리고 그의 친구 X64DBG 의 그것이다. 얘네들은 내부적으로 Zydis, XED 라는 디스어셈블/어셈블 오픈소스 라이브러리를 사용하여 사용자에게 UI로 보여준다. 라이센스 또한 MIT 허가서를 사용하므로 GPL에 대한 부담없이 사용하기 좋은 디스어셈블 라이브러리다. 제작자 일동에게 정말 경의를 표한다... 나는 리버싱을 해본 경험이 분석가들에 비하면 세발의 피이므로 이런식으로 먼저 맛을 보려고 한다. 음~ 여러분도 함께 같이 찍어 먹어보도록 하자. 우선은 라이브러리를 받아야겠다. github.com/zyantific/zydis zyantific/zydis Fast and lightweight x86/x86-64 disassembler librar..

    스타크래프트 리마스터 간이 맵핵 시연

    www.youtube.com/watch?v=uFirSBy4tnQ&ab_channel=TESTROOM-19- 역시 스타는 재미삼아 가볍게 갖고놀기 좋은 게임 같다. 배포, 코드공유는 하지 않으므로 관련 문의는 하지 마시길. 난 그냥 연구만 할 뿐이다.

    윈도우 - 60초마다 무선랜 불안정해지는 현상 [무선랜 안정화]

    "젠장 또 이러네. 렉때문에 죽었어..." 게임은 유선랜으로 하라는 말이 있다. 무선랜으로 하면 묘한 렉 현상이 있기 때문이다. 윈도우즈에서 무선랜 사용시 1분마다 한번씩 아주 잠깐씩 핑이 튈 때가 있다. 주변 와이파이가 뭐뭐있나 스캔하기 위해서 1번 채널부터 161번채널까지 쭉 돌기 때문이다. 문제는 사용자가 사용중일때도 채널이 수시로 돌아가버린다는 점이다. 병장님 TV 보고계시는데 채널을 멋대로 돌려버리는 꼴이다. 그 찰나의 사이 전파를 수신받지 못하고 결국 데이터가 소실되어 핑이 튀고 게임이 간헐적으로 렉이 걸리게 되는것이다. 그래서 무선 환경에서 게임하지 말라는 이야기가 퍼지게 된 것이다. 이것은 마이크로소프트의 잘못이 크다. 운영체제 자체에서 무선랜을 이런식으로 운용하니말이다... 실시간성이 중..

    WIFI 데이터 스니퍼를 만들던 중 발생한 문제. [비표준 비콘]

    뻘짓의 시작은, 802.11 비콘 프레임 파서를 만드는중 자꾸 알 수 없는 이유로 프로그램이 죽는데서부터 시작한다. 위의 저 데이터덩어리들은 Iptime 의 공유기가 송신해온 비콘 신호인데, 저놈을 파싱하면 프로그램이 죽는다. 내가 놓친게 있나 싶어서 pcap 파일 형식으로 해당 바이너리를 재작성 후 와이어샤크에 올려보았더니 봐라, 저 불경한 빨간색을. 결론은 Iptime 사에서 표준을 미준수한 데이터를 덧붙여 비콘을 송신한것이 문제였다. 혹시나 해서 다른 비콘 신호들도 같이 조사 해보았다. 그런데 짜잔? Iptime 말고도 수많은 제조사들이 이상한 비표준 데이터를 덧붙여 와이어샤크를 불경한 빨간색으로 뒤덮이게 만들었다. 더 가관인것은 LG U+Net 공유기는 벤더 ID 가 shenzhen이다. 선전은 ..

    Winmain 코드 (귀차니즘 해소용)

    다들 짤 줄 알지만 막상 짜려면 귀찮은 그 코드이다. 필요할때마다 복붙해서 쓰려고 그냥 올려놓았다. #include #define CLASSNAME TEXT("TestModule") LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, Message, wParam, lParam); } int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) { WNDCL..