1. ์ธ์ด ์ ํ ๋ฐ ์ฝ๋ ์์ฑ ๋ฐฉ์
- Win32 API๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ถ์.
- ์์ฑํ ์ฝ๋๋ ๋ชจ๋ main() ํจ์์ ์๋ค.
2. ํ์ผ ๊ฒ์, ๊ด๋ฆฌ ์ฝ๋
2.1 ๋์ ํ์ธ
- ๋์ผ ๊ฒฝ๋ก์ Sample 01.exe๊ฐ ์๋์ง ํ์ธ
- Sample 01.exe ํ์ผ ๋ฐ์ดํฐ๋ฅผ ํ๋
- Sample 01.exe ํ์ผ์ ์ญ์
- "%TEMP%" ๊ฒฝ๋ก๊ฒ Replicated Sample 01.exe๋ผ๋ ์ด๋ฆ์ผ๋ก ์๋ก์ด ํ์ผ์ ์์ฑ
- Replicated Sample 01.exe์ Sample 01.exe ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ก
- Replicated Sample 01.exe๋ฅผ ์คํ
2.2 ์ฝ๋ํ์ต
1. ํ์ผ ๋ณต์ ์ฝ๋ ๊ธฐ๋ณธ ๊ตฌ์ฑ
- ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด์๋ ํ์ผ์ ์ด์ด์ผ ํ๋ ๋ฐ ์ด๋ ํ์ํ API๋ CreateFile()
- CreateFile()์ ํ์ผ์ ์๋ก ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ํ์ผ์ ์ด ์ ์๋ค.
- ์ฒซ ๋ฒ์งธ ์ธ์๋ ์์ฑ ๋๋ ์ด๊ณ ์ ํ๋ ํ์ผ์ ๊ฒฝ๋ก ๊ฐ
- Sample05.exe๋ ํ์ฌ ๊ฒฝ๋ก์ ์์นํ Sample01.exe๋ฅผ ๋ณต์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ %guswo rudfh%\Sample01.exe๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ค.
- ํ์ฌ ๊ฒฝ๋ก๋ Sample05.exe์ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ CreateFile() API๋ฅผ ํธ์ถํ๊ธฐ ์ด์ ์ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์์๋ผ ํ์๊ฐ ์๋ค.
- GetCurrentDirectory() API๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๊ฒฝ๋ก ๊ฐ์ ์ป์ ์ ์๊ณ ์ฌ๊ธฐ์ \Sample01.exe ๋ฌธ์์ด์ ๋ํด์ฃผ๋ฉด ์ ๋ ๊ฒฝ๋ก๊ฐ ์์ฑ๋๋ค.
- ๋ ๋ฒ์งธ ์ธ์(Generic_Read)๋ ํด๋น ํ์ผ์ ์ด๋ค ์ฉ๋๋ก ์ธ ๊ฒ์ธ์ง์ ๋ํ ๊ถํ ์ ๋ณด
- ๋ค์ฏ ๋ฒ์งธ ์ธ์(OPEN_EXISTING)์ ๋์ผํ ๊ฒฝ๋ก์ Sample01.exe๊ฐ ์์ ๊ฒฝ์ฐ์ ์ด๊ฒ ๋ค๋ ์๋ฏธ
- ํ์ผ์ด ์์ผ๋ฉด ํธ์ถ์ด ์คํจ๋ก ๋๋๋ค.
- ํ์ผ์ ์ด์์ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋๋ฐ ReadFile() API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ธ์๋ Sample01.exe์ ํธ๋ค ๊ฐ์ด๋ค.
- ํธ๋ค: exe๋ ํ์๊ฐ ๋ฐ์ํ๋๋ก ์์ฒญํ๋ ๊ฒ์ธ๋ฐ exe๊ฐ ์ด๋ค ํ์๋ฅผ ์์ฒญํ ๋๋ ๋ชฉ์ ์ ๋ฐํ๊ณ ๊ด๋ฆฌ์์๊ฒ ํ๋ฝ์ ๋ฐ์์ผ ํ๋ค. ์ฌ๊ธฐ์ CreateFile() API ํธ์ถ์ด ํน์ ํ์์ ๋ํ ์์ฒญ์ด๋ฉฐ ์์ฒญ ์น์ธ์ ๋ํ ์งํ๊ฐ ํธ๋ค์ด๋ค.
- ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ์ธ์๋ '์ฝ์ด์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์์น ์ฃผ์'์ '์ฝ์ด์ฌ ๋ฐ์ดํฐ์ ํฌ๊ธฐ'์ด๋ค.
- ReadFile() API๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ฝ์ด ์ฌ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๊ณ ์ ์ฅ ๊ณต๊ฐ์ ํ ๋นํด์ผ ํ๋ค.
- GetFileSize() API๋ฅผ ์ฌ์ฉํ๋ฉด Sample01.exe์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ ์ ์๋ค.
- ๊ทธ๋ฆฌ๊ณ malloc() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ ํฌ๊ธฐ๋งํผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ ์ ์๋ค.
- ๊ฐ๊ฐ์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ ReadFile() API์ ์ธ์๋ก ๋ฃ๊ณ ํธ์ถํ๋ฉด 'IpBuffer'์ Sample01.exe ํ์ผ ๋ฐ์ดํฐ๊ฐ ์ ์ฅํ๊ณ ๋์ ํธ๋ค์ ๋ฐํ๋๋ค.
- Sample01.exe๋ ์ญ์ ํ๋ค.
- ์ด์ "%TEMP%" ๊ฒฝ๋ก์ Replicated Sample 01.exe๋ฅผ ๋ง๋๋ก 'IpBuffer'์ ์ ์ฅ๋์ด ์๋ Sample01.exe ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์จ์ผ ํ๋ค.
- CreateFile() API๋ฅผ ํธ์ถํ๊ธฐ ์ ์ "%TEMP%\Replicated Sample 01.exe" ๊ฒฝ๋ก ๋ฌธ์์ด์ ๋จผ์ ๋ง๋ค์ด์ฃผ๊ณ GetTempPath()์ wsprintf() API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- CreateFile() API์ ๋ ๋ฒ์งธ, ๋ค์ฏ ๋ฒ์งธ ์ธ์์๋ 'GENERIC_WRITE'์ 'CREATE_NEW'๋ฅผ ๋ฃ์๋ ๋ฐ ์ด๋ 'Sample 01.exe ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ธฐ ์ํด Replicated Sample 01.exe๋ฅผ ์๋ก ๋ง๋ ๋ค.'๋ ์๋ฏธ.
- WriteFile() API๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์ด ๋ค์ธ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ exeํ์ผ์ ๊ธฐ๋ก.
- ์ด๋ ๊ฒ ํ๋ฉด ํ์ผ ๋ณต์ ๊ฐ ๋๋ฌ๊ณ Replicated Sample 01.exe๋ฅผ ์คํํ๋ฉด Sample 05.exe์ ๋์์ด ์๋ฃ๋๋ค.
2. ํ์ผ ๊ฒ์ ๊ธฐ๋ฅ ์ถ๊ฐ
: Sample 05.exe๊ฐ ์์ฒด์ ์ผ๋ก Sample 01.exe์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ํ์ผ ๋ณต์ ๋์์ ํ๋๋ก ๋ง๋๋ ๊ฒ.
- ํ์ผ ๊ฒ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํน์ ๊ฒฝ๋ก์ ์๋ ํ์ผ๋ค์ ํ์ํ๊ณ ์ ๋ณด ์์ง์ด ๊ฐ๋ฅ.
- ํ์ผ์ด๋ ํด๋๋ฅผ ๊ฒ์ํ ๋ FindFirstFile(), FindNextFile() API๋ฅผ ์ฌ์ฉํ๋ค.
- FindFirstFile() API ์ฒซ ๋ฒ์งธ ์ธ์์๋ ๊ฒ์ํ๊ณ ์ ํ๋ ๊ฒฝ๋ก ๊ฐ์ด ๋ค์ด๊ฐ๋๋ฐ ๊ฒ์ ๋์์ด ๋ชจ๋ ํ์ผ๊ณผ ํด๋์ด๊ธฐ ๋๋ฌธ์ "%ํ์ฌ ๊ฒฝ๋ก%\*.*" ๋ฌธ์์ด์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
- *์ ๋ชจ๋ ๋ฌธ์์ด์ ์๋ฏธํ๊ณ ๊ฒ์ ๋์์ด ๋ชจ๋ exe ํ์ผ์ด๋ฉด, *. exe๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
- ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ฉด ํ์ผ ๊ฒ์์ ํด์ผ ํ๋๋ฐ FindFirstFile() API์ ์ฝ๋์ ์ฒซ ๋ฒ์งธ ์ธ์์๋ ์์ฑ๋ ๊ฒฝ๋ก ๊ฐ์ ๋ฃ๊ณ , ๋ ๋ฒ์งธ ์ธ์์๋ WIN32_FIND_DATA ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ์ง์ ํด ๋ฃ์ผ๋ฉด ๋๋ค.
- ๊ตฌ์กฐ์ฒด๋ ๋ณ์์ ๋น์ทํ๊ฒ ๊ฐ์ ๋ด์ ์ ์๋ ์ฃผ๋จธ๋๋ก ๋ณ์์ ๋ฌ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ ํด์ ธ ์๊ณ , ๊ทธ ์์๋ ์ฝ์๋ ๊ฐ์ด ๊ธฐ๋ก๋๋ค.
- FindFirstFile()์ ํธ์ถํ๋ฉด ์ฒ์์ผ๋ก ์ฐพ์ ํ์ผ์ ์ ๋ณด๊ฐ WIN32_FIND_DATA ๊ตฌ์กฐ์ฒด ๋ณ์์ธ 'FileData'์ ๊ธฐ๋ก.
- WIN32_FIND_DATA ๊ตฌ์กฐ์ฒด์ cFileName ๋ฉค๋ฒ๋ ๊ฒ์ ํ์ผ์ ์ด๋ฆ ์ ๋ณด์ด๋ฉฐ ์ด ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ๋ฌธ์์ด์ ๋น๊ตํด์ Sample 01.exe๊ฐ ๋ง๋์ง ํ์ธ.
- ๋ง์ฝ์ ์๋๋ฉด FindNextFile() API๋ฅผ ํธ์ถํด์ ๋ค์ ํ์ผ์ ๊ฒ์ํ๊ณ ์ฐพ์ผ๋ฉด ํ์ผ ๋ณต์ ์ฝ๋๊ฐ ์คํ๋๋ฉฐ ์ด ์์
์ ํ์ฌ ๊ฒฝ๋ก์ ์๋ ๋ชจ๋ ํ์ผ, ํด๋ ๊ฒ์์ด ๋๋ ๋๊น์ง ๋ฐ๋ณต๋๋ค.
2.3 ํ์ผ ๋ถ์
3. ๋ ์ง์คํธ๋ฆฌ ๊ด๋ฆฌ ์ฝ๋
3.1 ๋ ์ง์คํธ๋ฆฌ
:๋ ์ง์คํธ๋ฆฌ๋ ์ผ์ข
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก Windows ์์คํ
์ ๋ณด์ ํจ๊ป ๋์์ ํ์ํ ๋ค์ํ ์ ๋ณด๋ค์ด ๊ธฐ๋ก.
1. Key
: ๋ ์ง์คํธ๋ฆฌ์์ ํด๋์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฐ๋
.
ํด๋์ ํ์ ํด๋ ๋ฐ ํ์ผ๋ค์ด ๋ค์ด๊ฐ ์ ์๋ ๊ฒ์ฒ๋ผ ํ์ ํค์ Value๋ฅผ ๊ฐ์ง ์ ์๋ค.
2. Root Key
: ๋ ์ง์คํธ๋ฆฌ์ ์ต์์ ํค
HKEY_CLASSES_ROOT |
ํ์ผ ํ์ฅ์์ ํ์ฅ์๊ฐ ์ฌ์ฉํ ํ๋ก๊ทธ๋จ์ ๋งคํ ์ ๋ณด๊ฐ ์ ์๋์ด ์๋ค. |
HKEY_CURRENT_USER |
ํ์ฌ ์์คํ
์ ๋ก๊ทธ์จํ๊ณ ์๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์์คํ
ํ๊ฒฝ ์ ๋ณด(๋คํธ์ํฌ, ์์ฉ ํ๋ก๊ทธ๋จ ๋ฑ์ ์ ๋ณด)๊ฐ ์ ์๋์ด ์๋ค. |
HKEY_LOCAL_MACHINE |
์์คํ
์ ํ๋์จ์ด ๊ตฌ์ฑ์ ํ์ํ ์ด๊ธฐํ ํ์ผ๊ณผ ์ํํธ์จ์ด ์ ๋ณด, ๋๋ผ์ด๋ฒ ์ ๋ณด ๋ฑ์ด ์ ์๋์ด ์๋ค. |
HKEY_USER |
์์คํ
์ ์๋ ๋ชจ๋ ๊ณ์ ๊ณผ ๊ทธ๋ฃน์ ๋ํ ์์คํ
ํ๊ฒฝ ์ ๋ณด๊ฐ ์ ์๋์ด ์๋ค. |
HKEY_CURRENT_CONFIG |
์์คํ
์ด ๋ถํ
์ ์ฌ์ฉํ๋ ํ๋์จ์ด ํ๋กํ์ผ ์ ๋ณด(๊ธ๊ผด, ํ๋ฆฐํฐ ์ ๋ณด ๋ฑ์ ๋ถ๊ฐ์ ์ ๋ณด)๊ฐ ์ ์๋์ด ์๋ค. |
3. Value
: ํด๋์ ์ํ ํ์ผ์ฒ๋ผ Key ์์ ์กด์ฌํ๋ค.
Type |
Description |
Type |
Description |
REG_SZ |
๋ฌธ์์ด ๊ฐ |
REG_BINARY |
์ด์ง๊ฐ |
REG_MULTI_SZ |
๋ค์ค ๋ฌธ์์ด ๊ฐ |
REG_DWORD |
DWORD ๊ฐ |
REG_EXPAND_SZ |
ํ์ฅ ๊ฐ๋ฅํ ๋ฌธ์์ด ๊ฐ |
RGE_QWORD |
QWORD ๊ฐ |
4. Data
: Value๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ.
Value์ Type์ ๋ฐ๋ผ ๋ฌธ์์ด ๋ฐ ์ด์ง ๊ฐ ๋ฑ์ ๊ฐ์ง ์ ์๋ค.
๋ ์ง์คํธ๋ฆฌ ์ค์ต
3.2 ๋์ ํ์ธ
3.3 ์ฝ๋ ํ์ต
- ๋ ์ง์คํธ๋ฆฌ์ Value๋ฅผ ๋ฑ๋ก, ์กฐํ, ์์ ํ๊ธฐ ์ํด์๋ Key๋ฅผ ์ด์ด์ค์ผ ํ๋ค.
- RegOpenKeyEx() API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ Key์ ๋ํ ํธ๋ค ๊ฐ์ ๋ค์ฏ ๋ฒ์งธ ์ธ์์ธ hKey์ ๋ค์ด๊ฐ๋ค.
- Key๋ฅผ ์ด์์ผ๋ฉด Value๋ฅผ ๋ฑ๋กํ๋ฉด ๋๋ ๋ฐ ๋ฐ๋ก ๋ฑ๋ก์ ํด์ค๋ ๋ฌด๋ฐฉํ์ง๋ง ์ฌ๊ธฐ์๋ 'Run_Sample'์ด๋ผ๋ ์ด๋ฆ์ Value๊ฐ ์์ ์๋ ์๋ค๋ ๊ฐ์ ํ์ ๋์ผ Value๋ฅผ ๊ฒ์ ๋ฐ ์ญ์ ํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- RegEnumValue()๋ Value๋ฅผ ์กฐํํ ๋ ์ฌ์ฉํ๋ API๋ก ๋ ๋ฒ์งธ ์ธ์๋ ์กฐํํ๊ณ ์ ํ๋ Value์ ๋ฒํธ์ด๋ค.
- 0๋ถํฐ ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉด์ Run Key์ ์กด์ฌํ๋ ๋ชจ๋ Value๋ฅผ ๊ฒ์ํ๋๋ก ์์ฑํ ๊ฒ์ด๋ค.
- RegEnumValue()๋ฅผ ํธ์ถํ๋ฉด 'IpValue'์ ๊ฒ์๋ Value์ ์ด๋ฆ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ค.
- ์ด ๊ฐ๊ณผ 'Run_Sample' ๋ฌธ์์ด์ ๋น๊ตํ๋ฉด ๋์ผํ ์ด๋ฆ์ Value๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๊ณ ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ RegDeleteValue() API๋ฅผ ํธ์ถํด์ Value๋ฅผ ์ญ์ ํ๋๋ก ์์ฑ.
- Sample 01.exe๊ฐ ์๋ ์คํ๋๋๋ก Value๋ฅผ ๋ฑ๋กํ๋ฉด ๋๋๋ฐ ์ด๋ RegSetValueEx() API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ๋ค์ฏ ๋ฒ์งธ ์ธ์๋ Data๋ฅผ ์๋ฏธํ๋ค.
- IpSamplePath ๋ณ์์๋ Sample 01.exe ๊ฒฝ๋ก ๊ฐ์ด ๋ค์ด๊ฐ ์๋ค.
- ์ฌ์ฏ ๋ฒ์งธ ์ธ์๋ Data ํฌ๊ธฐ ๊ฐ์ด๋ค.
- Value ๋ฑ๋ก์ด ๋๋๋ฉด RegCloseKey()๋ฅผ ํธ์ถํด์ ํธ๋ค ๊ฐ์ ๋ฐํํ๋ค.
- Sample 01.exe์ ์๋ ์คํ ๋ฑ๋ก์ด ์๋ฃ๋์์ผ๋ฉฐ ์ฌ๋ถํ
๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ CMD ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ ์ด์์ฒด์ ๋ฅผ ์ฌ๋ถํ
ํ๋ฉด Sample 06.exe์ ๋์์ ์๋ฃ๋๋ค.
3.4 ํ์ผ ๋ถ์