
sogen โ Updated!
๐ช Windows ๋ฐ Linux ์ฌ์ฉ์ ๊ณต๊ฐ ์๋ฎฌ๋ ์ดํฐ
Sogen์ ์ค์ ์ด์ ์ฒด์ ์์ด Windows ๋ฐ Linux ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ์ํํ๋ ๋ชจ๋ ์์ ์ ๋ณด๊ณ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.
์์ฒ ๊ฐ์ OS API๋ฅผ ์ฌ๊ตฌํํ๋ ๋์ , Sogen์ CPU ๋ฐ ์์คํ ์ฝ ์์ค์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์ค์ ์์คํ DLL์ ์คํํ๋ฏ๋ก ๋์์ด ์ค์ OS์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
๋ชจ๋ ๋ช ๋ น์ด, ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐ API ํธ์ถ์ ํํน, ๊ฒ์ฌ ๋๋ ์ฌ์์ฑํ ์ ์์ผ๋ฉฐ, ์คํ์ ์์ ํ ๊ฒฐ์ ์ ์ด๊ณ , ์๋ฎฌ๋ ์ดํฐ ์ ์ฒด ์ํ๋ฅผ ์ค๋ ์ท์ผ๋ก ์ ์ฅํ๊ณ ๋ณต์ํ ์ ์์ต๋๋ค.
C++๋ก ์์ฑ๋์์ผ๋ฉฐ, ์ ํํ CPU ๋ฐฑ์๋๋ก ๊ตฌ๋๋ฉ๋๋ค:
์ง์ ์ฌ์ฉํด ๋ณด์ธ์: sogen.dev
ย
์ฃผ์ ๊ธฐ๋ฅ
- ์ค์ ์์คํ DLL: ์ฌ๊ตฌํ๋ ์คํ ์ด ์๋ ์ค์ ntdll, kernel32 ๋ฐ user32๋ฅผ ์คํํฉ๋๋ค
- ํํน ๋ฐ ์ฌ์์ฑ: ๋ฉ๋ชจ๋ฆฌ, ๋ช ๋ น์ด, ์์คํ ์ฝ ๋ฐ API ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ ๋ณ๊ฒฝํฉ๋๋ค
- ์ถฉ์คํ Windows ๋ด๋ถ ๊ตฌ์กฐ: PE ๋ก๋ฉ(์ฌ๋ฐฐ์น, TLS), Windows ๋ฉ๋ชจ๋ฆฌ ์ ํ, SEH, ์ค๋ ๋ฉ, ๋ ์ง์คํธ๋ฆฌ, ํ์ผ ์์คํ ๋ฐ ๋คํธ์ํน
- ์ค๋ ์ท ๋ฐ ๋ณต์: ์ ์ฒด ์ํ ์ง๋ ฌํ, ๋น ๋ฅธ ์ธ๋ฉ๋ชจ๋ฆฌ ์ค๋ ์ท ๋ฐ ๋ฏธ๋๋คํ ๋ก๋ฉ
- ์ด๋์๋ ์คํ: Windows, Linux, macOS, Android, iOS ๋ฐ ๋ธ๋ผ์ฐ์ ์์ x86-64 ๋ฐ arm64 ์ง์
- ๊ฒฐ์ ์ ์คํ: ๋ชจ๋ ์คํ์ด ๋ช
๋ น์ด ์์ค๊น์ง ์ฌํ ๊ฐ๋ฅ
ย
๋ฏธ๋ฆฌ๋ณด๊ธฐ
ํ์ง ๋ถ๊ฐ๋ฅํ ๋๋ฒ๊น
IDA Pro ๋๋ GDB์ ๊ฐ์ด ์ด๋ฏธ ์๊ณ ์๋ ๋๊ตฌ๋ฅผ GDB ํ๋กํ ์ฝ์ ํตํด ๋๋ฒ๊น
ํ๊ฑฐ๋, ๋ด์ฅ๋ ๋ธ๋ผ์ฐ์ ๋ด ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ธ์.
๋๋ฒ๊ฑฐ๋ ํ๋ก์ธ์ค ์ธ๋ถ์ ์๋ฎฌ๋ ์ดํฐ ์์ค์์ ์คํ๋๋ฏ๋ก ์ํฐ๋๋ฒ๊น
๊ฒ์ฌ์ ๋
ธ์ถ๋์ง ์์ต๋๋ค.
ย
์๋๋ฐ์ค์์ ๊ฒ์ ์คํ
๋ค์ดํฐ๋ธ GUI ์ฑ์ด ์ฐฝ, ๋ํ ์์ ๋ฐ ์ปจํธ๋กค๊ณผ ํจ๊ป ์ ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
GPU ๋ฐ๊ฐ์ํ๋ฅผ ํตํด ์ค์ GPU์์ 3D ๊ฐ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, Hyper-V ๋ฐฑ์๋๋ CPU์์ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์คํํฉ๋๋ค. ๊ฒ์์ ์คํํ๊ธฐ์ ์ถฉ๋ถํ ๋น ๋ฆ
๋๋ค.
Direct3D 8/9/10/11 ํ์ดํ์ DXVK๋ฅผ ํตํด ์คํ๋๋ฉฐ, GPU ๋ธ๋ฆฌ์ง ์์์ Direct3D๋ฅผ Vulkan์ผ๋ก ๋ณํํฉ๋๋ค.
ย
ํ๋ก์ ํธ ๊ฐ์
์ฌ๋ผ์ด๋๋ ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ธ์.
ย
Python ๋ฐ์ธ๋ฉ
์ค์น ๋ฐฉ๋ฒ:
pip install sogen
Python ๋ฐ์ธ๋ฉ์๋ ์๋ฎฌ๋ ์ด์ ๋ฃจํธ๊ฐ ํ์ํฉ๋๋ค. ์ค๋น๋ ๋ฃจํธ๋ ์ฌ๊ธฐ์์ ๋ค์ด๋ก๋ํ๊ฑฐ๋, ์ํค์ ์ง์นจ์ ๋ฐ๋ผ ์ง์ ๋ง๋ค ์ ์์ต๋๋ค.
์์:
import sogen
emu = sogen.windows.create_application("c:/test-sample.exe", emulation_root="./root")
def on_module_load(module):
if module.name.lower() == "test-sample.exe":
emu.hooks.memory_execution_at(module.entry_point, lambda address: print(f"hit entry point: 0x{address:x}"))
emu.callbacks.on_module_load = on_module_load
emu.start()
print(emu.process.exit_status)
์ค์ ์ธ๋ถ ์ฌํญ๊ณผ ๋ ํฐ ์์๋ examples/python/README.md๋ฅผ ์ฐธ์กฐํ์ธ์.
ย
๋น๊ณต์ ๋ฐ์ธ๋ฉ
Dart ๋ฐ์ธ๋ฉ์ ๋ณ๋ ์ ์ฅ์์์ ์ ๊ณต๋ฉ๋๋ค.
ย
๋น ๋ฅธ ์์ (Windows + Visual Studio)
[!TIP]
Windows, Linux, macOS ๋ฑ์์ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋น๋ํ๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ Wiki๋ฅผ ํ์ธํ์ธ์.
1. ์ฝ๋๋ฅผ ์ฒดํฌ์์ํฉ๋๋ค:
git clone --recurse-submodules https://github.com/momo5502/sogen.git
2. ๋ณต์ ๋ ๋๋ ํฐ๋ฆฌ์ x64 ๊ฐ๋ฐ ๋ช ๋ น ํ๋กฌํํธ์์ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค:
cmake --preset=vs2022
3. build/vs2022/sogen.sln์ ์์ฑ๋ ์๋ฃจ์
์ ๋น๋ํฉ๋๋ค
4. grab-registry.bat์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํํ์ฌ ๋ ์ง์คํธ๋ฆฌ ๋คํ๋ฅผ ์์ฑํ๊ณ , analyzer.exe ์์ artifacts ํด๋์ ๋ฐฐ์นํฉ๋๋ค
5. ์ํ๋ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค:
analyzer.exe C:\example.exe
