Study/study

๋งํฌ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ํŠน์ง•

์œค์ •_ 2024. 11. 7. 17:03

์‹คํ–‰ ํŒŒ์ผ์„ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ถ„์„ํ•  ๋•Œ ๋งํฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฝ”๋“œ์— ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋งํฌ(Link)

  • ์—ฌ๋Ÿฌ ๊ฐ์ฒด ํŒŒ์ผ(object file)์„ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ์ž‘์—…
  • ์ด ๊ณผ์ •์—์„œ ์‹คํ–‰๋  ์ฃผ์†Œ ์œ„์น˜, ์—ฐ๊ฒฐํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

๋งํฌ ๋ฐฉ์‹

1. ์ •์  ๋งํฌ(Static Link)

  • ์ปดํŒŒ์ผํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‹คํ–‰ ํŒŒ์ผ์— ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
  • ์‹คํ–‰ ํŒŒ์ผ๋งŒ ๋ฐฐํฌํ•˜๋ฉด ์‹œ์Šคํ…œ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ด ์—†์–ด๋„ ๋™์ž‘ํ•œ๋‹ค.
  • ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ์— ํฌํ•จ๋˜๋ฏ€๋กœ ์‹คํ–‰ ์‹œ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ์ ๊ณ  ์„ฑ๋Šฅ์ƒ ํšจ์œจ์ ์ด์ง€๋งŒ, ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•œ๋‹ค.

 

2. ๋™์  ๋งํฌ(Dynamic Link)

  • ์ปดํŒŒ์ผํ•  ๋•Œ ๊ฐ์ฒด ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ์‹ฌ๋ณผ(symbol)๋งŒ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์‹คํ–‰ ์‹œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ(ex. DLL)์„ ์ฐพ์•„์„œ ํ”„๋กœ๊ทธ๋žจ์— ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ๋งํฌํ•œ๋‹ค.
  • ์‹คํ–‰ ํŒŒ์ผ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ์œ„์น˜๋ฅผ ๋ชจ๋ฅด์ง€๋งŒ ์‹คํ–‰ ์ค‘์— ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋œ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ํŒŒ์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง„๋‹ค.
  • ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์—ฌ ํšจ์œจ์ ์ด๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์‹คํ–‰ ํŒŒ์ผ ์™ธ์—๋„ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋ฐฐํฌํ•ด์•ผํ•˜์—ฌ ๋ฐฐํฌ๊ฐ€ ๋ณต์žกํ•˜๋‹ค.
  • ์‹คํ–‰ ์ค‘์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ฒ„์ „์ด ๋งž์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งํฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋„ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํฌ๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ํฌํ•จ ์—ฌ๋ถ€์™€ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘ ๋ฐฉ์‹ 2๊ฐ€์ง€ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งํฌ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์ฐจ์ด

1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ํฌํ•จ ์—ฌ๋ถ€

  • ์ •์  ๋งํฌ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ํŒŒ์ผ์— ํฌํ•จ๋œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด OpenSSL์„ ์ •์  ๋งํฌํ•˜๋ฉด, libssl.lib, libcrypto.lib์— ์žˆ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์ด ์‹คํ–‰ ํŒŒ์ผ ๋‚ด์— ํฌํ•จ๋œ๋‹ค.
  • ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ์—์„œ ์ด ํ•จ์ˆ˜๋“ค์„ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ DLL์„ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ๋””์Šค์–ด์…ˆ๋ธ”๋œ ์ฝ”๋“œ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฆ„์ด ํ‘œ์‹œ๋˜๊ณ  ์ง์ ‘ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.
    ex) ์ •์  ๋งํฌ๋œ OpenSSL ํ•จ์ˆ˜ ์˜ˆ์‹œ: AES_encrypt
    call AES_encrypt

 

2. ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘ ๋ฐฉ์‹

  • ๋™์  ๋งํฌ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์— ๋™์ ์œผ๋กœ ๋กœ๋“œ๋œ๋‹ค.
  • ์‹คํ–‰ ํŒŒ์ผ์—๋Š” ํ•จ์ˆ˜๋“ค์˜ ์‹ฌ๋ณผ ์ •๋ณด๋งŒ ํฌํ•จ๋˜๊ณ  ์‹ค์ œ ๊ตฌํ˜„์€ DLL์— ์กด์žฌํ•œ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์ค‘์— ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋กœ๋“œํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด OpenSSL์„ ๋™์  ๋งํดํ•˜๋ฉด, ์‹คํ–‰ ์ค‘์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ libssl.dll, libcrypto.dll์—์„œ ๋กœ๋“œํ•œ๋‹ค.
  • ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋งŒ ์กด์žฌํ•œ๋‹ค.
    ex) ๋™์  ๋งํฌ๋œ OpenSSL ํ•จ์ˆ˜ ์˜ˆ์‹œ: AES_encrypt
    mov eax, [Address_of_AES_encrypt]
    call eax

 

 

 

Visual Studio๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผํ•  ๋•Œ ๊ธฐ๋ณธ ์„ค์ •์€ ๋™์  ๋งํฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋™์ ์œผ๋กœ ๋งํฌ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๊ด€๋ จ DLL ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

OpenSSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ API๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด, ๊ทธ์™€ ๊ด€๋ จ๋œ libcrypto-3-x64.dll์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

DLL ๋ถ€์žฌ๋กœ ์‹คํ–‰ ๋ถˆ๊ฐ€ (๋™์  ๋งํฌ๋œ ํ”„๋กœ๊ทธ๋žจ)

 

 

์ปดํŒŒ์ผ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜จ ๊น€์— ์ปดํŒŒ์ผ/๋งํฌ/๋นŒ๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…๋„ ์กฐ๊ธˆ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด!

 

์ปดํŒŒ์ผ(Complie)

  • ์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ์„ ๊ฐ์ฒด ํŒŒ์ผ(object file)๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •
  • ๊ณ ๊ธ‰์–ธ์–ด(C/C++ ๋“ฑ)์—์„œ ์ €๊ธ‰์–ธ์–ด(๊ธฐ๊ณ„์–ด, ์–ด์…ˆ๋ธ”๋ฆฌ์–ด)๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
    • ๊ณ ๊ธ‰์–ธ์–ด๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ์ฒด ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

๋งํฌ(Link)

  • ์—ฌ๋Ÿฌ ๊ฐ์ฒด ํŒŒ์ผ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •
  • ์ด๋•Œ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จ์‹œํ‚จ๋‹ค.

๋นŒ๋“œ(Build)

  • ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ๋ฐ ๋งํฌํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์ „์ฒด ๊ณผ์ •์„ ์˜๋ฏธ
  • ์ปดํŒŒ์ผ๊ณผ ๋งํฌ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์ž‘์—…์„ ๋นŒ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.