[리버싱 핵심 원리] 질문과 답변 게시판 입니다.
책에 관하여 궁금하신 점이 있으시면 댓글로 질문을 올려주시기 바랍니다.
다른 사람들의 질문에 대해 답변을 달아주셔도 되고요, 남들과 다른 해결 방법이 있으신 경우 공유해 주시면 감사하겠습니다.
다양한 사람들의 아이디어가 많이 모여 같이 생각하고 발전할 수 있는 기회가 되면 좋겠습니다.
[리버싱 핵심 원리] 질문과 답변 게시판 입니다.
책에 관하여 궁금하신 점이 있으시면 댓글로 질문을 올려주시기 바랍니다.
다른 사람들의 질문에 대해 답변을 달아주셔도 되고요, 남들과 다른 해결 방법이 있으신 경우 공유해 주시면 감사하겠습니다.
다양한 사람들의 아이디어가 많이 모여 같이 생각하고 발전할 수 있는 기회가 되면 좋겠습니다.
"리버싱 핵심 원리" 책의 대부분의 예제는 32bit OS 에서 테스트 되었습니다.
("5부 - 64비트 & Windows Kernel 6" 의 실습 예제들은 64bit OS 환경이 필요합니다.)
64bit 환경을 사용하시는 독자님들께서는 아래에 소개되는 내용을 참고하여 실습을 진행하시기 바랍니다.
OllyDbg 1.1 은 기본적으로 64bit 환경을 지원하지 못합니다.
책의 디버깅 실습은 거의 대부분 OllyDbg 를 이용해서 진행됩니다.
그러나 OllyDbg 1.1 은 64bit 환경을 지원하지 못합니다.
<그림 1. Windows 7 64bit 에서 OllyDbg 1.1 실행시 예외 발생>
64bit OS 에서 "2장 Hello World 리버싱" 실습 예제 파일 HelloWorld.exe 를 OllyDbg 1.1 로 실행시키면 <그림 1>과 같이 예외가 발생하면서 ntdll.dll 모듈 영역의 코드에서 멈춰버립니다. (이것은 OllyDbg 1.1 의 버그입니다.)
64bit 환경에서 OllyDbg 사용할 수 있는 2 가지 방법
#1. 64bit OS + OllyDbg 2.0
OllyDbg 2.0 버전에서는 64bit에서 정상 실행 되지 않는 버그가 수정되었습니다.
다운로드 링크 : http://www.ollydbg.de/odbg200.zip
* 참고
최신 버전 OllyDbg 2.01 beta 2 는 실행 과정에 약간의 문제가 있습니다. 문제가 해결될 때까지는 OllyDbg 2.0 을 사용해 주시기 바랍니다.
위 링크에서 파일을 다운받아 압축을 해제한 후 실행하면 <그림 2> 와 같은 화면이 나타납니다.
<그림 2 - Windows 7 64bit 에서 OllyDbg 2.0 으로 HelloWorld.exe 를 띄운 화면>
<그림 2>의 화면을 책의 <그림 2.3> 처럼 보이게 하려면 다음과 같이 작업해 주시면 됩니다.
1) 내부의 CPU 윈도우를 최대화 시킵니다.
2) Code/Register/Dump/Stack Window 의 폰트를 변경합니다.
(각각의 창에서 마우스 우측 메뉴 - Appearance - Font - System fixed font 메뉴 선택)
3) Code Window 의 Highlighting 을 변경합니다. (디스어셈블리 코드의 가독성이 좋아집니다.)
(마우스 우측 메뉴 - Appearance - Highlighting - Jumps and calls 메뉴 선택)
4) OllyDbg 2.0 의 창 크기를 적절히 조절합니다.
OllyDbg 2.0 버전의 GUI 는 1.1 버전과 거의 차이가 없습니다. 이제부터 디버깅 실습을 진행하시면 됩니다.
#2. 64bit OS + OllyDbg 1.1 + "Olly Advanced" PlugIn
OllyDbg 2.0 이 발표된 후에도 OllyDbg 1.1 버전이 꾸준히 사랑받는 이유는 바로 다양한 플러그인(PlugIn) 때문입니다. 특히 안티 디버깅이 적용된 PE 프로텍터를 디버깅 할 때 다양한 플러그인은 유용하게 사용됩니다. (최근에는 OllyDbg 2.x 용 플러그인도 많이 개발되고 있습니다.)
64bit OS 에서도 "Olly Advanced" 플러그인을 적용하면 OllyDbg 1.1 버전을 사용할 수 있습니다.
다운로드 링크 : http://tuts4you.com/request.php?75
* 참고
Olly Advanced 플러그인은 OllyDbg 의 버그 패치, 다양한 안티 디버깅에 대한 방어 기능을 지원합니다. Olly Script 플러그인과 함께 가장 유명하고 사용자가 많은 플러그인 입니다.
Olly Advanced 플러그인 설치 방법은 다음과 같습니다.
1) 다운 받은 Olly Advanced v1.27.rar 파일의 압축을 해제하면 advancedolly.dll 플러그인 파일이 생성됩니다.
2) OllyDbg 1.1 설치 폴더에 advancedolly.dll 파일을 복사합니다.
<그림 3 - advancedolly.dll 파일 복사>
3) Olly Advanced 플러그인의 옵션 메뉴를 선택합니다.
<그림 4 - Plugins - Olly Advanced - Options 메뉴 항목>
4) Olly Advanced 옵션 다이알로그에서 "x64 Compatiblity-mode (single-step)" 항목을 체크합니다.
<그림 5 - x64 Compatiblity-mode (single-step) 항목 체크>
5) 이제 64bit OS 환경에서 OllyDbg 1.1 을 사용할 수 있습니다. HelloWorld.exe 실습 파일을 올려 보시기 바랍니다.
참고로 OllyDbg 의 플러그인들은 보통 자체 버그들이 있어서 디버깅할 때 OllyDbg 가 종료될 때가 있습니다. 그리고 기능을 잘 모르는 플러그인을 많이 설치하면 생각지도 않은 오동작을 할 때가 있기 때문에 주의 하시기 바랍니다.
* 참고
- 책의 실습 예제 파일들은 32bit OS 환경에서 실습 하시는 것을 권장합니다. (5부 실습 예제들은 64bit 환경만 가능)
- 위에 소개된 방법처럼 64bit 환경에서 디버깅 실습을 진행하실 때 책의 내용과 약간 다르게 동작할 수도 있습니다.
[리버싱 핵심 원리] 독자님들의 성원에 감사드립니다~ *^^* (7) | 2021.04.17 |
---|---|
리버싱 핵심 원리 - 중국어판 출간 소식 (31) | 2014.05.11 |
逆向工程核心原理 (5) | 2014.05.09 |
리버싱 핵심 원리 - 2쇄 찍었어요~ ^^ (63) | 2012.12.13 |
리버스 엔지니어링 : "리버싱 핵심 원리" 책 소개 (68) | 2012.10.15 |
리버싱 핵심 원리 - 서문 (26) | 2012.10.10 |
[리버싱 핵심 원리 : 악성 코드 분석가의 리버싱 이야기] (121) | 2012.09.11 |
조판 원고 검토 작업 (2차) (155) | 2012.06.29 |
책 원고 작성 완료! (108) | 2011.12.05 |
책소개 (85) | 2010.09.06 |
즐겁고 신나는 리버스 엔지니어링 세계를 여행하기 위한 가이드!
소프트웨어 리버스 엔지니어링이란 응용 프로그램의 내부 구조와 동작 원리를 탐구하는 기술입니다.
신기한 모험과 흥미로운 도전 과제들로 가득한 리버스 엔지니어링의 길로 들어선 독자 여러분을 환영합니다.
리버싱을 잘 하면 프로그램의 속을 훤히 들여다 볼 수 있습니다. 자신이 만든 프로그램도 아니고 소스 코드조차 없는 상태에서 말이죠. 리버싱 기술을 잘 활용하면 개발/테스트 단계에서 미처 발견하지 못한 버그나 취약점을 파악할 수 있고, 파일이나 메모리를 직접 수정(패치)하여 문제를 해결할 수 있습니다. 그리고 더 나아가서 전혀 새로운 기능을 추가시켜 프로그램의 기능을 향상 시킬 수 도 있습니다. 마치 마법과도 같은 멋진 일을 할 수 있는 것입니다.
리버싱 공부를 시작할 때 거창한 사전 준비 같은 건 필요 없습니다.
이야기를 하나 들려 드리겠습니다. 제가 수 년간 리버싱 블로그를 운영해 오면서 가장 많이 받은 질문은 “도대체 리버싱을 어떻게 공부해야 하나요?” 였습니다. 여러 가지 경험담과 실패 사례를 분석해본 결과 리버싱 공부를 실패하는 가장 큰 원인은 공부 자체의 분량이나 어려움이 아니었습니다. 오히려 “전 C언어도 모르는데요?”, “어셈블리를 마스터 해야 하나요?”, “저는 OS 구조를 잘 모릅니다”, “디버거를 사용할 줄 몰라요”, “이 많은 것들을 언제 다 공부하고 본격적인 리버싱 공부를 시작하죠?” 와 같은 막연한 두려움과 걱정 때문에 중도에 포기하는 것이 주요한 실패 원인이었습니다.
본격적인 리버싱 공부는 C언어, 어셈블리, OS구조, 디버거 사용법등을 공부한다는 것과 같습니다. 이런 것들을 이미 알고 있는 사람은 리버싱 입문 과정이 필요 없습니다. 이미 리버싱 전문가라는 뜻이니까요. 아직 리버싱에 대해 알고 있는 게 하나도 없다구요? 실망하지 마세요. 오히려 참 좋은 일입니다. 바꿔 말하자면 앞으로 머릿속에 입력될 지식이 많다는 뜻입니다. 지금보다 더 똑똑해지고, 더 가치 있는 사람이 될 테니 참 좋은 일이라고 할 수 있습니다.
이 책은 리버스 엔지니어를 꿈꾸는 리버싱 입문자들과 리버싱 기술에 흥미를 갖고 있는 개발자 등을 위하여 쓰여졌습니다.
리버싱 기술들을 단순히 공식처럼 외우기만 해서는 필요한 순간에 제대로 응용 할 수 없습니다. 관련 지식을 얻고 내부 동작 원리를 이해하는 것이야말로 가장 중요합니다. 따라서 동작 원리를 설명하고 이해 시키는 데에 주안점을 두었습니다. 그럼 이 책이 왜 리버스 엔지니어링 입문서로 적합한지 제 소개를 곁들여서 설명해보도록 하겠습니다.
첫 째는 개발과 분석 경험입니다. 보통 리버스 엔지니어는 업무 과정에서 전문적인 리버싱 실력뿐만 아니라 어느 정도의 개발 실력도 갖추게 됩니다. 저는 네트워크 어플리케이션 개발자로 일하다가 악성 코드 분석 업무를 맡으면서 리버싱 기술을 익히게 되었습니다. 즉 전문 개발자에서 전문 리버서로 전향한 흔치 않은 케이스입니다. 이 두 기술은 그야말로 찰떡궁합처럼 상호 발전하고 보완하면서 기가 막힌 콤비 플레이를 보여줍니다. 평소에 이 둘을 양 날개에 비유하며 다양한 업무에 활용해 왔습니다. 따라서 자연스럽게 개발과 리버싱이라는 두 가지의 관점으로 프로그램을 분석하게 되었습니다. 이 책의 거의 모든 실습 예제는 리버싱 과정에서 얻은 지식과 노하우를 가지고 제가 직접 개발한 것으로서 군더더기 없이 각 장의 주제만을 집중해서 보여줍니다.
둘 째는 교육 및 발표 경험입니다. 회사에서 고참 직원이 되면서 점점 사내 교육/세미나, 외부 발표 기회가 많아졌습니다. 리버싱 입문자들에게 직접 리버싱 교육을 시키면서 그들의 어려움과 궁금증을 잘 파악할 수 있는 계기가 되었지요. 나름대로 어떻게 하면 쉽게 설명할 수 있을지 고민하면서 자연스레 리버싱 입문자를 위한 교육 노하우를 쌓을 수 있었습니다. 이 경험이 책의 구성, 내용, 예제 등 전반에 걸쳐 큰 영향을 끼쳐서 어려운 리버싱 기술을 비교적 쉽게 이해할 수 있도록 설명할 수 있었습니다.
셋 째는 다양한 커뮤니케이션 경험입니다. 몇 년 전부터 리버싱 전문 블로그를 운영하고 있습니다. 처음에는 제가 보유한 리버싱 기술의 정리 차원에서 가볍게 시작하였습니다. 그런데 방문객들이 조금씩 늘어 나면서 여러 가지 다양한 질문들이 올라오기 시작했습니다. 전 사실 이때 좀 놀랐습니다. 그 동안 우리나라는 리버싱의 불모지라고 여겼었는데 생각보다 많은 사람들이 관심을 보였고 관심 범위가 매우 다양했습니다. 그러면서 시야가 밖으로 넓어지는 계기가 되었습니다. 다른 리버싱 블로그도 방문하고 다양한 사람들의 글과 질문을 접하면서 그들의 관심사를 알 수 있게 되었는데요. 리버싱 입문자들은 체계적인 학습 방법을 알고 싶어 했습니다. 그리고 입문 과정을 지난 사람들은 좀 더 전문적인 리버싱 기술과 내부 동작 원리에 목 말라 하고 있었습니다. 블로그 활동을 어느 정도 한 이후부터는 체계적인 학습도구로서 기술 서적 집필을 고려하게 되었습니다.
결과적으로 저의 이러한 리버싱과 개발, 교육/발표, 다양한 커뮤니케이션 경험을 기반으로 하여 리버싱 입문 서적을 완성하게 되었습니다.
독자 여러분께 이 책을 이용한 리버싱 학습 방법에 대한 팁을 소개해 드리겠습니다.
첫째, 기술 서적은 책꽂이를 예쁘게 장식하는 용도가 아닙니다. 여러분의 기술력을 향상 시키기 위한 하나의 도구입니다. 따라서 책의 중요 부분에 밑줄을 팍팍 긋고, 여백에다가 여러분 자신의 생각과 느낌 등을 적어보시기 바랍니다. 연관된 기술, 주의 사항, 기술의 장단점, 저자와 다른 여러분 자신만의 아이디어 등을 신나게 기록하면서 여러분만의 책으로 만들어 보세요. 이런 리버싱 기술 서적을 한 권씩 독파하다 보면 어느 순간 여러분만의 독자적인 리버싱 세계를 구축하면서 리버싱 전문가가 될 수 있답니다.
둘째, 긍정적이고 여유 있는 마음 자세를 가지세요. 리버싱은 OS 의 가장 밑바닥까지 내려가는 심오한 기술입니다. 공부할 내용이 많고 그 특성상 대부분의 내용이 직접 실습하고 눈으로 확인해야만 이해 되는 경우가 많습니다. 이러한 과정을 긍적적인 마음으로 즐기시기 바랍니다. 그리고 리버싱 공부는 얼마나 머리가 좋은지가 아니라 얼마나 시간을 투자했는지가 더 중요합니다. 조급해 하지 말고 여유 있는 느긋한 마음 자세로 공부를 해나가시기 바랍니다.
셋째, 계속 도전하세요. 리버싱이 잘 안될 때는 멈추지 말고 다양한 방법으로 계속 시도해 보시기 바랍니다. 분명히 해결 방법은 존재합니다. 이미 몇 년 전에 누군가 성공시킨 일입니다. 관련 자료를 검색하고 다양하게 시도하면 자신의 실력도 향상될 뿐 아니라 문제가 해결되었을 때 엄청난 성취감을 느낄 수 있습니다. 이러한 성공 경험이 하나씩 쌓이면서 자신감이 생기고 리버싱 실력은 눈부시게 향상됩니다. 또한 경험을 통해 얻은 자신감은 무의식적으로 업무에 영향을 끼쳐서 일이 잘 풀리는 방향으로 나아가게 합니다.
이 책을 통하여 독자 분들의 위시 리스트가 하나씩 이루어 지고, 리버싱 기술이 다양한 IT 분야에서 널리 활용되기를 바랍니다. 감사합니다.
이 승 원
www.reversecore.com
reversecore@gmail.com
[리버싱 핵심 원리] 독자님들의 성원에 감사드립니다~ *^^* (7) | 2021.04.17 |
---|---|
리버싱 핵심 원리 - 중국어판 출간 소식 (31) | 2014.05.11 |
逆向工程核心原理 (5) | 2014.05.09 |
리버싱 핵심 원리 - 2쇄 찍었어요~ ^^ (63) | 2012.12.13 |
리버스 엔지니어링 : "리버싱 핵심 원리" 책 소개 (68) | 2012.10.15 |
64bit 환경에서 OllyDbg 사용할 수 있는 방법 (26) | 2012.10.11 |
[리버싱 핵심 원리 : 악성 코드 분석가의 리버싱 이야기] (121) | 2012.09.11 |
조판 원고 검토 작업 (2차) (155) | 2012.06.29 |
책 원고 작성 완료! (108) | 2011.12.05 |
책소개 (85) | 2010.09.06 |
(2021.07.08) github.com 에도 제 계정을 생성하여 소스코드 및 실습예제를 올렸습니다. github 에 익숙하신 분들께서는 이곳을 이용하시면 됩니다. https://github.com/reversecore/book |
1. 소스 코드 (ver 1.0.2)
* 암호 : reversecore
< 릴리즈 히스토리 >
ver 1.0.2 - "44장 InjDll.exe - DLL 인젝션 전용 도구" InjDll.cpp 오류 수정 (20121110)
ver 1.0.1 - "33장 스텔스 프로세스" 프로젝트 소스 보기 오류 수정 (20121008)
ver 1.0.0 - 첫 릴리즈 (20120928)
< 참고 >
* 모든 소스 코드는 MS Visual C++ Express 2010 으로 개발되었습니다.
* 소스 코드를 이용하여 빌드한 결과 파일은 사용자 환경에 따라 약간씩 달라질 수 있습니다.
* 책의 설명과 동일하게 디버깅 하기 위해서는 첨부한 예제 파일을 사용하시기 바랍니다.
2. 실습 예제 파일 (ver 1.0.1)
* 2중 압축 되어 있습니다. (압축 풀면 실습예제.zip 이 생성됩니다. 이를 다시 압축 해제 해주세요.)
* 암호 : reversecore
< 릴리즈 히스토리 >
ver 1.0.1 - "1장 리버싱 스토리" 예제 변경 (20130401)
ver 1.0.0 - 첫 릴리즈 (20120928)
< 참고 >
* "실습예제.zip" 파일은 Anti-Virus 제품의 실시간 검사를 피하기 위하여 2중 압축 되어 있습니다.
* "5부 - 64비트 & Windows Kernel 6" 의 실습 예제 파일을 실습 하기 위해서는 Windows XP/Vista/7 64bit 환경이 필요합니다.
* 5부를 제외한 나머지 모든 실습 예제 파일은 MS Windows XP SP3 32bit & Windows 7 32bit 에서 테스트 되었습니다.
* 만약 64bit 환경에서 실습을 진행하기 위해서는 다음 포스팅에 나타난 방법을 참고하시기 바랍니다.
64bit 환경에서 OllyDbg 사용할 수 있는 방법
* 중요!!!
일부 Anti-Virus 제품에서 실습 예제 파일의 일부가 악성 파일로 진단될 수 있습니다.
그 이유는 예제에서 사용된 기법들이 기존의 악성 파일에서 사용된 기법과 동일하기 때문에 AV 휴리스틱 엔진에서 그 부분을 탐지하여 악성 파일로 잘 못 진단할 수 있기 때문입니다.
전혀 악성 파일이 아니므로 아래 설명을 잘 읽어 보시고 실습해 보시기 바랍니다.
1) UPack 패커와 UPack 으로 패킹된 실습 예제가 진단될 수 있습니다.
이는 패커 자체가 PE 헤더를 심하게 훼손시켜서 Black 리스트에 포함되었고, 또한 몇 년전에 많은 악성 코드들이 UPack 으로 실행압축 되었기 때문에 이젠 대부분의 AV 에서 UPack 자체만으로도 악성 파일로 진단해 버립니다.
그렇다고 UPack 자체와 이걸로 패킹된 실습 예제가 악성 파일은 아닙니다.
다만 리버싱 기술 설명을 위해 AV 업계의 권고사항을 따르지 않은것 뿐입니다.
PE 파일 설명에 UPack 만큼 좋은 예제가 드물기 때문에 이런 불편함에도 예제로 사용하였습니다.
2) '고급 리버싱', '안티 디버깅' 예제 일부가 악성 파일로 진단될 수 있습니다.
이 예제 파일 역시 악성 파일에서 사용되는 것과 동일한 기법을 사용했기 때문에 AV 휴리스틱 엔진에서 그 부분을 탐지한 것입니다.
실습 파일 자체는 아무런 악성 행위를 하지 않는 정상 파일입니다.
3) 시간이 지난 후에 멀쩡한 예제 파일들이 악성으로 진단될 수 있습니다.예제 파일이 퍼져서 AV 업체에 접수되어 자동 분류 시스템에 의해 만에 하나 '악성'으로 분류될 수도 있습니다.악성 파일에서 안티 디버깅에 사용되는 SEH, TLS Callback 기법을 구현하였기 때문입니다.이 기법 자체만으로는 아무런 악성 증상이 없습니다. 다만 AV 엔진의 휴리스틱 진단에서 이 부분을 탐지 할 가능성이 있다는 것이죠.
4) 그렇다면 진짜 악성 파일이란 어떤 것일까요?
사용자 몰래 시스템에 숨어 들어서, 자동으로 실행 되며, 개인 정보를 무단으로 수집하고, 수집한 정보를 외부로 유출하는 등의 악의적인 행위를 하는 파일들입니다.
즉, 악성 파일이란 사용자에게 크던 작던 피해를 입히는 파일들을 말하는 것이죠.
실습 예제 파일들은 특정 리버싱 기법을 위해 만들어진 단순한 파일들 입니다. 악성 증상은 전혀 없습니다. ^^~
5) 실습 환경 PC 에서는 잠시 AV 제품의 "실시간 감시" 기능을 꺼두시기 바랍니다.
물론 실습을 마치셨다면 실시간 감시를 다시 켜주시는 것이 좋습니다.
6) Windows 7 에서 실습을 하시는 경우 UAC(User Access Control) 기능을 끄고 하시면 편리합니다.
혹시 다운로드가 잘 안되거나 AV 진단 관련하여 궁금하신 점은 이곳에 질문해 주세요~
감사합니다.
"리버싱 핵심 원리" Errata (정오표)
* 36 [4쇄에서 수정됨]
간단히 MessageBoxW 함수의 RETN 명령까지 실행[Ctrl+F9]한 다음, RETN 명령도 실행[F7]하면, 리턴 주소 401014로 갈 수 있습니다.
=> MessageBoxW() 함수의 RETN 명령어에 BP 를 설치[F2]한 후 실행[F9]합니다. 도중에 메시지박스가 나타나면 [확인]을 선택합니다. 그리고 RETN 명령어에서 디버깅이 멈추면 StepInto[F7]/StepOut[F8] 명령으로 리턴 주소 401014로 갈 수 있습니다.
* 85 [2쇄에서 수정됨]
14장에서 EAX는 => 4장에서 EAX는
* 152 [2쇄에서 수정됨]
Line nunbers => Line numbers
바이트 of machine => Bytes of machine
마지막으로 IMAGE_FILE_HAEDER => 마지막으로 IMAGE_FILE_HEADER
* 157 [2쇄에서 수정됨]
빨간색으로 표시한 EXPORT => EXPORT
* 161 [2쇄에서 수정됨]
<코드 13.10>
Section is writeable => Section is writable
* 164 [4쇄에서 수정됨]
각각의 RVA를 계산해보세요 => 각각의 RAW(File Offset)를 계산해보세요
* 164 [2쇄에서 수정됨]
<그림 13.9>
<File> 에서 Section(".text") 생략됨
* 165 [4쇄에서 수정됨]
Q3. RVA = ABA8일 때 File Offset = ?
A2. 해당 RVA 값이 속해 있는 => A3. 해당 RVA 값이 속해 있는
* 170 [2쇄에서 수정됨]
<그림 13.11 IAT>
이 테이블은 PE 로더를 덮어씁니다. => 이 테이블은 PE 로더에 의해서 덮어써집니다.
* 178 [4쇄에서 수정됨]
표 13.8 notepad.exe 파일의 DataDirectory 배열 => 표 13.8 kernel32.dll 파일의 DataDirectory 배열
* 178 [2쇄에서 수정됨]
<코드 13.14>
address of functino name string array => address of function name string array
* 179 [4쇄에서 수정됨]
<표 13.9 내부>
Ordinal 주소 배열 => Ordinal 배열
* 181 [2쇄에서 수정됨]
앞서 소개한 코드 13.15의 => 앞서 소개한 GetProcAddress() 동작 원리의
* 182 [2쇄에서 수정됨]
RVA:4424 -> RVA:3824 => RVA:4424 -> RAW:3824
* 183 [2쇄에서 수정됨]
RVA:2654 -> RVA:1A54 => RVA:2654 -> RAW:1A54
* 188 [2쇄에서 수정됨]
1000d(400h)바이트라면 => 1000d(3E8h)바이트라면
* 200 [2쇄에서 수정됨]
그림 14.13은 => 그림 14.3은
* 201 [2쇄에서 수정됨]
실실행되는 순간에 => 실행되는 순간에
* 207 [2쇄에서 수정됨]
EDI 레지스터가 가리키는 => EDX 레지스터가 가리키는
* 211 [2쇄에서 수정됨]
그림 15.4가 바로 OEP로 => 그림 15.9가 바로 OEP로
* 215 [4쇄에서 수정됨]
<그림 16.1> TEXT.EXE => TEST.EXE
* 223 [4쇄에서 수정됨]
VirtualSize(1000) + Offset(420) = 1420(RVA) => VirtualAddress(1000) + Offset(420) = 1420(RVA)
* 249 [4쇄에서 수정됨]
<그림 18.18>
01014000 => 01015000
* 253 (3쇄오류) [4쇄에서 수정됨]
3쇄에서 <그림 18.24> 이 완전 잘 못 되었습니다. 아래 그림이 정확합니다.
* 273 [4쇄에서 수정됨]
OEP(40120.)로 갑니다. => OEP(40121E)로 갑니다.
OR
OEP(40120E)로 갑니다. => OEP(40121E)로 갑니다.
* 277 [4쇄에서 수정됨]
<그림 20.13> 에서 "momory" => "memory"
* 281 [2쇄에서 수정됨]
JMP OEP(40120E) 명령을 => JMP OEP(40121E) 명령을
* 296 [4쇄에서 수정됨]
<코드 21.2> 내부의 KeyboardProc() 함수 내부 if ( nCode = 0 ) => if ( nCode >= 0 )
* 301 [4쇄에서 수정됨]
401006 주소에서 LoadLibrary(KeyHook.dl) => 401006 주소에서 LoadLibrary("KeyHook.dll")
* 322 [4쇄에서 수정됨]
메모리에 szDllName 크기만큼 => 메모리에 szDllPath 크기만큼
* 384 [4쇄에서 수정됨]
그림 27.2 오류!
<그림 27.2 ThreadProc()>
* 422 [3쇄에서 수정됨]
ESI 레지스터는 그림 28.28에서 보다시피 => ESI 레지스터는 그림 28.31에서 보다시피
* 423 [3쇄에서 수정됨]
함수의 리턴 값은 EAX에 저장되므로 위 그림을 보면 => 함수의 리턴 값은 EAX에 저장되므로 그림 28.32을 보면
* 502 [3쇄에서 수정됨]
보기 옵션을 'Integer Address'로 변경하면 => 보기 옵션을 'Long - Address'로 변경하면
* 523 [2쇄에서 수정됨]
XXXXXXXX = (DWORD)pfnNew - (DWORD)pfnOrg - 5 => // XXXXXXXX = (DWORD)pfnNew - (DWORD)pfnOrg - 5
dwAddress = (DWORD)pfnNew-(DWORD)pfnOrg 5 => dwAddress = (DWORD)pfnNew - (DWORD)pfnOrg - 5
* 573 [4쇄에서 수정됨]
NewInternetConnetcW() 함수의 코드 => NewInternetConnectW() 함수의 코드
* 615 [4쇄에서 수정됨]
<그림 38.1> 우측 하단의 "이 테이블은 PE 로더를 덮어씁니다." 설명이 잘못되었습니다.
"이 테이블은 PE 로더에 의해 덮어써집니다." 가 맞습니다.
* 647 [4쇄에서 수정됨]
<코드 45.1 ASLR.cpp>
#include "studio.h" => #include "stdio.h"
* 691 [2쇄에서 수정됨]
<코드 45.5 TlsTest.cpp>
#include windows.h => #include <windows.h>
* 772 [2쇄에서 수정됨]
Vol. 2B -> Vol 2C (Intel Manual 이 업데이트 되었습니다.)