Study/study

COM(Component Object Model)์˜ ๊ฐœ๋…

์œค์ •_ 2025. 4. 21. 13:41

์˜ค๋Š˜์€ COM(Component Object Model) ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

โ—‹ COM(Component Object Model) ๊ฐœ๋…

Microsoft์—์„œ ๊ฐœ๋ฐœํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„, RPC, ๋ถ„์‚ฐ ๊ฐ์ฒด์™€ ๊ฐ™์€ ๋ถ„์‚ฐ ์ปดํ“จํŒ… ๋ชจ๋ธ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์–ธ์–ด๋กœ๋“  COM ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๊ธฐ๋Šฅ์„ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

โ—‹ COM ๊ตฌ์กฐ์˜ ํ•ต์‹ฌ ์š”์†Œ

  • COM ๊ฐ์ฒด
    • ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ์ธ์Šคํ„ด์Šค(instance)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    • ์ตœ์†Œํ•œ IUnknown ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
      • IUnknown์€ ๋ชจ๋“  COM ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ COM์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. 
      • IUnknown์€ ์ตœ์†Œํ•œ QueryInterface ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•ด์ฃผ๋ฉฐ, QueryInterface ๋ฉ”์„œ๋“œ๋Š” ์„œ๋น„์Šค ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์š”์ฒญ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

    • COM ๊ฐ์ฒด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜๋“ค์„ ๋ฌถ์–ด๋†“์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐ์ฒด ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ๋ชฐ๋ผ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    • COM ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ(lifetime)๋Š” IUnknown::AddRef์™€ IUnknown::Release ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์ฐธ์กฐ ์นด์šดํŠธ(reference count)๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

  • COM ํด๋ž˜์Šค
    • COM ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„ค๊ณ„๋„์ž…๋‹ˆ๋‹ค.

    • ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ COM ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    • COM ํด๋ž˜์Šค๋Š” ์šด์˜์ฒด์ œ์— ๋“ฑ๋ก๋˜๊ณ  ๊ณ ์œ ํ•œ GUID๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น GUID๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      • HKLM\Software\Classes\CLSID
      • HKCU\Software\Classes\CLSID

 

  • COM ์ธํ„ฐํŽ˜์ด์Šค
    • COM ๊ฐ์ฒด๊ฐ€ ์™ธ๋ถ€์— ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ(ํ•จ์ˆ˜)์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

    • COM ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋“ค์˜ ํ…Œ์ด๋ธ”(VTable)์ž…๋‹ˆ๋‹ค.

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ COM ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํ†ต๋กœ์ž…๋‹ˆ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๋Š” COM ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์„œ๋น„์Šค ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ⇒ ์บก์Аํ™”(encapsulation)

    • COM์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ ๊ฐœ๋…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ ‘๊ทผ ์ œ์–ด์™€ ๊ฐ€์žฅ ๊ฐ™์€ ๋ณด์•ˆ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

      • ์ƒ์†(inheritance)๊ณผ ๋‹คํ˜•์„ฑ(polymorphism)
        • ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๊ณ (inheritance), ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋™์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(polymorphism).
        • ์ด๋ฅผ ํ†ตํ•ด C++๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

      • ์ ‘๊ทผ ์ œ์–ด์™€ ๊ฐ€์žฅ(impersonation)
        • ๋ˆ„๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ์ œํ•œํ•˜๊ฑฐ๋‚˜(access control), ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์ฒ˜๋Ÿผ ํ–‰๋™ํ•ด์„œ ๊ถŒํ•œ์„ ์œ„์ž„๋ฐ›๋Š” ๊ฐ€์žฅ(impersonation)๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

  • COM ์ปดํฌ๋„ŒํŠธ 
    • ํ•˜๋‚˜ ์ด์ƒ์˜ COM ํด๋ž˜์Šค์™€ ๊ทธ ๊ตฌํ˜„(๊ฐ์ฒด, ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

    • ์„œ๋ฒ„๊ฐ€ ๋…๋ฆฝ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๊ตฌํ˜„๋œ EXE ํŒŒ์ผ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ ๋กœ๋“œ๋˜์–ด ์‹คํ–‰๋˜๋Š” DLL ํŒŒ์ผ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

โ—‹ COM ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํ†ต์‹ 

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก์‹œ(proxy)์™€ ์Šคํ…(stub) ๊ฐ์ฒด ์Œ์„ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

  • ํ”„๋ก์‹œ
    • ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ€์งœ ๊ฐ์ฒด
    • ์›๊ฒฉ ์„œ๋ฒ„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ์—ญํ• 

  • ์Šคํ…
    • ์„œ๋ฒ„ ์ชฝ์—์„œ ์‹คํ–‰
    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฆฌ์Šค๋„ˆ(listener) ์—ญํ• 

 

ํ”„๋ก์‹œ๊ฐ€ ํ˜ธ์ถœ์„ ํฌ์žฅํ•˜์—ฌ ์Šคํ…์—๊ฒŒ ๋ณด๋‚ด๋ฉด, ์Šคํ…์€ ๊ทธ๊ฑธ ๋ฐ›์•„ ์ง„์งœ ์„œ๋ฒ„ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ค‘๊ณ„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

COM์˜ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์›๊ฒฉ ํ†ต์‹ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ → ์ธํ„ฐํŽ˜์ด์Šค → ๋กœ์ปฌ ํ”„๋ก์‹œ → ์›๊ฒฉ ์Šคํ… → ์ธํ„ฐํŽ˜์ด์Šค → ์›๊ฒฉ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

 

 

 

โ—‹ COM ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ

COM ๊ฐ์ œ ์ผ๋ถ€ (Ref. "Malware Analysis Series(MAS) – Article 5", Alexandre Borges)

 

  • vtbl
    • ๊ฐ€์ƒ ํ…Œ์ด๋ธ” (ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ํ…Œ์ด๋ธ”)
    •  vtbl๋Š” ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • vptr
    • vtbl์— ๋Œ€ํ•œ ๊ฐ€์ƒ ํ…Œ์ด๋ธ” ํฌ์ธํ„ฐ
    • ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šคํ™”๋œ ๊ฐ์ฒด๋Š” ์ž์ฒด์ ์ธ vptr์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • IUnknown ์ธํ„ฐํŽ˜์ด์Šค
    • IUnknown์€ ๋ชจ๋“  COM ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ถ€๋ชจ์ž…๋‹ˆ๋‹ค.
    • IUnknown::QueryInterface ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋™์ ์œผ๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค.
    • IUnknown::AddRef์™€ IUnknown::Release ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ˆ˜๋ช…(lifetime) ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

โ—‹ Class Factory (COM Factory)

ํด๋ž˜์Šค ํŒฉํ† ๋ฆฌ๋Š” ํŠน๋ณ„ํ•œ COM ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ํŠน์ • COM ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ COM ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€์ ์ธ ํŒฉํ† ๋ฆฌ๋Š” IClassFactory๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ‘œํ˜„๋˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“  COM ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ IUnknown์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค(inheritance). COM ๊ฐ์ฒด ์ƒ์„ฑ ์š”์ฒญ์ด IClassFactory์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉด CreateInstance ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

Class Factory์™€ COM ๊ฐ์ฒด๋Š” DLL์ด๋‚˜ EXE ํŒŒ์ผ์— ๋‹ด๊ฒจ ํŒจํ‚น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • EXE์ธ ๊ฒฝ์šฐ
    • ํด๋ผ์ด์–ธํŠธ์™€๋Š” ๋‹ค๋ฅธ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค๋‚˜ ๋กœ์ปฌ/์›๊ฒฉ ์„œ๋ฒ„๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • EXE๋กœ ๋œ COM ํด๋ž˜์Šค๋Š” CoRegisterClassObject ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • out-of-process server์ž…๋‹ˆ๋‹ค.
      • out-of-process server
        • ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๋Š” COM ์„œ๋ฒ„ 
        • EXE๋กœ ๋œ COM ์„œ๋ฒ„(out-of-process server)๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— COM ๋Ÿฐํƒ€์ž„์ด IPC๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์„ ์ค‘๊ฐœ
        • IPC๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋А๋ฆฐ ํŽธ

 

  • DLL์ธ ๊ฒฝ์šฐ
    • in-process server์ด๊ณ , ๋ณดํ†ต ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์ง์ ‘ ๋กœ๋“œ๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

      • in-process server
        • ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” COM ์„œ๋ฒ„
        • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ COM DLL์„ ๋กœ๋“œํ•ด์„œ ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ
        • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„๋ฅผ ๋กœ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅธ ํŽธ

 

 

 

โ—‹ COM ํ™˜๊ฒฝ์—์„œ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•

COM ํ™˜๊ฒฝ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ •์  ํ˜ธ์ถœ(Static Invocation)
    • ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฉ”์„œ๋“œ(๋ฐ ์‹œ๊ทธ๋‹ˆ์ฒ˜)๊ฐ€ ์ •ํ•ด์ง„ ์ƒํƒœ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” vtbl(๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”)์„ ํ†ตํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค: interface pointer → vptr → vtbl

 

  • ๋™์  ํ˜ธ์ถœ(Dynamic Invocation)
    • ํƒ€์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(from ์ธํ„ฐํŽ˜์ด์Šค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(repository))์™€ ๋””์ŠคํŒจ์น˜ ์ธํ„ฐํŽ˜์ด์Šค IDispatch๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
      • IDispatch: COM์—์„œ ๋™์  ํ˜ธ์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํŠน๋ณ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
      • ๋””์ŠคํŒจ์น˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๋””์ŠคํŒจ์น˜ ์‹๋ณ„์ž dispid๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

    • ๋ ˆ์ดํŠธ ๋ฐ”์ธ๋”ฉ(late binding)์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

    • IDispatch ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด dispid์— ๋Œ€ํ•œ ์กฐํšŒ ์ž‘์—…(lookup)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

โ—‹ COM ํด๋ผ์ด์–ธํŠธ ์ž‘์„ฑ์„ ์œ„ํ•œ COM API

COM ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ COM API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • CoInitialize()/CoInitializeEx()
    • COM ํ™˜๊ฒฝ ์ดˆ๊ธฐํ™”

  • CoCreateInstance()
    • COM ๊ฐ์ฒด ์ดˆ๊ธฐํ™”

  • CoUninitialize()
    • COM ํ™˜๊ฒฝ ํ•ด์ œ (์ •๋ฆฌ)

 

 

- CoCreateInstance ํ•จ์ˆ˜

CoCreateInstance()๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ CoGetClassObject()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ IClassFactory::CreateInstance๋ฅผ ํ†ตํ•ด ์š”์ฒญ๋œ COM ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค ํŒฉํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. CoGetClassObject()๋Š” ์ฃผ์–ด์ง„ ํด๋ž˜์Šค ๊ฐ์ฒด์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

CoCreateInstance ํ•จ์ˆ˜์˜ ๊ตฌ์กฐ

 

CoCreateInstance์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • rclsid
    • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋  ๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ์— ๊ด€๋ จ๋œ CLSID์ž…๋‹ˆ๋‹ค.

  • pUnkOuter
    • ์ง‘ํ•ฉ ๊ฐ์ฒด(aggregation) ๊ตฌ์กฐ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค.
    • NULL์ธ ๊ฒฝ์šฐ, ๊ฐ์ฒด๊ฐ€ ์ง‘ํ•ฉ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • NULL์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ์ง‘ํ•ฉ ๊ฐ์ฒด์˜ IUnknown ์ธํ„ฐํŽ˜์ด์Šค(controlling IUnknown)์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค.
      • controlling IUnknown
        • Aggregation ๊ด€๊ณ„์—์„œ, ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ์œ ์ผํ•œ IUnknown ์ธํ„ฐํŽ˜์ด์Šค
        • ์ฆ‰, ์™ธ๋ถ€ ๊ฐ์ฒด์˜ IUnknown์„ ๋งํ•˜๊ณ ,๋‚ด๋ถ€ ๊ฐ์ฒด๋“ค์€ ์ด IUnknown์„ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ๋จ

  • dwClsContext: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

  • riid: ๊ฐ์ฒด์™€ ํ†ต์‹ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค.

  • ppv: riid์—์„œ ์š”์ฒญ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฆ‰ rclsid, riid, ppv์— ์ฃผ๋กœ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. clsid์™€ riid๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ GUID(128๋น„ํŠธ 16์ง„์ˆ˜)๋กœ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค. ์ด GUID๋Š” ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๋ฉฐ ์ด๋ฆ„ ์ถฉ๋Œ(collision)์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ค‘์š”ํ•œ ์ธก๋ฉด ์ค‘ ํ•˜๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋ถˆ๋ณ€ํ•˜๋‹ค๋Š” ์ ์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

 

 

 

Ref. "Malware Analysis Series(MAS) – Article 5", Alexandre Borges