"리버싱 핵심 원리" 2쇄를 찍었습니다~ 

성원해 주신 독자 여러분들께 감사드립니다~ ^^~


많은 독자분께서 블로그와 이메일을 통해 "리버싱 핵심 원리"에 대해 격려와 조언을 해주셨습니다.

정말 감사드립니다~~~



+---+



기억에 남는 이메일들이 많이 있는데요.

의외로 초/중/고 학생중에서 리버싱에 관심을 가지고 열심히 공부하시는 분들이 계시더군요.


어린 학생분들이 인생의 목표를 세우고 한 걸음씩 실천하는 모습을 보면서 가슴이 뭉클하고 절로 숙연해 졌습니다.

새삼 제 자신에 대해 돌아보게되고 삶의 자세에 대해 많이 생각할 수 있었습니다.

덕분에 많이 배웠습니다.



+---+



제 주변에도 제 책으로 공부하시는 분들이 계신데요.

1/3 분량 정도부터 어려움을 느끼시더군요. 

생소한 Win32 API 설명이 나오면서 그 부분이 좀 힘드셨나봐요.


Windows 리버싱이란 API 위주로 프로그램의 동작을 파악해가는 과정의 연속이기 때문에...

API 공부를 피할 수는 없습니다.


한 가지 팁을 알려드리자면 책과 구글 검색을 통해 API에 대한 대략적인 설명을 접한 후 디버깅 실습까지 진행해 보세요.

하나하나 디버깅 하면서 해당 API 의 기능을 익혀 보시기 바랍니다. 억지로 외울 필요 없습니다.

자주 반복해서 나타나기 때문에 나중에 가면 저절로 외워진답니다.


이렇게 하나씩 장애물을 넘어가다보면 자연스럽게 '리버서'가 되는 것입니다.


그리고 어려울땐 질문을 해보세요~

같이 고민하다보면 꼭 해결할 수 있을겁니다~



모두 화이팅 하세요~~~

여러분의 꿈이 다 이루어지길 기원합니다~ ^^



저작자 표시 비영리 변경 금지
신고
    이전 댓글 더보기
  1. 2013.01.22 11:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    어제 책 주문했어요 !!ㅋㅋ

  2. 퐈니아 2013.02.03 22:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    드디어 책을 구매했습니다.
    열심히 보겠습니다..ㅎㅎ

  3. 탄마지 2013.02.21 21:44 신고 댓글주소 | 수정 | 삭제 | 댓글

    축하드립니다^^ 리버싱 처음접하는데 많은 도움되길 기대하고있어요

  4. 매지구름 2013.02.23 11:40 신고 댓글주소 | 수정 | 삭제 | 댓글

    도서 제목이 리버싱 핵심 원리: 악성 코드 분석가의 리버싱 이야기였군요.. ^^
    제가 사정이 있어서 초판에는 구입못하고 오늘 2쇄를 구입했네요.. 구입못한 사정은 뭐...개인적인...
    페북하면 친추나 합시다.
    요즈음 AhnLab 분위기는 어떤지요? 제가 존경하는 안철수교수님의 횡보가 궁금하군요..
    엘다드에일람(리버스엔지니어 비밀을 파헤치다)도 아직다 마스터 못했는데.
    또 리버스코어님이 내 신책이라 반가운 마음에 바로 충동?구매했네요.
    먹고 살기 바빠서... 돈만 많으면 ㅎㅎ
    이승원님 저두 독서와 공상을 좋아하고, 늘 새로운 도전을 꿈꾸고 있습니다.
    댓글이나 페북친추 부탁드립니다. ^^
    근데 님 블로그에 트랙백이 안가는지요? 저 차단 하셨는지? ㅡ,.ㅡa

    • reversecore 2013.02.25 22:16 신고 댓글주소 | 수정 | 삭제

      안녕하세요~

      페북 계정이 있기는 한데요~ 그냥 회사 사람들 근황을 보는 수준이고 그나마 잘 들여다 보지도 않는답니다. ^^

      블로그 트랙백 차단이요? 아뇨~ 사실 그런거 할 줄도 몰라요~ ^^

      감사합니다.

  5. 2013.02.25 10:18 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2013.02.25 22:14 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      선행학습에 대한 제 의견은 이렇습니다.

      C, Win32 API, Assembly, Windows 내부구조, 디버거 동작 원리, PE 파일 등을 미리 잘 알고 있다면 선행 학습이 잘 되어 있는 것입니다. 근데 이미 리버싱도 잘 알고계신 상태인거죠. 이정도 선행학습이 되어 있다면 그 다음은 실전만 남은겁니다. ^^

      저 모든 것을 공부하는 것이 리버싱을 배우는 과정이라고 생각합니다. 그런데 프로그래머보다 더 전문적으로 C, Win32 API, Assembly 를 공부하기도 어렵고... 커널 드라이버 개발자보다 Windows 내부구조, 디버거 동작 원리 를 공부하기도 어렵습니다.

      보통 리버싱 초보자들은 선행학습만 하다가 그 엄청난 양에 지쳐서 포기한답니다. 그래서 저는 리버싱의 재미를 맛본 다음에 필요한 것을 필요한 정도 만큼만 찾아 공부하는 방식을 권해드립니다.

      체계가 약간 없어 보일 수 도 있지만... 어느정도 수준으로 올라가면 스스로 알아서 필요한 부분을 찾아서 깊이 공부하게 된답니다. 저와 제 주변의 모든 리버서들은 다 이런식으로 배웠습니다. ^^

      감사합니다.

  6. joon 2013.02.25 12:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    2쇄 구매자입니다. ㅋ
    공부 할겸 겸사겸사 검색하다보니 이곳까지 왔네요. ㅎㅎ
    좋은 정보 많이 보고 갑니다. 종종 올께요 ^^

  7. 매지구름 2013.02.26 16:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 드뎌 오늘 도서가 왔네요...^^
    저두 티스토리 블로그 오픈한지 얼마 안되어서, 사실 밤벌레로 활동하다가 접고 다시 아는 지인에게서 초대장부탁하여 티스토리 블로그 재오픈하였네요..^^
    제 블로그에 도서구입받은 사진 올렸어요.. 댓글이래도 부탁..^^
    저두 블로그에 좋은 컨덴츠를 많이 올릴예정이구 주가가 우상향으로 갈 블로그에요..ㅎㅎ
    꼭 들러주셔서 댓글이래두 남겨 주셨으면 고맙겠습니다. ^^
    오늘도 행복하시구요. 자주 와서 괴롭혀드릴께요,,ㅎㅎ

  8. ㅎㅎ 2013.03.03 18:36 신고 댓글주소 | 수정 | 삭제 | 댓글

    존경해요

    꼭 살겁니다!

  9. hans 2013.03.06 17:24 신고 댓글주소 | 수정 | 삭제 | 댓글

    시스템 엔지니어에서 보안파트로 업무를 변경되고
    악성코드를 찾다보니 백신벤더만으로 한계가 있어서
    책을 구입한지 3개월째...

    대다수 악성코드가 DLL Injection 방식이라 text 결과물로 맨날 쳐다보니 눈도 아프고
    마음도 지치고 편하게 하고자 툴을 만들고 있느라 책을 못보고 있네요 ㅠㅠ

    어여 마무리하고 책을 봐야겠네요 ㅠㅠ

    ps 툴이 어느정도 만들어지면 시험삼아 한번 봐주셨으면 감사하겠습니다. ^^

  10. REng 2013.03.07 20:05 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요?

    승원님 블로그 글을 자주 찾다가 오늘 드디어 책을 샀습니다.^^

    책이 두껍고 내용이 많아 좀 비싸더군요. ㅎㅎ ( 가치에 비해서 비싸다는 뜻이 아닙니다 오해하지 마세요^^)

    감사히 열심히 잘 보겠습니다! 궁금한 점 있으면 자주 들를께요~

  11. Ksg12 2013.04.02 23:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.!!
    리버싱 잘보고있습니다.
    아직 첫장이라서 제가 잘못생각하는걸 수도있는데
    더좋은 IDA 같은 디버깅 프로그램을 갔고
    꼭 올리디버거를 추천하시는게 이유가 있나해서요.

    그리거 어셈블리언어 강의는 없나요 ㅠㅠ

    책 잘보고있습니다.
    두꺼워서 약간 겁을 먹긴했는데 열심이 화이팅해서 보고있습니다 !!
    이런책 써주셔서 감사합니다.

  12. hansu9911 2013.04.25 23:06 신고 댓글주소 | 수정 | 삭제 | 댓글

    C언어 포인터까지 공부하고 바로 이책을 들어갈려고 하는데, 어셈블리어를 하나도 몰라도 진행하는데 문제가 없을까요?
    서점에서 초반부를 봤더니 윈도우 환경이다보니 API 도 나오고 하던데 API 라도 하고 봐야 정상적인 공부가 가능할까요?

  13. BoN 2013.05.20 22:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    후킹이라는 기법을 우연히 알게되어
    간간히 리버스코어님의 블로그에서 이것저것 도전해보고 시도하다가
    포기했었는데
    책이 나왔다는 소식을 듣고 구매했습니다!
    2판 축하드려요 ^^

    목표, 열정 그리고 구글!! :)

  14. 이정욱 2013.05.31 18:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요... "리버싱 핵심원리" 책을구매해서 공부하는학생입니다.
    "PE 헤더" 에서 "IAT" 에서 제가 이해를 잘한건지 안한건지를 알고싶습니다..
    기술 자체에는 이해는 가지만.
    DLL 부분에서 a.dll/b.dll 저걸 예시로 들어서 설명을햇는데 그부분이 이해가안갑니다...

  15. 김낙현 2013.06.04 21:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요... 이 책을 구매해서 공부하는 학생입니다.
    30페이지에서 all referenced text strings 메뉴에 들어갔는데도 불구하고 어떠한 것도 화면에 출력되지가 않네요... api 검색도 마찬가지입니다.. 이 문제를 어떻게 해결해야 할까요?

  16. 최찬희 2013.06.13 23:48 신고 댓글주소 | 수정 | 삭제 | 댓글

    아 저도 컴퓨터 수리하는것과 프로그램 분석하는게 취미인데
    책이 너무 비싸요 ㅠㅠ

    지금은 c언어배우고있긴한데 c언어보단 리버싱을좋아하는터라..

    언능 돈모아서 사야겠네요 ㅋㅋ

  17. 최찬희 2013.06.19 19:15 신고 댓글주소 | 수정 | 삭제 | 댓글

    책샀어요 괜찮고 좋은 지식배우고있습니다 ㅎㅎ

  18. 최찬희 2013.06.19 19:15 신고 댓글주소 | 수정 | 삭제 | 댓글

    책샀어요 괜찮고 좋은 지식배우고있습니다 ㅎㅎ

  19. Lim 2013.11.08 18:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    열심히 리버스 핵심원리를 읽으며 공부하고 있는 학생입니다. 좋은 책 감사합니다. ^^

  20. katarn 2014.01.02 13:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    축하드립니다. 오랜만에 와봤는데 출판하셨군요. 지름신 발동해서 질러야겠다 ㅋㅋ



질문/답변 코너를 만든 이후로 많은 분들께서 질문을 해주시고, 답변도 도와 주셨습니다.

모든 분들께 정말로 감사를 드립니다.

댓글로 질문/답변을 진행하고 있는데요, 너무 댓글이 길어져서 사용하기 불편해졌습니다.
그래서 새로 추가하였습니다.

이후부터는 이쪽에 질문/답변을 올려주세요~
감사합니다.

* 예전 질문/답변 코너 링크입니다. (원하시는 내용이 있는지 검색해 보세요~)

질문/답변 코너입니다.

=======================================================

리버스 엔지니어링 분야에 대해 질문이 있으시면 아래의 댓글로 올려주세요. 역시 댓글로 답변을 올려드리겠습니다. 공개하기 어려운 내용은 '비밀글' 에 체크해주세요.

"비도덕적, 불법적" 인 내용은 답변 드릴 수 없음을 이해해 주시기 바랍니다.


댓글, 방명록, 이메일 등으로 많은 분들께서 여러 가지 질문들을 해주십니다. 
그중에 정말 좋은 질문들이 많아서 여러분들과 공유하면 좋겠다고 생각하였습니다.

이제부터 저에게 들어오는 모든 질문과 답변들을 이곳으로 모을 것입니다.
앞으로 질문과 답변은 이곳에서 해주세요~

질문에 대한 답변은 저 뿐만 아니라 제 블로그에 오시는 모든 분들께서 하실 수 있습니다.
문제 해결을 위한 방법은 다양합니다. 저 말고도 다른 분들의 답변은 언제나 환영입니다.

"질문은 좋은 것 입니다. 많이 해주세요. ^^ "

* 댓글로 질문하기 어려운 내용들(긴내용, 첨부파일 등)은 제 이메일(reversecore@gmail.com)로 문의해 주세요.

* 제가 사용하는 GMail 은 PE 파일을 첨부하면 전송 거부를 합니다. (압축을 시켜도 그걸 열어서 확인하지요.)
   => 실행 파일을 첨부해서 보내실때는 확장자를 exex, dllx, zipx 등으로 변경해서 보내주세요.

* 댓글이 너무 많이 달리면 제가 질문/답변 빈 포스트를 또 올릴 겁니다. 그쪽으로 계속 질문 댓글 달아주시면 됩니다.

감사합니다.


ReverseCore

신고

'q&a' 카테고리의 다른 글

질문/답변 코너입니다. (3)  (394) 2011.04.13
질문/답변 코너입니다. (2)  (232) 2010.01.28
질문/답변 코너입니다.  (295) 2009.09.21
    이전 댓글 더보기
  1. 2010.11.30 16:19 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

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

      안녕하세요.

      LoadLibrary() API 는 DLL 의 EP 코드를 실행시킵니다. EP 코드내에 DllMain() 호출하는 코드가 있지요.

      따라서 LoadLibrary() 를 다시 호출하면 DLL 의 EP 는 정확히 다시 실행되겠지요.

      하지만 DllMain() 에 사용자 코드를 넣고 인젝션 되면서 자동 실행되도록 하는 것이 Dll Injection 의 보통 사용 목적인데 DllMain() 이 없다면 사용처가 좀 제한 되겠네요~ ^^

      아, 그리고 injdll.exe 와 myhack.dll 이 같은 폴더내에 두고 실행하고 싶으시다고 하셨죠? InjDll.exe 최신버전에서는 추가된 기능인데요. 아래 코드를 참고하시기 바랍니다.

      GetFullPathName(argv[3], BUFSIZE, szPath, NULL)

      argv[3] => "myhack.dll" 문자열 파라미터
      szPath => 같은 경로에 있는 myhack.dll 의 full path 가 저장됩니다.

      감사합니다. ^^

  2. 안녕하세요 2010.12.01 12:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요~
    Dll 을 다른 프로세스에 injection 시킨 후 DllMain이 전부 실행된 후에 바로 ejection 시키려고 하는데요, DllMain이 전부 끝났는지를 어떻게 검사해야할지 모르겠습니다. Dll쪽을 건드려서 DllMain의 끝부분에 IPC로 Dll Injecter에 끝났다는 것을 알리는 코드를 추가하는 방법이 있을 것 같기는 한데 제가 작성한 Dll말고 모든 Dll에서 범용적으로 사용될 수 있도록 Dll은 그대로 놔두고 Injecter 쪽에서 DllMain이 끝났는지를 검사하게 하고 싶은데 방법이 없을까요?

    • reversecore 2010.12.03 15:47 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      hThread = CreateRemoteThread(xxxxx);
      WaitForSingleObject(hThread, INFINITE)

      위와 같이 DLL Injection 을 시키면 DllMain() 함수가 리턴할 때까지 WaitForSingleObject() 함수에서 대기합니다.

      DllMain() 에 메시지 박스를 넣고 간단히 테스트해보시면 됩니다.

      감사합니다.

  3. 2010.12.05 15:11 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2010.12.10 15:51 신고 댓글주소 | 수정 | 삭제

      안녕하세요. ReverseCore 입니다. ^^

      보내주신 코드를 보았습니다.

      Inject -> patch -> Inject 흐름이더군요.

      2번째 Inject 시에 왜 DllMain() 이 호출되지 않느냐는 질문이신거죠?
      (제가 잘 이해했는지 모르겠군요? ^^)

      저 myhack.dll 이 제 블로그의 파일이라면... 소스코드는 아래와 같을겁니다.

      DWORD WINAPI ThreadProc(LPVOID lParam)
      {
      char szPath[MAX_PATH] = {0,};
      char *szProcess = NULL;

      if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
      return 1;

      if( !(szProcess = strrchr(szPath, '\\')) )
      return 1;

      szProcess++;
      if( !stricmp(szProcess, "notepad.exe") )
      URLDownloadToFile(NULL, DEF_NAVER_ADDR, DEF_INDEX_PATH, 0, NULL);

      return 0;
      }

      BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
      {
      HANDLE hThread = NULL;

      switch( fdwReason )
      {
      case DLL_PROCESS_ATTACH :
      hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
      CloseHandle(hThread);
      break;
      }

      return TRUE;
      }

      즉, DLL_PROCESS_ATTACH 인 경우에 스레드가 실행되는 것이죠.

      같은 DLL 파일을 같은 프로세스에 연속 Injection 시켜도 DLL_PROCESS_ATTACH 는 한번만 뜨게되고...
      이후부터는 DLL_THREAD_ATTACH 가 뜹니다. 그래서 2 번째 Injection 에는 ThreadProc() 이 실행되지 않은 것이지요.

      Injection 마다 ThreadProc() 을 실행시키려면 myhack.dll 소스코드의 DllMain() 함수를 수정하시면 됩니다.

      * 코드를 보면 DLL 의 RVA 254A 위치에 "EB" 로 한바이트 패치를 하셨는데요..
      제가 그 의도를 잘 이해 못 하겠네요. 이걸 왜 하신 건가요?
      어쩌면 가지고 계신 myhack.dll 파일과 제가 테스트한 myhack.dll 파일이 서로 틀릴 수 도 있겠네요.
      제가 가진 파일에서는 그 주소는 패치할만한 코드가 없거든요. ^^

      감사합니다.

  4. 2010.12.10 16:43 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2010.12.16 15:39 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      매번 Inject 시 DLL_PROCESS_ATTACH 로 뜨게 하려면...

      Inject -> Eject -> Inject 순으로 해주셔야 합니다.

      정상적으로 Eject 되었다면 메모리에 패치한 내용도 사라지겠죠?

      감사합니다.

  5. 2011.01.08 03:53 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

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

      안녕하세요.

      매우 재밌는 아이디어입니다~ ^^

      화면 처리용 Win32 API 를 후킹해도 될 것 같고,
      관련 메시지를 후킹해도 될 것 같군요.

      가능하고 안하고의 문제라기 보다는...
      어떤 방법이 좀 더 쉽고 간단할까 하는 문제일것 같습니다.

      감사합니다.

  6. jdi 2011.02.04 18:30 신고 댓글주소 | 수정 | 삭제 | 댓글

    C언어로 간단한 프로그램을 작성하고 main함수를 디버깅해서 어셈코드를 보면
    제가 이론상으로 알고있는 함수 프로로그(ebp백업..) 외에도 아래와 같은 긴 작업을 하는것을
    확인 할 수 있습니다.

    0040D3F0 55 push ebp
    0040D3F1 8B EC mov ebp,esp
    0040D3F3 83 EC 4C sub esp,4Ch
    0040D3F6 53 push ebx
    0040D3F7 56 push esi
    0040D3F8 57 push edi
    0040D3F9 8D 7D B4 lea edi,[ebp-4Ch]
    0040D3FC B9 13 00 00 00 mov ecx,13h
    0040D401 B8 CC CC CC CC mov eax,0CCCCCCCCh
    0040D406 F3 AB rep stos dword ptr [edi]

    ebx, esi, edi를 push하는건 callee saved 레지스터의 백업 절차인거 같긴 한데,
    4ch만큼의 스택영역을 CC로 초기화 하는건 설명이 잘 안되네요..ㅠㅠ
    그냥 컴파일러가 일정한 영역을 지정해서 초기화 한다고 생각하면 되나요??
    저 4ch라는 수치도 vs2005로 컴파일 하면 e4h가 되네요;;

    그리고 어떤 책을 보다 보니 함수의 메인을 캡쳐한 코드에 제가 확인한 CC로 초기화 하는 코드가 존재하지 않더라구요.. 이건 또 어떻게 된 일인지 궁금하기도하고 ;;

    질문이 너무 정리가 안되네요~~ 설연휴 잘보내시구요 답변 부탁드릴게요 ㅎ;;

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

      안녕하세요.

      아마 VC++ 에서 DEBUG 모드로 빌드하셨나 봅니다.

      VC++ 특징이 DEBUG 모드 빌드인 경우 스택의 일정 부분 크기를 "CC" 즉 INT3 명령어로 채워버립니다. 이유는 혹시나 프로그램의 버그(버퍼 오버플로우) 발생시에 바로 예외가 발생하여 프로그램이 멈추도록 하려는 것입니다. 만약 저게 없다면... 스트링 처리를 잘 못하여 버퍼 오버플로우가 살짝 일어난 경우 그대로 계속 실행될 수도 있거든요. 그럼 버그를 못잡는 거지요.

      RELEASE 빌드에서는 그러한 과정이 생략되어 있습니다.

      감사합니다.

  7. 봉이 2011.02.10 13:34 신고 댓글주소 | 수정 | 삭제 | 댓글

    코어님 안녕하세요!
    pe 공부하다 어떤건 그냥 그림으로 이해하는게 좋은거 같아서 그러는데요..
    코어님이 포스팅할때 어떤 이미지 편집툴 쓰시는건가요?
    여담입니다만 16진수 계산기 추천해주신거 아주 잘쓰고 있어서 그래픽툴도 추천받아보려구요..
    그럼 좋은 하루 되세요!

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

      안녕하세요.

      제가 사용하는 이미지 캡쳐 프로그램은 OpenCapture 입니다. 이걸로 간단한 편집도 하지요. 간혹 윈도우 그림판을 사용할 때도 있습니다.

      감사합니다.

  8. 2011.02.19 02:03 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.02.28 15:52 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      윈도우의 움직임을 모니터링 하고 계시는군요~

      가장 좋은 방법은 메시지 후킹이지요.

      SPY++ 을 생각해 보시면 됩니다.

      GUI 관련 모든 행위는 메시지 기반입니다. 따라서 이러한 메시지만 모니터링 하면 윈도우가 어떻게 움직이고 있는지 다 볼 수 있습니다. 몇몇 API 를 직접 후킹 하는 것 보다 훨씬 좋은 방법이라 생각됩니다.

      감사합니다.

  9. 2011.02.23 14:03 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.02.28 15:56 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      찾으시는게 혹시 이거 아니신가요?

      인젝션된 test.dll 에서 GetModuleHandle(NULL) 을 호출하시면 그 리턴값이 바로 프로세스(notepad.exe)가 로딩된 이미지 베이스 주소입니다.

      감사합니다. ^^

  10. 황순용 2011.03.10 17:19 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요..
    글은 자주 보고 있는데..
    댓글 다는게 익숙치가 않은 터라.. 이제야 처음 인사를 드립니다.
    (아 이쪽이 신규 질문방인거 같아서 ㅎㅎㅎ 다시 한번 올립니다.)

    API 후킹 쪽에 아무리 풀려고 해도 풀리지 않는 숙제가 있어 이렇게 질문을 드립닏.
    socket 후킹 부분입니다.
    mswsock.dll에 있는 NSPStartup을 후킹하여.
    내부에 LPNSP_ROUTINE이 가지고 있는 NSPLookupServiceBegin, NSPLookupServiceNext, NSPLookupServiceEnd의 주소값을 변경하고자 합니다.

    redirect.cpp 코드를 사용하여 NSPStartup을 후킹하려고 했스니다만
    iexplore.exe에 적용을 해보아도 NSPStartup으로 들어오지 않는 것입니다.

    이곳을 소스가 아닌 다른 예제로 해도 그부분은 해결하기가 너무 힘들더라구요..

    어느 시점이 NSPStarup 으로 들어오는지 알 수가 없습니다. 아무래도 dll Injection전에 한번만 로드가 되는거 같은데 이런경우 NSPStartup을 어떻게 찾아서 후킹 할 수가 있을까요?

    아니면 직접 LPNSP_ROUTINE의 NSPLookupServiceBegin 값들을 후킹하는 방법은 없을까요?

    바쁘시겠지만 조그만 조언이라도 부탁드립겠습니다.

    • 황순용 2011.03.11 09:41 신고 댓글주소 | 수정 | 삭제

      하녕하세요.
      아주 조금은 해결이 된 듯 합니다.
      프로세스가 만들어질 당시 한번만 호출이 되는듯 합니다.
      그래서 explorer.exe 나 서비스에서 시작되는 경우 해당 서비스에다가 Injection을 하니 가능하더라구요..

      그런데 또 하나 궁금한게 생겼습니다.
      방법이 이것 뿐이냐 하는 겁니다. 프로세스가 로드될때 젤 먼저 제가 만든 dll를 로드하게 한다던지 하는 방법은 없는 것인가요?

      너무 궁금한게 많아서 죄송합니다. ㅎㅎㅎ

    • reversecore 2011.03.16 23:07 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      질문하신 내용을 잘 읽어 보았습니다.
      일부 해결을 하셨다니 다행이네요~ ^^

      먼저 DLL Injection 의 조건은 kernel32.dll 이 로딩되어야 합니다. (사용자 DLL 은 시스템의 kernel32.dll 보다 먼저 로딩될 수 없습니다.)

      프로세스가 생성되는 순간에 DLL Injection 을 하기 위해서는 Global API Hooking 을 사용하시면 되는데요...

      제 블로그의 "DLL Injection" 파트를 죽 읽어보시면 몇 가지 방법이 있습니다.

      http://www.reversecore.com/38
      (레지스트리 등록 방법, SetWindowsHooks() 이용 방법, ZeResumeThread() 이용 방법)

      궁금한게 많으시다는 것은 좋은겁니다. 그만큼 열정이 있으시다는 뜻이지요. 또 질문 올려주세요~

      감사합니다.

  11. 2011.03.10 21:08 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.03.16 22:32 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      EXECrypter 라면 매우 고급 프로텍터입니다. 언팩이 매우 어렵습니다. 정확한 언패커가 있는지는 모르겠습니다만... 분명 언팩하시는 분들은 계시더군요. 제가 잘 모르는 전용 프로그램을 이용하는 것 같았습니다.

      감사합니다.

  12. 2011.03.12 01:17 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.03.16 22:35 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      ^^ 21세기는 엉뚱, 기발, 창의적인 사람이 대우받는 시대랍니다. J 님께서는 시대를 잘 타고 나신겁니다. 저도 그런게 좋아요~

      말씀하신대로 얼마든지 가능합니다.

      일단 대상 프로세스에 inject.dll 을 침투시켰다면... inject.dll 에서 간단히 LoadLibrary("test.dll") 만 호출해줘도 test.dll 을 메모리에 로딩시킬 수 있습니다.

      물론 또다른 프로세스에게 RemoteThread() 를 이용하여 test.dll 을 인젝션 시킬 수 도 있지요.

      감사합니다.

  13. 2011.03.21 13:11 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.04.13 00:59 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      사실 LoadLibrary() 리턴값이 로딩 주소입니다. ^^
      (GetModuleHandle() 도 마찬가지 입니다.)

      CreateToolhelp32Snapshot() 는 원격 프로세스에 로딩된 DLL 들의 로딩 주소를 얻을 때 사용합니다.

      모두 같은 프로세스내에 있잖아요?

      같은 논리로 WriteProcessMemory() 를 쓰셔도 되지만 그 보다는 memset() 을 쓰셔도 좋습니다. ^^

      아마 지금쯤 잘 해결 하셨을걸로 생각됩니다.

      요청하신대로 질/답 게시판을 하나더 추가해야 겠습니다.

      감사합니다.

  14. 유상윤 2011.11.13 15:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요? 유상윤입니다. 포스팅된 글들을 읽고 도움이 많이 되었습니다.
    특히 DLL Injection과 관련된 글은 쉽게 이해할 수 있도록 써 주셔서 큰 도움이 됐어요.
    궁금한 점이 있습니다. PE 구조에서의 각 섹션을 파일 별로 가지고 있습니다.
    그 파일들을 조합하여 실행 파일로 만들려면 어떤 작업이 필요한가요?
    헥스 에디터로 열어봤지만 막막하네요.
    아무래도 선행 지식이 부족하다 보니 문제가 막막해진거 같은데요
    필요한 지식이 있다면 소개해주셔요! 미리 답변에 대해서 감사하다는 말 전합니다.
    수고하세요!

  15. 추광 2013.02.15 02:13 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요~ stealthprocess을 제 프로그램에 적용중인데요.. 다른 경우는 대부분 숨겨지는 듯 한데, ctrl + alt + delete를 통해서 나오는 작업 관리자의 프로세스창에는 프로그램명이 뜨더군요.. 이것의 해결 방법은 없을까요??

  16. longchamp bags uk 2013.04.25 07:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    내가 성공을 했다면 오직 천사와 같은 어머니의 덕이다.Topics related articles:


    http://highflyer.tistory.com/category/travel 新建文章 4

    http://violettalove.tistory.com/53 新建文章 1

    http://juyayang.tistory.com/53 新建文章 7

    http://minamichiaki.tistory.com/130 新建文章 6

  17. prosn 2013.12.09 18:38 신고 댓글주소 | 수정 | 삭제 | 댓글

    인젝션을 시키지 않고 다른 프로세서의 이미지 베이스 주소를 가져오는 방법이 있나요?

  18. 초보 2014.08.07 21:16 신고 댓글주소 | 수정 | 삭제 | 댓글

    이런 질문 드리기에는 너무 죄송하지만 도저히 몰라서 질문합니다 ㅠㅠ
    금방 리버싱 핵심원리 책을 사서 실습하려고 하는 학생입니다.
    그런데 release모드로 빌드해서 exe파일을 만들어서 ollydbg로 돌렸는데 책에 나오는 예제랑
    다르게 나옵니다... 이건 컴파일러 종류가 달라서 그런건가요? 만약에 컴파일러 종류가 다르면
    어떤 컴파일러로 빌드했는지 알수 있을까요? 제가 사용하는 컴파일러는 visual c++ 2010 express입니다

    • Backer 2014.08.08 02:52 신고 댓글주소 | 수정 | 삭제

      컴파일러 종류가 아니라 아마 빌드 옵션에 따라 다른걸로 알고있습니다.
      제 생각엔 http://reversecore.com/104 에서 해당 소스코드와 예제파일을 다운받아 공부하시는걸 추천드립니다.

  19. 쿠크다스ss 2015.04.15 02:28 신고 댓글주소 | 수정 | 삭제 | 댓글

    34장 IE접속제어(553page) 부분을 공부하고있는데요 ollyDbg110 을 이용하여 익스플로어를 attach 하였는데 internetConnectW함수에 BP를 걸걸었는데도 불구하고 멈추질 않네요 그런데 또 올려주신 dll 인젝션 하면 또 후킹이 되고... 뭐가 문제인지 도통 모르겠습니다.

  20. sammysl 2015.05.05 17:49 댓글주소 | 수정 | 삭제 | 댓글

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




리버스 엔지니어링 분야에 대해 질문이 있으시면 아래의 댓글로 올려주세요. 역시 댓글로 답변을 올려드리겠습니다. 공개하기 어려운 내용은 '비밀글' 에 체크해주세요.

"비도덕적, 불법적" 인 내용은 답변 드릴 수 없음을 이해해 주시기 바랍니다.


댓글, 방명록, 이메일 등으로 많은 분들께서 여러 가지 질문들을 해주십니다.
그중에 정말 좋은 질문들이 많아서 여러분들과 공유하면 좋겠다고 생각하였습니다.

이제부터 저에게 들어오는 모든 질문과 답변들을 이곳으로 모을 것입니다.
앞으로 질문과 답변은 이곳에서 해주세요~

질문에 대한 답변은 저 뿐만 아니라 제 블로그에 오시는 모든 분들께서 하실 수 있습니다.
문제 해결을 위한 방법은 다양합니다. 저 말고도 다른 분들의 답변은 언제나 환영입니다.

"질문은 좋은 것 입니다. 많이 해주세요. ^^ "

* 댓글로 질문하기 어려운 내용들(긴내용, 첨부파일 등)은 제 이메일(reversecore@gmail.com)로 문의해 주세요.

* 댓글이 너무 많이 달리면 제가 질문/답변 빈 포스트를 또 올릴 겁니다. 그쪽으로 계속 질문 댓글 달아주시면 됩니다.

감사합니다.


ReverseCore



신고

'q&a' 카테고리의 다른 글

질문/답변 코너입니다. (3)  (394) 2011.04.13
질문/답변 코너입니다. (2)  (232) 2010.01.28
질문/답변 코너입니다.  (295) 2009.09.21
    이전 댓글 더보기
  1. RCE 2013.12.31 09:57 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요
    리버싱 공부 중인 학생입니다.
    인라인 패치를 하고 있는데 책에 나와 있는데로가 아닌
    rdata 영역 또는 data 영역을 이용해서 패치하려는데 패치가 잘 안 되서 질문드립니다.
    401083의 JMP 영역은 XOR 7로 잘 바꾸어 주었는데
    아마도 패치 영역이 문제인 것 같습니다. 바꾸고 저장해도 다시 디버깅을 해보면
    패치했던 부분이 그대로 0000 으로 되어 있더군요
    제가 패치한 부분은
    rdata 영역일 때 메모리상 pointer to offset은 402000을 시작으로 402B38까지 rdata 내용, 그 뒤로
    402B38~403000을 Null 영역으로 계산하였고 그 중 패치는 402B38~402200사이에 했습니다.
    (Pointer To Rawdata : 800 / VirutalSize : 138 / SizeOfRawdata : 200)
    그런데 제대로 패치가 되지 않아 저의 계산이 틀린 것 같은데 어떻게 계산을 해서 Null영역에
    패치를 해야 하는지 궁금합니다.
    <data 영역일 경우 403000을 시작으로 40302C 까지 data 내용, 그 뒤로 40302C부터 404000까지
    Null 영역으로 잡고 패치했었습니다.>

  2. James 2014.01.05 22:36 신고 댓글주소 | 수정 | 삭제 | 댓글

    처음 공부시작하는학생입니다...
    올리디버거 글자크기가 너무 작아서요... 눈이 아픈데요
    Option의 Appearence의 Fonts를 들어가서 Font parameters의 change를 눌러 폰트사이즈를 변경해도 바뀌지가 않습니다..
    글자를 좀 크게볼수있는 방법이 있나요?

  3. choi 2014.01.19 11:20 신고 댓글주소 | 수정 | 삭제 | 댓글

    처음 리버싱을 공부하는 학생인데 공부하던 도중 IA-32 매뉴얼은 어디에서 얻을 수 있나요?

  4. galois 2014.02.02 13:59 신고 댓글주소 | 수정 | 삭제 | 댓글

    음 올리디버그로 헬로월드 디버깅 하는 예제를 책을보고 따라해볼려고 올리디버그를 다운받고 예제 HelloWorld.exe도 다운받아서 올디에서 파일을 여는데 이런 에러가 뜨네요.

    Unable locate to file " 파일 경로"

    이거는 어떻게 해결하나요??

    그리고 올리디버그를 관리자 계정에서 사용하는데 그냥 실행하면
    you do not have administrative rights on this computer ~~ 라는 메시지 박스가 뜨길래
    관리자 권한으로 실행을 해본 결과 메시지박스가 안뜨는 걸 알게 됬는데
    이렇게 사용하는게 맞는지요??

    질문 읽어주셔서 감사합니다.

  5. 2014.04.24 13:22 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  6. shiri 2014.06.25 12:34 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요

    Hello World! 리버싱을 해보려고 Ollydbg 110으로 실행을 했는데 CALL 0040270C는 안보이고

    774A01B8 895C24 08 MOV DWORD PTR SS:[ESP+8],EBX 이런게 먼저 나오네요...

    200버전으로 다시 실행해도 책에 있는 것처럼 나오지 않아서 책 따라하기가 힘들어요

    제 운영체제가 64비트인데 혹시 이것 때문인가요?

  7. ㅇㄹㄴㅇㅁㄹ 2014.07.12 22:33 신고 댓글주소 | 수정 | 삭제 | 댓글

    datadirectory export값이요.
    NT Header - optional header의 멤버를 설명하는 부분에선
    datadirectory[0]의 값, 그러니까 Export의 Size값과 RVA값이 모두 00 00 00 00, 00 00 00 00
    이라고 나오는데

    EAT를 설명하는 부분에선 Size=00 00 6d 19, RVA=00 00 26 2c라고 값이 바뀌어 있습니다.
    이유가 뭔가요.

  8. ㅇㄹㄴㅇㅁㄹ 2014.07.13 19:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    아 위의 질문 취소입니다. 파일이 다른거였네여 ㅈㅅㅈㅅ

  9. 전국수석 2014.07.16 02:31 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요
    올해 5년차 Windows 개발자 입니다
    주로 C/C++ 사용해서 개발은 하고 있습니다 ~ 응용프로그램개발, 시스템 프로그래밍을 했습니다
    지금 분야를 보안개발이나 정보보안전문가로 가고 싶은데요
    현재 리버싱책을 사서 공부중인데요 IDA Pro 정품을 구매해서 제대로 공부해보고 싶습니다
    정품구매 요령하고 어디서 구매하는지 패키지가 얼마정도 하는지 좀 알려주세요
    감사합니다 ~

  10. 한숨만나온다 2014.07.22 07:53 신고 댓글주소 | 수정 | 삭제 | 댓글

    저자분 블로그 관리 너무 안하시는것 같아요.
    리버싱이란게 생소하고, 변수가 많은 분야이기 때문에
    당연히 수많은 독자들이 수많은 질문을 할텐데, 그 부분을 생각지 못하고
    저자분 혼자 답변하겠다는 생각으로 메일과, 블로그에 QA게시판을 만들면...
    지금 저자분처럼 일일이 답변해주는거 포기하고, 블로그도 뜸하게 들어오게 되고
    덕분에 독자들만 개고생하는 결과가 나는거죠.
    윤성우님처럼 저자의 개입없이 독자들끼리 정보공유해서 해답을 찾을 수 있게끔
    커뮤니티 카페를 만들었다면 좋았을텐데 말입니다.
    다시 한번 윤성우님을 찬양하게 되는 부분입니다.

  11. 한숨만나온다 2014.07.22 07:53 신고 댓글주소 | 수정 | 삭제 | 댓글

    저자분 블로그 관리 너무 안하시는것 같아요.
    리버싱이란게 생소하고, 변수가 많은 분야이기 때문에
    당연히 수많은 독자들이 수많은 질문을 할텐데, 그 부분을 생각지 못하고
    저자분 혼자 답변하겠다는 생각으로 메일과, 블로그에 QA게시판을 만들면...
    지금 저자분처럼 일일이 답변해주는거 포기하고, 블로그도 뜸하게 들어오게 되고
    덕분에 독자들만 개고생하는 결과가 나는거죠.
    윤성우님처럼 저자의 개입없이 독자들끼리 정보공유해서 해답을 찾을 수 있게끔
    커뮤니티 카페를 만들었다면 좋았을텐데 말입니다.
    다시 한번 윤성우님을 찬양하게 되는 부분입니다.

  12. 2014.08.12 12:56 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  13. 애독자 2014.09.29 19:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 애독자이며, 정말 많은 도움을 받고있습니다. 감사합니다.
    다름 아니오라 한가지 궁금하게 있어서 질문하게 되었습니다.

    a.dll 에서 aaa라는 함수를 실행하면 그 함수안에서 c:\ccc 라를 폴더에서 ccc.ini 불러오고있습니다. 그런데 a.dll 은 제가 LoadLibrary로 실행중에 로드 하는 상황입니다.
    a.dll 의 aaa라는 함수에서 c:\ccc 라는 폴더 말고 c:\ccc\sub 라는 폴더로 수정하고싶은데,
    책에서 보면 별도의 exe를 만들어서 만들어서 pid를 얻고 그 다음 실행중에인젝션하는 것 같습니다.

    a.dll 자체를 수정해서 인젝션 따로 필요없이 하는 처리하는 방법은 없을까요?


  14. 좋아요 2014.10.28 22:31 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하십니까, 저자님의 ollydbg.ini 파일을 적용시킨 후, 실행하고 F7나 F8을 누르면
    다른 경고창으로 HelloWorld가 작동하지 않습니다 또는 중지되었습니다 따위의 오류가 발생합니다. 어떻게 해야됩니까??

  15. 이리x 2014.11.18 13:59 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱의 핵심원리를 공부하다가 궁금증이 생겨서 문의 드립니다.
    어떻게 보면 아주 간단한거고, 어떻게 보면 아주 간단하지 않은 질문이지만요^^
    제가 궁금한것은 hooking의 기초, SetWindowsHookEx 함수입니다.
    (리버싱의 핵심원리 21장, 294~297페이지 소스를 같이 봐주시면 이해가 더 빠르실지도.. ㅎㅎ)
    소스 내용은 대충 이러합니다.
    콜백함수를 통해 메시지 발생 시(키보드 누르는 메시지 발생 시) notepad일 경우 메시지를 후킹하여 전달하지 않아 키보드 입력이 안되게 하는 알고리즘으로 되어 있습니다.

    자 여기서 질문입니다.
    1. 부모프로세스가 explorer인 notepad는 정상적으로 후킹이 됩니다. 후킹이 되어 키보드 입력이 되지 않는데요.. 하지만 부모프로세스가 ollydbg인 notepad에는 후킹이 되질 않습니다.(키보드 입력이 정상적으로 됩니다.) 또한 다른 컴퓨터에서 진행해도 똑같이 정상적으로 입력이 됩니다. 이유가 무엇일까요?
    2. process explorer를 보면 ollydbg의 자식 프로세스 notepad에는 dll을 클릭해도 아무것도 출력되지 않습니다. 그 이유는 무엇일까요?
    3. 정확하게 dll이 붙는 곳은 어디일까요?(이 질문을 하는 이유가 뭐냐면 hookmain 프로그램과 메모장, 그리고 스티커 메모장 실행 시 키보드 메시지를 발생시키자 keyhook.dll이 붙는 것을 확인할 수 있었습니다. -> 이 말은 콜백함수가 우선적으로 호출된 후 injection 된다는 얘기입니다. dll injection 코드가 정확하게 어딘지 모르겠네요.. 올리디버거로 분석하려고 해도 붙질 않으니.. ㅠㅠ) 콜백 함수가 실행되고 dllmain이 실행되는 걸까요..? 흠..
    그래서 제가 고민끝에 내린 추측은
    콜백함수나, dll injection 과정을 거칠때 ppid가 같아야한다?
    아니면 애초에 keyhook.dll이 로드되지 않았다??(process explorer를 볼 시 아무것도 출력이 되지 않아서..)
    dll이 정상적으로 injection 되지 않았기 때문에..?? 그 이유는..??
    이정도 입니다..
    혹여 이 부분을 실습하다가 안되신 분들 계시면 답변 부탁드리고, 아시는 내용이 있으면 댓글 부탁드립니다.

  16. 쉬리 2015.02.08 23:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 지금 코드 인젝션을 공부하고 있습니다. InjectCode() 함수에서
    dwSize = (DWORD)InjectionCode - (DWORD)ThreadProc; 이 부분에서 질문이 있습니다.
    위의 코드가 MS Visual C++에서 사용되는 코드라면 다른 컴파일러를 사용했을땐 어떤식으로
    함수의 크기를 구하는지 알고싶습니다. 답변해주시면 감사하겠습니다.

  17. 2015.07.13 16:24 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  18. 2015.07.13 16:24 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  19. 디디딛 2015.07.21 17:03 댓글주소 | 수정 | 삭제 | 댓글

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

  20. 김준영 2015.09.25 22:46 댓글주소 | 수정 | 삭제 | 댓글

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





티스토리 툴바