뻘짓
Direct2D C++ UI 라이브러리 "Foxhop.lib"
https://youtu.be/z85mqV4YdK0 모션그래픽이 적용된 UI 라이브러리를 만들어보고 싶었다. 영화 속에나 있던 화려한 그래픽 화면을 현실에서 실제 응용프로그램으로 충분히 쓸 수 있을법 한데, 그런게 없으니 직접 만들수밖에 없었다. Direct2D 기반이라 윈도우즈 환경에서밖에 사용할 수 없다는게 가장 아쉬운 부분이라 말할 수 있겠다. 과정은 상당히 험난했는데, 투명한 윈도우 위에서 반투명 오브젝트를 출력하기위한 갖은 노력의 일환으로 OpenGL을 이용하여 화면을 렌더링 해보는것이 시작이었다. 리눅스에서도 사용 할 수 있을테니 나쁘지 않은 선택으로 보였으나 텍스트 출력이 골자였다. Freetype 이라는 라이브러리로 폰트 파일을 로드해 글자 하나씩 직접 렌더링 하는 작업을 나는 감당 할 수..
[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..
Windows에서 FFmpeg 빌드하기 (빌드된 파일 첨부)
FFmpeg 는 영상 및 사운드 인코딩/디코딩 전문 라이브러리이다. 이 라이브러리 안에는 x264, x265, VP8, VP9 와 같은 저명한 알고리즘들이 들어있다. 화면을 녹화하거나 실시간으로 전송 해야 할 일이 있다면, 2022년 현재로써도 x264 코덱 말고는 마땅히 뾰족한 대안이 없다. 다른 코덱을 쓸 수야 있긴 하지만 인코딩 성능이 *아직은* 많이 부담된다. 예전 글에서도 VP9 인코딩 속도가 초당 5프레임도 안 나온다고 언급 한 바 있다. (라이브러리에서 하드웨어 가속을 못 받았기 때문이다. libvpx 에서 이를 지원 해주면 참 좋을텐데 참 아쉽다.) 아직까지도 수많은 기업들에게 이 MPEG 이라는 그룹은 골칫거리다. 자사 코덱을 배포한지 오래되어, 지원하는 하드웨어도 이미 많고, 당연히 하..
[짧은글] 블루투스 페어링 : sspmode 0
이상한 버그를 발견하여, 긴급하게 작성하는 글이라 다듬어지지 않고, 정제되지 않은 표현이 나올 수 있음을 미리 양해를 구합니다. 내가 페어링을 "하는 쪽" 이 아니라, 페어링 요청을 "받는 쪽" 이야기이다. 외부 기기에서 페어링이 붙기 위해서는 Discoverable 모드가 활성화 되어있어야 한다. 자기 자신의 존재를 외부에 알려서 나한테 붙으시오~ 하는거다. 휴대폰에서 스캔된 장치를 눌러서 내 PC로 (또는 개발중인 임베디드 리눅스 장치로) 페어링 시도를 위해 PIN 입력 창을 띄우려면, sspmode 가 0으로 비활성화 되어야 한다. 현재 상태는 sspmode가 Enabled 상태. 그러니까 1 로 셋팅 되어있다는거다. 그런데 이놈을 끄려고 하면 안된다. IO에 에러가 있다면서 불만을 토로한다. 당연..
와이파이 끊김이 심하다면
최근 블로그 유입 통계를 보니, 공유기때문에 골치깨나 썩는 사람들이 많은 모양이다. 그래서 오늘은 정보보안이나 프로그래밍이 아닌, 우리 일상에서 가장 골치아픈 문제를 다뤄보자. 짧게 가겠다. 와이파이 전파가 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
디스어셈블 라이브러리 "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- 역시 스타는 재미삼아 가볍게 갖고놀기 좋은 게임 같다. 배포, 코드공유는 하지 않으므로 관련 문의는 하지 마시길. 난 그냥 연구만 할 뿐이다.
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..
Winmm을 통한 사운드 입출력장치 얻어오기
#include #include #include #include int main() { IMMDeviceEnumerator* pEnumerator; IMMDeviceCollection* pCollection; unsigned int n, i; IMMDevice* device; IPropertyStore* store; PROPVARIANT varName; _wsetlocale(LC_ALL, L"korean"); /*정상적인 유니코드 출력을 위한 로케일 명시*/ CoInitialize(NULL); /*COM 사용을 위한 초기화. 윈속의 WSAStartup과 같은 개념*/ /*IMM 열거자를 얻어온다*/ CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX..
libvpx를 통한 인코딩 예제
극단적으로 간단하게만 작성해본다. 유용하지 않은 예제일 수도 있다. #include #include "./vpx_version.h" #include "vpx/vpx_codec.h" #include "vpx/vpx_image.h" #include "vpx/vpx_integer.h" #include "vpx/vpx_encoder.h" #include "vpx/vpx_decoder.h" #include "vpx_ports/msvc.h" #include "vp9/vp9_iface_common.h" #include "vp9/vp9_cx_iface.h" int main() { vpx_codec_iface_t* vpx; vpx_image_t* vpximg; vpx_codec_ctx_t codec; vpx_codec_..
libvpx 빌드하기 (파일 첨부 되어있음)
MPEG의 H.264 정말 너무 좋다. 왠만한 하드웨어 가속은 다 받을 수 있고, 화질도 좋고, 용량도 작고, 스트리밍에도 최적이다. 일반 사용자에게는 말이다. 문제는 개발 할 때 이다. 이놈들을 사용하기 위해 대중적으로 사용되는 라이브러리는 FFMPEG이며 이는 GPL이 걸려있다. 내 소스를 공개해야한다. 더 큰 문제는 이 H.264 라는 규격 자체가 특허가 걸려있어 로열티를 지불 해야 한다. 최근 AOM 결성으로 그를 의식한 MPEG는 웹 서비스에 대해서만 로열티 지불을 면제 해주고있다. VP8, VP9 등의 코덱은 구글이 인수한 코덱을 기반으로 개량된 코덱이다. 구글이 통크게 모두 제약없는 오픈소스로 풀어버렸다. 이 코덱들은 비교적 최신 코덱이라 하드웨어 가속을 빋지 못할 수도 있다. 인텔 i3, ..
OpenSSL을 통한 소수 생성 (랜덤)
#include /*openssl의 bn에서 bio를 참조하고 bio에서는 윈속을 참조함. 이거 추가 안하면 링크에러남.*/ #pragma comment(lib, "ws2_32.lib") #include "openssl/bn.h" /*openssl의 빅넘버 관련 헤더*/ /*openssl의 스태틱 빌드된거 찾아보면 라이브러리 받아서 사용 할 수 있다.*/ #pragma comment (lib, "libcrypto_static.lib") /*여담 : 윈도우즈에서 openssl 소스 받아다가 빌드 하려면 온갖 생쇼를 해야한다. 이미 누군가 빌드해둔 스태틱 버전 받아다 그냥 쓰는게 정신 건강에 이롭다.*/ /** @brief [콘솔 전용]16바이트 단위로 개행하며 16진 값을 프린트 한다. @param buf..
무선랜 인터페이스 얻어오기
#include #include /*wlanapi.h 를 include 하기 전에 windows.h 를 include 해주자. wlanapi.h 에서 일부 매크로 상수를 windows.h 에서 끌어다 사용하기 때문에 이 조치가 없다면 정상적인 함수 선언이 들어가지 않게된다.*/ #include #include #pragma comment(lib, "wlanapi.lib") int main() { HANDLE hClient; DWORD CurVer; DWORD Err; PWLAN_INTERFACE_INFO_LIST pInterfaceList = NULL; int i; char buffer[256]; Err = WlanOpenHandle(2, 0 , &CurVer, &hClient); if (Err != E..
DirectX 스크린 캡쳐 (DXGI 캡쳐 예제)
GDI를 사용한 화면 덤프는 끔찍하게 느리다. 그래서 그래픽카드의 도움을 받기로 했다. #include #include #include #include #include #pragma comment (lib, "d3d11.lib") #pragma comment (lib, "dxgi.lib") /** @brief 텍스쳐 생성함수 */ ID3D11Texture2D* CreateTexture(ID3D11Device* d3d11, int width, int height, DXGI_FORMAT colorformat) { D3D11_TEXTURE2D_DESC td; ID3D11Texture2D* OutputTexVal; if (!d3d11) return NULL; memset(&td, 0, sizeof(td)); t..