리버싱 기술을 이용하면 기존 어플리케이션의 버그를 수정하거나, 새로운 기능을 추가시킬 수 있습니다. 간단한 실습 예제를 통하여 동작원리를 소개하도록 하겠습니다.





리버싱 기술의 활용



리버싱 기술이 꼭 다른 프로그램을 분석하는 용도로만 사용되는 것은 아닙니다. 약간의 아이디어와 끈기만 있다면 여기서 조금 더 나아가 개발자들이 시도하지 않는 방법으로 작업을 진행할 수 있답니다. '개발 관점' 에서는 어렵게 보이는 문제이지만 오히려 '리버싱 관점' 에서는 쉽게 해결할 수 있는 경우도 있습니다.


* 참고


어플리케이션에 추가 기능을 삽입하는 것은 마치 "API Hooking - 계산기, 한글을 배우다. (1)" 와 비슷한 맥락의 작업 이라고 볼 수 있습니다.


자신이 개발하지 않은 (소스 코드를 가지고 있지 않은) 다른 어플리케이션의 버그 수정이나 전혀 새로운 기능 추가 같은 작업이 바로 그 좋은 예입니다. 이러한 작업의 핵심기술은 "Debugging""Injection" 그리고 "Hooking" 입니다. 또한 어셈블리 언어, PE File Format 등의 지식도 매우 중요합니다.


1) Debugging 


디버깅 기술은 매우 다양하게 사용됩니다. 먼저 작업 설계 단계에서 문제를 파악하고 해결 아이디어를 검증하고 구체화 시키는데 필수적으로 사용됩니다. 구현 단계에서 단위 모듈을 검증하는데에도 사용되고, 마지막 테스트와 버그 파악에 빠져서는 안되는 가장 중요한 기술입니다.


2) Injection


다른 프로세스를 수정하려면 일단 그 프로세스 메모리 영역으로 침투해야 합니다. 이게 바로 인젝션 기술의 역할입니다. 일단 프로세스 메모리에 침투하기만 하면 절반은 성공이라고 볼 수 있습니다.


3) Hooking


기존 코드와 다르게 동작시키려면 후킹 기술을 사용하면 됩니다. 기존에 있던 코드의 흐름을 변경시켜 사용하지 못하게 할 수 도 있고, 새로운 코드를 추가하여 전혀 다르게 동작시킬 수 도 있습니다. 


이제 간단한 실습 예제를 분석하면서 "기존 응용프로그램에 새로운 기능을 추가시키는 방법" 에 대해서 알아보도록 하겠습니다. 제가 아이디어를 내고 구체화 시키고 검증하는 과정, 그리고 실제로 구현하면서 부딪쳤던 문제들과 해결 과정에 대해 자세히 보여드릴 겁니다. 향후 여러분께서 리버싱 기술을 실무에 적용하실 때 작은 도움이 될 것입니다.




실습 프로그램 - HxD.exe 




<그림 1 - HxD.exe>


위 그림은 제가 평소 애용하는 헥스 에디터 HxD.exe 의 실행 화면입니다. dummy32.dll 라는 이름의 PE 파일을 열고 있네요. 


문득 "화면 좌측 하단의 Offset 표시 영역에 RVA 를 계산해서 같이 표시해 주면 어떨까?" 라는 아이디어가 떠올랐습니다. 아이디어의 유용성 여부를 떠나서 일단 재미있어 보였고, 어플리케이션 기능 추가라는 주제에 잘 맞을거 같다는 생각이 들었습니다.


여러차례 시도 끝에 결국 아래와 같이 성공할 수 있었습니다.



<그림 2 - PE 파일의 RVA 표시 기능이 추가된 HxD.exe>


먼저 Offset 과 RVA 를 동시에 표시하기 위해 status bar 의 좌측 하단 영역의 길이를 조금 늘렸습니다. 그리고 글씨를 출력하는 API 를 후킹하기 위한 hxdhook.dll 을 인젝션 시켰습니다. 또한 Offset <-> RVA 변환 계산 모듈 PEInfo.dll 을 로딩하여 계산을 수행하도록 만들었습니다. 이제 HxD.exe 에서 PE 파일을 열고 커서 위치가 변할 때마다 해당 파일 Offset 과 RVA 가 자동으로 표시됩니다.


다음 포스트에서 구체적인 작업 내용과 동작 원리에 대해 알아보도록 하겠습니다.



* 참고


위 실습 예제 파일은 "HxD.exe 기능 추가" 페이지에서 다운 받으실 수 있습니다.




ReverseCore


  1. 감염오리 2012.06.23 18:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    ㅎㅎ 다시 포스팅을 올리시는군요
    앞으로도 더 많은 지식을 알려주시기 바랍니다^^

  2. ray 2012.06.27 04:50 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은 정보 감사합니다.


진법 변환

study 2012.03.06 08:30

간단한 진법 변환에 대해서 알아보겠습니다. 

아주 기초적면서도 중요한 내용입니다만, 블로그에 제대로 소개한적이 없어서 이번에 제대로 정리해보겠습니다. 


일반적인 사람이 사용하는 진법은 10진법입니다. 컴퓨터는 내부적으로 2진법을 사용합니다. 리버싱에서는 16진법을 사용합니다. 따라서 리버서는 이 세 가지 진법체계(2, 10, 16)를 자유자재로 변환할 줄 알아야 합니다.

보통은 계산기를 사용하면 편합니다만 2진수 <-> 16진수 변환 과정은 리버싱에 자주 등장하기 때문에 암산으로 가능하도록 숙달하는 것이 좋습니다. 




기본 진법


 진 법 숫 자 설 명   
 2 (Binary)  0, 1  ON, OFF 1111(2), 1111b
 10 (Decimal)  0 ~ 9  사람이 익숙한 숫자 체계 15(10), 15d
 16 (Hexadecimal)  0 ~ 9, A ~ F  2진법을 1/4로 줄여서 보여줌  F(16), Fh

* 참고

16진수는 2진수를 1/4로 압축시켜 보여주는 효과가 있습니다. 즉, 4 자리의 2진수가 1 자리의 16진수로 간단히 표현됩니다. 

예) 15(10) = 1111(2) = F(16)




변환 방법


학창시절에 배웠던 진법 변환 방법의 기억을 되살려 보겠습니다.

#1. 2진수 <-> 10진수 

1) 9(10) -> 1001(2)



2) 1001(2) ->  9(10)


3) 30(10) -> 11110(2)



4) 11110(2) ->  30(10) 


변환 방법은 매우 간단합니다. 기억이 새록새록 나시죠?  


#2. 10진수 <-> 16진수

1) 123(10) -> 7B(16)


2) 7B(16) -> 123(10)


3) 500(10) -> 1F4(16)



4) 1F4(16) -> 500(10) 


여기까지는 변환 원리만 기억하시고 실제로는 계산기를 사용하시는것이 편리합니다.

리버서에게 중요한 것은 아래의 2진수 <-> 16진수 변환을 암산(수작업)으로 해내는 능력입니다.

#3. 2진수 <-> 16진수



<2진수 테이블>


위 테이블에서는 1 ~ 15 까지의 숫자를 각각 10, 16, 2 진수로 보여주고 있습니다. 

눈여겨 보실 내용은 4 자리의 2 진수를 1 자리의 16진수로 표현 가능하다는 것입니다.
'4 자리의 2 진수' 라는 말은 4 bit 라고 바꿔 말 할 수 있고, 8 bit(1 byte) 는 '8 자리의 2 진수' 이며 이는 2 자리의 16 진수입니다.

즉, 1 byte 는 2 자리의 16 진수로 간단히 표현(00 ~ FF)이 가능하다는 뜻입니다. 이런 특성 때문에 컴퓨터 공학에서는 16진수로 숫자를 표현하는 것이 편리합니다. (1 byte 로 저장할 수 있는 숫자를 10 진수로 표현하면 0 ~ 255 이며 세 자리수가 필요합니다.)

위의 테이블을 다 외우시면 물론 좋습니다만 처음에는 빨간색으로 표시한 2(0010), 4(0100), 8(1000), A(1010), C(1100)만 외우셔도 됩니다. 파란색으로 표시한 1(0001), F(1111)는 간단하니까 한번 보면 저절로 외워지고요. 나머지 숫자는 빨간색 숫자에서 계산하시면 됩니다. 계산 방법은 아래와 같습니다.


3(0011) = 2(0010) + 1(0001)
5(0101) = 4(0100) + 1(0001) 
6(0110) = 4(0100) + 2(0010)
7(0111) = 8(1000) - 1(0001)
9(1001) = 
8(1000) + 1(0001)
B(1011) = A(1010) + 1(0001)

D(1101) = C(1100) + 1(0001)
E(1110) = F(1111) - 1(0001) 


간단한 예제를 살펴보겠습니다.

변환 요령은 "16진수는 한 자리씩 끊고, 2진수는 네 자리씩 끊는다" 입니다. 그리고 위 테이블을 보면서 변환하시면 됩니다. (조금만 숙달되도 암산으로 가능해 집니다.)  

1) 7F(16) -> 01111111(2)


2) 3D6A921E(16) -> 00111101 01101010 10010010 00011110(2)


3) 10101100(2) -> AC(16)




진법 변환 활용


이러한 16진수 <-> 2진수 진법 변환을 왜 공부해야 할까요?

리버싱 분야에서 다양한 활용 예가 있습니다.

IA32 Instruction Table 을 해석을 위해 ModR/M, SIB, Group ID 등을 계산할 때 필요합니다.


<그림 - IA32 Instruction Format : 출처 Intel Manual>


<그림 - ModR/M Byte : 출처 Intel Manual>

EFLAGS 레지스터는 각 bit 가 flag 를 의미합니다. 이러한 bit flag 연산에 진법 변환이 필요합니다.


 <그림 - EFLAGS : 출처 Intel Manual> 

 Win32 API 의 파라미터 중에 Flag 를 bit 로 표시하는 경우가 많습니다.

HANDLE WINAPI CreateFile(

  __in      LPCTSTR lpFileName,

  __in      DWORD dwDesiredAccess,

  __in      DWORD dwShareMode,

  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,

  __in      DWORD dwCreationDisposition,

  __in      DWORD dwFlagsAndAttributes,

  __in_opt  HANDLE hTemplateFile

);


* 출처 : MSDN


CreateFile() API 의 6 번째 파라미터 dwFlagsAndAttributes 는 아래와 같이 bit flag 로 이루어져 있습니다.


<그림 -  dwFlagsAndAttributes 설명 일부 : 출처 MSDN>  

이외에도 디버깅을 하다보면 각종 bit 연산이 나타나는데 16진수 <-> 2진수 변환 방법을 알고 있으면 코드를 이해하는데 크게 도움이 됩니다.

지금까지 매우 기초적이면서도 중요한 진법 변환에 대하여 알아보았습니다. 잘 활용하시기 바랍니다.


개인적으로 백만년 만의 포스팅이네요. 이 포스팅을 시작으로 블로그 활동을 재개합니다. ^^~

* 얼마전 회사를 떠나서... 사회에 첫 발을 내디딘... 혹은 학교로 복귀한... 15기 인턴들 모두 화이팅~~~




ReverseCore
    이전 댓글 더보기
  1. 1 2018.02.01 22:56 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  2. 2018.02.02 06:03 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  3. 1 2018.02.02 20:01 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  4. 2018.02.03 19:05 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  5. 1 2018.02.03 19:38 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  6. 1 2018.02.04 15:11 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  7. 2018.02.05 07:31 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  8. 1 2018.02.05 19:19 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  9. 1 2018.02.07 18:05 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  10. 2018.02.08 07:38 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  11. 1 2018.02.08 17:51 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  12. 2018.02.10 00:28 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  13. 바이낸 2018.02.10 08:35 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  14. 1 2018.02.10 16:02 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  15. 1 2018.02.11 17:13 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  16. 2018.02.11 19:14 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  17. 1 2018.02.13 18:28 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  18. 2018.02.14 08:30 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  19. 1 2018.02.14 15:55 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  20. 1 2018.02.15 17:23 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다



안녕하세요. ReverseCore 입니다. 

책 원고 작성을 완료하였습니다.

모든 컨텐츠 작성을 마치고 자체 퇴고(8회)를 완료하였습니다.

이제 출판사에 넘겨줄 수 있겠네요. ^^~



<퇴고 작업을 도와준 아이패드>


분량


8섹션, 61챕터, A4 기준 1000 페이지 입니다.
885 개의 이미지와 65 개의 소스파일이 담겨있습니다.
책 이름도 결정 하였습니다. (나중에 공개할 께요~ ^^)


내용


기존 블로그의 내용 60% + 새로운 컨텐츠 40% 로 구성하였습니다.

블로그에 있는 내용들은 Windows XP + Visual C++ 6.0/2008 환경에서 작업했었습니다. 이를 최신 Windows 7 32bit + Visual C++ 2010 환경으로 재작업을 하였구요. 컨텐츠들의 순서 조정에 많은 고민을 하였습니다.

새로 추가된 내용들은 아래와 같습니다.


64 bit Computing / Debugging
고급 리버싱 (TLS, TEB, PEB, SEH, IA-32 Instruction 해석)
Anti-Debugging (Static, Dynamic, Advanced)
디버깅 실습 (Service, Self-Creation, PEImageSwitching, DebugBlocker)
 



일정


2010년 5월 1일 책을 쓰기로 마음 먹고 2011년 12월 3일 원고를 마감하였네요. 원고 작업만 19 개월 소요되었군요. (블로그 시작한날인 2009년 2월부터 따져보면 벌써 약 33 개월이 지났네요.)

아직까지는 제 인생 최대의 프로젝트라고 말할 수 있겠습니다. ^^

2011년 6월말쯤 8장 마지막 챕터를 끝내고 책에 뭐 빼먹은게 없나 살펴보니, 문득 제가 애초에 기획했던 모든 컨텐츠 작성을 끝냈다는 사실을 깨달았습니다.

약간 멍~ 했죠. 조금 재충전을 하고 퇴고 작업에 들어갔습니다. 노트북으로 들고 다니며 보는데 한계가 있어서 문서를 출력해서 보다가 분량이 너무 많아서 힘들었습니다. 그래서 아이패드에 문서를 전부 입력하고 PDF Viewer 앱과 터치펜으로 퇴고 작업을 했습니다. (퍼포먼스가 확 향상되더군요.) 약 5 개월간의 기나긴 퇴고 작업 끝에 드디어 원고를 탈고 할 수 있었습니다.

마침 아내가 아기와 외출한 시간(12월 3일 토요일 오후 6시)에 제가 계획한 8 단계 퇴고작업의 마지막 작업을 끝마칠 수 있었네요. 


소감


일단 기분이 몹시 좋습니다. 몸과 마음이 날아갈듯 하네요. ^^ 
마치 오랜 여행을 마치고 집에 돌아온 느낌이 드네요. 기쁜 마음에 이렇게 블로그에 글을 올려 봅니다. 


# 작업 속도

책을 쓸 때는 생각보다 작업 속도가 너무 느려서 도대체 언제쯤 책이 완성될 수 있을까 싶었습니다. 하루에 그림 하나 또는 캡쳐 두개 정도 밖에 못 할 때도 많았거든요. 하지만 그런 날들이 하루 이틀 쌓이니까 어느 순간부터는 "내가 언제 이렇게 많은 일을 했지?" 라는 생각이 들면서 목표 지점이 희미하게나마 보이기 시작했습니다. 


# 재작업

책을 쓰면서 가장 힘들었던 순간은 이미 한번 쓴 글을 두번 세번 다시 쓸 때 였습니다. 독자분들께 최신의 리버싱 경험을 드리기 위해 개발도구를 Visual C++ 2010 으로 바꾸고 작업환경을 Windows 7 으로 바꾸었습니다. 그러다보니 기존 문서를 그에 맞게 다시 캡쳐하고 변경된 주소를 찾아 고치는 작업들이 많았습니다. 지금와서 뒤돌아보니 그런 작업들이 가장 기억에 많이 남습니다. 


# 슬럼프

10 여회의 크고 작은 슬럼프를 경험하였습니다. 수많은 재작업과 검증, 생각대로 나오지 않는 글쓰기, 예상보다 훨씬 오래 걸리는 시간, 개인적인 외부 요인 등으로 인해서 글을 쓰지도 못하고 글쓰기 자체가 싫어지는 상황이 몇 번 닥쳤었죠. 스트레스가 쌓인 겁니다.

제가 새벽에 일어나 글을 쓰는 책상이 있는데요, 어느 순간에는 그쪽을 쳐다보기도 싫어지더군요. 그리고 저녁에는 퇴근 후 글을 쓰러 찾아가는 도서관이 있습니다. 한때는 그쪽으로 발길이 도저히 떨어지지 않는 날도 많았습니다.

다행인것은 그때마다 제 자신이 슬럼프 상황인걸 인식하고 극복하려고 노력했다는 것입니다.


# 응원

가끔 블로그에 방문해서 댓글에 답변도 달아드리고 제 책을 응원하는 글을 보면서 힘을 얻곤 했습니다. 그리고 부모님, 아내, 친구들, 회사 동료들까지 많은 분들께서 관심을 가져주시고 격려를 해주셨습니다.

이 자리를 빌어서 모든 분들께 감사 드립니다.

그리고 제가 좋아하는 독서도 많이 하고 사람들과 많이 어울려 다니면서 다시 용기를 얻어서 작업을 이어나갈 수 있었습니다. 그러다 결국 여기까지 올 수 있었구요.

"포기하기 전까지 실패란 없다. 시행착오가 있을 뿐이다. 시행착오를 거듭하다보면 언젠가 결국 성공하게 된다."

위 명언을 계속 새기면서 포기하지 않고 꾸준히 작업했더니 결국 원고가 완성되었습니다.


# 앞으로...

출판사와의 일정이 잡히면 블로그에 다시 공지해 드리겠습니다.

원고 작업을 한번 성공하니 자신감이 충만해 지는게 느껴집니다. 이번에 많은 경험과 시행착오를 겪어보니 두 번째 책도 금방 쓸 수 있을 것 같은 기분입니다. (2 탄을 기획 중인데요. 구체적으로 정리되면 알려드릴께요~)


다시 한번 모든 분들께 감사 드립니다. ^^~


ReverseCore
    이전 댓글 더보기
  1. 지나가다 2012.02.29 17:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    휴.. 정말 대단한 사이트군요.
    .. 옛날.. 생각이 나긴하면서도 ... 다시 한번 이쪽을 공부해보고 싶다는 생각은 가끔했습니다. (지금은 그냥 평범한.. 코더입니다 :) )

    책을 내신다는데.. 필구해서 한번 읽어봐야겠군요. 아직 타오를지 확인해보고 싶어요 :)

  2. 책 언제나오나요 2012.03.01 02:10 신고 댓글주소 | 수정 | 삭제 | 댓글

    빨리 보고싶네요ㅎ
    3월 중반에 나올려나

  3. 나그네 2012.03.02 19:23 신고 댓글주소 | 수정 | 삭제 | 댓글

    오오 정말 기대됩니다. 꼭 사서 보도록 할게요 ㅠ.ㅠ)b

  4. 지름신 2012.03.05 08:53 신고 댓글주소 | 수정 | 삭제 | 댓글

    바쁜 직장인이 단시간에 많은 기술을 습득할 수 있는 책일 듯.
    나오면 바로 사아겠군요.
    수고하셨습니다.

  5. 뿡뿡대마왕 2012.03.06 15:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    드뎌 나오는거군요!!!
    너무 기대됩니다!!
    언제쯤 출간될려나..ㅠㅠ

  6. reversecore 2012.03.06 23:37 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. ReverseCore 입니다.

    먼저 제 책에 관심을 가져주셔서 대단히 감사합니다. ^^~

    현재 출판사에서 제 원고를 편집/교정/디자인 작업중이며 여름 출간을 목표로 열심히 작업하고 계십니다. 일단 책의 분량도 많고, 책의 완성도를 위해서는 충분한 시간이 필요합니다.

    제가 원고를 더 빨리 완성시켰다면 그만큼 더 빨리 출간되었을텐데요...
    일정과 완성도 중에서 완성도를 선택한 결과입니다.
    그런데 기다리시는 분들이 너무 많으셔서 제가 정말 죄송스럽네요.

    책의 60%는 블로그의 컨텐츠들로 채워지기 때문에 그동안 이곳에서 공부하시는 것도 좋겠습니다.
    그리고 앞으로 블로그에 새로운 컨텐츠를 꾸준히 포스팅 할 계획이니 재밌게 봐주시기 바랍니다.

    감사합니다.

  7. Genesis 2012.03.09 22:10 신고 댓글주소 | 수정 | 삭제 | 댓글

    시간 나시면 카테고리를 분류해서 정리해주시면 안되나요? PE, 후킹 이런씩으로 말이죠.
    제가 리버싱에 입문한지 얼마 안되서 무슨 기술이 있는지 몰라서 어떤 걸 검색 해야할지도 잘 모르겠습니다. 글이 워낙 많아서 어떤 걸 봐야할지도 잘 모르겠구요.

  8. windofme 2012.03.14 05:08 신고 댓글주소 | 수정 | 삭제 | 댓글

    책 출간 열기가 후끈 하군요..
    한국에 이런 책이 얼마나 부족했는지 실태를 보여주는것 같아 매우 아쉽고
    다행이도 여름 출간이라니 기쁘기 까지 복잡 미묘한 심정입니다.

    예쁘게 출간 하시면 싸인회도 하시나요? 커버에 사인한장 받고 싶습니다

  9. TOD 2012.03.21 03:14 신고 댓글주소 | 수정 | 삭제 | 댓글

    아~ 드디어 기다리고 기다리던 책이 나오겠군요.

    1년 넘게 기다린 기분이네요. ㅋㅋ

    어서 빨리 보고 싶어요~ 책 주세요~

  10. 김성겸 2012.04.04 22:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    가격은 대략 정하셨나요?

    그간 많은 책들을 사왔고 보았는데

    몇몇 책은 정말 내용에 비해 책값이 정말 저렴했습니다

    이 블로그의 내용을 대략 살펴보았는데 매우 고가로 책정하셔도 불티나게 팔릴것 같습니다

    그냥 그렇다구요 ㅎㅎ

  11. binish 2012.04.07 15:08 신고 댓글주소 | 수정 | 삭제 | 댓글

    제대로 된 리버싱 책 한 권 나오겠네요! 멋지십니다.. 진정.. ^^

  12. 남현욱 2012.04.10 14:38 신고 댓글주소 | 수정 | 삭제 | 댓글

    무지막지한 노가다를 즐기셨군요...
    읽으면서 전율을 느낍니다. 등에서부터 뒷목까지 짜르르....
    존경합니다. 본받겠습니다.
    본디 책 구매를 꺼리는 저입니다만, 반드시 구매하고 싶어집니다.

  13. lotzelon 2012.04.22 22:04 신고 댓글주소 | 수정 | 삭제 | 댓글

    ^^꼭 사겠습니다!!!
    완전 기대하고 있습니다.
    화이팅화이팅!

  14. 지나가다 2012.05.30 18:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    아웅... >_<);;
    책소식 들어왔나~ 싶어서 간만에 들렀는데 아직이로군요..ㅋㅋ
    기다리다가 목빠지겠어욤_!

  15. 키위는제스프리 2012.06.08 18:26 신고 댓글주소 | 수정 | 삭제 | 댓글

    어서나와라어서~

  16. 2012.06.10 23:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    여름 쯤에 출판 된다고 하는데 아직 소식이 없군요 ㅠ_ㅠ

  17. reversecore 2012.06.14 01:21 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. ReverseCore 입니다.

    제 책은 지금 에디터 분께서 열심히 작업중이십니다.

    몇 달내에 볼 수 있을꺼라 생각합니다. ^^~

  18. 컴공학생 2012.07.06 11:06 신고 댓글주소 | 수정 | 삭제 | 댓글

    지금까지 누구의 도움도 없이 혼자서 리버싱을 공부하다보니
    너무나도 많은 벽이 느껴졌는데, 정말 좋은 책을 쓰셨군요!!
    감사합니다^^

  19. Jayden. 2012.08.30 23:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    수고하셧습니다! 감사드려요!

  20. yrmfpnwshu 2013.04.29 02:11 신고 댓글주소 | 수정 | 삭제 | 댓글

    Hi there, what's up you guys???



기존 InjDll.exe 유틸리티를 업그레이드(Ver. 1.1.1) 하였습니다.

  1. 64bit 지원

  2. <dll path> 의 상대 경로 지원


☞ InjDll.exe - DLL Injection/Ejection 전용 도구


Windows 7 64bit OS 가 보급됨에 따라 리버싱 분야에도 점차 64bit 지원 여부가 중요한 이슈가 되고 있습니다. 저 또한 최근에 64bit 관련 내용을 공부하면서 흥미로운 내용을 많이 접하였습니다. (이번에 작업 중인 리버싱 책에 64bit 리버싱 챕터를 추가시켰습니다.)

각 플랫폼(32/64bit) 별로 Dll Injection 을 하실 때 다음의 내용을 주의해 주시기 바랍니다.

- Target 프로세스가 32bit 인 경우 : Injector & Dll => 모두 32bit (PE32 포멧)
- Target 프로세스가 64bit 인 경우 : Injector & Dll => 모두 64bit (PE32+ 포멧)

* 64bit OS 에서는 32/64bit 프로세스가 모두 실행 가능하므로, Target 프로세스의 PE 포멧을 확인 하신 후 적절한 Injector(InjDll32/InjDll64) 와 DLL 을 사용하시면 됩니다.

* PE32+ 포멧의 파일을 생성하시려면 Visual C++ 2010 Express & Windows SDK 를 설치하시면 됩니다.


ReverseCore

    이전 댓글 더보기
  1. RUIN 2010.12.03 13:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    도대체 책 언제 나와요 ㅠ_ㅠ
    책 Part 1 // Part 2로 나눠서 Part 1부터 먼저 내주셧으면 ㅠㅠ

    • reversecore 2010.12.03 16:14 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      Part 1/2 를 생각해 봤는데요.

      현재로서는 한권에 다 넣는게 좋다고 생각중입니다.

      제 책을 기다려주셔서 감사합니다. ^^

      힘내서 열심히 작업할께요~

    • RUIN 2010.12.03 18:20 신고 댓글주소 | 수정 | 삭제

      네ㅠㅠㅠ........

      최대한 빨리 써주신다면 감사 감사^_^

      감기 조심하세요^^

    • 두둥 2010.12.05 01:31 신고 댓글주소 | 수정 | 삭제

      저도 책 기다리고 있어요..ㅜ.ㅜ

      요새 사이트에 자주 못들어 왔는데 다양한 정보를
      책으로 볼수있는 기회가 빨리 오기를 바랍니다.

    • reversecore 2010.12.10 11:55 신고 댓글주소 | 수정 | 삭제

      네, ^^

      항상 신경써 주시는 두분께 감사드립니다.

  2. Saeglo 2010.12.24 17:48 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    여기서 배운게 정말 많고 항상 잘 보고 있습니다.

    혹시 윈도우가 아닌 다른 OS에서의 리버싱은 다룰 생각이 없으신지 궁금합니다.

    예를 들어 리눅스의 시스템 콜 후킹 같은 -

    실은 제가 최근에 Mac에 대해 공부를 하고 있는데
    국내에서 Mac에 대한 정보는 찾기가 힘들어서
    혼자 공부하기 쉽지 않네요 ㅠㅠ

  3. kaka 2010.12.27 20:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    좋은 글 매일와서 보고 따라해 보고..ㅋㅋ 있습니다.
    일단 책을 좀더 기다려야 한다니..아쉽습니다.
    화이팅~하세요.

    질문인데요..
    올려 놓으신 소스로 win7(32비트) IE8에서 DLL 인젝션을 실행하면 인젝션은 잘됩니다.
    그런데 인젝션된 dll의 DLL_PROCESS_ATTACH 이벤트가 수행되지 않는건
    머가 문젠가요? IE를 관리자 권한으로 실행하면 원하는데로 되던데요...
    직접 인젝션을 시키거나 NewZwResumeThread()을 수행하나 마찬가지네요.

    이것저것 해봐도 DLL_PROCESS_ATTACH 이벤트가 실행되질 안네요 T___T;;

    • reversecore 2010.12.31 00:38 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      어떤 소스 코드를 사용하셨나요?

      제 블로그에 몇 가지 버전의 InjDll 소스가 있습니다. @@~

      제가 http://www.reversecore.com/76 에 있는 InjDll64.exe 와 dummy64.dll 을 가지고 테스트 해보면 잘 되는데요.

      dummy64.dll 소스에 OutputDebugString() 을 추가해서 DbgView 로 확인하면 DLL_PROCESS_ATTACH 가 정확히 뜹니다.

      테스트하신 소스(혹은 실행파일)을 제게 보내주시면 확인해 드리겠습니다.

      감사합니다.

    • kaka 2011.01.03 09:52 신고 댓글주소 | 수정 | 삭제

      새해 복 많이 받으세요..

      아.. 죄송합니다.
      정확히 질문을 하지 못했네요.
      iexplore.exe부모는 DLL_PROCESS_ATTACH가 말씀하신데로 정확히 뜨는데,
      자식 iexplore.exe에게는 DLL_PROCESS_ATTACH나 DLL_THREAD_ATTACH 이벤트가 발생하질 안습니다.

      인젝터는 reversecore님께서 올려놓으신 파일로 했습니다.

    • reversecore 2011.01.07 05:38 신고 댓글주소 | 수정 | 삭제

      아~ iexplore.exe 의 child process 말씀이시군요.

      Global API Hooking 을 써야 하는데요.
      인젝션 시키는 DLL 에 global API Hooking 코드가 준비되어 있어야 합니다. 위 댓글에서 소개한 dummy.dll 에는 그런 기능이 없지요.

      http://www.reversecore.com/79 <- 요기 있는 redirect.dll 파일이 바로 그 파일입니다.

      redirect.dll 을 인젝션 하신 후 IE 의 탭을 마구 띄워서 child process 가 생성되는 순간 자동으로 인젝션이 되면서 DLL_PROCESS_ATTACH 가 뜹니다.

      DbgView 로 확인할 수 있도록 OutputDebugString() 으로 로그를 찍었습니다.

      * Win 7 32bit/64bit 에서 테스트 하였습니다.

      kaka 님께서도 새해 복 많이 받으세요~~~

      감사합니다.

  4. kaka 2010.12.30 17:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    InjDll64.exe와 dummy64.dll로 win7 64 OS에서 테스트해보니
    notepad에 inject(dll_process_attach)후 자동으로 dll_process_detach되던데
    왜그럴까요?

    • reversecore 2010.12.31 00:41 신고 댓글주소 | 수정 | 삭제

      역시 제 환경에서는 잘 되는데요.

      notepad 에 injection 성공하면 DLL_PROCESS_ATTACH 가 뜨고 바로 이어서 DLL_THREAD_DETACH 가 뜹니다. (원격 스레드가 종료되면서 뜨는거죠.)

      메일 주소를 알려주시면 OutputDebugString() 을 추가한 dummy64.dll 을 보내드리겠습니다. 다시 한번 확인해 보시기 바랍니다.

      * 간혹 보안 모듈에서 DLL Injection 을 막는 경우가 있습니다. 근데 그건 인젝션 자체를 막는 거라 올려주신 증상하고도 맞지 않네요.

      감사합니다.

  5. Reversing_H 2011.01.14 10:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    항상 잘보고 잘 배우고 있습니다.
    여기서 질문하나 드릴게요 ~

    제가 리버싱쪽으로 취업을 하고 싶은데,,
    리버싱쪽에서 뽑는거는 잘 못본듯 하고
    다른기술도 같이 병행해야하는 업무인지;

    이쪽에 대해 아는게 없어서 말이죠;;

    조언 부탁드립니다 ^^

    • reversecore 2011.01.14 11:50 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      관리자가 아닌 리버싱 엔지니어를 말씀하시는 거라면...

      제가 알기로는 보안 분야뿐입니다.
      (AV 업체, 온라인 게임 업체...)

      간혹 보안 컨설팅 분야에서 리버싱 관련 지식에 대해 가산점을 부여한다는 얘기만 건네 들은적은 있네요~

      감사합니다.

  6. Reversing_H 2011.01.14 11:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    아,, 한가지더 ;
    보통 악성코드 분석에서 리버싱이
    쓰이는걸로 알고있는데

    그렇다면 악성코드 분석할때
    필요한게 리버싱과
    또 어떤분야가 필요한지
    알고싶습니다.

    질문여러개 드려서
    죄송합니다 ㅠ

    • reversecore 2011.01.14 11:54 신고 댓글주소 | 수정 | 삭제

      회사마다 다르겠습니다만...

      악성코드 분석은 리버싱 지식만 있으면 됩니다. (이것만도 쉽지 않습니다.)

      추가적으로 악성 코드 자체의 지식, 보안 지식 등을 갖춘다면 면접에서 좋은 점수를 받을 수 있겠지요.

      사실 회사마다 사람 뽑는 기준(신규직원의 경우) 은 다 틀려서 말이죠. 어디는 학력을 중시하고, 어디는 성격/기질을 중시하고, 어디는 순수한 실력을 보기도 하고... 그렇답니다. ^^

      감사합니다.

  7. Reversing_H 2011.01.15 20:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    답변 정말 감사드립니다.
    그런데 한가지 더 질문드릴게요;;
    원래 제가 7년전쯤에 프로그래밍쪽이 너무 좋아서
    개발쪽으로 취업을 하려다가 우리나라의 개발직의 종사자분들의
    여러가지 이야기를 들어보니(뭐 IT쪽은 여건이 안좋은건 비슷하지만)
    흥미도 떨어지고 여차저차에서 아예 IT쪽에 손을 놓았다가
    보안쪽에 흥미를 갖고 다시 공부를 시작했습니다.
    하지만 보안이라는 분야에 대해 처음 접하고 보안자체도 워낙 종류가
    많더군요;; 그리고 신입이 바로 들어가기도 쉽지 않은 분야이구요.
    그래서 리눅스 계열의 서버쪽에 우선 취업을 해서 이직하려고 준비하던중에
    리버싱이라는 분야를 알게 됐고 매우 흥미를 가지게 되었습니다.
    정말 이건 충격자체였고, 바로 이거다라는 느낌을 받았습니다.
    하지만 이걸 알게된것이 얼마전이고 말 그대로 실력이 없습니다.
    목표는 리버싱 일을 하는게 제 목표이긴 하지만요.
    여기서 질문을 드리자면
    뭐 물론 제일 좋은것은 처음부터 리버싱 업무를 하는 곳에 취직하는게 제일
    좋겠지만,, 제가 여건상 돈을 벌어야 하기에;; 바로 들어가기에는
    시간적이 여유와 자금적 여유가 없어서 프로그래밍 쪽이나
    서버쪽에 먼저 취직을 해야 할듯 싶은데 ,
    추후 리버싱일을 하려면 개발직 쪽으로 가는것이 더 나을까요?
    또한 개발직 쪽으로 가더라도 개발직도 종류가 많은데
    보안솔루션 개발쪽으로 가는것이 더 좋은 선택인지
    많은 것이 고민됩니다.
    자꾸 질문드려서 죄송하구요;;
    그만큼 이곳을 알게되고 리버싱이란 것을 알게되서
    기쁘구요. 조언좀 주셨으면 좋겠습니다 .
    감사합니다 ^^

    • reversecore 2011.01.20 00:04 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      사실 리버싱일을 하시려면 말그대로 리버싱쪽으로 취직을 하시는게 좋습니다.

      제가 처음 리버싱으로 취업할 때만 해도 국내에 리버싱을 하는 사람들이 없어서 거의 대부분 경력 개발자들을 뽑았습니다. 몇 달을 교육시켜서 실무에 투입했지요.

      요즘은 리버싱 인구가 많이 늘어나서... 회사도 신입을 뽑더군요... 신입들의 리버싱 경험도 상당하더군요. 경력을 뽑을때도 동종 업계의 리버싱 경력자를 뽑구요...

      저와 저희 회사의 사례를 소개해 드린거라서요...
      참고만 하시기 바랍니다.

      제 개인적으로는 개발/리버싱 모두 경험을 가지고 있는 것이 좋다고 생각합니다. (실제로 제가 그렇구요.)

      감사합니다.

  8. 아침햇살 2011.02.07 16:24 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요^^ 맨날 눈팅만하고...책나오길를 기다리는 사람입니다;;
    매번 조용히 글만읽고 댓글하나 없이 가다가....궁금한게 있어서 염치 없지만 이렇게 질문하나
    드리고 갑니다.

    32비트에서는 전역 후킹시에 ntdll!ZwResumeThread를 이용하면 앞으로 실행될 프로세스에 대해
    서도 모두 후킹이 가능한걸 알았읍니다.. 근데

    64비트에서는 실행되고 있는 프로세드들이 64비트 응용프로그램인지 32비트 응용프로그램인지를
    구분하여 따로 Injector와 DLL을 맞추서 인젝션을 해야 하더군요..

    예를 들어 저는 64bit OS에서 32비트 응용프로그램에만 인젝션을 시도할 예정인데요
    이게 앞으로 실행될 프로세스에 대해서 어떻게 인젝션을 해야 할지 좀 감이 안와서요;;
    쓰레드를 돌려서 새로 생성되는 프로세스를 감시하다가 32비트인지 64비트인지 구분해서 인젝션을 할까도 생각했지만 이건 왠지 아니다 싶은 생각이 들더군요;;
    64비트에서도 ntdll!ZwResumeThread 처럼 뭔가 핵심적인 함수 하나를 후킹해서 전역적으로 후킹할 수 있는 방법이 없을까 해서요.. 물론 저 함수를 64비트에서 후킹 할 수 있겠지만
    제가 돌리는 응용프로그램이 32비트이다보니 explorer.exe에 인젝션을 할 수 가 없는 상황입니다.
    다른 분들의 의견이나 reversercore님의 의견이 한번 듣고 싶네요..~ +.+
    구글링을 해봤지만 딱히 눈에 딱 보이는거 없어서요..(혹시 제가 놓친거 일 수도 있습니다..ㅋ)
    어떻게 생각하세요??

    • reversecore 2011.02.09 21:39 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      64bit 환경에서 32bit 프로세스만 global hooking(자동 인젝션) 을 하신다는 말씀이시죠~

      제가 직접 시도해 보기 전에는 뭐라 말씀드리기가 어렵군요.

      테스트 후 다시 답변 달아드리겠습니다.

      감사합니다.

    • 아침햇살 2011.02.14 11:34 신고 댓글주소 | 수정 | 삭제

      넵 답변 달아주셔서 감사합니다^^

      지금은 우선 쓰레드에서 프로세스를 감시하여 새로 생성된 프로세스
      를 탐지해 32bit일경우만 Injection하도록 작업하고 있습니다.^^

      좀더 좋은 방법이 나왔으면 좋겠네요~ ㅎ ~
      그럼 수고하세요^^

  9. baboha 2011.02.12 19:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 리버스코어님 글 잘보고있습니다.

    질문이 하나있는데요

    프로세스가 실행중일때 Injection된 dll의 이름들을 얻을려면 어떻게 해야할까요?

    IAT에 써진것말고 프로세스가 LoadLibrary를 통해서 따로 Injection한 것까지 알고싶습니다

    마치 procexp 프로그램처럼요

    • reversecore 2011.02.18 22:44 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      말씀하신 그런 기능을 수행하는 API 가 있습니다. Injection 된 DLL 들을 Ejection 시킬 때 사용됩니다.

      CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID)
      Module32First()
      Module32Next()

      위 API 를 검색해 보시기 바랍니다.

      감사합니다.

  10. harrison 2011.04.16 06:37 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    리버싱 관련 지식이 필요해서 검색을 하다가 이곳에 왔는데,
    굉장한 도움이 도움이 되었습니다.
    감사합니다.

  11. wordboss 2011.05.17 10:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    오늘 오랜만에 강좌에 와보니 새로운 내용 더 생겼네요.
    보 다 흥미로운 내용 더 많이 올려주세요
    자주 방문 하겠어요
    건강에 각별히 류의하시구요

  12. FreeAngel 2011.07.06 03:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    궁금한점이있는데요.ㅠㅠ 글로벌 후킹에ㅓ 실행되는 프로그램, 앞으로 실행될 프로그램을
    제어 할 수 있다고했는데, 흰트조금만주세요.ㅠㅠ 크레이트 프로세스를 써서하는건지;;;;ㅠ

    • reversecore 2011.07.14 05:56 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      제 블로그에 있는 글이 도움이 되실 것 같습니다.

      Advanced Global API Hooking – IE 접속 제어 (1)
      (http://www.reversecore.com/77)

      API Hooking – '스텔스' 프로세스 (1)
      (http://www.reversecore.com/65)

      감사합니다.

  13. 2011.10.27 10:49 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  14. 2011.10.28 12:51 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  15. 2011.10.28 12:51 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  16. 2012.01.09 02:04 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  17. 따오기d 2012.02.01 10:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    수고하십니다.!! 글잘봤어요
    질문이 있는데요
    Injector = 32bit process
    HookDLL = 64bit dll
    Target Process = 64bit Process
    OS 는 Windows 2008 R2 (64bit) 이구요
    이상황에서 Injector 가 wow 로 돌고있는 상황에서 가능한 방법이 있나요?

  18. 따오기 생각 2012.02.13 13:34 신고 댓글주소 | 수정 | 삭제 | 댓글

    따오기님
    수고하세요.
    오 그거 생각에 system disable wow비슷한 API가 있는데요.
    그걸 참고하시지요.

  19. 2012.05.25 16:16 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  20. 2012.05.29 09:28 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다



"리버싱 공부를 어떻게 시작해야 할지 모르겠어요. 도와주세요." 라는 질문을 종종 받곤 합니다. 제가 블로그 활동을 하는 이유는 우리나라의 리버싱 기술 수준을 향상시키고, 리버싱 기술을 널리 전파하는데 작은 힘을 보태는 것입니다. 특히 리버싱에 처음 입문하시는 분들께 길잡이 역할을 할 수 있다면 더이상 바랄게 없습니다.

과연 어떻게 하면 리버싱을 잘 할 수 있을지 제 생각을 얘기해 드리겠습니다.



1. 모든 공부에는 "목표"가 있어야 합니다.


"리버싱 전문가가 되기 위해", "취직을 위해", "흥미를 위해", "해커가 되기 위해" 등의 자신만의 목표가 필요합니다. 이러한 목표가 없으면 힘든 공부를 지속하기 어렵습니다. (도중 포기할 확률이 높아진다는 뜻입니다.) 목표는 여러분들에게 방향을 제시합니다. 그 목표를 향해 한발 한발 전진하시기 바랍니다.


2. "긍정적인 마인드"를 가지세요. 


잘못된 편견을 가지신 분들이 많이 계십니다.

- "저는 C 언어도 모르는데요... 리버싱을 할 수 있을까요?"  --->>> 물론이죠.
- "저는 어셈블리를 해본적이 없는데요... 리버싱을 못 하겠지요?" --->>> 천만에요. 잘 하실 수 있습니다.
- "저는 윈도우즈 구조를 전혀 모르는데요... 그래도 리버싱을 할 수 있을까요?" --->>> 무지 잘하게 되실 겁니다.

바로 위와 같이 "저는 XXX 를 모르는데요" 라던지 "저는 YYY 를 해본적이 없는데요" 라는 말은 리버싱을 공부할 때 전혀 의미없는 말입니다. 이런 말은 지레 겁을 먹게 만들고, 도전 의식을 꺾어버립니다. 시도조차 못해보고 포기하게 만드는 부정적인 말입니다. 오히려 "XXX 를 모르기 때문에 배우고 싶다" 라고 긍정적인 생각을 해보시기 바랍니다.

배워야 할 가짓수를 따지자면 수십 가지가 넘을 것입니다. 리버싱 초보자가 그걸 처음부터 다 배워야 할까요? 너무 힘들겠지요. 지겨워질 겁니다.

그냥 새로운 내용이 튀어 나올때마다 다 해결하고 넘어가려고 하지 마시고 일단 맘에 묻어두시고 계속 진행하시는 것이 중요합니다. 반복 학습 하는 과정에서 한가지씩 차츰 차츰 배워나가시면 됩니다.

예를 들어 "XOR EAX, EAX" 의 의미는 디버깅을 몇 번 해보시면 저절로 체감하게 되는 내용입니다. 처음 볼때나 낯설고 흥미롭지요. 하지만 100번 봤다고 생각해 보세요. 그냥 당연하게 받아들이게 됩니다. 오히려 같은 의미의 "MOV EAX, 0" 명령어가 이상하게 보일겁니다. XOR EAX, EAX 를 왜 안썼을까 하고 말이죠.


3. "재미"를 느끼셔야 합니다.


초보일수록 더더욱 리버싱 과정에서의 재미를 찾으셔야 합니다. 어렵고 지겨운데 어떻게 계속 해나갈 수 있겠습니까? 리버싱이 재밌고, 하나씩 모르는 걸 배워나가고, 내가 맘먹은대로 프로그램을 패치시키는 이런 과정에서 재미를 찾으셔야 하지요.

사람은 재미있는 일이라면 남들이 아무리 말려도 스스로 하게 되어있답니다.


4. "검색"을 생활화 하셔야 합니다.


"검색하면 9할은 나온다" <- 제가 어디서 읽은 후 맘속에 담아둔 명언 입니다. 특히 리버싱 기술은 수많은 검색을 통한 지식 습득이 필수적입니다. 역사가 짧고 관련 전문가도 적고 관련 서적도 거의 없다시피 하니까요. 일단 믿고 검색해 보시기 바랍니다. 반드시 원하시는 내용을 찾을 수 있으실 겁니다.


5. 제일 중요한건 "실천"입니다.


"Just Do It" 아시죠~

뭔가를 이루고는 싶은데... 맘을 먹으셨으면... 행동을 하셔야죠... 그것도 지금 당장 하는겁니다...

제 블로그에 있는 HelloWorld 부터 무작정 따라해보는 겁니다. 당연히 처음에는 하나도 아는게 없지요. 모든게 낯설게 느껴집니다. (특히 어셈블리 명령어는 거의 외계 언어로 보이죠.)

첫 목표는 디버거를 이용해서 main() 함수를 찾아가는 겁니다. 디버거에 일단 익숙해 지기 위해서 메뉴도 하나씩 건드려 보고요. tracing(StepIn[F7], StepOut[F8] 명령어를 이용) 을 마구 해보는 겁니다. 차츰 감이 오다가 결국 main() 을 찾게 됩니다. C 소스 코드와 Disasembly 코드의 차이도 확인해 보시구요. 시작은 성공하신 겁니다! 출발이 좋군요. ^^

그다음 간단한 crackme, patchme, unpackme 등을 찾아서 해보시구요.

흔히 볼 수 있는 메모장, 계산기등을 패치해봅니다. (아주 간단히 말이죠. 가령 기능을 막아본다던지 하는 그런 정도로요.) 그 후 차츰차츰 대상을 넓혀 가시는 겁니다.


6. "느긋한 마음"을 가지세요.


리버싱 초보자가 가장 걸리기 쉬운 병이 바로 "조급증" 입니다. 빨리 성과를 내고는 싶은데 공부가 만만치는 않고 실력은 제자리에서 맴돌고 있습니다. 자신이 얼마나 모르는 것인지, 제대로 가긴 하는 건지 너무 답답합니다. 어셈블리, 윈도우즈 내부구조, PE 파일 포멧, API 후킹 등 뭐 하나 쉬운게 없습니다. 어셈블리 한가지만 봐도 어디까지 공부를 해야 하는지 알 수 가 없지요. 이럴때 마음이 급해지고 목표를 잃어 버리게 됩니다. 

제가 해드리는 얘기를 잘 읽어 보시기 바랍니다.

世界最强 大韓民國 

위 한자들을 읽어 보세요. "세계최강 대한민국" 입니다. 대부분 정확히 읽으셨을 겁니다. 그렇다면 안보고 정확히 쓸 수도 있으신가요? 아마 안보고 쓰는건 쉽지 않으실 겁니다. ^^ 위 8 글자 중에서 한 두 글자를 모르더라도 주변 글자들을 통해서 전체를 읽어 낼 수 있습니다. 

저를 비롯한 많은 리버서들이 어셈블리 명령어를 100% 자유자재로 구사하지는 못합니다. 몇명은 그래도 어셈블리 프로그래밍이 가능하지만 많은 사람들은 그렇지 못합니다. 마치 위의 한자를 읽을 수만 있고 쓸 수는 없는 것과 비슷한 상황입니다. 그래도 리버싱만 잘해요~ ^^ 명령어를 모르면 찾아 보면 되니까요. 그 정도만 알아도 프로그램의 동작 흐름을 알아낼 수 있습니다. 아마 이런식으로 몇 년이 더 흐르면 지금보다 훨씬 잘하게 되겠지요.

중요한 것은 저와 제가 아는 모든 리버서들도 초보 시절에는 (여러분들과 같이) 다 고만고만한 조건이었다는 것입니다. 꾸준히 하다보니 자연스럽게 어느 정도의 실력이 쌓인 것이지요. 절대로 조급해 하지 않았습니다.

여러분들도 지금 당장 시작해보세요~ 분명히 성과가 나타날 것입니다.

제가 어떻게 장담하냐구요? 저는 사실 구체적인 성공 사례를 알기 때문입니다. 블로그를 운영하면서 많은 분들께 과분한 감사의 메일을 받았습니다. 그 사연들을 읽어보면 감동에 이어 전율이 흐를 때도 있습니다.

- 대학 졸업작품이 단과대 전체 최우수 작품으로 선정되었습니다. (상까지 받으셨다는...)
- 개발 프로젝트에 후킹 기술을 적용해서 쉽게 해결할 수 있었습니다. (유명 회사 개발팀 소속이십니다.)
- XX소프트웨어 멤버십에 합격했습니다. (XX 취직이 보장된다는 그런 곳이라죠.)
- 리버싱 프로젝트("문서 암호화")를 성공시켰습니다. (아마 대학교 동아리 였던걸로 기억합니다.)
- 기타...

이분들께서는 대부분 리버싱 초보셨습니다. 본인들의 불타는 열정으로 엄청난 성취를 이루어 내신 거지요. 따라서 제가 여러분도 할 수 있다고 장담할 수 있는 것이고요.

공부하시다가 모르시는 내용이 있으세요? 질문하세요~ 저도 다른 분들의 생각을 들어보고 같이 고민하는 것을 좋아합니다.

자, 지금 당장 시작하세요~ ^^

ReverseCore
    이전 댓글 더보기
  1. 퍼다우크 2010.10.21 14:54 신고 댓글주소 | 수정 | 삭제 | 댓글

    얼씨구 언제 이런 블로그를 .....
    아이고 글도 많이도 쓰셨네요... 5년을 옆에 있었는데 이런걸 몰랐다니...T.T

  2. Middle Reverser 2010.10.22 18:24 신고 댓글주소 | 수정 | 삭제 | 댓글

    저 같은경우도 리버싱 은 함부로 모른다고 접근 하면 안된다고 동감합니다 ...
    저두 .. C 언어를 배우기 전에 Reversing 을 배우기시작했는데요 ... 스스로 부족한건 자동으로 공부를 하게 되더군요 ..
    동감합니다 ^^

  3. 이영호 2010.10.25 10:43 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요? 즐겨찾기 하고 간혹 한번 두번 읽고 가는 사람입니다.
    강의해주신 내용보니 참 좋아서요..저는 웹프로그래머라 윈도우 어플리케이션에 대해 잘 알지
    못하지만 어쩌다가 리버싱이란걸 알게되서 흥미를 갖고있답니다 ^^;;

    아무쪼록 감사의 말씀 전하고 갑니다 ^^

  4. binoopang 2010.12.09 16:25 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 여기 참 자주 오게 되네요 ^^
    좋은글도 감사히 잘 읽고 갑니다.

  5. Lr라 2011.01.07 10:46 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 도움이 되는 글이군요 ㅠㅠ
    예전에 비해서 강좌가 많이 사라져서 슬펏는데 아쉽네요 ㅎㅎ
    런투 크랙이 망해버려서 공부할길도 없어지니말이져..
    점점 슬퍼지는 현실 ㅠㅠ

    • reversecore 2011.01.11 10:57 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      아이쿠~ 제가 원래 리버싱 입문자에게 약간의 도움이라도 드리고자 블로그를 시작했늗데 요즘 다른 일(?)로 강좌를 못 올리는 상황입니다.

      저말고도 다른 분들의 훌륭한 강좌가 많이 있습니다. 최소한 제가 리버싱 시작할 때보다는 훨씬 공부하기 좋은 환경이라고 감히 말씀드릴 수 있습니다. ^^~

      이럴때 실전 디버깅 연습을 많이 해보시는건 어떨까요?
      간단한 프로그램을 리버싱하면서 자신이 부족하다고 싶은 부분을 집중적으로 찾아서 공부하시는 겁니다.

      tuts4you 나 openrce 같은 사이트에 많은 샘플 예제가 있으니 그걸 활용해 보시는 것도 좋겠네요.

      감사합니다.

  6. Conscientia 2011.02.22 14:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    와...정말 많은 도움이 되었습니다 자주자주 들르겠습니다 사...사..사탕합니다 리버스코어님

  7. blackrus 2011.02.22 23:49 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스코어님을 멘토로 만났더라면 참많이배웠을거같습니다 ㅎ
    그렇다할 스승이없는 저에겐 참아쉽네요 ㅎㅎ

    • reversecore 2011.02.28 16:01 신고 댓글주소 | 수정 | 삭제

      저도 처음에 리버싱 멘토가 없었습니다. ^^

      장단점이 있는것 같습니다. 멘토가 없으면 없는대로 더 열심히 찾고 헤메고 하던 일들이... 지금보면 참 소중한 경험이 되었으니 말이지요.

      감사합니다.

  8. Aly 2011.03.01 11:18 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱을 공부하는 한 학생으로써, 정말 좋은말씀과 좋은정보들 감사합니다.

    앞으로 자주 들리면서 많은 질문드리도록 하겠습니다 ^^

  9. 초보 2011.03.16 01:05 신고 댓글주소 | 수정 | 삭제 | 댓글

    궁금한게 있습니다!
    PE 분석후, 디어셈블러를 통해 나온 어셈블리어에서
    변수의 이름도 파악할 수 있나요?
    함수이름은 파악이 되는걸로 아는데....
    답변부타드립니다ㅜ

    어셈블리어에서 어떤 정보까지 알 수 있는지... 찾아봐도 잘 안나오네요ㅜ

    • reversecore 2011.03.16 21:31 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      빌드 과정에서 생성되는 map 파일이란게 있습니다.
      디버거에 이 파일을 연결해주면 변수명, 함수명 등을 보실 수 있는데요.

      일반적인 상황에서는 map 파일을 배포하지 않으니 제삼자는 볼 수 없습니다. 따라서 전역변수와 함수명은 일반 주소로 표시되고, 로컬 변수는 [ESP+X] 형태로 표시되는 것이 일반적입니다.

      함수이름이 파악된다는 말씀은 아마 Win32 API 이름이 보인다는 뜻인것 같습니다. 그것은 DLL 에서 외부로 노출한 것이기 때문에 디버거에서 볼 수 있는 것이지요.

      감사합니다.

  10. 이제시작 2011.03.27 22:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    글을읽고 많은 도움을 얻어갑니다!
    적어도 저는 지금 3번째는 만족하고있네요~!
    요즘 하나하나 하는게 재미있습니다 !!

  11. 아직시작안함 2011.04.22 23:43 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 ,제가 네이버에 리버싱이라고 검색해보면 뜨겠지만 리버싱이라는 4만원짜리 책을 사려고 합니다. 그런데 그게 기초를 좀 다져야 한다고 하는데 그럼 어떤책을 기초로 삼아야 할까요? 추천좀 해주세요, 아니면 님께서 어떻게 시작하셨는지 가르쳐 주세요

    • reversecore 2011.05.03 00:56 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      그 책이 어떤 책인지는 잘 몰라서 뭐라 말씀드릴 수 가 없네요.

      제 경우는 업무가 리버싱이기 때문에 시작할 때 남들보다 훨씬 수월하였습니다.

      감사합니다.

    • 아톰보트 2011.06.26 11:08 신고 댓글주소 | 수정 | 삭제

      4만원 짜리 책이라는게 혹시....
      에이콘 출판사에서 나온 리버싱비밀을파헤치다 아닐까요?
      저도 이 책이있는데 초보자가 보기에는 좀 힘든거 같더라구요 ^^

    • Emalron 2011.08.22 11:45 신고 댓글주소 | 수정 | 삭제

      하지만 한국에 나온 책 중엔 가장 좋은 책 인거 같습니다.

  12. 아톰보트 2011.06.26 11:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은글 잘 읽었습니다!!
    즐겨찾기 해두고 매일 와야 할 거 같아요..
    전 이제 리버싱공부를 시작한 초보거든요 ㅎ
    앞으로 많은 조언과 가르침 부탁 드리겠습니다^^

  13. 리버서가되고싶다 2011.09.22 17:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    저는 리버싱을 하기위해 c언어공부를 하고있고 이해될떄까지 마친 후
    X86 프로세서를 위한 어셈블리언어 <--이걸 공부하려고하는데요..
    확실이 c랑 어셈을 어느정도 공부한 후에 리버싱을 하게된다면 수월하게 기술을 익힐수있을까요..?

    • reversecore 2011.09.28 21:04 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      C 와 Assembly 를 잘 알면 분명 디버깅이 수월합니다만...

      잘 모르시는 분들도 리버싱을 공부하면서 같이 병행으로 배우시는 분들이 많습니다.

      그래도 잘 하시더군요. ^^~

      감사합니다.

  14. Z2ong2 2011.09.30 13:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    시작할때 여기서 시작하고 중간에 크랙미 몇개 풀고 다시오네여
    지금 3달정도 리버싱 공부를 하고 있는데 이게.. 실력이 느는것 같지 않네여..
    그저 3달동안 이 블로그의 글 몇개와 크랙미 몇개 풀고 그랬는데도
    얼마전 청소년대회의 리버싱문제는 풀지도 못햇네요 ㅠㅠ
    너무 느린걸까요 아니면 조급한 생각일까요..
    조언 부탁드립니다

  15. 아로미 2011.11.08 02:54 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스코어님 글을 읽으니 힘이 솟네요... +_+/
    지금부터 열심히 공부하겠습니다! 잘 부탁합니다 ^^

  16. 양승환 2012.02.12 03:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    이글보니까 힘이 나네요~^^
    2~3개월동안 공부하면서 실력이 늘지 않는다고 자책해왔었는데..ㅎㅎ;;
    그래도 꾸준히 해볼랍니다~^^
    리버스코어님 글보구 호랑이기운받고 갑니다~
    감사합니다~^^

  17. 신ㅂㅣ 2012.07.23 16:02 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은말 감사합니다 ㅠㅠㅠㅠ

  18. 2012.08.09 13:24 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  19. Obelbert 2012.09.20 11:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    감사합니다.

  20. 기모찌 2017.04.02 15:41 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다





티스토리 툴바