C#과 같은 Managed code(GC) 언어는 바이너리(exe, dll) 리버스 엔지니어링을 통하면 개발 소스와 거의 동일한 결과물(code)을 얻을 수 있다. 이러한 역공학을 쉽게 지원하는 툴은 대표적으로 ILSpy와 dotPeek 등이 있다. C# 언어에 문제가 있어서 역공학이 쉽다는 말이 아니고 Managed code(GC, ARC)의 언어(Java, Python etc)의 특징이다.
Database 연결 문자열과 같은 보안에 취약한 소스를 보호하기 위해 난독화(Obfuscation:리버스 엔지니어링을 적용하지 못하게 만드는 기술) 프로그램을 사용한다. 난독화한 바이너리는 디컴파일러를 하여도 원래의 소스 코드는 보이지 않고 읽기 어려운 소스 코드로 나타난다. 대표적은 난독화 프로그램은 상용인 Eazfuscator, Skater와 무료로 사용할 수 있는 ConfuserEx, obfuscar 등이 있다.
위의 이미지는 ConfuserEx를 실행했을 때의 화면이며, obfuscar는 콘솔프로그램으로써 아래의 절차에 따라 난독화를 진행한다.
Rust is a multi-paradigm system programming language focused on safety, especially safe concurrency. Rust is syntactically similar to C++, but is designed to provide better memory safety while maintaining high performance(wikipedia, 2019). Rust 컴파일러는 Rust로 작성한다.
러스트는 인터넷에서 실행되는 서버 및 클라이언트 프로그램을 개발하는데 적합한 언어를 목표로 설계되었다. 이 목표에 따라 러스트는 안전성과 병행 프로그래밍, 그리고 메모리 관리의 직접 제어에 초점을 맞추고 있다. 또한 성능 면에서는 C++와 비슷한 수준을 목표로 하고 있다(ibid). 모질라 재단에서 개발하고 있으며, 차기 웹 브라우저 엔진 프로젝트인 서버(Servo)를 개발하는 데에 쓰인다.
Native C/C++의 DLL을 C#에서 호출하여 사용하는 간단한 예제이다. 사용환경은 Visual Studio 2019, .NET Core 3.0을 선택하였고 모두 64bit로 빌드하였다. 주의할 점은 C++, C# 모두 x64이거나 x86으로 같이 맞추어야 에러가 나지 않는다.
C++ 예제의 함수는 숫자를 반환하는 Add, 문자열을 반환하는 TestString 두 개고 작성 후 C#(.NET Core) 콘솔 프로그램에서 호출하여 사용한다. 아래는 전체 소스이다. 참고로 Project1.dll 파일은 C# 프로젝트의 실행 파일이 있는 곳에 복사한다.