안녕하세요 호박감자입니다!
오늘은 '리버싱 핵심원리'에서 메시지 후킹부분을 실습하며 일어난 에러들에 대해서 그 해결방법을 적어보고자 합니다.
메시지 후킹 실습을 실행하게 되면 키보드 입력시 프로그램이 먹통이 되어 버립니다.
저는 학교 리버싱 과제에서 이 점을 고치고, 메모장만을 후킹해야 했는데
이 먹통이 되는 원인을 찾는 것에서 굉장히 애를 먹었습니다.
그래서 혹시 저같이 고민하시는 분들이 있으면 도움을 드리고자 이 글을 작성해보려 합니다.
# error 1. 키보드 입력시 먹통
이 문제는 프로그램에 디버깅 옵션을 설정하고 컴파일해줌으로써 해결할 수 있습니다.
먼저 교재에 코드가 다 나와있으니, 그 코드를 visual studio에서 작성해줍니다.
이 소스코드를 다운받을 수 있는지는 잘 모르겟어요. 저는 하나하나 입력했습니다 ㅎㅎ💦
다 입력했으면 컴파일 해야하는데 그전에 이걸 바꿔줘야 합니다.
저기 빨간색 동그라미 부분을 x64로 바꿔줘야 합니다.
그 후 컴파일하시면 됩니다!
저는 이렇게하니까 먹통안되구 후킹이 잘 됐어요
(방금 혹시몰라서 다시 해봤는데 잘 돼용:-) )
그런데 WORD나 cmd 창에서 키보드 입력해도 먹통안되구, 노트패드에서도 먹통안되구 후킹이 잘 되었는데
이상하게 PC 카카오톡에서 키보드 입력시 먹통이 되요. (왜 그런지 아시는분 댓글로 알려주세요!)
이 문제를 해결하고자 한다면, 어차피 notepad만 후킹하고자 하는 거니까 notepad의 스레드 ID를 SetWindowsHookEx의 4번째 파라미터에 넣어주시면 됩니다. 그럼 메모장에만 훅이 설치되서, PC 카톡은 정상 실행됩니다.
(이 방법의 단점은 메모장이 실행중이어야 한다는 점, 메모장이 여러 개 실행되고 있을 때 그 중 하나에만 후킹이 된다는 점입니다. 물론 제가 API 활용이 미숙해 거기까지 코딩을 하지 못한 것일 수도 있습니다.)
아 그리고 HookMain이랑 KeyHook 둘 다 x64로 컴파일 해주셔야 합니다
왜 이렇게 x64로 바꿔줘야 하는지는 다들 느낌이 오셧죠?
( x64 프로그램에는 x64 dll이 들어가야 하니까! )
# error 2. dll 핸들 문제
이거는 저만 그런지는 모르겠는데 SetWindowsHookEx API를 호출할 때 세번째 파라미터가 DLL의 핸들이잖아요?
그런데 이게 자꾸 NULL 값이 들어가더라구요
DLLMain에서 저렇게 핸들값을 설정해주는 부분이 실행이 안되는 거 같았어요
혹시 후킹이 제대로 되지 않으신다면 핸들값이 제대로 들어가고 있는지 한번 확인해보세요!
핸들값 확인하는 코드↓
저 빨간 코드를 넣어서 실행해 봤을 때, hooking error라고 뜨면 저처럼 핸들값이 안 들어가고 있는 거니까 따로 넣어주세요!
저는 HookMain에서 넣어줬어요
빨간색 쳐져 있는 부분이랑 위에 사진(핸들값 들어갔나 확인)에서 hDll이 들어가도록 코드처럼 고쳐주시면 됩니다.
# error 3. dll로 컴파일하는 법
HookMain.cpp은 exe파일로 컴파일하면 되지만, KeyHook.cpp은 dll로 컴파일해야 합니다.
그런데 그러기 위해서 DLL로 프로젝트를 만들게 되면, 여러가지가 포함되어 만들어지게 됩니다.
그래서 혹시 이게 싫으신 분들을 위해 빈프로젝트에서 dll로 컴파일하는 방법을 알려드리겠습니다.
일단 빈프로젝트로 프로젝트를 만들어 줍니다.
그리고 코드를 작성한다음, 컴파일 하기 전에 이 옵션을 바꿔주면 됩니다.
빨간색으로 표시되어 있는 디버그 속성을 눌러주면 됩니다.
(blog는 이 프로젝트 이름입니다.)
그럼 속성 페이지 창이 뜨는데, 구성 속성 -> 일반 -> 구성 형식을 .dll로 바꿔주면 됩니다.
확인 누르고 빌드하면 dll로 컴파일이 되어 bin 폴더에 .dll 파일이 생성된 걸 볼 수 있습니다.
(error 1의 x64로 바꿔주는거 잊지 마세요!)
음.. 그런데 이렇게 해서 만들었을 때 잘 되다가 에러가 날 때가 있더라구요
방법의 문제인지는 모르겠지만, 혹시 몰라 한가지 방법을 더 알려드리겠습니다.
새로 만들기에서 Windows 데스크톱 마법사를 클릭합니다.
그럼 이런 화면이 나옵니다.
그 다음 만들기를 누르면
이런 창이 뜨고 종류를 .dll로 선택해서 만들면 됩니다.
저같은 경우엔 저 밑에 추가 옵션을 설정안하고 그냥 만들었는데, 그러면은 dll main이 기본적으로 있고, 헤더는 있었는지 기억이 잘 안나네요
그런데 기본적으로 있는 dll main 안 쓰고 그냥 새 소스코드 만들어서 거기에 main이랑 여러 함수들 넣었었는데 그래도 잘 실행됐어요
# error 4. 디버깅 옵션(멀티 바이트)
이 에러도 참 난감했었는데요. 과제를 위해서 인터넷에서 여러 소스코드들을 가져왔었는데
그 중에서 한 소스코드에서 문자열과 관련된 변수에 자꾸 빨간줄이 뜨더라구요.
(변수였는지 함수였는지는 정확히 기억이 안나네요 ㅎㅎ)
LPCTSTR 이런 타입들 있잖아요.
자꾸 에러가 뜨길래 코드의 문젠가 싶어 하염없이 타입을 바꿔줘 봤지만 아무 소용이 없더라구요.
사실 이런 타입들을 사용해 코딩해 본적두 별루 없구... 그래서 멘붕이 오더라구요
인터넷 소스코드를 그대로 실행했는데 대체 왜 에러가 나는걸까!
그 해답은 바로 디버깅 옵션에 있었습니다.
에러 3에서처럼 디버그 속성에 들어가서 고급 -> 문자 집합을 바꿔주면 됩니다.
저는 유니코드 문자 집합에서 멀티 바이트 문자 집합으로 바꾸니까 정상 실행 되더라구요
여러분도 문자열 관련된 타입에서 빨간줄 뜨면 이 속성을 바꿔보세요!
5. std:: string
혹시 string 함수를 쓰려고 string.h 헤더파일까지 제대로 넣어줬는데, 에러가 나셨던 분 있나요?
대체 stirng 함수에 왜 자꾸 빨간 줄이 뜨는 건지.. 이런 에러는 어떻게 검색해야 하는지 멘붕이 왔었는데
결국은 C++의 문법과 관련된 문제인 것 같아요.
만약 저와 같은 문제라면 string 앞에 std:: 라고 써주시면 해결 될 겁니다!
이게 class와 관련된 문제이지 않을까 조심스럽게 생각해보지만, C++에 대해서 잘 몰라서
언젠가 공부하게 되면 이 글을 수정해서 적어놓겠습니다.
이렇게 리버싱 핵심 원리 책의 메시지 후킹 실습을 하며, 그리고 그 실습을 수정하는 과제를 하며 겪었던 에러들에 대해 정리해보았습니다.
사실 굉장히 사소한 부분에서 일어났던 에러들이지만 오히려 너무 사소해서 해결방법을 찾기가 쉽지 않더라구요..
(제가 검색을 잘 못한 걸 수도 있지만요ㅜㅜ)
혹시나 저처럼 이런 문제에 좌절하고 계시는 분들이 있을까 이 에러들에 대해 정리해 보았습니다.
하지만 사실 이 과제를 한 시점과 이 글을 올리는 오늘이 시간이 많이 지난 뒤라 약간의 아쉬움이 있네요.
더 많은 에러가 있었을 테지만 기억이 잘 안나서..
하지만 이 에러들 5가지로 고민 중이시던 분들에게 도움이 되었으면 좋겠습니다!
다들 힘내시고! 좌절하지 마시고! 꼭 에러를 해결하시길 바랍니다! 화이팅!!!
'리버싱' 카테고리의 다른 글
Reversing.kr Position 문제 풀이 (0) | 2023.07.03 |
---|---|
Reversing.kr ImagePrc 문제 풀이 (0) | 2023.06.18 |
Reversing.kr Replace 문제 풀이 (0) | 2023.06.16 |
Reversing.kr Music Player 문제 풀이 (0) | 2023.06.15 |
Reversing.kr Easy Keygen 문제 풀이 (0) | 2023.06.02 |