'디컴파일러'에 해당되는 글 2건

  1. 2010/09/01 귀차니스트 DebuggerOnC (2)
  2. 2010/07/29 귀차니스트 음 요새 아주 열코딩중입니다. (6)

DebuggerOnC

Programming 2010/09/01 02:34 귀차니스트

사용자 삽입 이미지

 

  안녕하세요^^. 멤버십에 들어와서 생활을 하다보니 블로그에 글이 적어지는 듯한 이유를 알 수 있을 것 같습니다. 사실 뭐 조금 게으른것도 영향이 클 것 같군요. 과제를 3개월 단위로 하나를 수행하는데, 원래 4명으로작하려고 했었다 2명이 결국 도중에 나가게 되어 2명이서 과제를 완료한 DebuggerOnC 라는 프로그램입니다. 

  이 프로그램의 특징은 우선 x64 프로세스를 대상으로 동작하는 Debugger 이자 Decompiler 입니다. 즉 한마디로 컴파일 되어 실행된 프로그램을 어셈블리와 C코드로 분석을 할 수 있게 도와주는 툴입니다. 이 것을 3개월 동안 만들었습니다^^. 물론 약간의 사정이 있어 기간상 문제도 있었구요.

  저번에 올라왔었던 글이 이 프로그램에서의 Decompiler 쪽을 담당하는 모듈입니다. 그에 대한 기능을 대략적으로나마 완성이 되었을 때 올렸었죠^^. 일단 8월 10일날 프로그램에 대해서 1차적인 완료는 끝이 났습니다. 왜냐구요? 이게 8,9,10월에 진행하는 또 다른 과제가 있기 때문입니다. 

  새로 시작하게 되는 과제는 상용 서비스를 진행할 예정이기 때문에 공개는 현재 힘들듯 하고. 아마 이 과제가 끝나게 되면 DebuggerOnC의 개선과 더불어 OS의 기능 추가도 진행할 수 있을 듯 합니다. 오랫만에 들른거 치고는 또 많이 남기지는 못하는군요.

  머릿속에 많은 아이디어는 존재하는데 실제로 개발하기에 시간이 부족하기 그지 없습니다. 만들고 싶은 것은 많은데 아쉽네요^^. 탐색기도 기존의 Windows Explorer는 불편한 점이 종종 발견되어 새로운 부분을 생각하고 있긴 한데 어떻게 될지 모르겠습니다. ㅎㅎ

  8,9,10월이 끝나고 제대로 된 상용 서비스가 시작된다면 아마 또 그 쪽 관련해서 글을 올릴지도 모르겠군.모바일 멀티 플랫폼으로 개발하는 게임이다 보니 ^^ 4명이서 제작하고 있는 만큼 퀄리티도 꽤 나올 듯 합니다. 

  이 글을 올린 이유는 Decompiler 기능을 마치면서 기념을 위해서 올린거랍니다. 더 큰 프로그램을 만든 적도 있긴 하지만 제가 원해서 이 정도로 만들어본 프로그램은 극히 드물기 때문이죠 ㅎㅎ 그럼 다음 포스팅을대해 주시면 감사하겠습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/09/01 02:34 2010/09/01 02:34

댓글을 달아 주세요

  1. 정경석 2011/04/11 02:42  댓글주소  수정/삭제  댓글쓰기

    상규형 안녕하세요! ㅋㅋ
    블로그 돌다가.. 들어오게되었습니다..
    좋은글 많이 보고 나갑니다^^
    저도 블로그.. 해볼까 하는 맘이 들어요! ㅋㅋㅋ

음 요새 아주 열코딩중입니다.

Small Talk 2010/07/29 10:45 귀차니스트

  최근에 아주 열코딩할 일이 생겨서 잠적을 할 수 밖에 없었습니다. 과제가 있어서 끝을 내야 하기 때문이지요. 그런데 제가 맡은 분야가 디컴파일분야 입니다(?). 이거 아주 토나오는군요 ㅋㅋ 하루종일 붙어서 작업을 하고 있지만 이거 컴파일러 수업을 들었음에도 불구하고 다른 점이 아주 많아 무척 힘들고 결과물이 정확하게 나오지는 않습니다.

  물론 원래 결과물이 제대로 나오지 않는다고는 하지만 아휴 그래도 좀 나와줬으면 하는데 제가 놓치고 있는 부분이 정말 많은가 봅니다. 일단 만드는 프로그램의 전체 개요는 컴파일된 바이너리 프로그램이 64비트일 때, 해당 프로그램을 대상으로 디버거와 같이 달라붙어 동작하는데, 디버거 기능도 존재하면서 디컴파일 기능 또한 존재하는 프로그램이죠.

  이 프로그램을 만들다 보니 기계어 -> 어셈블리를 다른 팀원이 맡았고, 제가 하는 부분은 어셈블리 -> C 코드인데.. 쩝접 한 숨이네요 ㅋ

그래도 아래에 결과물을 올려봅니다. 아직 함수 인자 및 콜링 컨벤션을 처리하지 않았습니다.

 

원 소스


(Language : c)
  1. int main(int argc, char **argv)
  2. {
  3.     int a;
  4.     int b;
  5.     std::cin >> a >> b;
  6.     if(a == 300)    {
  7.         while(a * b <= 100) {
  8.             a--;
  9.             if(a + b == 150)
  10.                 a *= 2;
  11.         }
  12.     }
  13.     else    {
  14.         if(b == 200)    {
  15.             b++;
  16.         }
  17.         else if(a == 100)   {
  18.             while(a == 100) {
  19.                 a++;
  20.             }
  21.             if(a + b < a * b)   {
  22.                 b++;
  23.             }
  24.             else if(a - b < a * b)  {
  25.                 a--;
  26.                 int c = 23424;
  27.                 std::cin >> c;
  28.                 if(c <= 1000)
  29.                     while(c <= 10000)   {
  30.                         c++;
  31.                     }
  32.                 else
  33.                     c--;
  34.                 std::cout << c;
  35.             }
  36.         }
  37.     }
  38.     std::cout << a << b;
  39.     return 0;
  40. }

디컴파일 소스

(Language : c)
  1. int sub5358030852()
  2. {
  3.     unsigned __int64 vVar0;
  4.     unsigned int vVar1;
  5.     unsigned int vVar2;
  6.     unsigned int vVar3;
  7.     unsigned int vVar4;
  8.     vVar0 = IntArg1;
  9.     vVar1 = IntArg0;
  10.     memset(StackAddress, 3435973836, 32);
  11.     sub5358064932();
  12.     sub5358064932();
  13.     if(vVar2 == 300)    {
  14.         while(vVar2 * vVar3 <= 100) {
  15.             vVar2 = vVar2 - 1;
  16.             if(vVar2 + vVar3 == 150)    {
  17.             }
  18.         }
  19.     }
  20.     else    {
  21.         if(vVar3 == 200)    {
  22.             vVar3 = vVar3 + 1;
  23.         }
  24.         else    {
  25.             if(vVar2 == 100)    {
  26.                 while(vVar2 == 100) {
  27.                     vVar2 = vVar2 + 1;
  28.                 }
  29.                 if(vVar2 + vVar3 < vVar2 * vVar3)   {
  30.                     vVar3 = vVar3 + 1;
  31.                 }
  32.                 if(vVar2 - vVar3 < vVar2 * vVar3)   {
  33.                     vVar2 = vVar2 - 1;
  34.                     vVar4 = 23424;
  35.                     sub5358064932();
  36.                     if(vVar4 <= 1000)   {
  37.                         while(vVar4 <= 10000)   {
  38.                             vVar4 = vVar4 + 1;
  39.                         }
  40.                     }
  41.                     vVar4 = vVar4 - 1;
  42.                 }
  43.                 sub5358064900();
  44.             }
  45.         }
  46.     }
  47.     sub5358064900();
  48.     sub5358064900();
  49.     sub5358030116();
  50.     return 0;
  51. }

  만드는 입장에서 먼저 말씀드리고 싶네요.. 절대 하지 마세요. .. 제가 하는 이유가 있답니다. 이게 x86, x64 명령어를 어느정도 다 처리해야 하다보니 명령어만 631개 정도가 됩니다. 지원 안되면서 정리된 명령어들 이 많이 존재하여 그나마 정리된게 저 정도라죠(?).. 일단 그래요 지금도 달리러 갑니다.. 아흑

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/07/29 10:45 2010/07/29 10:45

댓글을 달아 주세요

  1. 도형 2010/08/08 23:02  댓글주소  수정/삭제  댓글쓰기

    아흑

  2. 테트리스 2010/08/10 13:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요...인터넷에서 테트리스 인공지능 검색하다가
    우연하게 이곳이 들르게 되었습니다...ㅎㅎ
    제가 이번에 테트리스 인공지능을 자바로 코딩 해보려고 하거든요.
    예전에 한게임 테트리스 오토 인공지능으로 조작하시는 동영상을
    봤는데요..

    테트리스를 인공지능으로 하려면
    자동으로 블럭을 쌓는 부분을 어떤 방법, 알고리즘 등을 써야할 지
    잘모르겠어서요... 조금 그 부분에 대해서 알려주실 수 있나요??

    • 귀차니스트 2010/08/11 20:53  댓글주소  수정/삭제

      음.. 일단 뭐 대충 게임 트리라고 생각하시면 되구요..
      각각의 수에 대해서 트리를 타고 내려가면서 계산을 하셔야 됩니다.

      물론 최적을 위해서는 브랜치 앤 바운드 같은 방법을 사용하셔도 되고.
      점수가 가장 높은 부분을 향해서 커맨드를 생성하신 다음 입력 하시면 되죠^^..

  3. dd 2011/05/19 22:51  댓글주소  수정/삭제  댓글쓰기

    저도 이런거 비슷한거 해볼려고해봤었는데 ㅋㅋ
    저렇게 정확하게 나올줄은 몰랐네요..

    그런데 기계->어셈은 이미 나와있을텐데..
    예로 리눅스 그누에선 objdump 이런거 쓰면 되지않나요?

    • 귀차니스트 2011/05/20 09:16  댓글주소  수정/삭제

      음 프로그램이 리눅스에서 돌아가는 것이 아니고
      다른 글에 보시면 Windows x64 용으로 개발된 프로그램이 있습니다.

      그 상황에서 통합된 기능을 만드려고 한다면 해당 프로그램을 사용하지 못하겠죠..
      그리고 해당 프로그램이 x64가 되는지는 저도 잘 모르겠습니다.

      여러가지 상황이 맞아들어서 팀으로 개발할 때 팀원 한 명이 해당 기능을 전담하게 되었지요