๋ฐ˜์‘ํ˜•

๋””์ปดํŒŒ์ผ๋Ÿฌ(Decompiler)

ํ˜น์‹œ ๋””์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์ €๋Š” ๋””์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋งˆ๋„ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋””์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์—ญ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ €๋Š” ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณธ ์ ์ด ์—†๊ธฐ์—, ๋””์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์ง€ ๋ชปํ–ˆ์—ˆ๋Š”๋ฐ์š”. C# ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋†€๋ผ์šด ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋์—ˆ์Šต๋‹ˆ๋‹ค. .Net Framework๋กœ ๊ฐœ๋ฐœ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ILSpy ๋˜๋Š” dotPeek๊ณผ ๊ฐ™์€ ๋””์ปดํŒŒ์ผ๋Ÿฌ ํˆด์— ์˜ํ•ด ์‰ฝ๊ฒŒ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ง์ด์ฃ . ์–ด๋Š ์ •๋„๋กœ ๋…ธ์ถœ๋˜๋Š”์ง€๋Š” ๋ณธ๋ฌธ์—์„œ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋ณด์—ฌ๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ํ˜„์žฌ C# ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ์—๋Š” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ Native C++ ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐ C++/CLI Wrapper Class ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœํ•˜๋ฉด ๋””์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์€ ์ถ”ํ›„์— ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

.Net Framework๋ž€?

๊ทธ๋Ÿผ .Net Framework์˜ ์ •์˜ ๋ฐ ํŠน์ง•๋“ค์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ๋ชฐ๋ผ๋„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜์ค‘์— '์ด๋Ÿฐ ๊ฒƒ๋„ ์žˆ์—ˆ์ง€'ํ•˜๊ณ  ๊ธฐ์–ต์— ๋‚จ์„ ์ •๋„๋กœ๋งŒ ์•Œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.Net Framework๋Š” Windows์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Linux, macOS, Windows, iOS, Android ๋“ฑ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์„ ๋ชจ์•„ ๋†“์€ .Net ํ”Œ๋žซํผ์˜ ์ผ๋ถ€์ด์ง€์š”.

.Net Framework์˜ ๊ตฌ์กฐ์—๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Common Language Runtime(CLR)๊ณผ .Net Framework Class Library์ž…๋‹ˆ๋‹ค. 

Common Language Runtime(CLR): ์‹คํ–‰์ค‘์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹คํ–‰ ์—”์ง„์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage collection), ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Class Library: ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด, ๋‚ ์งœ, ์ˆซ์ž ๋“ฑ์˜ ์œ ํ˜• ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ํŒŒ์ผ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋“œ๋กœ์ž‰ ๋“ฑ์„ ์œ„ํ•œ API๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

.Net ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ C#, F# ๋˜๋Š” Visual Basic ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์–ธ์–ด์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” Common Intermediate Language(CIL)๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” .dll ๋˜๋Š” .exe ํŒŒ์ผ ํ™•์žฅ๋ช…์„ ๊ฐ€์ง„ ์–ด์…ˆ๋ธ”๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ CLR์€ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์„œ just-in-time(JIT) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ์ปดํ“จํ„ฐ์˜ ํŠน์ • ์•„ํ‚คํ…์ฒ˜์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

.Net Framework ์•„ํ‚คํ…์ณ

ILSpy & dotPeek๋กœ ์†Œ์Šค ์ฝ”๋“œ ๋ณด๊ธฐ

๊ฐ„๋‹จํ•˜๊ฒŒ C# ์ƒ˜ํ”Œ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•œ ํ›„ ILSpy ๋ฐ dotPeek๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—ด์–ด๋ณด๋Š” ์ž‘์—…์„ ๋ณด์—ฌ๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฒ„ํŠผ์ด ์žˆ๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค ์™ธ์— ๋ณ€์ˆ˜ ๋ช‡ ๊ฐœ๋„ ์ถ”๊ฐ€ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Exam_ILSpy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("ILSpy Test Sample Code");
            int a = 5, b = 10;
            int sum = a + b;
        }
    }
}

Release ๋ชจ๋“œ๋กœ ๋นŒ๋“œํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ILSpy ๋ฐ dotPeek์—์„œ ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์ •๋ง๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ exe ํŒŒ์ผ์„ ๊ฐ ํˆด์— drag & dropํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.

ILSpy๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค ์ฝ”๋“œ๋Š” ๋ณด์ด์ง€๋งŒ, ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ๋Š” ์ผ๋ถ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ๋ณด์ด์ง€๋Š” ์•Š๋Š”๊ตฐ์š”.

ILSpy ๊ฒฐ๊ณผ ํ™”๋ฉด

dotPeek๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

dotPeek ๊ฒฐ๊ณผ ํ™”๋ฉด

ํ˜น์‹œ ์ง€๊ธˆ๊นŒ์ง€ ๊ทธ๋ƒฅ C#์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฆด๋ฆฌ์ฆˆ ํ–ˆ๋‹ค๋ฉด ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด ๋ณด์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฌด๋‹จ์œผ๋กœ ๋œฏ์–ด๋ณด๋Š” ๊ฒƒ์€ ๋ถˆ๋ฒ•์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ, ๋กœ์ปฌ PC์—์„œ ๋ˆ„๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ. ๊ทธ๋ž˜์„œ ์ธํ„ฐ๋„ท์— ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด C# ๊ฐœ๋ฐœ ์‹œ ๋””์ปดํŒŒ์ผ์„ ์–ด๋ ต๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ์ฒ˜์Œ์— ์–ธ๊ธ‰ํ–ˆ๋˜ C++/CLI๋กœ Wrapping ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ถ”ํ›„์—๋Š” Native C++๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ๋ฐœํ•˜๊ณ , C++/CLI๋กœ Wrapper Class๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, C#์—์„œ Wrapper dll์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณผ ์ˆ˜ ์—†๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜

https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet-framework
https://docs.microsoft.com/ko-kr/dotnet/framework/get-started/index#Introducing
https://ko.wikipedia.org/wiki/%EA%B3%B5%ED%86%B5_%EC%96%B8%EC%96%B4_%EB%9F%B0%ED%83%80%EC%9E%84

๋ฐ˜์‘ํ˜•