티스토리 뷰
<해당 포스트에서 소개하고 있는 책 중 "윈도우 실행 파일 구조와 원리로 배우는 리버스 엔지니어링"은 한빛 미디어로부터 지원을 받아 읽고 이에 대한 서평을 작성하는 것임을 알려드립니다. 책에 대한 자세한 정보는 다음을 참고하시기 바랍니다.>
리버스 엔지니어링(Reverse Engineering)이란 뭘까? 임베디드 개발을 얼마 해보진 않았지만, 그냥 나름대로 낸 생각으로는 만들어진 상태에서 어떤 과정을 거쳐 내부 동작 원리를 이해하고 분석하는 것이라고 생각한다. 물론 이게 처음 접하게 되면 무슨 내용인지 하나도 모른다. 그도 그럴게, 진짜 아무 툴도 없는 상태에서 동작원리를 알기란 쉽지 않기 때문이다. 그렇기 때문에 먼저 타겟 디바이스의 데이터 시트나 스펙을 읽고, 분석을 한다. 물론 운영체제와 같이 디바이스 상에서 돌아가는 SW의 형태도 분석하고, 그러고 나서 Trace32같은 하드웨어 디버거를 사용해서 실제 동작이 스펙에 나와있는 것과 같이 이뤄지는지를 확인하고 그 다음 과정을 거치곤 한다. 이런 모든 일련의 과정이 결국 디버깅이라는 게 개인적인 생각이다. 그래서 이 책을 읽고나서도 딱 드는 생각은 "아! 윈도우 환경에서 디버깅을 하기 위해 그 주변 환경을 분석하는 내용이구나" 였다.
참고로 나는 회사에서 전문적으로 리버스 엔지니어링을 다루지는 않지만, 어느정도 프로세서와 운영체제의 동작원리에 대해서는 숙지하고 있는 상태이다. 이 리뷰도 그런 기준에서 작성되었으므로, 이 점을 참고하고 읽으면 좋을거 같다. 추가로 이번에 수령한 책은 2권만이며, 아쉽게도 1권의 내용은 담고 있지 않다. 그래서 1권에서 주로 다루고 있는 PE 구조에 대한 이해는 없는 상태에서 2권을 읽었다.
우선 이 책은 2005년에 출시된 windows 시스템 실행파일의 구조와 원리의 개정판이다. 옛날 동아리 책꽂이에 이 책이 항상 꽂아 있었던게 기억이 나는데, 그도 그럴 것이 책 두께가 정말로 두꺼웠서 기억에 많이 남았다. 나는 열심히 듣지 못했지만 그때는 한창 Windows의 Portable Executable(PE) 구조를 스터디하면서 내부 구조를 살펴볼 수 있었던 좋은 책이었는데, 이번에 64 bit 환경에 맞춰 재출간되었다. 추가로 리버스 엔지니어링에 초점이 초점이 맞춰진 2권에서는 디버거를 직접 만드는 과정을 다루고 있다. 그래서 다루는 내용들이
- 어셈블리 언어를 분석하고,
- 디버거가 처리해야 되는 예외처리들과 이에 다루는 API들을 숙지하고,
- 그리고 마지막으로 직접 디버깅을 구현하는 과정
들로 구성되어 있다.
이 책은 다루는 주제의 특성상 수많은 코드와 코드 테이블, 그리고 내부 구조에 대한 간단한 다이어그램이 담겨져 있다. 그 양의 정도가 좀(?) 많기 때문에, 처음 접하는 독자라면 그 두께에 겁을 먹을 수 있을 듯하다. 실제로 우리 집에도 두께 두꺼운 책들이 여러권 있기는 한데, 이 책이 내가 가진 책중 가장 두꺼운 것 같다. 그래서 한편으로는 챕터별로 분권해서 판매했으면 휴대성이나 보는 관점에서도 조금 좋지 않았을까 하는 생각을 잠깐 가진다.
그런데 그렇게 책이 두꺼운 만큼 코드와 다이어그램에 대한 설명이 정말 자세하다.
특히 코드 진행에 있어 필요한 구조체와 플래그에 대한 설명, 그리고 설명한 필요한 경우 이에 대한 다이어그램와 테이블이 묘사가 되어있어 코드 분석에 있어 조금더 쉽게 이해할 수 있도록 도움을 준다. 글 문맥도 보면 의문을 가질 수 있는 부분에 대해서 질문을 던지고 이에 대한 답변을 서술형으로 풀어놓은 흔적들이 있어, 저자분께서 해당글을 쓰면서 많은 부분을 고민하고 쓴 흔적들이 책 중간중간에 남아있다는 느낌을 많이 받았다.
이 책의 기대 독자층은 C/C++에 익숙하면서 리버스 엔지니어링에 관심이 있는 독자라고 명시되어 있는데, 개인적인 생각으로는 단순히 관심보다는 스택 프레임의 섹션이라는 개념이나 어셈블리 언어가 좀 익숙한 사람? 다르게 표현하면 프로세서의 동작 원리를 잘 이해하고 있는 사람이 봐야 읽으면서도 도움이 될듯 싶다. 확실히 내용 자체가 그림이나 코드 설명이 잘 되어 있다고 하더라도, 내적으로 포함하고 있는 방법론이나 기초 지식들은 처음 접하는 사람이 딱 읽기에는 어려움을 느낄 수 있을거란 생각이 많이 들었다. 나름 나도 이런 걸 조금 봤다고 말하면서도 책을 읽으면서 어렵다 느낀 부분이 간간히 나타났다. 물론 부연 설명이나 도식이 잘 나와있다 하더라도, 책 두께에 놀란 입문자가 계속 읽어나가긴 힘들 듯하다. 이때문에 꼭 코드를 반복해서 따라해보고 정독을 하는 과정이 필요하다.
개인적으로 좀 응용이 될 수 있는 부분은 디버거를 만드는 제일 마지막 파트가 아닐까 싶다. 물론 이 책의 부제가 디버거를 만드는 것이라고는 되어 있었는데, 정말 마지막 300여장정도만 디버거를 만드는 실제 과정이고, 그 이전까지는 쭉 기반 지식에 대한 설명만 담겨있다. 그래서 지루할 수도 있었는데, 이 디버거를 실제로 만드는 부분은 단순히 윈도우 기반에서만 적용되는 개념뿐만 아닌 디버깅의 개념과 필요한 요소에 대해서 소개해둔 터라, 차후 다른 환경에서 디버깅을 위한 툴을 만들고자 할때 조금 응용해볼 수 있는 여지가 있을거라고 생각한다. 그리고 추가로 어셈블리 언어와 디어셈블리 과정에 대한 설명은 굳이 리버스 엔지니어링이랑 목적을 두지 않더라도 컴퓨터 구조에 대해서 관심이 많은 사람이라면 꼭 읽어보면 좋은 파트일 거라 여겨진다.
책에서 다루는 내용이나 저자가 원하는 목적상 책 두께가 두꺼워지는 것은 어쩔 수 없었을 듯 했다. 그만큼 책에서는 필요한 내용을 가능한한 자세하게, 더 세밀하게 묘사된 흔적들이 많이 보인다. 정말 책을 읽으면서도 정말 이책을 저자 혼자 쓰셨을까 하는 의심이 들정도로 너무 리버스 엔지니어링이란 분야를 윈도우 환경과 엮어서 너무 자세하게 설명해주셨다. (한권만 1300페이지인데, 두권 합치면 한 2500여 페이지 되지 않을까... 정말 놀랍다).
물론 디버깅이란 분야의 한계상 많은 사람들이 접하고 즐기기에는 너무 고급적인 주제를 다루고 있지만, 분명 해당 분야를 접하는 실무자에게는 정말 유용한 책이 아닐까 생각된다. 특히 윈도우를 개발환경으로 두고 디버깅 업무를 해가는 개발자에게는 정말 우리나라에서 몇없는 개발서일것 같다.
아 그리고 마지막으로.... 리뷰를 쓰는데 치중한지라 코드 내용을 일일히 따라쳐 본다던가 분석하는 과정을 많이 수행하지는 못했지만, 글 맥락을 읽으면서도 "아 정말 이 책을 이해하는데 있어서는 실습이 중요하다" 라는 걸 많이 느꼈다. 다른 개발서 리뷰때도 종종 말하는 내용이지만, 진짜 좋은 개발서는 독자가 쉽게 읽고, 따라하면서 이해할 수 있는 그런 책이라고 생각하고, 이 책도 그런 관점에서는 좋은 개발서라고 본다. 그러니 제발... 두께보고 겁내지 말고 1권부터 보자. 제발~~
그나저나 이 책은 어디에 꽂아야 되나 걱정이다..
'Hobby > Book' 카테고리의 다른 글
[Book] DirectX 12를 이용한 3D 게임 프로그래밍 입문 (0) | 2017.07.18 |
---|---|
[Book] Effective Debugging : 디버깅 지옥에서 탈출하는 66가지 전략과 기법 (0) | 2017.06.06 |
[Book] Hello coding : 그림으로 개념을 이해하는 알고리즘 (1) | 2017.05.05 |
[Book] 딥러닝 첫걸음 (0) | 2017.02.06 |
[Book] 유니티로 배우는 게임 수학 (0) | 2016.08.02 |
[Book] 임베디드 프로그래밍 C코드 최적화 (0) | 2015.06.06 |
[Book] Joel On Software (0) | 2015.05.23 |
- Total
- Today
- Yesterday
- Kinect SDK
- RL
- 한빛미디어
- 딥러닝
- 강화학습
- ai
- Expression Blend 4
- Gan
- Policy Gradient
- Variance
- Off-policy
- reward
- SketchFlow
- ColorStream
- TensorFlow Lite
- Windows Phone 7
- Offline RL
- PowerPoint
- Kinect
- bias
- Kinect for windows
- End-To-End
- windows 8
- 파이썬
- arduino
- processing
- Pipeline
- DepthStream
- dynamic programming
- Distribution
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |