답변:
리버스 엔지니어링이란 무엇입니까?
리버스 엔지니어링은 크래킹 및 해킹 (일련 번호 보호 또는 비밀번호 프롬프트 제거)뿐만 아니라 다른 소프트웨어가 수행 할 수있는 바이러스 또는 기적을 이해하는 데 주로 사용됩니다. 때로는 소스를 얻지 못한 프로그램에서 버그를 찾아 패치하는 것이 유용한 기술입니다.
프로그래머로서 리버스 엔지니어링 기술을 배워야합니까?
예, 어셈블러를 배우고 알맞은 디버거를 사용하십시오. 그것은 금속에 더 가까운 저수준의 것을 이해함으로써 더 나은 개발자가 될 것입니다.
리버스 엔지니어링에 익숙한 프로그래머의 이점은 무엇입니까?
당신은 좋은 해커 / 크래커가 될 것입니다. 다른 안티 바이러스 제작자를 위해 일할 수도 있습니다. 개인적인 예로 : 오라클 연결을 설정하는 동안 발생하는 오류를 추적하기 위해 소프트웨어를 리버스 엔지니어링했습니다. 아무도 그 문제를 해결할 수 없었기 때문에 명성을 얻었습니다.
또한 @ johannes의 의견 을 인용하고 싶습니다 .
나는 "나쁜"크래킹으로 제한하지 않습니다. 디스 어셈블 링은 컴파일러가 화를 냈는지 (보통 코드이지만), 더 많은 sysadmin 관점에서 응용 프로그램이 실패하는 위치를 보는 것이 흥미로울 수 있는지 알아내는 데 유용 할 수 있습니다
나는 Falcon의 대답을 좋아 하지만 오래된 지루한 비즈니스 응용 프로그램에서 리버스 엔지니어링을 사용하면 골치 아픈 문제에서 벗어날 수 있다고 덧붙이고 싶습니다.
직장에서는 새로운 유지 관리가 필요없는 타사 시스템과 데이터 통합을 수행 할 때 많은 작업을 수행하므로 중단해야 할 위치와 중단되지 않은 위치를 알 수 있습니다.
또한 소스 코드가 포함되어 있지 않은 경우 구매하는 타사 구성 요소에 대해 리버스 엔지니어를 사용하여 코드 품질을 확인합니다 (물론 특정 제약 조건이 있음).
나의 진짜 요점은 : 리버스 엔지니어링은 단일 기술이나 언어에 국한되지 않고 "블랙 박스"의 내부를 배우는 프로세스 입니다. 의존하는 코드가 있지만 신뢰할 수 없거나 신뢰할 수없는 경우에는 반드시 코드를 들여다보고 해당 코드의 기능을 확인해야합니다.
리버스 엔지니어링의 드롭 데드 보링 측면도 있습니다. 이것은 현재 회사에 여전히 사용되고있는 약간의 코드 나 프로그램이 있지만 아무도 그것에 대해 아무 것도 주장하지 않습니다. 따라서 프로젝트를 시작하고 문서화하고 테스트를 작성하며 프로젝트를 시작하기 전에 수행해야하는 모든 엔지니어링 작업을 수행합니다. 이미 작성된 소프트웨어 ( "역 엔지니어링")에 대해이 작업을 수행합니다.
코드가 있으면 훨씬 쉬워 지지만 여전히 기술적으로 리버스 엔지니어링입니다. 레거시 프로젝트에 대해 이야기 할 때 비즈니스 미팅에서 크게 나타나는 용어 중 하나입니다.
리버스 엔지니어링의 비즈니스 가치를 확장하기 위해 우리가 만나는 신규 고객의 절반 이상이 기존 시스템 / 앱 (항상 프로덕션에 신경 쓰지 않아도 됨)을 가지고 있지만 이전 소프트웨어 개발 공급 업체와의 관계가 미쳤습니다.
사례의 약 30 %에서 고객은 시스템의 소스를 전혀 얻지 못했으며 많은 경우 실제 비즈니스 프로세스, 규칙 및 지식의 많은 부분이 코드에 잠겨 있습니다.
그리고 이전 벤더들이 명백한 악성 프로그램을 입수 한 경우, 바이너리를 난독 처리하고, 고객을 무기한으로 유인하기 위해 코드를 타임 록하는 등의 경우가있었습니다.
따라서 리버스 엔지니어링은 종종 절망적이며 불에 타 버린 고객과의 새로운 계약의 출발점이며 기존 코드에서 잊어 버린 지식을 추출하는 '비즈니스 크리티컬'성공 요인이 될 수 있습니다.
역 엔지니어링을위한 기술과 디버깅을위한 기술은 완전히 동일하다고 주장합니다. 환상적인 디버거라면 환상적인 역 엔지니어이고 그 반대도 마찬가지입니다.
나는 내 경험에서 실제 사례를 보여주고 있습니다.
우리 회사가 다른 회사의 프로젝트를 인수하면 프로젝트에 약 반 년 동안 우리는 하위 프로젝트에 코드가 없다는 것을 깨달았습니다. 이전 회사에 코드를 제공하도록 요청했을 때, 그들은 하위 프로젝트의 코드를 찾을 수 없다고 정중하게 대답했습니다. 하위 프로젝트에서 무언가를 변경하고 싶었 기 때문에 코드가 필요했습니다.
하위 프로젝트 를 리버스 엔지니어링 해야했습니다 .
먼저 어셈블리를 디 컴파일했습니다 (예, .NET 프로젝트). 디 컴파일 된 어셈블리의 결과는 로컬 변수의 이름과 복잡한 제어 구조가없는 부드럽고 혼란스러운 코드입니다. 컴파일은 디 컴파일 할 수없는 중요한 정보를 삭제하기 때문입니다.
그런 다음 해당 코드를 변경할 위치를 찾으려고 노력했습니다. 이를 위해 코드를 능률화하여보다 간결하게 작동합니다. 또한 변수의 이름을 동작에서 추측했습니다. 내가하는 일을 알아낼 때까지 코드를 여러 번 살펴 보았습니다.
나는 모든 것을 리버스 엔지니어링하지 않았고, 우리가 바꿔야 할 부분 만 바 꾸었습니다. 약 200 줄의 VB 코드는 그렇게 나쁘지 않았습니다. 작업 시간은 약 5 일이 걸렸습니다.