API Basic Declare ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Declare / Lib / Alias

ClassicUO โ€ข Basic

Declare๋Š” Basic ํ”„๋กœ์‹œ์ € ์ด๋ฆ„์„ ๋„ค์ดํ‹ฐ๋ธŒ Windows x64 DLL์˜ ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฒ”์œ„๋Š” ์‹คํ–‰ ์ค‘ ์ฝ”๋“œ ์ƒ์„ฑ ์—†์ด ์ปดํŒŒ์ผ๋œ ํด๋ผ์ด์–ธํŠธ์—์„œ๋„ ๋™์ž‘ํ•˜๋ฉฐ, VB.NET ์ƒํ˜ธ ์šด์šฉ ์ „์ฒด๋ฅผ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ๊ตฌ๋ฌธ

[Public | Private] Declare [Ansi | Unicode | Auto] Function name Lib "library.dll" [Alias "export"]([ByVal arg As Type, ...]) As ResultType
[Public | Private] Declare [Ansi | Unicode | Auto] Sub name Lib "library.dll" [Alias "export"]([ByVal arg As Type, ...])
name(arguments)
name(argumentName:=value)
ModuleName.name(arguments)

๋งค๊ฐœ๋ณ€์ˆ˜

  • name / Public / Private โ€” ๋กœ์ปฌ ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  UO. ์—†์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋˜๋Š” Module ์ˆ˜์ค€์— ์„ ์–ธํ•˜๋ฉฐ ๋ณธ๋ฌธ๊ณผ End Function/End Sub๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Public, Module ์•ˆ์—์„œ๋Š” Private์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Basic/UO ์ด๋ฆ„์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„๊ณผ Alias๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Lib / library.dll โ€” ํ•„์ˆ˜ .dll ์ด๋ฆ„ ๋˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœ ์‹œ์Šคํ…œ ์ด๋ฆ„์€ System32์—์„œ ๋จผ์ € ์ฐพ๊ณ , ๋‹ค๋ฅธ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” Include๋ฅผ ํฌํ•จํ•ด ์„ ์–ธ ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ž‘์—… ํด๋”๋‚˜ PATH๋Š” ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข…์† DLL์€ ํ•ด๋‹น DLL ์˜†์ด๋‚˜ System32์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Alias / export โ€” ์„ ํƒ์ ์ธ ์ •ํ™•ํ•œ ๋‚ด๋ณด๋‚ด๊ธฐ ์ด๋ฆ„์œผ๋กœ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด ๋‹จ์ˆœ ๋กœ์ปฌ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆœ๋ฒˆ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ์–ธ๊ณผ ์ •ํ™•ํžˆ ๋งž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ Windows x64 ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๊ด€๋ฆฌํ˜• .NET ๋ฉ”์„œ๋“œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
  • Ansi / Unicode / Auto โ€” ๊ธฐ๋ณธ Ansi๋Š” Windows ANSI๋กœ ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•ด ํ‘œํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Unicode๋Š” UTF-16์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ์ •ํ™•ํ•œ ์ด๋ฆ„์„ ์ฐพ์Šต๋‹ˆ๋‹ค. Auto๋Š” UTF-16์œผ๋กœ ์ •ํ™•ํ•œ ์ด๋ฆ„๋ถ€ํ„ฐ ์ฐพ๊ณ  ์ด์–ด W๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ•จ์ˆ˜ ์ธ์ฝ”๋”ฉ์„ ์•Œ์•„๋‚ด์ง€๋Š” ๋ชปํ•˜๋ฏ€๋กœ Unicode API๋Š” Unicode์™€ ๋ช…์‹œ์ ์ธ W ์ด๋ฆ„์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ByVal arg As Type โ€” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 0~4๊ฐœ๋กœ ๊ฐ ํ•ญ๋ชฉ์— ByVal๊ณผ As Integer, Double, Boolean ๋˜๋Š” String์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Integer๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š”32๋น„ํŠธ, Double์€64๋น„ํŠธ, Boolean์€32๋น„ํŠธ Windows BOOL์ด๋ฉฐ C/C++ bool์ด ์•„๋‹™๋‹ˆ๋‹ค. String์€ ์ฝ๊ธฐ ์ „์šฉ ์ž„์‹œ NUL ์ข…๋ฃŒ ์ž…๋ ฅ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์ตœ๋Œ€1048576 UTF-16๋‹จ์œ„์ด๋ฉฐ ๋‚ด๋ถ€NUL์€ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. DLL์€ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฒ„ํผ์— ์“ฐ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ๋กœ์ปฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ByRef, Optional, ParamArray, ๋ฐฐ์—ด, ๊ตฌ์กฐ์ฒด, ํฌ์ธํ„ฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • As ResultType / Sub โ€” Function์€ As Integer, Double ๋˜๋Š” Boolean์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. Sub๋Š” As ์—†์ด Unit์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Integer/Boolean ์ธ์ˆ˜๋Š” Integer ๊ฐ’์ด์–ด์•ผ ํ•˜๋ฉฐ Double์€ Integer๋„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋ฉด CInt/CDbl/CStr๋กœ ๋ช…์‹œ ๋ณ€ํ™˜ํ•˜์„ธ์š”. ๋ฌธ์ž์—ด, ํฌ์ธํ„ฐ,64๋น„ํŠธ ์ •์ˆ˜ ๋ฐ˜ํ™˜์€ ์ง€์›๋˜๋Š” ์„œ๋ช…์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ž˜ํผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

Integer๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๊ฐ€ ์˜๋ฏธ๋ฅผ ์ •ํ•˜๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š”32๋น„ํŠธ ์ˆซ์ž๋กœ, ๋ฐ˜๋“œ์‹œ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Double์€64๋น„ํŠธ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. As Boolean์€0์„0/False, ๋‹ค๋ฅธBOOL์„1/True๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ์—์„œ๋Š”1/0๊ณผTrue/False ๋น„๊ต๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Sub๋Š” ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(Unit). ์˜ˆ์ œ ๊ฒฐ๊ณผ๋Š”1, "3:8", "missing export:1"์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„ ์–ธ์€ ์‹คํ–‰ ์ „์— SC031๋กœ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์Šคํฌ๋ฆฝํŠธ๋‹น ์„ ์–ธ256๊ฐœ, ๋กœ๋“œ๋œ DLL64๊ฐœ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๋ถ„์„๊ณผIDE์™„์„ฑ์€DLL์„ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋„ค์ดํ‹ฐ๋ธŒ ์„œ๋ช…์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ž˜๋ชป ์„ ์–ธํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒซ ํ˜ธ์ถœ์€DLL์„ ๋กœ๋“œํ•˜๊ณ  ์ดํ›„์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ฃผ์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์ž‘์„ฑ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ ํ‰๊ฐ€ํ•œ ๋’ค ์ด๋ฆ„์— ๋งž๊ฒŒ ์žฌ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ, ์•„ํ‚คํ…์ฒ˜, ๋‚ด๋ณด๋‚ด๊ธฐ, ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋Š”Try/Catch๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์œ„๋ฐ˜์€ ์ผ๋ฐ˜์ ์ธ ๋ณต๊ตฌ ๊ฐ€๋Šฅ ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋ฅผ ํฌํ•จํ•ด ํ˜ธ์ถœ์ด ๋๋‚˜๋ฉด ์ž„์‹œ ๋ฌธ์ž์—ด์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์Šคํฌ๋ฆฝํŠธ ์™„๋ฃŒยท์‹คํŒจยท์ทจ์†Œ ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. IDE๋งŒ ๋‹ซ์œผ๋ฉด ์‹คํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ์™€DLL์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฝํŠธ ์›Œ์ปค์—์„œ ๋™๊ธฐ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ •์ง€์™€ ์ค‘์ง€๋Š” ํ˜ธ์ถœ ์ „ํ›„์— ๊ฒ€์‚ฌํ•˜๋ฉฐ, ๋Œ์•„์˜ค์ง€ ์•Š๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๋ฅผ ์—”์ง„์ด ์ค‘๋‹จํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์งง์€ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆด ๋•Œ๋Š”Basic Wait๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ด€๋ฆฌํ˜• DLL, Basic ์ฝœ๋ฐฑ, ๊ฐ€๋ณ€ ์ธ์ˆ˜ ๋‚ด๋ณด๋‚ด๊ธฐ, ์ž„์˜ ํฌ์ธํ„ฐAPI๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

1. ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์„ธ์ŠคID

# ClientProcessId๋Š”kernel32.dll์˜GetCurrentProcessId๋ฅผ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Main์€ Windows ์ˆซ์žID๋ฅผprocessId์— ์ €์žฅํ•˜๊ณ  processId > 0 ๋น„๊ต๋กœ1/True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ID ์ž์ฒด๋Š”Boolean์ด๋‚˜UO์‹œ๋ฆฌ์–ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
Option Explicit On
Declare Function ClientProcessId Lib "kernel32.dll" Alias "GetCurrentProcessId"() As Integer

Sub Main()
    Dim processId = ClientProcessId()
    Return processId > 0
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

ClientProcessId๋Š”kernel32.dll์˜GetCurrentProcessId๋ฅผ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Main์€ Windows ์ˆซ์žID๋ฅผprocessId์— ์ €์žฅํ•˜๊ณ  processId > 0 ๋น„๊ต๋กœ1/True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ID ์ž์ฒด๋Š”Boolean์ด๋‚˜UO์‹œ๋ฆฌ์–ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

2. ๋ฌธ์ž์—ด, ๊ฑฐ๋“ญ์ œ๊ณฑ, ์ด๋ฆ„ ์ธ์ˆ˜

# TextLength(text)๋Š”UTF-16์„lstrlenW์— ์ „๋‹ฌํ•ด ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Power(value, exponent)๋Š”๋‘Double๋กœpow๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Describe("ore", 2, 3)๋Š”์„ธ์ธ์ˆ˜๋ฅผ ๋ฐ›๊ณ  Power์˜ ์ด๋ฆ„ ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋กœ ์ž‘์„ฑํ•˜์—ฌ"3:8"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ ํ•จ์ˆ˜๋„ ๋ชจ๋‘ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
Option Explicit On
Declare Unicode Function TextLength Lib "kernel32.dll" Alias "lstrlenW"(ByVal text As String) As Integer
Declare Function Power Lib "ucrtbase.dll" Alias "pow"(ByVal value As Double, ByVal exponent As Double) As Double

Function Describe(ByVal text As String, ByVal value As Double, ByVal exponent As Double) As String
    Dim length = TextLength(text:=text)
    Dim powered = Power(exponent:=exponent, value:=value)
    Return CStr(length) & ":" & CStr(powered)
End Function

Sub Main()
    Return Describe("ore", 2, 3)
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

TextLength(text)๋Š”UTF-16์„lstrlenW์— ์ „๋‹ฌํ•ด ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Power(value, exponent)๋Š”๋‘Double๋กœpow๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Describe("ore", 2, 3)๋Š”์„ธ์ธ์ˆ˜๋ฅผ ๋ฐ›๊ณ  Power์˜ ์ด๋ฆ„ ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋กœ ์ž‘์„ฑํ•˜์—ฌ"3:8"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ ํ•จ์ˆ˜๋„ ๋ชจ๋‘ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

3. ์—†๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ

# NativeDemo.MissingExport๋Š” ์ผ๋ถ€๋Ÿฌ ์—†๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. TryRead๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์žก์•„ status="missing export", Finally๊ฐ€ finished=1๋กœ ์„ค์ •ํ•˜๊ณ  Main์€ "missing export:1"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Private๋Š” ์„ ์–ธ์„ ๋ชจ๋“ˆ ์•ˆ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์˜ˆ์ด๋ฉฐ ๊ธด๊ธ‰ ์ทจ์†Œ ๋’ค ์Šคํฌ๋ฆฝํŠธ ์ •๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์•„๋‹™๋‹ˆ๋‹ค.
Option Explicit On
Module NativeDemo
    Private Declare Function MissingExport Lib "kernel32.dll" Alias "BasicManualMissingExport_71cf"() As Integer
    Public Function TryRead() As String
        Dim status = "unexpected export"
        Dim finished = 0
        Try
            MissingExport()
        Catch problem
            status = "missing export"
        Finally
            finished = 1
        End Try
        Return status & ":" & CStr(finished)
    End Function
End Module

Sub Main()
    Return NativeDemo.TryRead()
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

NativeDemo.MissingExport๋Š” ์ผ๋ถ€๋Ÿฌ ์—†๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. TryRead๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์žก์•„ status="missing export", Finally๊ฐ€ finished=1๋กœ ์„ค์ •ํ•˜๊ณ  Main์€ "missing export:1"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Private๋Š” ์„ ์–ธ์„ ๋ชจ๋“ˆ ์•ˆ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์˜ˆ์ด๋ฉฐ ๊ธด๊ธ‰ ์ทจ์†Œ ๋’ค ์Šคํฌ๋ฆฝํŠธ ์ •๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํ•จ์ˆ˜: ํ˜ธ์ถœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๊นŒ์ง€

Declare๋Š” Basic ํ”„๋กœ์‹œ์ € ์ด๋ฆ„์„ ๋„ค์ดํ‹ฐ๋ธŒ Windows x64 DLL์˜ ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฒ”์œ„๋Š” ์‹คํ–‰ ์ค‘ ์ฝ”๋“œ ์ƒ์„ฑ ์—†์ด ์ปดํŒŒ์ผ๋œ ํด๋ผ์ด์–ธํŠธ์—์„œ๋„ ๋™์ž‘ํ•˜๋ฉฐ, VB.NET ์ƒํ˜ธ ์šด์šฉ ์ „์ฒด๋ฅผ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1. ExternalDeclaration

์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„ ์–ธ์€ ์‹คํ–‰ ์ „์— SC031๋กœ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์Šคํฌ๋ฆฝํŠธ๋‹น ์„ ์–ธ256๊ฐœ, ๋กœ๋“œ๋œ DLL64๊ฐœ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๋ถ„์„๊ณผIDE์™„์„ฑ์€DLL์„ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋„ค์ดํ‹ฐ๋ธŒ ์„œ๋ช…์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ž˜๋ชป ์„ ์–ธํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

source -> typed declaration -> SC031 on unsupported ABI

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ExternalDeclaration.cs; ํ•จ์ˆ˜ ExternalDeclaration.

2. LibraryPath / GetCallable

ํ•„์ˆ˜ .dll ์ด๋ฆ„ ๋˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœ ์‹œ์Šคํ…œ ์ด๋ฆ„์€ System32์—์„œ ๋จผ์ € ์ฐพ๊ณ , ๋‹ค๋ฅธ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” Include๋ฅผ ํฌํ•จํ•ด ์„ ์–ธ ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ž‘์—… ํด๋”๋‚˜ PATH๋Š” ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข…์† DLL์€ ํ•ด๋‹น DLL ์˜†์ด๋‚˜ System32์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

first call -> absolute DLL path -> cached library -> exact export

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ExternalLibraries.cs; ํ•จ์ˆ˜ LibraryPath / GetCallable.

3. Invoke

๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 0~4๊ฐœ๋กœ ๊ฐ ํ•ญ๋ชฉ์— ByVal๊ณผ As Integer, Double, Boolean ๋˜๋Š” String์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Integer๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š”32๋น„ํŠธ, Double์€64๋น„ํŠธ, Boolean์€32๋น„ํŠธ Windows BOOL์ด๋ฉฐ C/C++ bool์ด ์•„๋‹™๋‹ˆ๋‹ค. String์€ ์ฝ๊ธฐ ์ „์šฉ ์ž„์‹œ NUL ์ข…๋ฃŒ ์ž…๋ ฅ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์ตœ๋Œ€1048576 UTF-16๋‹จ์œ„์ด๋ฉฐ ๋‚ด๋ถ€NUL์€ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. DLL์€ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฒ„ํผ์— ์“ฐ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ๋กœ์ปฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ByRef, Optional, ParamArray, ๋ฐฐ์—ด, ๊ตฌ์กฐ์ฒด, ํฌ์ธํ„ฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

evaluate arguments once -> validate kinds -> copy input strings -> select compiled call shape

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ExternalLibraries.cs; ํ•จ์ˆ˜ Invoke.

4. CallInteger / CallDouble / CallVoid

Function์€ As Integer, Double ๋˜๋Š” Boolean์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. Sub๋Š” As ์—†์ด Unit์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Integer/Boolean ์ธ์ˆ˜๋Š” Integer ๊ฐ’์ด์–ด์•ผ ํ•˜๋ฉฐ Double์€ Integer๋„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋ฉด CInt/CDbl/CStr๋กœ ๋ช…์‹œ ๋ณ€ํ™˜ํ•˜์„ธ์š”. ๋ฌธ์ž์—ด, ํฌ์ธํ„ฐ,64๋น„ํŠธ ์ •์ˆ˜ ๋ฐ˜ํ™˜์€ ์ง€์›๋˜๋Š” ์„œ๋ช…์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ž˜ํผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Windows x64 argument slots -> native call -> declared result

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ExternalCallSites.cs; ํ•จ์ˆ˜ CallInteger / CallDouble / CallVoid.

5. Dispose

๋ณ€ํ™˜ ์˜ค๋ฅ˜๋ฅผ ํฌํ•จํ•ด ํ˜ธ์ถœ์ด ๋๋‚˜๋ฉด ์ž„์‹œ ๋ฌธ์ž์—ด์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์Šคํฌ๋ฆฝํŠธ ์™„๋ฃŒยท์‹คํŒจยท์ทจ์†Œ ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. IDE๋งŒ ๋‹ซ์œผ๋ฉด ์‹คํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ์™€DLL์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

finally: free temporary strings; root exit: release DLL handles in reverse order

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ExternalLibraries.cs; ํ•จ์ˆ˜ Dispose.

Integer๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๊ฐ€ ์˜๋ฏธ๋ฅผ ์ •ํ•˜๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š”32๋น„ํŠธ ์ˆซ์ž๋กœ, ๋ฐ˜๋“œ์‹œ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Double์€64๋น„ํŠธ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. As Boolean์€0์„0/False, ๋‹ค๋ฅธBOOL์„1/True๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ์—์„œ๋Š”1/0๊ณผTrue/False ๋น„๊ต๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Sub๋Š” ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(Unit). ์˜ˆ์ œ ๊ฒฐ๊ณผ๋Š”1, "3:8", "missing export:1"์ž…๋‹ˆ๋‹ค.


en ยท ru ยท uk ยท fr ยท de ยท it ยท es ยท zh-tw ยท ja ยท ko

Basic