리버스 엔지니어링만을 위한 바이블, 리버싱의 모든 것이 이 책 한 권에 녹아들어 있다!

리버스 엔지니어링은 소위 해커들의 전유물처럼 취급되어 왔다. 기술이 가지고 있는 위험성 때문에 수면 위로 올라오지 못하고 '어둠의 예술'이라고 불리며 그간 많은 사람들에게 정체가 가려져 있었다. 그래서 역사가 오래되었음에도 불구하고 뚜렷한 전문서나 바이블이 존재하지 않으며, 인가된 해커들만 정보를 공유할 수 있거나 리버싱 업무를 수행하던 소수의 리서처에게 발품을 팔아 하나씩 배워가야 했다.

『리버스 엔지니어링 바이블: 코드 재창조의 미학』은 이 같이 해커들이 주고 받던 어둠의 지식을 물 위로 끌어올리는 역할을 한다. 많은 사람들이 리버스 엔지니어링에 대해 깊이 있는 지식을 만나지 못하고 마약을 밀매하듯 은밀하게 기법을 주고받았지만, 이제 이 책을 통해 그 모든 목마름에 대한 해답을 찾을 수 있다. C/C 코드가 어셈블리 코드로 어떻게 변해가는지에 대한 기초적인 부분에서부터, 보안 프로그램 공격 방법, 리버싱 보조 플러그인 개발 방법, 그리고 소스가 없는 상태에서 프로그램을 커스터마이징하는 방법까지, 리버스 엔지니어링에 관련된 모든 사항을 이 책에서 다루고 있다.

★ 이 책에서 다루는 내용 ★

  • C/C 코드를 리버스 엔지니어링할 때에 접근 방법에 대한 노하우
  • MFC나 Win32 API, 런타임 라이브러리 등 실제 모듈에 사용되는 코드 해석 방법
  • 리버스 엔지니어링을 방해하기 위한 안티 리버싱 기술, 그리고 그것을 또 우회하는 방법
  • 백신이나 보안 솔루션 등을 공격하는 기술, 바이러스 감지 회피의 원리
  • 시리얼 연산 루틴을 리버스 엔지니어링 할 때의 테크닉, 크래킹 기법
  • 소스가 없는 프로그램을 리버스 엔지니어링으로 커스터마이징하는 방법
  • 키보드 보안 솔루션이나 실시간 감지 기술을 우회하는 과정
  • 국내에서는 한 번도 다뤄지지 않는 Olly Debugger의 플러그인 개발 방법,

 

추천의 글

Matt 오정욱
  • 현) Microsoft Malware Protection Center(미국 시애틀) 근무
  • 블랙햇, 데프콘, 캔섹 웨스트(CanSecWest), EuSecWest, ShmooCon, ToorCon, BayThreat, CARO, XCON, CodeGate 스피커 활동, 다른 그림(http://darungrim.org) 개발자
  • 전) Websense, eEye Digital Security 근무, BugTruck 운영진

리버스 엔지니어링의 역사는 사실 깊다. 아마도 엔지니어링이 시작되었던 인류 역사 초기부터, 리버스 엔지니어링은 존재했을 것이다. 리버스 엔지니어링은 누군가가 만들어 놓은 것을 분해해서 분석하고 재조합하는 과정을 말한다. 그 대상이 인간이 만든 기계 장치가 될 수도 있을 것이고, 자연에 존재하는 생명체나 유전자, 화학 물질 등이 될 수도 있겠다.

소프트웨어의 리버스 엔지니어링의 역사는 소프트웨어의 역사만큼이나 길 것이다. 기계어로 코딩을 해야 하는 시기에는 엔지니어링에 사용하는 언어와 리버스 엔지니어링으로 분석하는 언어도 같았다. 하지만 컴퓨터 언어 체계가 발전하고 다분화하면서 엔지니어링 과정에 비해 리버스 엔지니어링 과정은 현저히 복잡한 과정이 되었다. 단 한줄의 코드도 컴파일러의 종류, 작동 방식과 최적화 알고리즘 등에 의해 다른 형상을 가진 비트(bit)를 생성해 낸다. 이러한 복잡성의 증가로 인해 리버스 엔지니어링은 완벽함을 실현할 수 있는 분야가 아니다. 의도되거나 의도되지 않은 수많은 가지치기된 기술의 출현으로 바이너리들은 온갖 형상을 취할 수 있기 때문이다.

소프트웨어 리버스 엔지니어링은 보안 분야나 악성 코드 분석에만 한정된 것이 아니다. 엔지니어링을 할 때도 리버스 엔지니어링은 필수적인 과정의 일부다. 특히 요즘처럼 개발을 위한 요소가 모듈화돼 있는 경우 소스코드를 얻기 어려운 모듈의 작동 방식에 대한 이해도를 높이기 위해서는 리버스 엔지니어링은 필수다. 또한 자신이 직접 작성한 코드라도 작동 방식의 문제를 해결하거나 최적화 등을 이루기 위해서는 리버스 엔지니어링은 필수적인 과정이다.

본질적으로 리버스 엔지니어링을 가장 빠르게 습득하는 방법은 엔지니어링을 먼저 섭렵하는 것이다. 엔지니어링에 관한 각 분야별 정보는 넘치도록 있으니 일단 그 부분을 섭렵하고 들어 가는 것이 좋을 것이다. 하지만 이미 그러한 과정을 거치고 지나간 선생들의 가르침을 들어 보는 것도 좋을 것이다. 이 책의 의미가 바로 거기에 있다. 책 한권으로 리버스 엔지니어링을 모두 이해하겠다는 것은 어불성설이다. 하지만 이 책을 통해 현업에서 실제로 쓰이는 기술과 전략, 트릭 등에 대한 지식을 습득할 수 있을 것이라고 본다. 책을 읽다 보면 저자가 실무에서 풍부한 경험을 쌓아 왔다는 것을 책을 통해 쉽게 느낄 수 있었다.

책 자체는 심심 풀이용으로 읽을 수 있을 만큼 재미 있게 쓰여져 있다. 예전에 어렸을 적에 흔히 보던 퍼즐 문제집을 읽는 것처럼 흥미진진하다. 저자의 의도대로 책을 읽으면서 예제를 따라해 본다면 어느덧 리버스 엔지니어링의 세계에 빠져 있는 자신을 발견할지도 모른다. 흥미로운 전개 방식은 첫 장을 읽고 어딘가에 처박아 놓고 몇 달, 몇 년이 지나도 다시 펴 보지 않는 책과의 차별 요소라고 할 것이다. 그러한 재미를 담는 여유 또한 지은이의 오랜 연륜에서 나오는 것이라 보고 싶다.

이제 독자 여러분도 맛있는 리버스 엔지니어링의 세계에 푹 빠져 볼 것을 권한다. 물론 맛있게 요리된 지식을 소화해서 자신의 것으로 만드는 것은 전적으로 독자의 몫일 것이다. 이렇게 재미와 내용의 균형이 잡힌 책인 한국에서도 나왔다는 사실을 기뻐하며, 이 서평을 마칠까 한다.

 

이호웅
  • 현) 안철수연구소 ASEC 센터장
  • Application Hacking 감수

인간은 살아가면서 한번쯤 모순적인 선택을 할 수밖에 없는 상황에 부딪히게 된다. 보안과 해킹! 절대로 뚫릴 수 없다는 보안와 무엇이든 뚫을 수 있다는 해킹, 보안을 천직으로 하는 사람들은 이 창과 방패의 모순 속에서 치열하게 싸움을 하고 있다. 보안과 해킹은 그 태생이 같다. 기술적인 기본이 같다는 얘기다. 그 기술을 사용하는 사람과 적용하는 대상에 따라 선이 될 수도 있고 악이 될 수도 있다. 그렇기 때문에 보안과 해킹은 더더욱 모순과의 싸움이 될 수밖에 없다고 생각한다.

어찌보면 이 책의 저자인 강병탁 님도 이 책을 통해 그 모순에 대한 스스로의 고민을 말하고 싶었는지도 모르겠다. 리버싱의 기본부터 방어기능, 공격기능을 차례로 설명하면서, 선과 악에 대한 선택을 독자에게 맡기는 잔인함도 보인다. 자칫 양날의 검이 될 수도 있는 기술들 중에서 가장 기본이 되는 것이 바로 리버싱이다.

그동안 리버싱에 대해서는 많은 번역서가 출간되었다. 그러나 지금까지의 리버싱 관련 서적은 현업에서의 경험과 지식에 기반을 두고 있다기보다는 대부분 이론적인 내용을 기반으로 한다. 리버싱을 완벽하게 이해하려면 운영체제, 프로그래밍, 컴파일러 등 여러 가지 기본적인 지식이 필요하기 때문에 이론에만 치우칠 경우 독자들이 쉽게 다가갈 수 없는 벽이 느껴질 수밖에 없다.

그러나 이 책은 현업에서 보안전문가로서의 저자의 경험을 바탕으로 기본적인 지식이 조금 부족하더라도 리버싱을 이해하는 데 전혀 어려움이 없을 정도로 매우 친절하게 설명돼 있다. 또한 저자 특유의 감각이 돋보이는 제목과 설명으로 자칫 지루하고 딱딱하게 느낄 수 있는 내용을 공부하고 싶은 호기심으로 바꾸고 있다. 이 책을 발판으로 실무 경험을 바탕으로한 좋은 내용의 국내 서적들이 많이 출간되어 보안을 꿈꾸는 많은 이들의 길잡이가 되기를 희망한다.

 

서우석
  • 현) 파인드스티브 대표이사,
  • 전 디버그랩 운영진
  • Microsoft C# MVP
  • 전 국가기관 보안 연구원
  • 안철수 연구소 엔진팀 근무

우리는 지금 총성없는 전쟁, 바로 사이버 전쟁 시대에 살고 있다. 국가에서도 사이버 사령부를 창설하고 보안 인재를 육성하기 위해 다양한 시도를 하고 있으며 언론이나 사람들의 관심도 날로 높아지고 있다. 한편 보안 전문가라 하면 보안이라는 용어가 지닌 지나치게 광범위한 의미 탓에 과연 어떤 지식을 겸비해야 보안 전문가로 칭할 수 있는지가 애매한 부분이 있고, 때문에 보안 전문가를 만나보면 문제 풀이나 이론적인 부분에만 치중해 있어 실무적인 감각은 떨어지는 경우가 종종 있다.

이 책은 국내 최고 보안 전문가이면서 넥슨 미국지사 보안팀을 책임지고 있는 강병탁 님의 실전 노하우가 녹아있는 책이다. 저자가 진행한 세미나와 블로그를 통해 그의 노하우가 공개된 적은 있지만 접하기 어려운 사람들이 많았기에 이번 책이 특히 기대되는 이유이기도 하다. 이 책은 수많은 보안 기술 분야 중에서 ‘리버싱’을 중점적으로 설명하고 있다. 리버싱은 보안 전문가라면 반드시 마스터해야 하는 기술로 소위 ‘분석’ 작업의 기초 기술이기도 하다. 하지만 기계가 이해할 수 있는 있는 언어로 만들어진 코드를 인간이 이해할 수 있는 논리도 변환하기는 쉽지 않다. 그뿐만 아니라 패킹과 같은 안티-리버싱 기법의 범용화로 더 이상 예제 수준의 리버싱 기법만 배워서는 실무에서 어떤 정보도 얻지 못하고 좌절하고 말것이다. 이 책은 저자가 실무에서 경험하고 해결했던 수많은 사례를 통해 리버싱의 기초부터 안티-리버싱 기법에 이르는 전방위적인 리버싱 기법에 대해 설명한다.

모든 보안 분야가 그렇듯이 사용하는 사람에 따라 칼이 될수도 있고 방패가 될 수도 있다. 이 책의 내용은 기업의 자산을 외부로부터 보호하기 위해서지만 ‘6장 보안 모듈 우회’와 같은 기법은 해킹 도구를 만드는 사람들에게는 악용될 소지가 있다. 하지만 그럼에도 불구하고 이 책에서 상세하게 보안 모듈 우회 기법을 설명함으로써 오히려 음지의 기법을 양지로 드러내면 해당 분야가 더욱 발전할 수 있는 기회가 될 것이다.

끝으로 리버싱이 기술적 난이도로 인해 설명하기 쉽지 않은 분야지만 저자만의 위트있는 설명과 다양한 도식, 예제 코드 등을 통해 독자 여러분도 소설책 읽듯이 리버싱을 이해할 수 있을 것이다. 오랫만에 국내 저자가 집필한 완성도 높은 보안 서적을 만나게 되어 정말 기쁘다.

 

베타리더 서평

이홍선, 넥슨 코리아 게임보안팀

한 권의 명저가 탄생했다. 기존의 책과는 차별화된 방식으로 리버스 엔지니어링에 접근하는 이 책은 리버스 엔지니어링의 현대판 바이블이라고 생각한다. 저자의 노고에 무한한 박수를 보낸다.

이진석, 넥슨 코리아 게임보안팀

실무자로서의 경험과 연구에서 비롯된 리버스 엔지니어링에 관한 다향한 기술, 기법들을 집대성한 주옥같은 학습서다. 쉬운 예제와 친절한 설명으로 이 새로운 세계에 쉽게 적응할 수 있도록 도와주며 구체적인 설명으로 기술에 대한 이해를 높여주고 이에 더해 기존에는 잘 다뤄지지 않았던 부분에 대한 전문적인 노하우를 알려 주고 있어 중급 이상의 과정으로 나아가려는 이들이라면 시행착오를 줄이고 시간을 절약하는 데 도움될 것이다.

김동현, 넥슨 코리아 게임보안팀

리버스 엔지니어링을 강병탁 님 특유의 위트있는 어투로 재미있게 풀어낸 책이다. 그동안 게임보안 일을 하며 많은 책을 봐왔지만 이렇게 군더더기 없이 필요한 것만 설명해주는 책은 처음이다. 이제부터 이 책은 지금까지와는 다른 리버스 엔지니어링 입문서가 될 것이다.

전동기, 넥슨 코리아 게임보안팀

리버스 지니어링의 기초부터 고급기술까지 다루고 있는 책이다. 베타리더를 진행하면서 새롭게 알게 된 부분도 많고, 기초를 다시 다지는 계기가 되었다. 이 책을 읽는 독자들 또한 실력이 두 단계 업그레이드될 것이라 장담하며, 리버스 엔지니어링의 세계를 경험해 보시기 바란다.

최종학, 넥슨 코리아 게임보안팀

강력한 비급이 담겨 있을수록 어려운 내용으로 인해 주화입마에 빠지고 마는 경우가 많다. 하지만 이 책은 그러한 주제를 특유의 위트와 재치로 풀어낸 비급서가 아닐까 생각한다.

김지호, 넥슨 코리아 게임보안팀

아직 많은 부분에서 부족한 내가 이 책을 통해 얻게 된 것, 그것은 저자가 수년간 게임 보안 업계에서 쌓아온 실무 노하우였다. 해커들과 수없이 공방을 치뤄야 하는 나에게 이 책은 전세계 해커들과 맞짱을 뜰 수 있게 해준 무기였다.

김창규, 넥슨 아메리카 정보보안팀

처음 시작조차 막막하고 높은 벽처럼 느껴졌던 리버싱 기술을 어떻게 접근해야 하는지, 그 기술의 핵심이 무엇인지 보여주는 지침서라고 생각한다. 처음 리버싱을 공부했을 때 어셈블리 책을 읽다가 좌절했던 경험을 겪어본 한 사람으로서 지식과 실무 경험이 녹아 있는 이 책으로 보안 분야에 입문하기를 감히 추천한다.

지은이 - 강병탁

window31이라는 닉으로 활동하며, 월간 마이크로소프트에서 약 3년간 리버스 엔지니어링, 악성코드 등 해킹/보안 관련 기고물을 연재했다. 국방부, KISA, 침해사고대응협의회, 고려대, 카이스트, 홍익대 등에서 수차례에 걸쳐 리버스 엔지니어링에 대한 공개 강의를 진행했다. 국내에서는 최초로 Developer Security 분야에서 마이크로소프트 MVP를 수상했으며, 보안 블로그 Broken Code(www.window31.com)를 운영하며 각종 해킹/보안 테크니컬 칼럼을 작성하고 있다. 고려대학교 해킹대응연구실 소속으로 정보보호학을 공부했으며, (주)잉카인터넷 재직 시절에는 온라인 게임보안 솔루션인 nProtect GameGuard의 Lead Programmer, 넥슨 코리아에서는 게임보안팀 팀장으로 재직했다, 현재는 넥슨 아메리카 정보보안팀 팀장으로, 미국 지사의 보안업무를 담당하고 있다.

 

감수자 - 김휘강

  • 전 A3 시큐리티컨설팅 창업자
  • 전 엔씨소프트 정보보안실장/TD (Technical Director)
  • 현 고려대학교 정보보안대학원 조교수

정보보안의 태동기에는 네트워크 보안, 시스템 보안 두 영역에서 방화벽과 같은 네트워크 단에서의 필터링 기술과, OS 단에서의 아주 기본적인 요소기술이 발전했었다. 그 뒤 나온 보안기술들을 보더라도 네트워크 기반 침입탐지시스템(N-IDS), 침입방지시스템(IPS), 웹애플리케이션방화벽(WAF)과 같이 주로 이미 발생해서 인스턴스화된 공격에 대해 탐지와 예방을 하는 것들이 주류를 이뤘다. 예전부터 개념 역시 존재했고 소수 기업 및 인원들에 의해 이뤄지고는 있었지만, 이미 개발된 프로그램 그 자체에 대한 취약점을 발견해 내기 위해 시큐어코딩이나 개발보안에 사람들이 관심을 갖고 노력을 하기 시작한 것은 사실 10년도 채 되지 않았다고 볼 수 있다.

보안산업 역시 고도화 되어가는 과정에서 나타나는 현상 중 하나로, 일단 기본적인 기술들이 먼저 발전한 뒤에야, 특화된 영역에 대한 요소기술로 깊이 연구가 이뤄지게 된다. 전통적인 네트워크 보안 영역에 쏠렸고(Firewall, N-IDS), 그 후 OS 영역(H-IDS, SecureOS)에 주 초점이 맞춰져 있었다가, DB/Application 영역 (DB보안, 웹보안 및 시큐어코딩 등의 개발보안)으로 관심사가 옮겨감에 따라 리버스엔지니어링 기술의 중요성은 두말할 나위 없이보안 분야 종사가 반드시 갖춰야 할 스킬로 자리 잡았다.

다양한 보안직군 가운데 모의해킹, 취약점분석을 주로 하거나 또는 악성코드 분석 또는 안티리버스엔지니어링(Anti-Reverse Engineering)을 통해 보안을 강화하고자 한다면 리버스엔지니어링 관련 지식을 꼭 쌓을 것을 권하고 싶다. 리버스엔지니어링 지식과 더불어 Solaris, HP-UX, AIX, Linux, FreeBSD와 같은 다양한 OS를 익혀보고 각 환경에서의 프로그래밍 스킬을 함께 익히게 된다면 보안 분야에서 “자신만의 고유한(unique) 능력을 갖춘 대체 불가능한(irreplaceable) 인재"로 성장하리라 확신한다.

이 책은 리버스엔지니어링에 대해 충실히 다룰 뿐 아니라, 익힌 리버스엔지니어링 기법을 실제로 어떤 곳에 활용할 수 있는지에 대해서도 상세히 다룬다. 그간 저자가 오랜 기간동안 시행착오를 겪어오면서 익힌 소중한 지식을, 그다음에 배우는 사람들은 실수와 시행착오를 최소한으로 하고 배울 수 있게 여기저기에 배려하고 있으며, 복잡하고 어렵기만 한 내용을 편안하게 전달하는 저자 특유의 노하우가 담겨 있다.

저자는 이미 정보보안 분야 종사자 중에서도 실력이 완성에 이르렀다고 볼만큼 시스템 보안 및 개발 보안에 능하고, 국내에서 여러 유수의 세미나 및 대학에서의 강의를 한 경험이 있는 자기만의 철학과 유머를 갖춘 구루다. 독자들이 이 책을 통해서 많은 지식을 전달받을 수 있을 것이라 기대한다.

  • <01부>- 리버스 엔지니어링 기본
    • 01장_리버스 엔지니어링만을 위한 어셈블리
      • 어셈블리의 기본 구조
      • 어셈블리의 명령 포맷
      • 레지스터, 복잡한 설명은 그만
      • EAX
      • EDX
      • ECX
      • EBX
      • ESI, EDI
      • 외울 필요가 없는 어셈블리 명령어
        • PUSH, POP
        • MOV
        • LEA
        • ADD
        • SUB
        • INT
        • CALL
        • INC, DEC
        • AND, OR, XOR
        • NOP
        • CMP, JMP
      • 리버스 엔지니어링에 필요한 스택
      • 함수의 호출
      • 리턴 주소
      •  
    • 02장_C 문법과 디스어셈블링
      • 함수의 기본 구조
      • 함수의 호출 규약
        • 1) _cdecl 방식
        • 2) 파라미터는 2개
        • 3) 리턴 값이 숫자
      • if 문
      • 반복문
      • 구조체와 API Call
      • 결론
      •  
    • 03장_C 클래스와 리버스 엔지니어링
      • C 분석의 난해함
      • 클래스 뼈대
      • 클래스의 수명과 전역변수
      • 객체의 동적 할당과 해제
      • 생성자와 소멸자
      • 캡슐화 분석
      • 다형성 구조 파악
      •  
    • 04장_DLL 분석
      • DLL의 번지 계산법
      • 재배치를 고려한 방법
        • 1) push 문
        • 2) 점프문
      • 번지 고정
      • 익스포트 함수
      • DllAttach/DllDetach 찾기
      • 패킹된 DLL의 DllMain() 찾기
      • DisableThreadLibraryCalls로 찾기
      •  
  • <02부> 리버스 엔지니어링 중급
    • 05장_PE 헤더(PE Header)
      • PE에 대한 상식적인 개념
      • 빌드 과정
      • PE 파일 구조
        • IMAGE_DOS_HEADER
        • IMAGE_NT_HEADER
        • IMAGE_FILE_HEADER
        • Machine
        • NumberOfSections
        • TimeDateStamp
        • SizeOfOptionalHeader
      • IMAGE_OPTIONAL_HEADER
        • Magic
        • SizeOfCode
        • MajorLinkerVersion, MinorLinkerVersion
        • ImageBase
        • AddressOfEntryPoint
        • BaseOfCode
        • SectionAlignment, FileAlignment;
        • SizeOfImage
        • SizeOfHeaders
        • Subsystem- - - - - - - : 0x2 (Windows GUI)
        • DataDirectory
      • IMAGE_SECTION_HEADER
      • PE와 API 호출의 원리
      • IAT에서 API를 계산하는 방법
      • 익스포트 테이블 (export table)
      • 마무리
      •  
    • 06장_흔히 사용하는 패턴
      • 조건문의 기본
      • 심화된 조건문
      • 반복문
      • break가 들어가는 경우
      • continue가 들어갈 경우
      • return이 생기는 경우
      • 문자열 컨트롤
          1. strcpy
          1. strcat
          1. strlwr
      • 정리
      •  
    • 07장_MFC 리버싱
      • 리버스 엔지니어링에 필요한 MFC 구조
      • MFC로 개발됐는지 여부 확인
      • MFC 라이브러리 등록
      • MFC 초기화 루틴 찾기
      • 버튼 핸들러 찾아내기
      • 헤더 파일 활용
      • 그 밖의 MFC 관련 리버싱 접근 방법
      •  
  • <03부> 연산 루틴 리버싱
    • 08장_시리얼 추출 방법
      • F-Secure Reverse Engineering 대회
      • Level 1 문제 풀이
        • 1) 사전 정보 획득 첫 번째 – 파일 스캐너로 스캔
        • 2) 사전 정보 획득 두 번째 – API 확인
        • 3) 사전 정보 획득 세 번째 – 파일의 이미지 베이스 확인
      • Level 2 문제 풀이
      • 문자열 컨트롤
      • 안티 디버깅 기법
      • WinMain보다 먼저 가동되는 코드
      •  
    • 09장_코드 속이기
      • Level 3 문제 풀이
      • 데이터 속에 숨은 코드
      • 리버싱으로 방정식 세우기
      • 바이너리 파싱
      • 재사용이 어려운 코드
      • 디스어셈블러 속이기
      • 정리하며
      •  
  • <04부> 안티 리버스 엔지니어링
    • 10장_교과서적인 안티 디버깅
      • 프로그램 개발 완료 후 다가올 리버싱의 위험
      • 리버싱에 대항하는 A씨의 반격, 그 후…
      • 안티 디버깅이란?
      • 고전적인 안티 디버깅
      • API 로 제공되는 안티 디버깅 기능
      • 다중 기능을 보유한 맥가이버칼, NtQueryInformationProcess
      • Debug Object Handle
      • 또 핸들을 찾아라, NtQueryObject
      • NoDebugInherit
      • 디버거는 어디에, NtSetInformationThread
      • int3을 이용한 디버거 감지
      • SetUnhandledExceptionFilter
      • 0xCC 자체를 탐지하자
      • 소프트아이스 감지
      • PEB를 이용한 방법
      • 정리
      •  
    • 11장_한 단계 높은 안티 디버깅
      • 생각보다 활용도가 높은 프로세스 체크
      • 버전 체크
      • 부모 프로세스 체크
      • SeDebugPrivilege 권한 체크
      • WinDBG 검출
      • 키보드 입력 봉쇄
      • CloseHandle()을 이용한 안티 리버싱
      • OutputDebugString이 주는 두 가지 마술
      • 시간차 공격! 타이머를 이용한 방법
      • PREFIX REP을 통한 예외 처리
      • API Hook을 이용한 디버깅 감지
      • 리모트 디버깅 감지
      • 생각해 볼 과제
      •  
    • 12장_패커가 사용하는 기술
      • 패커? 대수롭지 않은 개념
      • 패킹된 코드의 암호화/복호화
      • IAT의 변화
      • 매뉴얼 언패킹(MUP)
      • 파일 스캐너
      • 디버거의 구조
      • Self Debugging
      • 스택 세그먼트 레지스터
      • int 0x2d
      • 덤프 방지
      • 디버그 레지스터
      •  
    • 13장_우회 방법
      • API Hooking을 통한 우회
      • OllyDBG 옵션을 이용한 우회
      • 플래그 수정으로 우회
      •  
  • <05부> OllyDBG 플러그인
    • 14장_OllyDBG 플러그인 SDK
      • 최고의 매력 OllyDBG 플러그인
      • 플러그인 가동 원리
      • 플러그인 SDK 사용 규약
      • 초기화 코드
      • PreInit - ODBG_Plugindata()
      • 초기화 루틴 - ODBG_Plugininit()
      • 메뉴 작성 - ODBG_Pluginmenu()
      • 메뉴 핸들러 작성 - ODBG_Pluginaction()
      • 종료 처리
      • PDK 활용
      • t_dump - 덤프 관련 구조체
      • t_memory – 메모리 관련 구조체
      • t_disasm – 디스어셈블 구조체
      • Readmemory
      • 구조체 종합 예제 - Extra Copy
      •  
    • 15장_리버싱 보조 플러그인
      • IsDebuggerPresent() 무력화
      • 디버거 떼어내기
      • 자동 어태치
      • 단축키 - ODBG_Pluginshortcut()
      • OllyAdvance 분석
      • Setbreakpoint()와 TLS CallBack 감지
      • 커맨드라인 실행 바
      • 디버깅 흔적 청소
      • 게임 해킹 플러그인 – Game Invader
      • Game Invader의 구현 원리
      • 메모리 속성 옵션
      • 암복호화 코드 분석 – Find Crypt
      • FindCrypt의 구현 원리
      • 남은 과제
      •  
    • 16장_메모리 스캔 플러그인 개발
      • 아직 세상에 없는 플러그인을 만들어 보자
      • 분석 시간을 줄일 수 있다면?
      • 플러그인 코어 루틴 컨셉
      • UI 디자인
      • 버튼 핸들러 제작
      • 후킹 탐지 기능
      • 파일과 메모리의 기준 번지를 정하는 방법
      • IAT가 코드 섹션에 포함된 경우
      • 패킹 체크
      • 후킹 탐지 스캔 결과
      • 암복호화 루틴 탐지
      • 화이트 리스트 처리
      • OllyMemScan 평가
      •  
  • <06부> 보안 모듈 우회
    • 17장_바이러스 감지 회피
      • 백신은 과연 바이러스만 감지하는가
      • 기본적인 감지 원리
      • 고전적인 우회 방법
      • 쓰레기 코드를 통한 우회 방법
      • 실행조차 되지 않는 코드
      • 헤더 변조
      • 문자열 패턴 우회
      • 바이너리 패킹의 시대
      • 대체 가능한 어셈블리어
      • 패커의 특성을 고려한 회피
      • 섹션 이름 변경
      • 백신사의 대응
      •  
    • 18장_백신을 공격하는 악성코드
      • 백신을 공격하는 바이러스는 어느 정도 존재하는가
      • 특정 백신 언급 증가
      • 백신 프로세스 종료
      • 트레이 속임
      • 공식적으로 언급된 취약점
      • 업데이트 우회
      • 보안업체 비방
      • 드라이버 공격
      • 몸체가 없는 공격 코드
      • Conficker
      • SDT 취약점
      • 벤치마킹의 중요성
      •  
    • 19장_실시간 감시 기능 취약점
      • 바이러스 감지 후 필요한 행위
      • 파일 시스템 필터 드라이버
      • 실시간 감시 기능의 구현 원리
      • 콜백 함수 무력화
      • 콜백 무력화 대응 방법
      • 노티파이 카운트 취약점
      • 화이트리스트 강제 주입
      • 파일 접근 통제
      • ZIP 취약점
      • 가상 PC 감지
      • 그외 안티바이러스 우회를 위한 다양한 방법
      •  
    • 20장_키보드 보안 솔루션 우회
      • 키보드 취약점이 되는 구간
      • 키보드 보안의 원리
      • 폴링 취약점
      • IE 의 추가 기능 관리
      • 가장 피해 사례가 많은 ring3 영역
      • 핵심 모듈 공격
      • 언로드 DLL
      • ring3에서 키보드 보안을 우회하는 이유
      • 키보드 보안의 문제점
      • 가상 키보드 취약점
      • 인터넷 뱅킹 취약점 – 메모리 해킹
      • 키보드 보안이 어려운 이유
      • 클라이언트에서 완전한 보안은?
      •  
  • <07부> 한 차원 높은 바이너리 창조
    • 21장_코드 후킹
      • 코드 후킹과 공동경비구역
      • 번지 계산의 고통
      • DLL 인젝션 코드
      • CreateRemoteThread
      • DLL 인젝션 테스트
      • 코드 후킹 기본 디자인
      • 여섯 바이트를 변조하는 이유
      • DLL 번지의 강제 고정과 naked 함수
      • 패킷 버퍼 로깅
      • 하드코딩에서 탈피하자
      • 후킹 코드의 확장
      • MakeJMP - 후킹 함수의 간결화
      • 마무리
      •  
    • 22장_코드 패칭
      • 동적 접근 방법과 정적 접근 방법
      • 프로세스 검출 루틴 분석
      • 점프문 공격
      • 파일에서 패칭할 때와 메모리에서 패칭할 때
      • 상수값 패칭
      • 스택 해킹
      • 거짓을 리턴
      • 스레드 공격
      • 마무리
      •  
    • 23장_난독화와 더미 코드
      • 디스어셈블러 개론
      • 안티 디스어셈블링
      • 가비지 코드 속에 담긴 진짜 코드
      • ASPack이 사용하는 안티 디스어셈블링
      • Themida에서 사용하는 안티 디스어셈블링
      • ASProtect 의 코드 카피
      • Themida의 코드 리다이렉트
      • 상수 암호화
      • API 호출 감추기
      • 난독화 코드 찾아내어 우회하기
      • 마무리
  • 150쪽, 첫번째 문단

    "자, 이제 문자열이 들어있던 ebx를 --> "자, 이제 문자열의 길이가 들어있던 ebx를

  • 288쪽, 7번째 줄

    디버거를 구조를 --> 디버거의 구조를

  • 324쪽, 2번째 줄

    0이 첫 번째 메뉴, 1이 두 번째 메뉴, 3이 세 번째 메뉴 --> 0이 첫 번째 메뉴, 1이 두 번째 메뉴, 2가 세 번째 메뉴

예제코드 관련 GitHub 페이지

도서 소개자료

관련 글