소스 분석 결과 관리하기

geekforum의 이미지

자바 개발을 하다가, J2ME VM개발로 전업한 개발자입니다. 언제나 느끼는 바지만, 포터(1톤트럭 포터가 아니라, porting coder)에게는 다른 플랫폼으로 옮기는 포팅을 할 때마다, 노가다가 끝나면 꼭 본래의 Core 소스를 분석해야지 하는 생각을 하곤 합니다. (물론 부족한 시간 땜시 포기하는 경우가 부지기수지만...)

이때, 남이 짠 소스를 분석하고 어딘가에 정리할 때 보통은 엑셀을 많이들 사용합니다. 물론 Rose같은 걸로 하면 좋겠지만, 가격도 비싸고 UML도 좀 알아야 되고, 뽀대 나게 하려니깐 소스분석하는 시간보다 정리하는 시간이 더 걸리는 듯 하더군요.(배보다 배꼽이....) 그래서들 부담없이 엑셀들을 많이 사용하더군요.

여러분들은 어떤 프로그램을 사용해서, 세부적으로 어떤 식으로 정리하는지, 궁금하군요. 뭔가 획기적인 방법이 있을까요? 빠르고 쉽게, 그리고 한눈에 들어오는 그런 방법!!!

하늘사람의 이미지

Reverse Engineering: A Roadmap

ICSE 2000 에서 발표된 논문입니다.

리버스 엔지니어링의 80년대 90년대 그리고 현재 전망에 대한 로드맵을 보여 주는 개괄적인 문서입니다.

<요약> Abstract: By the early 1990s the need for reengineering legacy systems was already acute, but recently the demand has increased significantly with the shift toward web-based user interfaces. The demand by all business sectors to adapt their information systems to the Web has created a tremendous need for methods, tools, and infrastructures to evolve and exploit existing applications efficiently and cost-effectively. Reverse engineering has been heralded as one of the most promising technologies to combat ...

링크 :
www.cs.ucl.ac.uk/staff/A.Finkelstein/ fose/finalmuller.pdf

하늘사람의 이미지

2백만 라인의 소스코드 분석하기...

[소개]
휴대폰 업체인 노키아의 아키텍쳐 개발 문서입니다. 폰 소스의 경우 1.5MLOC(Million Line of Code) 정도 된다고 하는데, 그 아키텍쳐를 재 구축하는 경험에 관하여 적어 놓았습니다.

[사용툴]
읽어본 결과 사용한 툴들은 다음과 같습니다.
1. Rigi (www.rigi.csc.uvic.ca)
2. Source Navigator (RED-HAT TM)
3. Prolog (better than SQL)
4. 기타 등등...

프로그램의 복잡도를 관리하기 위한 추상화 레벨등 보다 다양한 정보를 원한다변 아래 링크를 참조 바랍니다.

[참고자료]
http://www.sei.cmu.edu/publications/documents/02.reports/02tn004.html

[참조 사이트]
http://www.sei.cmu.edu/

The Software Engineering Institute (SEI) is a federally funded research and development center sponsored by the U.S. Department of Defense through the Office of the Under Secretary of Defense for Acquisition, Technology, and Logistics [OUSD (AT&L)].

[에틸로그]
찾아보면 방법이 나오는 군요...
조금만 더하면 기업연구소에서 현재 사용하고있는 Best Practice 나 Better Practice에 접근할 수 있을 것 같습니다.

뭐든지 원산지에 가야 좋은 것을 찾을 수 있더라구요. 원산지가 어딘지 몰르면 고생이지만...그럼 이만... 감사합니다.^.^

하늘사람의 이미지

reverse engineering tools을 여러 방법으로 찾는 중입니다.

참고 사이트를 열거 합니다. 찾아본것 중 에 괜찮은 것만...

1. http://www.sdl-forum.org/

UML 이전에 있었던 SDL(Sepc. description lang.)의 경우 객체 지향적이기 보다는 SDL-82에서 SDL-2000까지 프로시져 루틴 중심의 C언어를 표기하는 다양한 방법들 존재MSC, SDL tool을 이용하여 정리....

2. http://www.cs.queensu.ca/Software-Engineering/tools.html
백가지 이상의 CASE tool들의 리스트가 있음...

이중에서 C언어용으로 기존시스템을 분석하기 위한 툴 중에서 세가지만 정리하면 아래와 같다.
[1]http://www.imagix.com/products/products.html

[2] http://www.aonix.com/content/products/stp/stp.html

[3] http://www.telelogic.com/products/tau/logiscope/index.cfm

[1]의 경우 if문 까지 즉, flowchart level까지 시작적으로 분석하는 툴...

[2] SDT UML tool

Please take a moment to complete the following form, making sure to enter a working email address so that we can forward you the password needed to download any of the following:
The StP (UML, ACD, SE) Modeling ReadMe
The StP (UML, ACD, SE) Modeling Download
StP (UML, ACD, SE) Product Literature

[3] reverse tool, code coverage analysis 등의 기능이 있으며... 프로그램의 품질보장 툴. 품질을 보장하면 시스템을 분석(역공학)해야죠... Nokia , CERN, 등 대규모 단체에서도 사용.

3. 대학교에서 정리한 reverse tool list

http://www.rigi.csc.uvic.ca/UVicRevTut/F6tools.html

계속 찾아 봐야죠...

익명 사용자의 이미지

vim, ctags, printf(); 삽.
때론 포크레인.

하늘사람의 이미지

몇 가지를 찾아 보았습니다.

관련툴
1. Source Insight(TM)
2. Source-Navigator
3. Understading for C++(TM)/Java/C/Perl/Ada등

이중에서 C언어를 분석해서
비주얼하게 보여주는 것은 3 번이 좋음

(최신버전의 경우, 마이크로소프트 비지오

로 저장이 됨. 이 점이 상당히 유용한 기능)

1번과 2번은 비슷한 기능을 하지만, 현재
제 주변에서는 주로 1번을 많이 사용하여
소스를 분석함....

익명 사용자의 이미지

제가 1번을 구입해서 사용하고 있는 관계로 (회사가 샀지만요 ^^)

2번과 3번도 설치해서 사용해 보았습니다.

Linux에서는 어떨지 모르겠습니다만,

Windows 환경하에서는 2번과 3번 모두 너무 느리더군요.

3번의 경우 C 파일을 정리 분석해 준다는 것은 매우 유용한것 같습니다만.
제가 일하고 있는 곳에서 소스 파일이 1000개정도 되는데 이것을 분석해 내는데 1시간이 걸려도 안끝나길래.. 취소해 버렸습니다.

2번의 경우 제가 사용할 수 있는 기능보다 엄청나게 많은 것이 숨어 있는 해 보입니다. 하지만 이것 역시 Windows 환경하에서는 너무 느리더군요.

제 생각에는 2번 3번 둘다 Script를 사용하는 점이 문제 인것 같습니다.
2번의 경우 Tcl/Tk를 사용하고 있는 것 같고 3번의 경우 Perl을 사용하더군요.
너무 느린것은 이 두 S/W의 문제점인것 같습니다.
기능상으로 3번 Tool은 1번에 비해서 Report Generator의 기능이 너무 훌륭하기는 합니다. ^.^

1번의 경우는 약 1년 반정도 Editor의 기능만을 충실하게 사용해 봤습니다.
속도는 2~3번에 비해서 빠른편이고 버그가 많고, Windows Only만 된다는 단점이 있습니다.

제 생각에는 2번이 빨리 좋은 S/W가 되면 좋겠다는 생각이 듭니다. ^.^..

저도 한때는 추종자 였거든요 ^.^

하늘사람의 이미지

3번 프로그램은 아래에서 구할 수 있습니다.

understand c/c++ (15days, shareware)

http://www.scitools.com/ucpp.html

그리고 특징적인 기능중 하나는 C 파일의 비주얼한 분석내용을 비지오로 저장하는 기능이 있습니다.

익명 사용자의 이미지

Source Insight는 저도 사용하고 있습니다. ^.^

아주 좋은 Editor입니다. ^.^

그런데 분석 Tool이라고 하기에는 좀 그런것 같네요.

Source-Navigator는 아주 초기버전에서 사용해 봤었는데 현재 버전은 어느정도인지 모르겠네요 ^.^
(그 때 느낌은 이것도 Editor였거든요 ^.^)

익명 사용자의 이미지

저는 x86이 아닌 환경에서 Only C로만 개발을 하는 사람입니다. 사실 대부분의 PC S/W나 Unix S/W 이외에는 68000계열의 CPU에서 임의의 RTOS를 써서 C로 개발하는 방법을 쓰고 있다고 생각합니다.

의외로 이러한 환경에서 개발하고 있는 사람들이 많을 겁니다. 저 같은 경우는 셋탑박스에서 일을 하고 있는데..

이런 상황에서는 남이 짜놓은 코드 보는일이 정말 죽음입니다. 특히 한 1년 반전에 이 회사에 첨 입사했을때 셋탑에 대해서 제대로 이해하고 있지도 못한데 남이 짜놓은 몇천라인 짜리 C 소스가 몇백개씩 널려 있는 코드를 받아서 다 잘돌아가는 코드니까 수정해서 새 모델만들어라 그럴때는 정말 죽음이져.

이러한 상황에 알맞는 프로파일러나 소스 분석툴같은 것을 알고 있는 분의 조언이 있었으면 좋겠네요.

제가 생각하기로는 적어도.

ANSI C + POSIX 호환지원 정도되면..

그나마 Embedded환경에서 사용할 수 있을 것같은데 ^.^

아무튼 저같은 환경에서도 그넘의 역공학인지 뭔지해서 일좀 쉽게 할 수 있는 방법 알고 계신분 정보 주심 감사하겠습니당 ^.^

익명 사용자의 이미지

제가 볼때.. 다른 사람이 짠 프로그램을 정리하는게 문제가 아니라 그걸 어떤방식으로 분석할것이냐.. 이게 더 원초적인(?) 문제인것 같은데요..

정리하는거야.. 엑셀을 사용하든 워드를
사용하든.. 지 마음대로 사용하면 되겠죠..
(근데 엑셀을 사용한다는건 좀 의외네요..)

어쨋든.. 리버스 엔지니어링시 이를 정리하는
가장 좋은 방법은 역시.. 모델링밖에 없는것
같아 보입니다.

개인적으로.. 본 토론이 소스 분석 결과에 대한 관리보다는
리버스 엔지니어링쪽에 촛점이 맞춰져..
어떻게 하면 더 잘 남의 소스를 분석할 수
있을까.. 하는 방향으로 갔으면 하는
작은 소망이..있네요 ^^

1. 코드에 대한 아무런 문서도 없다.(심지어 README 조차..)
2. 아주 거대한.. (최소 10만라인 이상의) 코드 덩어리만 덩그러니 놓여있다.

이러한 전제조건하에서
소스가 OO 개념으로 디자인된 경우(Java 소스)
소스가 structured 개념으로 디자인된 경우(C 소스)

두 경우에 가장 효과적이고, 속도가 빠른
역공학 방법에는 어떠한 것이 있을까...
그런것에 대해 토론을 해봤으면 하는...
소망이...

음.. 이것도 역공학 관련 논문들을
찾아봐야 하는건가..

개인적으로..프로그램의 main()을 찾은다음
top-down으로 분석하여 나가고 동시에 임의의 모듈로부터 시작하여 bottom-up 분석을
적용시키는 방법..

그리고.. 프로파일러를 사용해 실행시간중
가장 많은 시간을 잡아먹는 모듈을 찾아내서..
그 부분을 중심으로 up, down을 동시에
진행시켜 나가는 방법..
이 두가지 방법 말고는..
정말 삽질이 될것 같은데..

누구 리버스 엔지니어링 도사가 있다면..
약간의 힌트라도 좋으니..
이와 관련하여 리플 부탁드립니다.

익명 사용자의 이미지

분명 리버스 엔지니어링 이라는 거창한 이름을 달았을 경우, 이를 정리하는 방법은 모델링이 최고라는데에는 이의를 달지 않습니다.
하지만 모델링이라는 것도 한계가 있다고 봅니다. 오히려 모델링은 OO개념에 촛점이 맞춰진 듯한 느낌이 들어 C 소스에 적용하기에는 문제가 있다고 생각됩니다. (사실 전 C 소스 작업을 하면서 로즈로 작업한 적이 없었고 로즈나 모델링 책을 봐도 거의 OO 개념의 모델링만 봐서 그런지...C와 모델링은 잘 안 어울린다는 생각이 듭니다.) 그리고 모델링이라는 것도 조금은 이해가 선행된 후, 분석한 내용을 정리를 해야 되므로 시간적으로 모델링에 빼았기는 시간이 너무 많다는 거죠. 저도 회사에서 언제나 모델링을 하고 코딩 작업을 하지만 모델링을 할 때마다 느끼는 생각이지만 왜 이런 거지 같은 노가다를 하는지 모르겠다는 생각이 듭니다.(모델링 신봉하시는 분들께는 죄송한 얘기지만....) 바쁠 경우에는 모델링 생략하고 코딩 먼저하고 나중에 모델링 문서만 대충 만드는 경우도 부지기수입니다. 분명 실제로는 모델링이 전부는 아니라는 거죠.

그리고, 리버스 앤지니어링에 대해서는 저의 생각은 이렇습니다. 소스가 있고 제대로된 makefile만 있다면, 리버스 엔지니어링은 크게 문제가 될 점은 없다고 봅니다. 디버거를 잘 사용한다면 어느정도 분석은 끝낼 수 있다고 생각됩니다. (물론 특출난 환경에서 디버거가 제공 안되거나, 디버깅이 골치아플 경우도 있겠지요...)

리버스 앤지니어링 보다는, 오히려 소스를 디버깅한 후 분석된 내용을 토대로 메모리 구조라든지, row level devic와의 연관성을 분석한 내용을 어떤 형식으로든지 정리를 해야할 필요성을 느꼈고, 동료들과 공유를 해야될 필요성이 생긴다는 것이 문제죠.

이때 과연 모델링으로만 모든 것이 커버가 안 된다는 것이 문젭니다. 특히 동료가 모델링에 대한 이해가 부족할 경우에는 더욱 그렇습니다. (물론 OO개발자들은 모델링에 대해 이해를 하겠지만 C 개발하시는 분들의 경우 모델링에 대한 이해가 없으신 분들이 많습니다.)

OO개발이 아닌 C개발하시는 분들의 경우, 엑셀을 이용해서 분석한 내용을 정리하는 경우가 많이 보이던데, 엑셀도 실은 소스 정리를 위한 용도가 아닌지라 한계가 있다는 생각입니다. 물론 워드보다는 훨씬 낫다고 봅니다. 그리고 엑셀로 내용을 정리하는 경우에도, 개발자마다 정리하는 방식이 모두들 달라서, 뭔가 체계적인 방식을 정해야 되겠다는 생각이 듭니다. 물론 세련된 형식으로요...

여기 토론의 방향은 이렇게 자신이 분석한 내용을 어떻게 체계적으로 정리된 형태로 생산을 해 내냐는 것에 맞춰 졌으면 하는 바램이 있습니다.

익명 사용자의 이미지

모델링만으로 역공학을 다 성취 한다는 얘기는 아니지요..
어차피 소스랑 모델은 공존할때에 더 많은 가치를 가져다줍니다.

사람 몸을 분석할때마다 현미경으로 세포하나하나를 뜯어봐야한다면..
일단 그 과정자체가 엄청난 고통일것이고.. 뿐만아니라
몸의 전체 구조가 어떤지 체계적으로 파악하기도 힘들죠..

또 반대로 팔, 다리, 몸통, 머리등으로 크게 구분하여 몸을 큰 단위로
분석할때에도 특정부위를 세포수준으로 세밀하게 봐야 할때가
있을텐데.. 단위가 큰 모델만으로는 그런 세밀함을 갖출 수 없습니다.
(가장 세밀한 모델은 code 그 자체입니다.)
보다 완전한 분석을 위해선 둘다가 필요하다는거죠..

그리고.. 절차적 방식의 소스코드가 모델링에 적합하지 않은것 같다는것은..
그야말로 개인적인 느낌일뿐인것 같군요.
전통적인 모델링방식에서도 DFD, STD, ER 도 등등의
다이어그램들이 제공되고.. 각각을 레벨별로 그릴수 있습니다.
다만, 대세가 OO쪽으로 치우치다보니.. 많은 사람들이 그쪽은 거의 생각을
안하는것 뿐이죠.

Rose같은것에 너무 집착할 필요는 없을것 같네요..
어차피 그것도 case 도구니까요.. 모델링은 원래 종이와 연필만으로
다 가능한거 아니겠습니까.. 뭐 나중을 위해선 그런툴을 사용하는게
좋겠지만..

개인적으로 모델링 도구로서.. 파워포인트를 추천합니다.. --;;;
체계적인 작성 규칙이 제정되어있고..일관성만 갖춰진다면...
파워포인트도 쓰기 편하고 강력한 모델링 도구로 손색이 없다는 생각입니다..

익명 사용자의 이미지

프로파일러에 대해 더 자세한 설명을 들을수 있을까요? 어떤건지(프로그램인지 혹은 리버스 엔지니어링의 한 방법인지) 알고 싶습니다.

그리고 전, top-down방식과 bottom-up 방식의 혼합사용을 하고 있습니다. 역변환 레벨은 항상 디스어셈블링 레벨과 맞쳐줘 있구요. 제가 하고 있는 이 방법에 대해 뭔가 더 도움될만한 조언하나 해주셨으면 합니다.

조기태의 이미지

Profiler는 프로그램의 성능을 측정하는 도구로써 주로 병목점이나 쓰레드의 데드락을 발견하는데 쓰입니다. 자바의 경우 간단한 프로파일링은 자바 실행시 -Xprof 옵션을 주어 실행할 수 있지만 좀 더 복잡한 경우 OptimizeIt!이나 JProbe와 같은 상용 프로그램을 사용합니다.

이들 프로그램의 경우 특히 어플리케이션 서버와 연동하면 라인단위까지 병목점을 정확히 추적할 수 있어 규모있는 서버측 계발에서 필수적입니다.

프로파일링은 역공학과 직접적인 관련은 없습니다만 콜스택을 뽑아보는 정도는 도움이 될 수 있을 것 같군요.

남이 작성한 자바 프로그램이라면 일단 javadoc을 참조하고 UML툴을 이용해 클래스 다이어그램을 뽑아보는게 유용할 것 같습니다. 소스가 없다면 javap 나 jad등으로 디컴파일 해보는 것도 한 방법이겠지요...

개인적으로 자바 프로그램에서 javadoc이외에 주석을 다는 걸 상당히 싫어합니다. 제대로된 oop라면 클래스 구조와 메소드 이름만 봐도 프로그래머의 의도가 명확히 드러나야 한다고 생각합니다.

그럼~

익명 사용자의 이미지

맞는 말씀입니다. 적어도 자바로 프로그래밍 하면서 주석은 필요 없지요.
아니 필요 없도록 프로그램을 해야합니다. TestCase라도 있으면 코드 분석은 훨씬 쉬워지겠지요.