'분류 전체보기'에 해당되는 글 123건

  1. 2010/09/01 귀차니스트 DebuggerOnC
  2. 2010/07/29 귀차니스트 음 요새 아주 열코딩중입니다. (4)
  3. 2010/06/23 귀차니스트 오랫만에 글을 올리면서.. (1)
  4. 2010/03/17 귀차니스트 Textcube 에서 XQuared 에디터를 쓰면서 Hooriza님의 Codehilight 사용
  5. 2010/03/13 귀차니스트 Dovelet - (1)

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

댓글을 달아 주세요

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

  물론 원래 결과물이 제대로 나오지 않는다고는 하지만 아휴 그래도 좀 나와줬으면 하는데 제가 놓치고 있는 부분이 정말 많은가 봅니다. 일단 만드는 프로그램의 전체 개요는 컴파일된 바이너리 프로그램이 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

"Utility / Program" 분류의 다른 글

PangCal - 팡야계산기 (2)2008/02/16
War 3 Axis - 워크래프트3 후킹 프로그램 (1)2008/02/16
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  댓글주소  수정/삭제

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

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

오랫만에 글을 올리면서..

Small Talk 2010/06/23 13:53 귀차니스트

  안녕하세요 요즘 3개월 동안 진행하는 과제가 거의 마지막 달이라서 무척 바쁜 관계로 제대로 글을 올리지 못하고 있습니다. 그런데, 최근 진행을 함에 있어서 약간의 상대적 시간 여유가 생겨 해킨토시라고 불리는 Mac OSX를 깔아보았습니다. 물론 Vmware, Virtual Box등의 가상 머신이 아닌 Native 로 깔아보았죠. 일단 스크린샷을 먼저 보시길.

 

사용자 삽입 이미지

 

 위와 같이 동작하고 버젼은 10.6.3 입니다. Snow Leopard 라고 하죠. 주위에 아는 사람이 정품을 가지고 있었던 터라 그 것을 이용하여 깔아보았습니다. 화면안에 떠있는 프로그램은 인터넷 익스플로어, 파이어폭스,은 인터넷 브라우젼인 사파리입니다. 그리고 또 오른쪽은 Pidgin이라고 하는 프로그램의 Mac버젼인 Adium을 깔아서 네이트온 상대와 대화하고 있는 장면이구요.

 

  제가 이렇게 한 번 깔아보게 된 까닭은 과제가 끝나게 되면 IPhone App 개발을 해보기 위함입니다. 물론 배포는 생각을 하지 않고 있지만.. 사실 만약 IPhone 4HD를 사게 된다면 개인적으로 필요한 프로그램을 만들어서 사용할 생각에 깔게 되었습니다.

  이래뵈도 프로그램안에 xcode도 깔려 있고, 기존에 가지고 있는 워크래프트3 정품도 다시 깔아놨습니다.론글버젼이다보니 프로즌쓰론을 깔고 버젼패치 때 에러가 발생하는 군요^^; 이 것은 웹 서핑으로 해결을 봤습니다. 그래픽 드라이버도 제대로 잡히고 하니 쓸만하군요 ㅎㅎ

 

  그래도 아직 사운드카드가 사운드블라스터 X-FI XtreamMusic 이라 안 잡히고 TV Card가 Fusion HDTV 3 Silver인데 이 것도 지원을 하지 않네요. 최근 바다 SDK와 안드로이드 SDK, IPhone SDK 중 많은 고민을 했으나 아무래도 IPhone 이라는 대세에 이끌린 듯 합니다. ㅎㅎ 그럼 과제가 끝나고 IPhone 개발에 대해서 글을 쓰게 될 때 다시 찾아 뵐지도 모르겠네요 ㅎㅎ

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/06/23 13:53 2010/06/23 13:53
TAG , , ,

댓글을 달아 주세요

  1. kkamagui 2010/06/26 12:07  댓글주소  수정/삭제  댓글쓰기

    오오~ 쵝오 ㅋㅋ >ㅁ<;)-b

    역시 멋지군하 ;)

  안녕하세요 오늘은 수업이 끝난 후 간단한 삽질을 통하여 아주 예전에 해결하지 못했던 부분을 해결하여 이렇게 올려봅니다. 예전에 Xquared라는 Springnote에서 사용하는 편집기가 Textcube에서 사용이 가능하게 된 플러그인이 올라왔다고 얘기를 드린 적이 있었습니다. 그리하여 그 플러그인을 적용을 시켰었는데 기존에 사용하던 Hooriza님의 Codehilight 플러그인이 제대로 적용되지 않고 깨지는 문제점이 있었다고 알려드렸던 적도 있었죠.

  그런데 오늘 수업을 마치고 약간 삽질을 해봤습니다. 글은 몇 개 없는 블로그이지만 그래도 2년 정도 된 블로그다 보니 차근차근 글을 쓸 예정이고 해서 수정을 시도를 했었습니다. 그리고 기존에 시도했었던 소스를 웹상에 백업폴더로 저장을 해놓았기에 이를 참고하여 제대로 적용을 완료시켰습니다.

 

Hooriza 님의 Codehilight 플러그인의 호출점 수정

  먼저 Hooriza님의 플러그인에서 Editor에 Html코드를 삽입하는 호출점을 수정하여야 합니다.

ch_main.js (Language : html4strict)
  1. success : function(html) {
  2.     var code = "<br />" + html + "<br />";
  3.     try {
  4.         wnd.xed.insertCodeHilightHtml(code);
  5.         setTimeout(function() { window.close(); }, 10);
  6.     } catch(e) {
  7.         alert("객체를 삽입하는 도중에 에러가 발생하였습니다");
  8.         alert(code + ", " + e.description + ", " + e.source);
  9.     }            
  10. }

  위 코드에서 wnd.xed.insertCodeHilightHtml 이라는 부분이 수정된 부분입니다. 기존의 코드는 이와 같이 되어 있지 않고, Editor.InsertObject인가 그런 것으로 적혀져 있었죠. 그러다보니 없는 메소드를 호출하게 되고 try~catch구문에 걸려 에러메시지만 표시되는데 이와 같이 수정할 경우 뒤에서 만들어줄 insertCodeHilightHtml 함수를 호출하게 됩니다.

 

XQuared - Editor의 개체삽입함수 수정

  원래 XQuared에서 제공하는 Editor.js 파일의 에디터는 insertTemplate 이라는 함수를 제공합니다. 그런데 실제로 이 것을 사용하면 이상한 에러가 뜨면서 제대로 실행이 되지 않는 것을 알 수 있는데요. 그리하여 예전에 수정했었던 소스에서는 아래의 함수를 수동으로 추가를 시켜 주었습니다.

Editor.js (Language : html4strict)
  1. /**
  2.  * Inserts HTML template
  3.  * @TODO: Add selenium test
  4.  *
  5.  * @param {String} html Template string. It should have single root element
  6.  * @returns {Element} inserted element
  7.  */
  8. insertTemplate: function(html) {
  9.     return this.rdom.insertHtml(this._processTemplate(html));
  10. },
  11. /**
  12.  * Inserts HTML
  13.  * @TODO: Add selenium test
  14.  *
  15.  * @param {String} html Template string. It should have single root element
  16.  * @returns {Element} inserted element
  17.  */
  18. insertCodeHilightHtml: function(html) {
  19.     return this.rdom.insertCodeHilightHtml(html);
  20. }

  위 함수에서 insertCodeHilightHtml함수를 만듬과 동시에 내부의 함수에서 this.rdom.insertCodeHilightHtml이라는 멤버함수를 불러주는 까닭은 실제 내용을 처리하는 함수가 rdom에 존재하기 때문입니다. insertHtml이 기존에 문제가 있었기 때문에 새로 인터페이스를 만든 것이죠.

rdom/base.js (Language : html4strict)
  1. /**
  2.  * Inserts given html into current caret position
  3.  *
  4.  * @param {String} html HTML string
  5.  * @returns {Node} Inserted node. It could be different with given node.
  6.  */
  7. insertHtml: function(html) {
  8.     return this.insertNode(this.createElementFromHtml(html));
  9. },
  10. /**
  11.  * Inserts given html into current caret position
  12.  *
  13.  * @param {String} html HTML string
  14.  * @returns {Node} Inserted node. It could be different with given node.
  15.  */
  16. insertCodeHilightHtml: function(html) {
  17.     return this.insertNode(this.createCodeHilightHtml(html));
  18. }
rdom/base.js (Language : html4strict)
  1. /**
  2.  * Creates element from HTML string
  3.  *
  4.  * @param {String} html HTML string
  5.  * @returns {Element} Created element
  6.  */
  7. createElementFromHtml: function(html) {
  8.     var node = this.createElement("div");
  9.     node.innerHTML = html;
  10.     if(node.childNodes.length < 1) {
  11.         throw "Illegal HTML fragment";
  12.     }
  13.     return this.getFirstChild(node);
  14. },
  15. /**
  16.  * Creates element from HTML string
  17.  *
  18.  * @param {String} html HTML string
  19.  * @returns {Element} Created element
  20.  */
  21. createCodeHilightHtml: function(html) {
  22.     var node = this.createElement("div");
  23.     node.innerHTML = html;
  24.     return node;
  25. }

 두 번째 블럭에서 CodeHilightHtml을 수정함과 밑의 체크 구문을 제거한 것으로 createCodeHilightHtml함수를 만들었습니다. 이렇게 하면 제대로 JavaScript 함수 단에서의 호출문제는 제거가된 것인데요. 이렇게 하여 Textcube 에서 Hooriza 님 플러그인을 사용하게 된다면 FIELDSET, LEGEND가 제거되어 글을 작성 후 제대로 표시되지 않는 문제점이 존재합니다. 

 

Whitelist에 Html태그 추가

  Javascript함수를 하나씩 디버깅하여 추적을 해본 결과 해결방법을 찾게 되었습니다. 위 까지는 예전에 진행했었던 단계였던지라 이 번에 적을 것이 점심시간 후 시도했던 방법이라고 보시면 됩니다. 여기서는 xquared.js 파일을 열어서 해당 부분을 찾아봅시다.

xqurared.js (Language : html4strict)
  1. /**
  2.  * Pre-defined whitelist
  3.  */
  4. xq.predefinedWhitelist = {
  5. .
  6. .
  7. .

  이 부분을 찾으셨으면 아래로 내린 뒤, 아래 코드와 같이 해당 tag를 추가하면 됩니다.

xqurared.js (Language : html4strict)
  1. .
  2. .
  3. .
  4.    'var':         xq.commonAttrs.concat(),
  5.    'fieldset':      xq.commonAttrs.concat(),
  6.    'legend':            xq.commonAttrs.concat()
  7. };

  이렇게 추가하신 뒤, 사용하시면 짜잔 제대로 표시가 됩니다. 물론 var는 기존에 존재하던 것이라 fieldset, legend 부분만 추가하시면 되구요^^. 지금 남기는 이 글 또한 문제를 해결한 Editor로 글을 남기는 것이라 감회가 남다르네요.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/03/17 14:54 2010/03/17 14:54

댓글을 달아 주세요

Dovelet - (1)

Algorithm 2010/03/13 00:42 귀차니스트

  알고리즘 테스트 사이트 인 Dovelet.com 입니다.
문제가 엄청 쉬운 것도 있고 어려운 것도 있는 듯 해 보이는데요.. 어제 2시간 정도 오늘 한 5시간 정도 투자하여 쉬운 쪽의 문제를 많이 풀어보았습니다. 대략 70여 문제를 풀었는데.. 이제는 조금 지치네요.. 나중에 차근차근 진행을 해봐야 겠습니다.

사각형 넓이 구하기
삼각형 넓이 구하기
네 수의 평균
두수의 교환
섭씨온도를 화씨온도로 변환
몫과 나머지 구하기
거스름 돈
손해 본 금액
퓨 즈
대소 판별하기
분수 크기 비교
수영장 가는 날
윤 년
중위수
삼각형 성립 조건
사주 팔자
해킹 회사
팀 구성
지하 차도
점수 맞추기
등차/등비 수열
축소 복사
조건 연산자
오버랩
달의 날수(switch 예제)
별 출력
순차 출력
구구단
7 개 합
끼리끼리 합
홀 수
순차 합
팩토리얼 구하기
순차 합II
최대 값
최소 값
달에서 무게
화학 실험
최대,최소값 출력
복리법
가장 부지런한 농부
약수 출력
3*n+1
완전 수
학 점
완전수,부족수,과잉수
총합,최대,최소
최대공약수,최소공배수
소수(prime number)
서로 소
중간 수
speed limit
세자리수 곱셈
수 추측하기
number steps
두 수의 연결
직각 삼각형 (별)
역 직각 삼각형I (별)
역 직각 삼각형II (별)
E 출력(별)
거울에 비친 E(별)
네모(별)
F 출력(별)
T 출력(별)
H 출력(별)
쾌걸 조로 (별)
삼각형 (별)
다이아몬드 (별)
54321
b54321
주사위 던지기 I
주사위 던지기 II
완전수 출력

어려운 문제는 푸는데 시간이 조금씩 걸릴 듯 하네요.. 차근차근 계속해서 풀어볼 생각입니다. 다들 한 번 풀어보시길 바랍니다.^^;

풀어본 문제 중 하나를 적어보도록 하겠습니다.

프로그램 명: center1
제한시간: 1 초
1 부터 n-1 까지의 합이 n+1,n+2,... 의 합과 같을 때 n 을 중간수라 한다.
예를 들어 , 4 는 1+2+3=6 이고 5 부터 차례대로 더해갈 때 5+6=11 이므로 4 는 중간수가 될 수 없다.

6 은 1+2+3+4+5=15 이고 7+8=15 이므로 6 은 중간수이다.

정수 하나를 입력으로 받아 중간수 인지를 판별하는 프로그램을 작성하시오.

입력

10,000 이하의 자연수가 입력으로 주어진다.

출력

중간수이면 O , 아니면 X 를 출력한다.

입출력 예

입력

6

출력

O

입력

10

출력

X

보충 설명

35 는 중간수
  • 1 + 2 + ... + 34 = 595
  • 36 + 37 + ... + 49 = 595
크리에이티브 커먼즈 라이센스
Creative Commons License
2010/03/13 00:42 2010/03/13 00:42

댓글을 달아 주세요