'2010/07'에 해당되는 글 1건

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

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

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가 되는지는 저도 잘 모르겠습니다.

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