Skip to content
This repository has been archived by the owner on Jan 16, 2022. It is now read-only.

Header 만드는법

Kim Si Young edited this page Nov 14, 2015 · 12 revisions

기준 0.13.0 제 깃허브에 업로드를 하실분만 보세요

#준비물 먼저 다음과 같은 준비물이 필요합니다.

  1. IDA Demo
  2. Notepad++ (옵션)
  3. 최신 minecraftpe.so 파일 (중요!!)

#설치 #####IDA Demo 설치 아래의 주소로 가서 운영체제에 맞게 다운로드 해주세요.

https://www.hex-rays.com/products/ida/support/download_demo.shtml

#####Notepad++ 설치 (옵션) Notepad++ Installer를 받아 설치해 주세요.

https://notepad-plus-plus.org/download/v6.8.6.html


#파일 열기 IDA로 so 파일을 여는법을 알려드리겠습니다.

IDA Demo를 실행하여 minecraftpe.so 파일을 열어줍시다. 보이지 않는다면 오른쪽 하단의 exe를 All로 바꿔주세요.

위와같은 창이 뜨면, ARM 을 선택후 OK 눌러줍시다. 그뒤로 뜨는 오류는 무시해주세요. 불러오는 시간이 조금 걸립니다.

위와같이 초록색으로 바뀌면 불러와진거고, 수정과 같은 작업을 하셔도 됩니다. #IDA 설명

  1. Functions window - 함수의 목록입니다. 곧 하게될 헤더의 함수를 찾는데 사용됩니다. MCPE의 애드온에 사용되는 함수가 전부 담겨있다고 보시면 됩니다. 근데 사용을 못하는건 함정. 비슷하지만 더 좋은 Names window가 있습니다. View->Open subviews->Names에서 열어주세요. 그러면 Functions 오른쪽에 Names window가 생깁니다.
  2. IDA View-A - 함수 내용을 볼 수 있습니다. 혹시 C언어로 보고 싶으시다면.. 꿈 깨세요. 뭐 코드로 보여주는 플러그인이 있는데, 유료에다가 우리가 사용하는 so에는 적용이 안되요.

#제작 ####vtable 찾기 (vtable 함수들은 꼭 필요한 함수들입니다. 작성을 하지 않으면 클래스 상속을 할 수 없습니다.) 쓸데없는 소리들은 그만하고 본격적으로 제작을 해봅시다. 우선 Name창을(Functions탭에서는 검색되지 않습니다.) 클릭하여 Ctrl+F를 눌러 나타나는 검색창에 vtable for'클래스명을 검색해줍니다.(저는 vtable for'Block) 검색된 항목을 더블클릭하고, 그뒤 나타나는 함수들을 전부 복사합니다. 아래의 다른 vtable까지 복사하시면 안됩니다.

위와같이 선택하였으면, Ctrl+C를 눌러 복사합니다. 그뒤 http://demangler.com/를 접속하여 붙여넣어줍니다. "DEMANGLE IT!" 버튼을 클릭하면 우리가 흔히 보는 C++ 클래스 형식으로 전환됩니다. Notepad++를 사용하여 필요없는 부분을 걸러내야 됩니다. 전환된 함수들을 복사합시다. Notepad++를 켜서 (또는 편한 에디터)복사한 함수들을 붙여넣어 줍시다. 이제 필요없는 부분을 정리해야 합니다. ::이전의 텍스트를 모두 제거합니다. 보통 .data.rel.ro:00XXXXXX DCD "클래스명"::과 같습니다. 그리고 각각의 마지막에 1숫자를 세미콜론으로 교체하세요. (Ctrl+F 사용) 함수내의 파라메터들을 정리 부탁드립니다!

####헤더 작성 제거를 마쳤다면, 첫번째 줄에 #pragma once를 작성해주세요. 그리고 class 형식을 작성하고, 함수앞에 virtual void 를 붙여주세요. 생성자는 붙이지 않습니다. 세미콜론도 붙여주세요.

#pragma once

class Block
{
public: // 모든 함수나 변수는 public으로 해주세요.
    virtual ~Block();
    virtual void tick(BlockSource &, BlockPos const &, Random &);
    ...
};

여기까지 하셨다면, 파라메터에 있는 클래스나 enum 등을 정의나 include 해주세요. 레퍼런스(&)나 포인터(*)는 하지 않으셔도 됩니다. (BlockSource -> #include "../level/BlockSource.h") 끝나셨다면 이제 애드온 헤더에 사용할 수 있게 됩니다. (만약 실수를 하지 않았다면) ####부가적인 함수 찾기 (옵션) (없어도 애드온 만드는데에는 지장이 없습니다. 꼭 필요로 하는 함수가 아니면 추가를 하지 않아도 작동합니다.) vtable에 없는 함수들이 있습니다. 그럴경우 하나하나 찾아줘야 됩니다. 검색창에 원하는 클래스를 검색합니다. (예를들어 Block) 그다음, 검색한 클래스 뒤에 ::를 붙여줍니다. 그러면 원하는 클래스의 함수들만 나타나게 됩니다.

△ 클래스의 함수들이 보여지는 모습

추가할 함수를 클릭하여 Ctrl+C 해줍니다. 복사한 함수를 정리후(어떻게하는지 아시죠?) 작성한 헤더의 함수부분의 맨 마지막에 추가합니다.

####static 변수 추가 Names 탭으로 함수들을 보게 되면, 뭔가 다른 함수를 보게 됩니다. D로 파랗게 칠해진 것은 함수가 아니라 static 변수들입니다. 이 역시 추가를 하지 않아도 작동합니다. static 함수들은 그냥 추가할 변수 전체를 선택하여 Ctrl+C를 눌러 복사합니다. 그 뒤에 정리후 클래스의 처음에 추가해줍니다.

...

class Block
{
public: // 모든 함수나 변수는 public으로 해주세요.
    static SoundType *SOUND_ANVIL;
    ...

public:
    virtual void ~Block();
    ...
};

####변수 추가 이 단계부터는 정말 어렵습니다. 뭐 함수 이름이 Get/Set인 경우에는 정말 추가하기가 쉬워지지만, 나머지 변수들은 정말 어렵습니다. 우선 Get/Set찾기부터 보겠습니다.

######방법1 - Get/Set찾기 이 방법은 단순합니다. 그냥 이름이 Get/Set인 함수만 찾으면 되니까요.

우선 IDA로 Names 탭에서 변수를 추가할 클래스를 검색해줍니다. :: 붙이는것도 잊지 마세요. (예를들어 Block::) 그다음, get/set인것 아무것이나 찾습니다. ... 이어집니다.

Clone this wiki locally