반응형

Cracking & Reverse Engineering

크랙과 리버스 엔지니어링에 관한 자료를 제공합니다. 주로 제가 크랙한 프로그램에 대한 자료를 제공합니다. 하지만 제 실력이 그리 좋지 않은 관계로 하이레벨 자료를 기대하지 않는게 좋습니다. ^^; 직업(?)이 아니라 취미로 하는것이기에... 좀 전문적이지 않습니다. 가끔씩 머리가 아플때마다 머리식히기 위해서 하는데 상당히 재미있습니다. 여러분도 한번 해보세요. ^^

Fry (Translate ALZIP to ZIP) - 2004년 2월 8일

어제 웃대에서 휴식을 취하고 있다가 안타까운 글을 읽었습니다. 모 개발자와 모 업체가 알집 파일을 푸는 알고리즘을 갖고 서로 싸우는 내용이었는데, 개인적으로 보기 안좋더군요. 한국사람들끼리 원수처럼 싸우는 것이 참... 그렇게 헐뜯고 싸울만큼 가치있는 기술도 아닌데 말이죠. 리버스 엔지니어링에 조금이라도 경험이 있는 분이라면 손쉽게 분석하실수 있습니다. 아래는 간단한 예제 코드 입니다. 알집이 zip 알고리즘을 그대로 사용하기 때문에, 헤더만 조금 고쳐주시면 zip 파일로 손쉽게 변환이 가능하죠. 아래 예제에서는 한개의 파일만 압축되어 있는 알집 파일을 zip파일로 변환시키는 모습입니다. 코드를 조금 수정 하시면, 여러개의 파일이 압축되어 있는 알집 파일도 변환 가능하죠. 뭐 다 아시겠지만.. ^^

  • fry.zip - 소스 파일 입니다. 콘솔에서 테스트 하다가 mfc로 옮기다 보니 소스가 좀 지저분 합니다. ^^;

Tinker Bell for WinMine 2000 Pro & XP Pro - 2003년 7월 1일

지뢰찾기 맵핵 입니다. 시스템 전역 후킹 라이브러리를 만들다가, 어떻게 하다보니 만들게 되었습니다. 황당하게도 프로그램 이름은 팅커벨로 정했습니다. 만들고 있던 라이브러리 이름이 후크선장 이어서 무의식적으로 프로젝트 이름을 팅커벨로 입력해 버렸거든요. 후킹 라이브러리에서 사용하는 부분들을 그대로 팅커벨(MFC)로 옮기다 보니 소스의 변수 선언부가 약간 어지럽습니다. 혹시라도 소스 보실분은 이점 이해해 주세요. 2003년 7월 1일 업데이트 이후로 윈도우즈 2000 프로페셔널 버젼과 함께 윈도우즈 XP 프로페셔널 버젼의 지뢰찾기도 맵핵이 됩니다. 나머지는 리버싱을 안해봐서 잘 모르겠네요. 선언부만 변경해주시면 다른 버젼도 적용 가능합니다. ^^

  • winmine.zip - Windows 2000 Professional에 들어있는 지뢰찾기 실행파일 입니다.
  • tinkerbell.zip [screenshot 1st 2nd] - 팅커벨 소스 파일입니다. Visual C++ 7.0이 필요합니다. 서비스팩 깔기 귀찮아서 이제부터 6.0은 안쓰기로 했습니다. ^^

'WinMine for Windows 2000 Professional' Cracking - 2003년 4월 25일

이번 크랙은 정말 얼떨결에 하게 됐습니다. 어떻게 된거나면, dcinside란 곳에서 놀고있는데 한분이 자신이 지뢰찾기 게임을 중급자 모드로 해서 30초만에 클리어 했다는 글을 올리신 것에서 부터 시작됐죠. 이후로 다른분들이 많이 도전하셨지만 50초가 최고였습니다. 저도 지뢰찾기는 꽤 한다고 생각했는데, 쉽지가 않더군요. 하지만, 뭐 모로가든 서울만 가면 된다는 말이 있잖습니까. 게임이 어려우면 내게 쉽도록 바꾸면 되죠. ^^ 이번 크랙은 간단했습니다. 약 100byte 정도의 코드만 추가해 주시면 되요. 한번 해보세요.

  • Original WinMine - Windows 2000 Professional에 들어있는 지뢰찾기 실행파일 입니다. 공짜에요. (맞죠?)
  • Cracked WinMine [screenshot 1st 2nd 3rd] - 크랙된 지뢰찾기 실행파일 입니다. 아래 두번째 사진이 크랙된 모습이에요. 실행하시면 지뢰가 보입니다. O_O;;;;

'ReverseMe#1 by SantMat' Reverse Engineering - 2002년 12월 9일

ReverseMes.de에 있는 문제 입니다. 처음 해보는 리버싱이지만 스토리를 갖고 있어서 상당히 재밌게 했습니다. ^^ 인류의 종말(멸망?)을 구한 영웅이 된 기분이랄까요? ㅎㅎ. 크랙보다는 훨씬 재미있네요. 이거 하면서 가장 힘들었던 점은 기계어 코드를 직접 입력하는것.. --; OpGen이라는 명령어 생성기를 구했는데 2000에서는 안돌아 가더군요. (미치는줄 알았음.) 그래서 생각보다 시간이 많이 걸려 버렸습니다. 계속 구해보다가 못구하면 하나 만들어서 써야 겠네요. 쩝. 그리고 리버스한 프로그램의 암호는 'fuckingUSA'로 설정했습니다. 미국이 싫어요! >.< ReverseMes에 리버스한 프로그램이랑 튜토리얼을 올릴려고 했는데 'fuckingUSA'암호로 올렸다가는 매장당할것 같아서 못올리겠네영 ㅋㅋ.. 그렇다고 암호는 바꾸기 싫고. -_- 암튼 잼있으니 여러분도 한번 해보세요. ^^

'CrackMe B1' Cracking - 난이도 : 4/10, 2002년 12월 3일

Le4rN TO Cr4cK에 있는 난이도 4의 문제 입니다. 아래의 문제들과는 달리 패치를 하는게 아니라 암호 key를 찾는 것 입니다. 크랙해 보니까 확실히 패치하는 것 보다는 어렵더군요. 디어셈 해보시면 아시겠지만 key에 따른 function table이 메모리에 있어서 그걸 참조 합니다. 더이상 말하면 재미 없겠죠? ^^; 한번 풀어보세요. 아마 연습장과 계산기가 필요하실 겁니다. ^^

  • CrackMe B1 - CrackMe B1 프로그램 입니다.
  • 튜토리얼 문서 [screenshot] - 아직 공개하지 않습니다. 'Le4rN TO Cr4cK'에서 출제중인 문제입니다. 따라서 스크린샷만 공개합니다.

'CrackMe 8' and 'CrackMe 8.1' Cracking - 난이도 : 1/10, 2/10, 2002년 12월 3일

Le4rN TO Cr4cK에 있는 난이도 1과 2의 문제 입니다. 프로그램을 실행하면 'Unregistered'라고 나오면서 등록하라고 그러는데 이걸 크랙해서 'Registered'라고 나오도록 바꾸면 됩니다. 이건 제가 가장 처음에 도전한 문제입니다. 이 두개는 똑같은 방법으로 풀었습니다. 그래서 이렇게 같이 적습니다. 출제자는 뭔가다르게 바꾼것 같은데 뭘 의도한지는 잘 모르겠네요. --; 쉬운 난이도인만큼 실제로 머리쓸일은 없을 겁니다.

  • CrackMe 8, CrackMe 8.1 - CrackMe 8과 CrackMe 8.1 프로그램 입니다.
  • 튜토리얼 문서 [screenshot] - 아직 공개하지 않습니다. 'Le4rN TO Cr4cK'에서 출제중인 문제입니다. 따라서 스크린샷만 공개합니다.

유용한 문서

홈페이지 링크

    $ 국내 홈페이지 $
  • Le4rN TO Cr4cK - 국내 크래킹 관련 포럼. 많은 해커들이 자신이 크래킹한 프로그램에 대한 튜토리얼 문서를 제공.
  • oPEN rEVERSE fORUMS - 리버스 엔지니어링 포럼.
  • dive2code님의 홈페이지 - 크래킹에 필요한 여러 문서를 공개.
  • x3chun님의 홈페이지 - 크래킹과 리버스 엔지니어링에 관한 문서와 프로젝트를 진행.

    $ 국외 홈페이지 $
  • CrackMes.de - 전세계 크래커들이 모여있는 곳. 난이도별로 수많은 크래킹 문제들 출제.
  • ReverseMes.de - 리버스 엔지니어링 사이트.
  • Crack Store - 폴란드의 크래킹 커뮤니티. 크래킹에 필요한 툴, 튜토리얼 문서, 툴사용 문서, 소스등을 제공.
  • Programmer Tools - 컴파일, 디버깅, 패킹 관련 툴을 제공.
  • Stenri님의 홈페이지 - 소프트아이스 화면을 캡쳐하는 IceExt라는 플러그인을 개발.
  • CoDe_InSiDe's Manual UnPacking Page - Packer와 Encrypter에 관한 문서 제공.
반응형

출처 : http://www.hackerschool.org

[어셈블리어] Win32 API Assembly 강좌

작성자 : nyam(천세진)
출처 : http://blog.naver.com/zoware.do
기타 : ZIP 압축 파일입니다.



[어셈블리어] 어셈블리어 강좌

출처 : http://blog.naver.com/zoware.do



[어셈블리어] 매크로 어셈블러에 관한 작은 이야기 (HWP 버젼)

작성자 : 김대수
출처 : http://blog.naver.com/zoware.do



[어셈블리어] 매크로 어셈블러에 관한 작은 이야기

작성자 : 김대수
출처 : http://blog.naver.com/zoware.do



[어셈블리어] 어셈블리 초급 기초 #2

작성자 : 정태식
출처 : http://blog.naver.com/zoware.do



[어셈블리어] 어셈블리 초급 기초 #1

작성자 : 정태식
출처 : http://blog.naver.com/zoware.do



[어셈블리어] MASM 6.0 사용법

작성자 : 정재흠(천사)
출처 : http://blog.naver.com/zoware.do



[어셈블리어] 인라인 어셈블리어 강좌

제목 : 인라인 어셈블리어 강좌
작성자 : ddoch(한동훈)



[어셈블리어] 인라인 어셈블리를 분석하자!

제목 : 인라인 어셈블리를 분석하자!
작성자 : ddoch(한동훈)



[어셈블리어] 어셈블리어 강좌 7

제목 : 어셈블리어 강좌 7



[어셈블리어] 어셈블리어 강좌 6

제목 : 어셈블리어 강좌 6



[어셈블리어] 어셈블리어 강좌 5

제목 : 어셈블리어 강좌 5



[어셈블리어] 어셈블리어 강좌 4

제목 : 어셈블리어 강좌 4



[어셈블리어] 어셈블리어 강좌 3

제목 : 어셈블리어 강좌 3



[어셈블리어] 어셈블리어 강좌 2

제목 : 어셈블리어 강좌 2



[어셈블리어] 어셈블리어 강좌 1

제목 : 어셈블리어 강좌 1

반응형
시스템프로그래밍(어셈블리어) 자료

전자계산기에선 독립적인 과목으로

조직응용에선 어셈블리어 파트를 공부하기 위해 공부해야 하는 과목으로

시스템 프로그래밍이 있습니다.

책마다 범위가 좀 다르던데 제가 이전에 본 책에선 운영체제에 대한 소개까지만 있었거든요

암튼 이 내용은 시스템 프로그래밍 자료입니다.


자료를 인터넷에서 구하긴 했는데 자료에 저작권 표시도 없고 해서 이렇게 올립니다.

원 저자라도 알았다면 저자에게 양해를 구햇을 터인데.... 저자도 안적혀 있더군요.

그래서 이렇게 올립니다.


이 자료의 모든 범위가 전자계산기 조직응용에 나옵니다.




반응형
반응형
Tsearch 한글 수정판 bisket 2

한글로 패치한 Tsearch 와 동일한 프로그램이다.



반응형

레지스터에 어느정도 감을 잡으셧다면 명령어를 좀 외워두어야 겠죠 ?

프로그램은 명령하는 코드가 집합되 있는거 뿐이니까요 ^ㅡ^

명령의 개략적인 해설 입니다.


데이터 전송 명령:    MOV


사칙연산 명령   :    ADD: 덧셈, ADC: 덧셈, SUB: 뺄셈, SBB: 뺄셈

                     MUL: 곱셈, IMUL: 부호달린 곱셈,

                     DIV: 나눗셈, IDIV: 부호달린 나눗셈

                     CBW: 바이트에서 워드로 부호확장

                     CWD: 워드에서 더블워드로 부호확장

                     INC: 하나 증가

                     DEC: 하나 감소  


논리연산, 쉬프트명령:AND: 논리곱, OR: 논리합,

                     XOR: 배타적 논리합, NOT:부정, NEG: 부호반전    

                     SHL: S는 shift, H는 0을 넣을 것인가, L은 left

                     ROR: R은 Rotate,


비교분기 명령: CMP, JMP는 무조건 분기,

                     Above(크다), Below(작다), Greater(부호를 포함해서 크다.)

                     Less(부호를 포함해서 작다), Equal(같다), Not(부정)

                     LOOP: 반복

                     LOOPE: loop if equal     ----+ 조건부 반복

                     LOOPNE: loop if not equal ---+

                     CALL: 서브루틴으로 분기      

                     RET:  서브루틴으로부터 원래의 루틴으로 돌아올 때


스트링 명령:         LODS: 메모리로부터 레지스터에 데이터를 로드

                     STOS: 메모리에 데이터를 저장하는 명령  

                    LODS, STOS는 메모리의 번지지정 방법이 SI 혹은 DI레지스터를 사용하여 간접지정으로 정해지기 때문에 미리 SI, DI에 번지를 세트해 두어야 하죠.

                     LODSB, STOSW, MOVSB, MOVSW: 블럭전송, 단독으로 1바이트, 1워드의 데이터를 전송

                     RET(repeat) 명령과 조합시켜 사용하면 cx 레지스터가 지정하는 횟수만큼 반복하여 데이터를 전송합니다.

                     이때 번지는 자동으로 갱신되어가므로 한 명령으로 연속된 여러 데이터를 전송할 수가 있습니다.``


스트링 명령에는 그 밖에도 데이터의 전송은 하지 않고 레지스터와 메모리의 내용을  

                     비교만 하는 SCAS(scan string),

                     메모리끼리의 내용을 비교하는 CMPS(compare string)

                     이들 명령은 REPE(repeat until equal)

                     REPNE(repeat until not equal)명령과 조합함으로써 일치하는 데이터가 얻어질 때까지, 혹은 일치하지 않는 데이터가 얻어질 때까지, 메모 리상의 데이터를 탐색할 수가 있습니다.


                     SCASB

                     REPE       SCASW

                     REPNE      CMPSB

                     REPE       CMPSW


I/O 명령: LSI에 명령을 보낸다든지 데이터를 얻는다든지 하기 위한 명령이 I/O 명령

                     I/O 포트에 데이터를 보내는 명령이 OUT

                     I/O 포트에 데이터를 얻는 명령이 IN

                     포트의 번호는 직접 수치 혹은 DX 레지스터를 사용하여 지정

                     데이터는 AX 혹은 AL 레지스터를 이용하여 전송


인터럽트 명령: INT (interrrupt) 다음에 번호를 지정

                     인터럽트 처리 루틴으로부터 원래의 루틴으로 돌아 오려면

                     IRET(interrupt return)을 사용


CPU 제어명령: 주로 8086의 CPU가 수치연산 프로세서 8087과의 사이에서 데이타를 전송한다든지 주변장치로부터 READY 신호가 올 때까지 실행을 정지하고 기다린다든지 하기 위한 명령입니다.

                     WAIT, ESC, LOCK, HLT :  외부 주기

                     NOP: 아무 수행도 하지 않음


그 밖의 명령: 레지스터 혹은 메모리의 내용을 스택영역으로 대피 복귀시키기 위한 PUSH, POP

                     플래그 레지스터를 스택으로 대피 복귀하는 PUSHF, POPF

                     두개의 레지스터 혹은 메모리의 데이터를 교환하는 XCHG

                     한 바이트씩 나열된 데이터의 N 번째의 것을 꺼내는 XLAT

                     

플래그 레지스터를 직접 제어하는 :

                     STC(set carry flag), CLC(clear carry flag),

                     CMC(complement carry flag),

                     STD(set direction flag), CLD(clear direction flag),

                     STI(set interrupt-enable flag)

                     CLI(clear interrupt-enable flag)

                     LAHF(load AH from flags), SAHF(store AH to flags) :

                     플래그 레지스터 하위 8바이트와 AH 레지스터의 데이터를 전송  

                     

                     AAA(ASCII adjust for addition),

                     DAA(decimal adjust for addition),

                     AAS(ASCII adjust for subtract),

                     DAS(decimal adjust for subtract),

                     AAM(ASCII adjust for multiply),

                     AAD(ASCII adjust for division) :

                     플래그 레지스터 하위 8바이트와 AH 레지스터의 데이터를 전송

                     (이상 모두 오퍼랜드를 갖지 않음)

                     LEA(load effective address): 실효번지를 로드

                     LDS(load data segment register),

                     LES(load extra segment register):

                     세그먼트 레지스터를 포함하는 실효번지를 로드함


그렇다면 우리가 올리디버거로 디버그 할때 명령어는 어떻게 생겼냐~?


L1:     MOV     AX,BX   ;comment

+-----+ +----------+ +-------------+ +-------------+ +----------+

|라벨 | |작동 코드 | |제 1 오퍼랜드| |제 2 오퍼랜드| |설명문    |

+-----+ +----------+ +------+------+ +-------+-----+ +----------+




L1:   과 같은 명령은 직접적으로는 기계어 코드로 번역되지 않고, 분기명령 등에서 참조 될 때에 번지의 계산에 사용됩니다.

      이와 같은 명령을 의사 명령이라고 말하고, 어셈블리 프로그램을 작성하는데 없어서는 안되는 것이죠 ^ㅡ^

* 주의 할점은 우리가 올리디버거로 읽을때는, 일본만화를 보는것과 같이 오른쪽에서 왼쪽으로 읽습니다.

설명문 -> 2 오퍼랜드 ㅡ> 1 오퍼랜드 ㅡ> 작동코드.

위의 예를 보면 comment (이건 설명이 아무것도 아니니 무시하고 ㅡㅡ+)  BX를 AX 에 넣어라(MOV)

그럼 이걸 언제 어디에서 넣냐 ? 

당연히 주소문에 있는 주소대로 이겠죠 ?




이 명령어들은 리버싱을 잘 하실려면 필수적으로 외우셔야 됩니다.
제가 외울때는 영어만 있어서 번역하느라 고생했는데 ㅠ.,ㅠ
이것만 잘 외우시고 명령어와 어느정도 친근감이 느껴 지신다면, 크랙은 어려운거 아니면 (공유프로그램 같은 쉬운것들은)
 몇분안에 다 해칠울수 있다고 장담합니다.
(실제로 무섭게 리버싱 빨리하는분이 말씀해주신거니 믿으셔도 될듯)

그럼 무언가를 조금 배워가셨기를 빌며, 좋은하루 되세요. ^ㅡ^/
반응형
IDA Pro는 OllyDbg보다 시각적인 부분과 Symbol 찾는 것 등에 장점이 있다.
하지만, 기능이 많고, 메뉴가 숨어있는 탓에 사용법이 어렵고, 익숙해지기 힘든 점이 있다.
나에게도 여전히 OllyDbg가 익숙하며, IDA는 코드의 흐름을 보거나 Symbol에 대한 정리가 필요할 때 잠깐씩 이용한다.
하지만, 잡스럽게 여러 도구들을 이용하는 것보다, 하나의 도구에 익숙해지려 했다.
그래서 간략히 IDA에 대해 정보를 찾던 중 Hex-Ray라는 좋은 플러그인이 있다길래 공부하는 겸 해서 정리한다.

Hex-Ray는 http://www.hex-rays.com/ 의 프로젝트 페이지를 갖고 있으며,
주요 메뉴얼에 대한 정보는 http://www.hex-rays.com/manual/ 에 나와있다.

Hex-Ray에 대해 짧게 기술을 한다면, De-Compiler이다.
OllyDbg나 IDA Pro는 기본적으로 Dis-Assembler의 속성을 갖고 있다.
그래서, Assembly 코드를 잘 표현하는데에 기능이 치중되어있다.
하지만, 그 정보를 활용해 De-Compiler의 기능을 플러그인으로 구현한 것이 Hex-Ray이다.

Hex-Ray를 이용하면, 우리에게 보다 친숙한 C 코드로 변환된 바이너리를 볼 수 있다.

(아래 : 기본적인 Dis-Assemble된 코드)
사용자 삽입 이미지

위 그림은 프로세스를 숨기기 위해 작성된 DKOM 드라이버 코드를 나타내고 있다.

아래 그림은 위 코드를 F5 단축키를 통해 Psuedo C Code로 변환된 드라이버의 모습을 나타내고 있다.

사용자 삽입 이미지

이를 텍스트로 옮기면 아래와 같다.

NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, int a2)
{
  NTSTATUS result; // eax@1
  PDRIVER_OBJECT v3; // esi@1
  NTSTATUS v4; // ebx@2
  int v5; // eax@3
  NTSTATUS v6; // eax@2
  PDEVICE_OBJECT DeviceObject; // [sp+14h] [bp-4h]@1
  LSA_UNICODE_STRING DestinationString; // [sp+Ch] [bp-Ch]@1
  LSA_UNICODE_STRING SymbolicLinkName; // [sp+4h] [bp-14h]@1
  DeviceObject = 0;
  RtlInitUnicodeString(&DestinationString, &word_1078A);
  RtlInitUnicodeString(&SymbolicLinkName, &word_107B2);
  v3 = DriverObject;
  result = IoCreateDevice(DriverObject, 0, &DestinationString, 0x22u, 0x100u, 0, &DeviceObject);
  if ( result >= 0 )
  {
    v6 = IoCreateSymbolicLink(&SymbolicLinkName, &DestinationString);
    v4 = v6;
    if ( v6 >= 0 )
    {
      v3->DriverUnload = (PDRIVER_UNLOAD)DriverUnload;
      gProcessNameOffset = GetProcessNameOffset();
      v5 = FindProcessByName("notepad.exe");
      pHidenProc = v5;
      if ( v5 )
      {
        hHidenProc = v5 + 132;
        HideProcess(v5);
      }
      __asm { mov     eax, cr0 }
      _EAX &= 0xFFFEFFFFu;
      __asm { mov     cr0, eax }
      oldZwQuerySystemInformation = (int)*(&imp__KeServiceDescriptorTable
                                         + *(_DWORD *)((char *)ZwQuerySystemInformation + 1));
      *(&imp__KeServiceDescriptorTable + *(_DWORD *)((char *)ZwQuerySystemInformation + 1)) = NewZwQuerySystemInformation;
      oldZwTerminateProcess = (int)*(&imp__KeServiceDescriptorTable + *(_DWORD *)((char *)ZwTerminateProcess + 1));
      *(&imp__KeServiceDescriptorTable + *(_DWORD *)((char *)ZwTerminateProcess + 1)) = NewZwTerminateProcess;
      __asm { mov     eax, cr0 }
      _EAX |= 0x10000u;
      __asm { mov     cr0, eax }
    }
    result = v4;
  }
  return result;
}

아래는 실제의 드라이버 코드를 나타내고 있다.
보다시피 거의 유사하다는 것을 확인할 수 있다.

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
 NTSTATUS status = 0;
 PDEVICE_OBJECT DevObj = NULL;
 UNICODE_STRING DeviceNameUnicodeString; // 생성될 장치의 이름
 UNICODE_STRING DeviceLinkUnicodeString; // 생성될 장치의 심볼릭 링크
 PEPROCESS pCurProc = NULL, pNotepadProc = NULL;
 UINT i = 0;
 KdPrint(("\n\n>-------------------------------\n\n"));
 KdPrint(("\n\n------------Init Driver---------\n\n"));
 KdPrint(("\n\n--------------------------------\n\n"));
 RtlInitUnicodeString(&DeviceNameUnicodeString, DEVICENAME);
 RtlInitUnicodeString(&DeviceLinkUnicodeString, DEVICESYMBOLICNAME);
 //////////////////////////////////////////////////////////////////////////
 // Device 객체를 생성
 status = IoCreateDevice(DriverObject,
  0,
  &DeviceNameUnicodeString,
  FILE_DEVICE_UNKNOWN,
  FILE_DEVICE_SECURE_OPEN,
  FALSE,
  &DevObj);
 if(!NT_SUCCESS(status)) {
  KdPrint((" -[DriverEntry::IoCreateDevice] Function Fail\n"));
  return status;
 }
 else
  KdPrint((" +[DriverEntry::IoCreateDevice] Function Success\n"));
 //////////////////////////////////////////////////////////////////////////

 //////////////////////////////////////////////////////////////////////////
 // 심볼릭 링크를 생성 - 장치 이름과 Win32 이름 사이의 링크
 status = IoCreateSymbolicLink(&DeviceLinkUnicodeString, &DeviceNameUnicodeString);
 if(!NT_SUCCESS(status)) {
  KdPrint((" -[DriverEntry::IoCreateSymbolicLink] Function Fail\n"));
  return status;
 }
 else
  KdPrint((" +[DriverEntry::IoCreateSymbolicLink] Function Success\n"));
 //////////////////////////////////////////////////////////////////////////

보다시피 Hex-Ray는 Dis-Assemble 된 코드에 대해 훌륭하게 De-Compile된 코드를 제공한다. 이를 활용하면, 실제 바이너리 분석이나 어셈코드 공부에 많은 도움을 얻을 수 있다.
반응형

프로그램 디버깅 하고 분석할 때 아주 유용한 도구입니다.

OllyDBG는 Win32 API에 최고. MFC 관련은 IDA PRO Disassemble 추천.

 

OllyDbg가 디버거로써는 뛰어나지만, reverse analyzing 면에서는 IDA Pro 가 독보적이죠~

OllyDbg는 Win32 API 인 경우 충실히 label (ex: CreateFile, ExitProcess, etc) 을 달아주지만,
RunTime/MFC library 인 경우 거의 label (ex: printf, strcpy, CString::CString() etc) 정보를 주지 못합니다.


소개하는 플러그인은 IDA Pro에서 자동으로 추가되는 label 과 comment 까지 그대로 OllyDbg 에서 쓸 수 있도록 도와줍니다.


사용법은


1. 플러그인 설치
2. IDA Pro 실행 -> 원하는 파일 오픈  (=> IDA가 욜씨미 분석을 하겠죵)
3. 맵파일 생성 : File\Produce file\Create Map file 메뉴 선택 => 나타나는 dialog 의 모든 체크박스에 체크 해주시고...
4. OllyDbg 실행 -> 동일 파일 오픈
5. 맵파일 로드 : Plugins\MapConv\Replace label 메뉴 선택 => 파일오픈 dialog에서 해당 *.map 파일 선택

 

OllyDbg 단축키

출처: http://home.t-online.de/home/Ollydbg/quickst.htm

Ctrl+F2 프로그램 재실행
Alt+F2 프로그램 닫기
F3 새 프로그램 열기
F5 활성화 되어 있는 윈도우 최대화, 혹은 원복
Alt+F5 olly 디버거 윈도우를 항상 위로
F7 Step into (함수 진입)
Ctrl+F7 Animate into (entering functions)
F8 Step over (executing function calls at once)
Ctrl+F8 Animate over (executing function calls at once)
F9 실행
Shift+F9 Pass exception to standard handler and run
Ctrl+F9 Execute till return
Alt+F9 Execute till user code
Ctrl+F11 Trace into
F12 Pause
Ctrl+F12 Trace over
Alt+B Open Breakpoints window
Alt+C Open CPU window
Alt+E Open Modules window
Alt+L Open Log window
Alt+M Open Memory window
Alt+O Open Options dialog
Ctrl+T Set condition to pause Run trace
Alt+X Close OllyDbg
F2 Toggle breakpoint
Shift+F2 Set conditional breakpoint
F4 Run to selection
Alt+F7 Go to previous reference
Alt+F8 Go to next reference
Ctrl+A Analyse code
Ctrl+B Start binary search
Ctrl+C Copy selection to clipboard
Ctrl+E Edit selection in binary format
Ctrl+F Search for a command
Ctrl+G Follow expression
Ctrl+J Show list of jumps to selected line
Ctrl+K View call tree
Ctrl+L Repeat last search
Ctrl+N Open list of labels (names)
Ctrl+O Scan object files
Ctrl+R Find references to selected command
Ctrl+S Search for a sequence of commands
Asterisk (*) Origin
Enter Follow jump or call
Plus (+) Go to next location/next run trace item
Minus (-) Go to previous location/previous run trace item
Space ( ) Assemble
Colon (:) Add label
Semicolon (;) Add comment
ctrl+위, 아래 화살표키 디스어셈블 위치 지정


소프트아이스와 함께 가장 많이들 사용하시는 올리디버거입니다. 소프트아이스와 같은 커널 디버거는 아니지만 사용하기 쉽고 기능도 많들으며 보기 좋은 인터페이스를 가지고 있습니다.

※ 제가 수정한 ollydbg.ini.fix를 사용하시면 좀 더 음침한(?) 인터페이스가 됩니다. ^^;

※ 한가지 주의할 점은 다음과 같습니다.
디 버그 모드로 빌드할 경우, *.exe 파일과 함께 *.pdb 파일이 생성되는데 (물론, 릴리즈 모드로 빌드하여도 옵션을 설정하면 *.pdb 파일을 생성할 수 있습니다.) 이것은 심볼(Symbol) 파일로 OllyDbg에서는 이 파일을 참조하여 디버깅시 사용자에게 추가적인 정보를 제공합니다. 그런데 이 파일이 위치하는 디렉토리의 경로명 중에 공백이 있을 경우 OllyDbg에서는 찾질 못하네요. 따라서 디렉토리 명에 공백이 들어가지 않도록 주의하시기 바랍니다. 소스 파일의 경로 또한 마찬가지입니다.

※ 버그가 있군요.
위 내용도 그렇고 올리에서는 디버깅 심볼 관련 파일들의 패스를 잘 찾지 못하는 것 같습니다. 소스 파일의 경우 패스가 길어지니까 올리에서는 패스를 엉뚱하게 인식하네요. 아마 버그인듯 합니다. Ollydbg Users Forum에는 그런 버그 리포트가 없지만요... -_-ㅋ 암튼 해결책은 간단한 패스에서 처음부터 개발작업을 하던지 빌드할 때만 간단한 패스로 옮겨와서 빌드해야 할 것입니다.

 

이 프로그램을 가지고 원래 우리가 작성한 프로그램을 역 어셈블 할 수 있다.


처음 프로그램을 설치하고 option 의 appearance에서 두개의 폴더설정을 현재의 프로그램이 있는 폴더를 설정한다.


그리고 visual c++의 project를 설치할 때 release mode와 minimize size를 해서 프로젝트를 만들어준다.


cf ) Minimize size와 Release Mode 그리고 Maximize speed와 Release Mode의 차이점....

speed와 size의 Trade-off가 된다. 이것은 이 util을 가지고 프로그램의 내부를 들여다보면 알 수 있다.

반응형

한국 사이트


reverse 홈페이지   -  각종 강좌, 자료, 게시판이 있는 사이트


crackme.co.kr  - 각종 crackme, 강좌, 자료, 게시판이 있는 사이트 (11/01/2007 오픈예정)


Coolsoft V2  -  리버싱 자료외에도 많은 자료와 커뮤니티가 있는 사이트


리버스엔지니어링 네이버 까페 - 리버스 엔지니어링 네이버 까페.  정회원이 되기위해서 4개자료를 업로드해야한다. 하지만, 방대한 자료가 있다.


파워해커 - 리버싱외에도 각종 인터넷 보안 전문가들이 게시판에서 활동중이다.



외국 사이트

 

Tuts 4 You - 각종 리버싱 자료와 강좌, 또 아주 활발한 커뮤니티 이다.

 

ARTeam Homepage - 아주 유명한 크랙커 그룹 ARTeam 의 홈페이지.  각종 강좌와 게시판이있다.

 

Astalavista Forum - 굉장히 활성화된 리버싱 엔지니어링 커뮤니티이다.

 

Crackme.de - 각종 크랙킹 예제 프로그램이 매일 올라오고 또 그 해법들을 같이 연구하는 커뮤니티이다.

반응형
RE를 공부한 사람이라면 누구나 알만한 그룹 ARTeam 이 쓴 문서다. part1부터 part10 까지 있으며, RE를 이제 막 시작하려는 사람에게 좋은 문서다. 앞으로 하나하나 번역해서 올릴 생각이다.
- forc1

--------------------------------------------

Gabri3l Tutorial #1

Beginner Tutorial: Serial fishing
번역 : forc1 (http://forc1.net)

The Target:
WorldTV 7.1
http://www.netfor2.com/WorldTV.html
The Tools:
OllyDbg 1.09d, PEiD 0.92, W32dasm, HexWorkshop 4.1
The Protection:
Serial Protection
Other Information:
이 문서는 초보 크래커에게 올리로 serial fishing을 소개하기 위한문서다. 과정을 하나하나 보여줄 것이다. 새로운 타겟에 어떻게 접근할지 더 좋은 아이디어를 얻는데 도와줄것이다.

Intro:

필요한 툴은 인터넷에서 모두 구할 수 있다.
http://home.t-online.de/home/Ollydbg/odbg109d.zip
http://peid.has.it/
http://protools.cjb.net/

일단 툴을 설치하고 크랙할 준비를 한다. 타겟이 있는 폴더를 연다. 이 경우 c:\program files\worldtv\ 이고 만약의 경우를 대비해 백업을 해둬라. 나는 worldtv2.exe 로 백업했고 이 문서에선 이것을 참조할것이다.

패커나 프로택터를 확인하기 위해 PEiD를 사용한다. PEiD를 열고 worldtv2.exe를 이곳에 드래그한다. 그 결과는 "Microsoft Visual C++ 5.0". 놀랍게도 타겟은 패킹이나 프로택팅 되지 않았다. 이것은 크랙하기 더욱 쉽도록 한다.


Body:

우리가 파일을 언팩할 필요가 없을거란걸 알고 있는것은 우리가 프로텍션 scheme의 검사를 조금
하게 한다. 이제 worldtv를 실행한다. 등록되지 않았다는걸 알려주는 nag 스크린으로 바로 간다.
이것은 프로그램이 로드되기 전에 등록키(키 파일이나 레지스트리 키)를 체크한다는걸 우리에게
알려주기 때문에 중요하다. 임의의값을 넣어본다. "Invalid Registration Code" 라는 메시지박스가
떳다. 이것을 적어둔다. 만약 전에 다른 문서를 읽어봤다면 능숙히 얻을 수 있으리라 본다.
 확인을 누르고 프로그램을 종료한다.

Finding the Bytes:
일 단 쉬운 방법으로 해볼것이다. invalid 등록 박스로 리턴하는 jump를 패치할 것이다. w32dasm을
실행하고 WordTV.exe를 연다. 오리지날 WorldTV.exe 파일을 열고 있기때문에 작업은 위에서 만든
만든 복사본에서 할 수 있다. 디스어셈블이 끝난 후, 메시지박스에서 문자열을 찾을 것이다.
w32dasm 의 위쪽에 있는 String References 버튼을 클릭한다.
파일에서 찾을 수 있는 모든 문자열의 리스트가 새로운 창에 뜬다. "Invalid Registration Code"를
찾을 때까지 스크롤을 아래로 내리고 그것을 더블클릭한다. 아마도 아래의 라인에 있을것이다.



test eax, eax와 그 밑의 jne 0041B54C 코드를 보라.



아무 시리얼이나 넣어도 프로그림에 등록되도록 하기 위해 jne(jump if not equal)을 jmp(jump)로
바꾸길 원한다. 이것을 하기 위해 WorldTv.exe에서 jne 명령이 위치한곳을 찾을 필요가 있다.
그 정보는 w32dasm 창의 아랫쪽에서 찾을 수 있다. 아마 다음과 같을것이다.

Line:52558 Pg 657 and 658 of 1734 Code Data @:0041B521 @Offset 0001A915h in File
 WorldTV.exe

0001A915h의 오프셋 값에 관심이 있다.
 hexadecimal 값을 의미하는 마지막에있는 h를 빼고 이 숫자를 적어둔다.

Patching the Bytes:
HexWorkshop으로 WorldTV2.exe를 연다. 다이얼로그 박스로 이동하기 위해 CTRL+G를 누른다.
 Edit 아래에서도 찾을 수 있다. 아까 적어논 0001A915를 입력한다.
 










Hex 옵션과 Beginning of File 옵션을 체크한다
. 다 됐으면 Go를 누른다.

아마도 jne 0041B54C에 위치할 것이다. 7
5
는 명령어 JNE의 오피코드고 74는 명령어 JE의 오피코드라는걸 알꺼라 믿는다.
 이 경우 bad serial로 점프하는거보단 프로그램이 어떤 serial로 점프하길 원한다.
 75를 JMP 명령어인 EB로 바꿀것이다.
 


[ Before ]

[ After ]

WorldTV2.exe를 저장한다. 백업하고 싶거든 뭐라 물었을때 YES를 선택한다.
 이제 패치된 WorldTV2.exe를 실행해본다.

시리얼을 물으면 아무값이나 넣는다. 나는 1234567을 넣을것이다.
Validate Registration을 누르면.. 성공!
Registration Code Accepted. 여기서 끝? 아니다 :P

WorldTV2.exe를 닫았다가 다시 연다. 여전히 시리얼을 묻는다.
사용할 때마다 항상 시리얼을 넣어야 할 것이다. 매우 귀찮다.
그래서 우리는 진짜 시리얼을 찾을것이다.

Finding a Serial:
시작하기 전에, 이 프로그램에 대해 알고 있는 것을 재검토 해보자.
1. 시작할 때 시리얼을 체크한다.
2. 가짜 시리얼로 등록하면 다음에 시작할 때 등록되지 않는다.
이 것은 프로그램이 완전히 로드되기 전에 제대로된 시리얼을 체크한다는걸 의미한다.
시리얼이 어디에 저장되어 있는지 찾아야 한다. 보통 두군데에 저장이 된다. 레지스트리와 파일.
레지스트리를 체크하면서 시작할 것이다. WorldTV2.exe를 실행하고 시리얼로 1234567을 넣는다.
 시리얼을 확인하고 WorldTV를 닫는다.

시작-실행에 가서 "regedit"를 입력한다. regedit이 뜨고 두 개의 창이 보인다.
왼쪽창의 HKEY_CURRENT_USER 앞에 [+]를 클릭하면 또 다른 리스트가 열릴 것이다.
같은 방법으로 Software-WorldTV 까지 간다.
아하! 오른쪽창에 우리가 아까 입력한 1234567이 저장된 RegCode라는 키가 있다.
이제 WorldTV는 로드되기 전에 레지스트리에서 시리얼을 체크한다는걸 알게되었다.

올리를 실행할 것이다. 1.10은 브포설정할 때 가끔 충돌이 일어나서 나는 1.09d 버전을 쓸 것이다.
원본 WorldTV.exe를 연다.


아마 위에 있는 그림과 비슷하게 나올 것이다. Run 키 를 누르기 전에 브포를 걸어야 한다.
Code 창에서 우클릭-Search For-All Intermodular Calls를 선택한다.
 그러면 Calls 창이 뜰것이다. Destination으로 정렬한다.
RegQueryValueExA를 찾을 때까지 스크롤을 내린다.
그것을 선택하고 우클릭-Set breakpoint on every call to RegQueryValueExA을 선택한다..


이제 Run 버튼을 누른다. 처음에
FF15 0C304400 CALL DWORD PTR DS:[<&ADVAPI32.RegQueryValueExA>]에 서 멈출 것이다.
오른쪽에 있는 레지스터 윈도우를 보면 EDI에서 아스키값 "Recordings"을 볼 수 있다.
이것은 우리가 찾던 레지스트리 키가 아니므로 다시 실행을 누른다.
여기에 도착하기까지 24번의 실행을 눌러야 할 것이다.


EAX 값이 아스키 "RegCode" 라는걸 주의하라. 한번 더 실행을 누르면 여기에 위치한다.


그리고 ECX는 아스키 값 "RegCode"가 있다.
WorldTV가 등록 코드를 찾았기 때문에 점점 가까워 지고 있다는걸 알고있다.
를 통해 코드를 스텝할 것이고 레지스터에 집중할 것이다.
몇 스텝후 ESI 가 가짜 시리얼 1234567값을, EDI에
00000000-00000000-00000000-00000000
가지고 있는걸 찾았다. 이것은 흥미롭지만 000... 이 등록 코드인지는 의심스럽다.
좀 더 스텝 하면, EDI 가  
-00000000-00000000-00000000로 줄어든걸 볼 수 있다.
이것은 아직 우리에게 시리얼을 주지 않는다. 계속 나아가다 보면 EDI가 "
C:\Program Files\WorldTV\Scheduler.txt.tmp"로 바뀐다. 여기 도착한 포인트 다음에 곧 찾을것이다.


EAX, EBX, EDX가 0이 된걸 주목하라. 또한 EDI안에 하나의 아스키 값이 들어간걸 볼 수 있다.
 시리얼 코드를 볼곳이 바로 여기다. 스탭을 통해 조금 더 진행하면 루프안에 있다는걸 발견한다.
 시리얼이 만들어지는걸 볼 수 있고 다음의 주소에서 볼 수 있다.
MOV EDI,WorldTV.004C8950.
코드 라인을 통해 step 하기보단 MOV EDI,WorldTV.004C8950에 브포를 걸고 시리얼을 볼 것이다.
 라인을 선택하고 브포 설정을 위해 F2를 누른다.
이제 Run 버튼을 누르면 잠시 후 완성된 시리얼을 볼 수 있다.


이젠에 EDI가 시리얼이 8문자 4개 세트이거나 8문자 3개 세트였다는걸 유의하라.
3개의 전체 세트를 유심히 보면 빠진게 있다.
오직 2문자만 남았을 때 실행 버튼을 누는걸 멈추고 코드를 step 하라.
REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
라인을 지날 때 마지막 2문자도 볼수있다.


이 숫자들을 적어라. 또 다른 추가된 문자 세트가 있는지 확인하기 위해 Run을 다시 누른다.
없군.. Run을 다시 누르는 것은 분리된 시리얼이 계산되는 또 다른 루프를 돌게 할것이다.
(무엇을 위해? 프로그램에 등록하지 않을 것이기 때문에 확실친 않다)

이제 올리를 닫는다. 원본 WorldTV.exe를 열고 적어논 시리얼로 등록해본다.
Registration Code Accpeted, 진짜 시리얼로 성공적으로 WorldTV를 등록했다.
 패치 없이 말이다.

 


Conclusion:

나는 이 프로그램을 순수하게 올리를 이용해 시리얼을 찾는걸 설명하기 위해 사용했다. 만약 이 프로그램을 사용하려거든 구입하기바란다.

이 문서를 작성하는데 도움을준 사람들 모두에게 감사한다. 배울 수 있는 좋은 장소를 제공해준 Exetools, Woodmann, Arteam 에게 감사한다.

질문이나 할말이나 수정할것이 있으면 email 달라. Gabri3l2003[at]yahoo.com


출처 : http://forc1.net/

+ Recent posts