소스 코드가없는 프로그램의 출력을 수정하는 방법


89

우리 회사에는 수학 계산을 수행하는 작은 프로그램 (.exe 500Kb 크기)이 있으며 결과적으로 워크 플로를 계속하는 데 사용하는 Excel 스프레드 시트에 결과가 뱉어집니다.

Excel 스프레드 시트에서 열, 간격 형식 및 VBA 논리 등을 수정하고 싶지만이 매개 변수는 해당 프로그램에서 구성 할 수 없으므로 .exe를 분해 / 리버스 엔지니어링하는 유일한 방법 인 것 같습니다.

어떤 언어로 프로그래밍되었는지 아무도 모릅니다. 우리가 아는 유일한 것은 :

  1. 20 년 이상 전에 개발
  2. 10 년 전에 은퇴 한 개발자
  3. GUI 응용
  4. 독립 실행
  5. 크기 500Kb

그런 종류의 문제를 해결하기 위해 어떤 옵션을 사용해야하는지 제안하십니까? 리버스 엔지니어링이 유일한 옵션입니까, 아니면 더 나은 방법이 있습니까?


149
계산이 무엇인지 알고 있습니까? 그렇다면 새 앱을 작성하고 두 테스트 데이터를 모두 푸시하여 새 앱이 동일하게 작동하는지 확인한 다음 이전 앱을 버립니다. 그런 다음 원하는대로 변경하십시오.
David Arno

13
@DavidArno의 의견은 좋은 답변을 만들 것입니다. 리버스 엔지니어링은 가능하지만 앱을 다시 지정하고 다시 작성하는 것이 훨씬 저렴하고 쉬워집니다.
Dan Pichelman

44
이를 수정하는 다른 방법은 원래 프로그램이 생성 한 결과를 가져 와서 원하는대로 필터링하는 것입니다.
Blrfl

9
@Alec 16 진수 편집기로 .exe를 열면 작성된 내용에 대한 힌트를 얻을 수 있습니다. 예를 들어, 컴파일러 이름이 포함되어있을 수 있습니다. 거기에서 가능한 디 컴파일 옵션에 대해 더 많이 알게 될 것입니다.
GrandmasterB

26
또는 신청서를 작성한 신사를 찾아 컨설턴트로 하루나 이틀 (매일 두 시간 정도) 기꺼이 들어올 수 있는지 확인할 수 있습니다. 은퇴 한 개발자 인 경우 시간당 짧은 기간 동안 약간의 작업을 수행하는 순간을 실제로 즐기면서 시간당 100-150 달러의 속도로 약간의 돈을 쓰는 것에 대해 약간의 감사를 할 가능성이 있습니다.
RLH

답변:


234

프로그램의 논리를 이해하고 싶지 않고 변경하고 다시 컴파일하려는 경우 리버스 엔지니어링이 훨씬 어려워 질 수 있습니다. 그래서 먼저 시도해 볼 것은 다른 솔루션을 찾는 것입니다.

Excel 스프레드 시트에서 열, 간격 형식을 수정하고 VBA 논리 등을 추가하고 싶습니다.

그것이 당신이 원하는 유일한 것이고, 프로그램에 의해 수행 된 계산이 괜찮다면, 레거시 "exe"를 호출하는 원하는 언어로 프로그램을 작성하는 것이 어떻습니까? 더욱이.


9
새 프로그램이 왜 이전 EXE를 호출해야합니까? 새 프로그램을 독립적으로 만든 다음 출력과 입력을 모두 호출하고 조정하는 스크립트를 작성하는 것이 어떻습니까? 내 경험에 따르면 bash, PowerShell 또는 명령 프롬프트 처리 프로세스 좌표를 처리하는 것이 명령형 언어로 직접 코딩하는 것보다 일반적으로 간단합니다. 그렇지 않으면 +1입니다.
jpmc26

8
@ jpmc26 : Bash의 터무니없는 인용 규칙을 다룰 때까지는 사실입니다. 예, POSIX를 준수합니다. 아니, 그들은 어떤 말도하지 않습니다. 예를 들어 $ FOO는 단어 분할하지 않아야합니다.
케빈

16
@ jpmc26 : subprocess.run()개인적으로 전화하는 데 아무런 문제가 없었습니다 .
케빈

3
@ jpmc26 : 어떤 파이핑? 순수한 요리 책입니다. stdout을 원하면 마법 PIPE상수 를 전달합니다 . 그렇지 않으면, 당신은하지 않으며 폐기됩니다. 무엇을 이해해야합니까?
케빈

3
... 과거에는 VBA와 함께 Excel을 명령 줄 유틸리티의 프런트 엔드로 두 번 이상 매우 성공적으로 사용했음을 추가해야합니다. 구조는 항상 동일합니다. 매개 변수를 "가난한 사람의 UI"로 입력하기위한 시트, 해당 시트의 "시작"버튼. VBA 코드에서 다음 Shell과 같이 Excel VBA에서 호출이 필요합니다 . stackoverflow.com/questions/8902022/… , cmd 유틸리티에서 stdout / stderr를 별도의 파일로 파이프 한 다음 출력 형식을 적용 할 수 있습니다.
Doc Brown

114

Doc Brown과 Telastyn이 이미 제공 한 답변 외에도 대안 접근 방식을 제안하고 싶습니다 (미션 크리티컬 한 가정하에).

수행하는 계산을 모르고 계산이 미션 크리티컬 한 경우 : .exe필요한 방법으로 파일 의 원래 논리를 추론하십시오 . 필요한 경우 IDA 와 같은 디 컴파일러 / 디 어셈블러를 사용하여 디코딩하십시오 . 필요한 경우 컨설턴트 (또는 컨설턴트 컨설턴트)를 고용하십시오.

물론 지금 솔루션을 사용하여 해결하지만 해결하지 마십시오.

내가 제안하는 이유는 다음과 같습니다. 계산 한 내용이 매우 복잡하다는 사실을 인정했습니다 (대화 한 엔지니어에 따라). 또한 미션 크리티컬합니다. 따라서 .exe플랫폼의 변경으로 인해 원래의 작동이 중지 되면 (16 비트 지원이 중단 될 수 있습니까?) 미션 크리티컬 한 지식을 잃어버린 것 입니다.

이제는을 잃을 염려가 .exe없지만 인코딩하는 지식을 잃을 염려가 없습니다 . 그 지식을 회복해야합니다.

이전과 마찬가지로 : 해당 지식이 이미 사용 가능한 경우 조만간 잃어 버리지 않을 형식으로 기록해 두십시오. 그렇지 않으면 복구하여 적어 두십시오.


14
현대 디 컴파일러는 실제로 원본 소스가 고급 C가 아닌 일반 C 또는 어셈블러 인 경우 일반적으로 읽기 쉬운 코드를 생성합니다.
phyrfox

4
아주 좋은 지적입니다. 또한 : 다시 작동하도록 패치하면 다음 수정 사항을 구현해야 할 때까지만 작동합니다.
Daniel Jour

33
@phyrfox 20 세 ... 개발자는 10 년 전에 은퇴했습니다. 출력 만 Excel 스프레드 시트입니다 ... VB6 응용 프로그램에 투자했습니다.
J ...

10
@micaho : 또는 회사가 여전히 존재하고 결과와 숨겨진 가정을 검증하는 노하우를 가진 사람이 트럭에 의해 맞았습니다. 물론 비즈니스 위험이므로 궁극적으로 이해 관계자가 결정해야합니다. 나는 단지 "래퍼 (wrapper)"가 지금 작동 할 것이라고 강조하고 싶었지만 기술 부채 만 증가시켰다.
Sjoerd Job Postmus

22
@J ... : VB6 인 경우 원래 포스터는 운이 좋습니다. VB6 컴파일에서 소스 코드를 매우 쉽게 복구 할 수 있습니다.
Eric Lippert

74

가능하면 원래 프로그래머에게 문의하십시오.

몇 주 전에 저는 10 년대 전에 일하던 회사에서 90 년대 중반에 개발 된 mdb 파일에 대해 똑같은 질문을 한 적이 있습니다.


52
이것은 실제로 낮은 교수형 과일입니다. 모든 사람 (자신 포함)은 리버스 엔지니어링, 프로그램 기능을 다시 구현하거나 데이터 처리에 계층을 추가하는 등의 하드 프로그래밍 기술을 로맨틱하게 사용합니다. 실제로 시작하기 가장 좋은 곳은 소스 코드 또는 다른 이상적인 솔루션의 위치와 함께 1 시간 안에 다시 올 수있는 친근한 이메일입니다.
user1717828

2
10 년 된 신청서가있는 집에서 나도 해체를 시작하지만 근무 시간 동안 목표가 다릅니다 ^^
Paolo

2
그것에 대해 기억이 나십니까? :)
Ángel

2
물론이야! 불행히도 회사는 3 개의 수집 및 병합을 수행하여 많은 정보가 손실되고 백업의 일부가 손실 된 가방에 들어갔습니다.
Paolo

1
개발자의 이름 등이 포함 된 포함 된 문자열이 있는지 EXE를 스캔하십시오. 전체 분해보다 쉽습니다.
JDługosz 2016 년

55

그런 종류의 문제를 해결하기 위해 어떤 옵션을 사용해야하는지 제안하십니까?

출력을 수정하는 것만으로도 컴포지션을 사용하지 않는 이유는 무엇입니까?

대신에 쉽게 액세스 할 수있는 블랙 박스를 수정, 당신은 엑셀 출력을 소요하고 서식 / 열이 변경 않는 새로운 프로그램 작성 도를 . 그런 다음 두 프로그램을 순서대로 호출하는 새 exe / script를 만들 수 있으므로 최종 사용자에게는 모든 작업을 수행하는 프로그램이 하나만 있습니다.


2
@Alec java가 적합한 언어인지 아닌지는 주로 처리해야하는 데이터 양 / 수행해야하는 계산량에 따라 다릅니다. 둘 다 낮 으면 java가 정상입니다. 둘 중 하나가 중요한 경우 C 또는 C ++로 드롭 다운하는 것이 좋습니다. 그러나 어쨌든 Excel 스프레드 시트에 맞는 양의 데이터 만 사용하는 것처럼 보이므로 Java를 잘못된 선택으로 만들 수있는 충분한 데이터가 있다고 생각하지 않습니다 (Excel은 앱보다 폭발하기 쉽습니다).
cmaster

18
@cmaster Java가 많은 계산을 위해 금지한다는 생각은 구식입니다. 최악 여기에 나열된 벤치 마크 도 4 배되지 않습니다 (대부분의 2 배 이하이다)과 한 자리 스칼라 당신의 한계점 인 경우, (개발자 달러로 직접 번역) 안전의 절감 가능성이 성능 저하를 상쇄하기 위해가는 것보다 더 많은입니다 .
corsiKa

8
@Alec 모든 언어가 작동합니다. VBA는 이미 Excel과 잘 통합되어 있기 때문에 좋은 선택 인 것 같습니다.
캡틴 맨

4
@corsiKa 그것은 전적으로 응용 프로그램의 규모에 달려 있습니다. 한 번의 실행이 수만 시간의 CPU 시간을 소비하는 경우 2 또는 4의 요인이 엄청납니다. 이는 수백만 대의 기계에서 얻을 수있는 결과 량으로 직접 변환됩니다. 또한 이러한 응용 프로그램은 일반적으로 잠금 단계에서 작동하므로 가비지 수집은 성능에 대한 독극물이며 작은 중단은 프로세스 수에 곱할 수 있습니다. 나는 그러한 응용 프로그램이 존재하고 가장 확실하게 Java로 작성되지 않았다고 말합니다. 그들은 단지 평균 인터넷 사업에 의해 사용되지 않습니다.
cmaster

7
@cmaster 우리는 실시간 글로벌 일루미네이션, 물리 기반 렌더링, 애니메이션 스파 스 복셀 옥트리, 범용 물리학 필드 시뮬레이션 등을 갖춘 완전한 AAA 게임 엔진이 아닌 간단한 계산에 대해 이야기하고 있습니다. 위법 행위는 없지만 여기에 인수 RE 성능을 삽입하는 것은 좋지 않습니다. 사용 편의성은 1 위 여야하며 몇 년 동안 C ++을 사용해온 사람은이 경우에 권장하는 마지막 언어입니다.

3

정확히 이런 종류의 문제를 전문으로하는 회사가 있습니다. 고유 코드를 사용하여 원시 코드를 고급 언어로 디 컴파일 한 다음 유용한 전문 지식을 적용하여 (예 : 변수에 적절한 이름 지정) 적용합니다.

몇 년 전 제 고용주는이 기능을 사용하여 일부 네이티브 S / 390 메인 프레임 코드를 Linux 서버로 마이그레이션했습니다. 우리는 그들에게 바이너리를줬고 C로 소스 코드를 주었다.

이것이 귀하의 경우에 필요한지 여부는 귀하에게 달려 있습니다. 출력 형식 만 신경 쓰면 출력을 만든 후 간단히 출력 할 수 있습니다. 그러나 다른 사람들이 지적했듯이 이진 블로 브에 비즈니스 로직을 숨기는 것은 지속적인 위험이 될 수 있습니다.


3

출력을 캡처하여 프로그램 주위에 간단한 랩퍼를 작성하십시오. 많은 언어 ( 예를 들어 , Java , C ++ , Python , .NET )가이를위한 수단을 갖는 것은 복잡한 일이 아닙니다 . 출력을 구문 분석하고 원하는 형식으로 다른 것을 생성하십시오. 사용자가 새 프로그램을 호출합니다. 이전 실행 파일은 그 옆에 유지되거나 호출하기 전에 리소스에서 자동으로 추출 될 수도 있습니다.

물론이 솔루션은 출력이 잘 구성되어 구문 분석하기 쉬운 경우에만 충분히 작동합니다.

GUI 응용 프로그램이라는 것은 블로킹 문제가 아닙니다. 이 GUI가 종료되면이를 실행하고 출력을 생성 한 후 자동으로 처리 할 수 ​​있습니다.


3
Doc Brown의 최고 투표 답변과 다른 점은 무엇입니까?
Laf

나는 Doc의 대답이 잘못 쓰여졌다는 가정에 동의하지 않습니다. 명확하고 간결합니다.
마스트

1
이 답변의 텍스트를 살펴보면, 유익한 정보 부분이 "레거시"exe "를 호출하고 출력을 가져 와서 더 처리하는 마지막 문장의 끝을 정확하게 만든다는 것을 알 수 있습니다.
h22

2
downvoter가 아니며 왜 이것이 -3을 얻었는지 보지 못합니다 ... 다시 Meta가 있습니까? 그러나 개별적으로, 나는 (A) 주관적인 판단이고 (B) 내 주관적인 의견에서, 당신의 의견이 포함되어있을 때, "많은 뇌 희석 성 뇌관을 포함하고있다"는 다른 사람의 대답을 놀라게하지 말라고 권고 할 것입니다.
underscore_d

이 방법이 더 도움이 될 경우 "독서 시간을 낭비하는 주제에서 벗어나는 정보가없는 일반적인 대화가 포함되어 있습니다."라고도 다시 쓸 수 있습니다. 마지막 문장의 후반부에 올바른 접근 방식에 대한 힌트를 제공합니다. 이것은 모욕하려는 의도가 없었다. 댓글이 삭제되었습니다.
h22

1

이전 코드에서 가능한 한 많은 사례를 테스트하는 테스트를 작성하십시오. 코너 케이스를 찾아서 잘못된 입력을 테스트하고 올바른 입력을 테스트하십시오.

다양한 경우에 올바른 출력 결과를 찾아 내고 동일한 테스트를 만족하는 구현을 작성하십시오 .

리버스 엔지니어링 경로를 따라 가지 않을 것입니다. 기계 코드를 뒤집는 것은 매우 복잡하므로 exe의 목적이 무엇인지 이미 알고 있어야합니다. 리버스 엔지니어링은 당신이 겪고있는 일에 대해 너무 많은 일입니다.

이 소프트웨어가 20 년 전에 한 사람에 의해 개발 되었다면 아마도 많은 현대적 힘을 필요로하는 것은 아닐 것입니다. 20 년 전에 머신을 확장 한 GUI 프로그램은 현대 머신에 거의 등록되지 않으므로 비교적 재현하기 쉬운 것을보고있을 것입니다.


0

exe를 리버스 엔지니어링하십시오. 계산 로직을 찾거나 실제로 수행하는 작업에 대한 공정한 힌트를 얻기 위해 최소한의 목적으로 만 리버스 엔지니어링을 통해 해당 지점에 도달 할 수있는 경우 해당 계산 로직을 기반으로 새 응용 프로그램을 작성할 수 있습니다. 그 외에도 다른 길가는 보이지 않습니다.

20 년 전에 생성 된 EXE를 리버스 엔지니어링하는 것은 실제 도전 과제입니다.


12
exe의 데이트는 중요하지 않습니다
Ángel

1
실제로, 최적화 프로그램이 매년 더 똑똑 해짐에 따라 리버스 엔지니어링은 더욱 어려워집니다.
MSalters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.