본문 바로가기

Software/C++&MFC17

리버싱 핵심원리, 메모장 WriteFile() 후킹 - 64비트에서 따라하기 리버싱이라는 흥미로운 분야에 발을 담근지는 벌써 몇 년이나 되었지만 꾸준하게 공부한 적이 없어서 그냥 재미로 예제나 따라 해 보는 수준입니다. 그래도 그나마 공부다운 공부를 하게 만들어준 자료가 바로 나뭇잎 책이라고 알려진 '리버싱 핵심원리'인데요. 저 같은 초보도 이 책 하나만 보면 리버싱이란 게 뭐구나 감 정도는 잡을 수 있게 해 주고 그리고 주변에 후기를 찾아보면 이거 하나로도 경지에 오르신 분들도 계실 정도로 아주 유익한 교재라고 생각이 됩니다. 오늘은 리버싱 핵심원리의 책 3부 30장에 있는 윈도 메모장 WriteFile() 함수 후킹 예제를 64비트 윈도에서 여러 가지 에러들을 해결하면서 실습한 후기를 정리해 보려 합니다. (개인적으로 재미도 있었고 가장 많이 공부가 된 부분이라서 언제 한번 .. 2021. 9. 27.
프로세스 이름으로 PID 번호 구하기 이름으로 해당 프로세스의 PID 번호를 구하는 방법입니다. 위 작업 관리자 캡처 화면의 경우 Notepad.exe의 PID는 5528입니다. 그런데 이 번호는 메모장이 실행될 때마다 변경되기 때문에 PID가 필요한 경우 유용하게 사용할 수 있습니다. #include #include DWORD GetProcessByFileName(LPWSTR name) { DWORD process_id_array[1024]; DWORD bytes_returned; DWORD num_processes; HANDLE hProcess; WCHAR image_name[MAX_PATH] = { 0, }; DWORD i; EnumProcesses(process_id_array, 1024 * sizeof(DWORD), &bytes_r.. 2021. 8. 18.
inline 함수 인라인 함수는 함수를 호출하는데 소요되는 자원을 최소화하기 위해서 호출될 함수 블록 전체를 프로그램과 한 몸처럼 컴파일해서 실행되도록 하는 함수를 말합니다. 일반적인 함수는 특정 위치에 컴파일된 함수가 위치하고 호출이 될 때마다 함수가 있는 곳으로 와서 함수를 수행하고 다시 원래 프로그램으로 돌아가는 식으로 동작하지만 인라인 함수는 호출되는 위치들마다 함수 블록들이 위치하고 있어서 그 자리에서 바로 실행되는 것처럼 수행된다고 하네요. 오픈소스 프로젝트로 공부하다 보면 아래 사진처럼 inline이라는 키워드로 시작하는 함수를 종종 볼 수 있습니다. 바로 이런 형태가 인라인 함수가 사용된 부분인데요. 함수 선언할 때 맨 앞에 "inline"이라는 키워드만 추가해서 사용할 수 있습니다. 인라인 함수는 언제 사.. 2021. 4. 16.
문자열 상호 형변환, char* ↔ std::string ↔ CString ↔ std::stringstream 문자열간 형변환 방법입니다. 워낙 많이 쓰이기 때문에 자료가 많긴하지만 매번 찾아보는것도 귀찮아서 정리했습니다. char* ↔ std::string char* to string #include char c[256] = "Hi there"; std::string str(c); // OR std::string str = c; string to char* #include std::string str = "Hi there"; const char* c = str.c_str(); string 을 char* 로 변환하기 위해서는 const char*을 사용해야 함. 이경우 당연히 수정이 불가능 수정가능한 문자열로 만들고 싶을때는 동적할당을 통한 메모리 복사를 해야함 #include std::string str = ".. 2019. 10. 22.
[라이브러리] C++ 라이브러리, Boost 빌드하고 사용하기 Boost Libraries C++ 개발자라면 누구나 사용한다는 "Boost"를 이제서야 알게되어 설치(?)를 해 봤습니다. 공식 홈페이지에서 필요한 자료들을 받아서 빌드하고 Visual Studio에서 사용할 수 있도록 하는 방법입니다. Boost C++ Libraries Welcome to Boost.org! Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of .. 2019. 10. 8.
MFC그래프 라이브러리, ChartCtrl 마우스 휠 기능 추가 C++/MFC에서 다양한 그래프를 손쉽게 그릴수 있도록 해주는 오픈소스 라이브러리인 ChartCtrl 관련 포스팅입니다. 해당 라이브러리에 대한 소개와 간단 사용법은 관련 포스팅에서 확인해 주세요. 'ChartCtrl' 태그의 글 목록 블로그 EveryX 입니다. C++, Python, Arduino등 학습노트로 시작했고, 신기하고 재미있는 제품 리뷰와 맛집/여행에 대한 추억도 남기고 있습니다. kwonkyo.tistory.com 이 라이브러리는 정말 잘 만들어진 라이브러리라서 다양한 기능들이 구현이 되어 있어 사용하기에 편리합니다. 그런데 사용을 하다보면 아쉬는 기능이 하나둘 보이기마련이죠. 이럴때 이런 오픈소스 라이브러리의 잠재력이 드러납니다. 오래 된 코드이긴 하지만 프로그래밍을 배우고 있는 입장에.. 2019. 10. 7.
MFC 그래프 라이브러리, Chart Control 기본 사용법 - 보통그래프 및 봉차트 그리기 2022-01-14 update log: 코드 중 오타 수정. 이전 포스팅에서 소개했던 그래프를 그려주는 MFC 라이브러리, Chart Control의 기본 사용법입니다. CodeProject에도 기본 사용법이 잘 나와있지만 저같은 초보는 맘먹고 정독해야 겨우 이해할 수 있기 때문에 그 겨우 이해한 내용을 기록으로 남깁니다. 라이브러리 소스는 아래 포스팅 참고하시면 됩니다. [라이브러리] MFC 그래프 라이브러리 - High-speed Charting Control MFC용 그래프 그리는 라이브러리를 소개합니다. Codeproject사이트에 등록된 소스인데 X-Y 기본 그래프 뿐만아니라 캔들스틱, 바차트 등 다양한 기능을 지원하는 라이브러리 입니다. 원본 출처: https://www.cod.. kwonk.. 2019. 10. 5.
[라이브러리] MFC 그래프 라이브러리 - High-speed Charting Control (ChartCtrl) MFC용 그래프 그리는 라이브러리를 소개합니다. Codeproject사이트에 등록된 소스인데 X-Y 기본 그래프 뿐만아니라 캔들스틱, 바차트 등 다양한 기능을 지원하는 라이브러리 입니다. 소스 출처: https://www.codeproject.com/Articles/14075/High-speed-Charting-Control 제작자가 공개한 라이브러리의 원본파일입니다. Codeproject사이트에서 직접받을 수도 있지만 혹시나 없어질까봐 하나 받아두었습니다. 그리고 원본소스는 컴파이시에 유니코드 주의가 발생해서 아래는 유니코드로 다시 저장한 버전입니다. 코드내용은 동일합니다. 사용조건 다음은 제작자가 허용한 소스이 사용조건입니다. 기본적으로 상업적 이용도 허용한다고 하네요. This code may be.. 2019. 9. 20.
C++ 동적 메모리 (Dynamic Memory) 할당 필요성 동적할당이 왜 필요할까요? 동적메모리 할당은입력갑에 의존적인 프로그램을 만들어야 할 경우 유용하게 쓰일 수 있습니다. 예를들어 사진이나 영상 등 어떤 파일을 읽어야 하는데 읽기 전에는 그 크기를 모르기 때문에 메모리에 얼마나 공간이 필요한지 알수가 없는데 이럴때는 동적할당이 꼭 필요합니다. 다음과 같은 코드를 컴파일 해보면 컴파일 에러가 납니다. int i = 5; int arr[i]; i라는 변수에 5가 할당되니까 정수형 배열 “arr[i]”은 정수형 x 5개 만큼의 크기가 필요하다는 것이 자명한데 왜 에러가 날까요? 이유는 컴파일시에 변수 i 가 정수형이라는 것만 정해지지 여기에 값 5가 들어가는건 프로그램이 실행될 단계에서 일어나는 일이라고 합니다. 그래서 컴파일러는 “i”에 뭐가 들어가있는.. 2019. 2. 28.
[컴파일 오답노트] error C2440 ON_WM_NCHITTEST 에러 인터넷에서 찾은 오래전에 만들어진 어떤 소스를 컴파일 하려는데 에러가 발생했습니다. 에러메시지는 error C2440: 'static_cast': 'UINT (__thiscall CACListWnd::* )(CPoint)'에서 'LRESULT (__thiscall CWnd::* )(CPoint)'(으)로 변환할 수 없습니다. note: 기본 형식에서 파생 형식으로 캐스트하려면 dynamic_cast 또는 static_cast가 필요합니다. 앞뒤로 형이 맞지 않는다는 내용인거 같은데 뭔말인지 잘 모르겠습니다. 에러가 발생한 부분은 메시지 맵에서 "ON_WM_NCHITTEST()" 부분이었습니다. BEGIN_MESSAGE_MAP(CACListWnd, CWnd) ON_WM_NCHITTEST() END_MESS.. 2019. 1. 3.
HTML Parcer 예제프로그램 분석과 코드 활용방안 Intro 이전 글에서 CodeProject.com에서 받은 코드를 컴파일하는 간단한 방법을 소개한 적이 있었는데 그때 받았던 코드를 본인의 프로그램에 사용하기 위해서 나름대로 로직을 분석한 결과를 정리해 두려 합니다. CodeProject.com에서 다운받은 C++ 프로젝트 컴파일 하는 방법 다운받았던 프로그램은 "HtmlParser"라는 프로그램으로 웹페이지 주소를 넣으면 해당 코드를 받아와서 HTML 코드를 분석해서 코드의 계층구조를 트리 형태로 시각화 시켜주고 원하는 특정 태그나 속성을 필터링 할 수도 있는 그런 기능을 합니다. 저는 전자공시 사이트인 Dart에서 필요한 기업정보를 가져오기 위해서 웹페이지 크롤링 방법을 고민하고 있는 중입니다. 당현히 HTML파싱이 빠질수 없기 때문에 잘 만들어진.. 2018. 12. 4.
[C++/MFC] CString 다양한 기능들 정리 CString은 MFC에서 문자열을 처리를 아주 쉽게 처리할 수 있도록 제공해주는 클래스라서 내장된 기능이 어마어마 합니다. 사용법만 알면 간단히 사용할 수 있도록 만들어 두었는데 그 내부를 보면 사용하는것 만큼 간단하지는 않습니다. 그 많은 기능들을 최적화해서 (물런 네이티브 문자열 처리에 비해 속도가 느리기는 함) 제공하기 위해서는 상당히 복잡한 구조로 되어있습니다. 언제나 처럼 저는 복잡한 내부구조는 관심없고, 쉽게 쓸수만 있으면 그만입니다. ㅎ 문자를 자르고 붙이고 뭐 이런건 이본이고 그외에도 다양한 기능을 CString 자체에서 할수 있으니 MFC를 사용한다면 어떤 기능들이 있는지 알아둘 필요는 있을 것 같습니다. 다는 아니지만 음 이정도는 내가 써볼만 하겠다 하는 기능들만 모아봤습니다. CSt.. 2018. 12. 3.
enum의 비트연산 활용 (여러가지 조건 한번에 비교하기) 열거자라고 하는 enum의 bit 연산을 활용하면 복수의 조건을 비교선택해야 하는 상황에서 간단하게 코드를 작성할 수 있습니다. 평소에 enum을 사용한 코드들을 보면 깊이 생각지 않고 개발자가 명명한 enum의 이름대로 직관적으로 코드의 흐름만 이해하고 넘어갔기 때문에 배우지 못했던 방법이었는데 알고나니 유용한것 같습니다. enum의 용도 enum은 말그대로 나열되는 이름들에 차례대로 번호를 부여해서 논리적 관계를 기술하기 여려운 개념도 산술적으로 기술할수 있도록 해주는 유용한 기능입니다. 그래서 코드의 가독성이 높아지도록 할 수 있는데요. 예를 들어 다음과 같습니다. enum day { Mon=1, Tue, Wed, Thr, Fri, Sat, Sun }; int today = Mon; int some.. 2018. 11. 29.
CodeProject.com에서 다운받은 C++ 프로젝트 컴파일 하는 방법 인터넷에 공개된 소스코드를 받아서 컴파일하는 방법을 알아 보겠습니다. 한번만 해보면 별거아닌건데 제가 공부를 시작했던 초반에는 남들다 만들어 놓은 프로젝트인데도 컴파일을 못해서 사용을 못했던 안타까운 기억이 있습니다. 이런내용도 누군가에게 도움이 되길 바라며 기록을 남깁니다. 저는 요즘, 테이블로 작성된 웹페이지를 받아와서 HTML코드를 파싱한 후 필요한 데이터를 골라오도록 하는 프로그램을 만들려고 공부를 하고 있습니다. 이런 때, 가장 쉬운방법은 인터넷의 많은 능력자분들께서 만들어 놓은신 예제 코드를 활용하는 거죠. 어디서 어떻게 시작해야 할지 모를때, 예제 프로그램에서 내가 필요한 부분들을 하나씩 수정해 나가다 보면 원하는 결과물도 빨리 얻을 수 있고, 내가 어떤 부분을 몰랐는지도 알수있게 되죠. 또.. 2018. 11. 14.
연산자 (Operators) 정리 C++ 언어의 연산자 총괄표 입니다. (최대한 모든 연산자를 담고자 했습니다.) 연산자 표기 사용법 및 설명 범위확인 :: 여러범위에서 식별자를 구분 멤버선택 . 혹은 -> 구조체 및 클래스의 멤버를 참조 베열 첨자 [ ] arr[5] //배열 참조 함수 호출 ( ) function( ) // 함수호출 더하기 + x+y 빼기 - x-y 곱하기 * x*y 나누기 / x/y 나머지 % x% 더하기 할당 += x += 5; // x = x + 5 빼기 할당 -= x -= 5; // x = x - 5 곱하기 할당 *= x *= 5; // x = x * 5 나누기 할당 /= x /= 5; // x = x / 5 나머지 할당 %= x %= 5; // x = x % 5 증가 ++ x++; ++x; 감소 -- x--;.. 2018. 11. 12.