ํน์ ํ๋ก๊ทธ๋จ์ ์๋ ์คํํ๋๋ก ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋กํ๋ C++ ํ๋ก๊ทธ๋จ์ ๋ฆฌ๋ฒ์ฑํด๋ณด๊ฒ ์ต๋๋ค.
#include <windows.h>
#include <iostream>
void AddToStartup(const std::wstring& appName, const std::wstring& appPath) {
// ๋ ์ง์คํธ๋ฆฌ ํค๋ฅผ ์ด๊ธฐ
HKEY hKey;
LONG result = RegOpenKeyEx(HKEY_CURRENT_USER,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0,
KEY_SET_VALUE,
&hKey);
if (result != ERROR_SUCCESS) {
std::cerr << "๋ ์ง์คํธ๋ฆฌ ํค ์ด๊ธฐ ์คํจ" << std::endl;
return;
}
// ๋ ์ง์คํธ๋ฆฌ์ ํ๋ก๊ทธ๋จ ๋ฑ๋ก
result = RegSetValueEx(hKey, appName.c_str(), 0, REG_SZ,
reinterpret_cast<const BYTE*>(appPath.c_str()),
(appPath.size() + 1) * sizeof(wchar_t));
if (result != ERROR_SUCCESS) {
std::cerr << "๋ ์ง์คํธ๋ฆฌ ๊ฐ ์ค์ ์คํจ" << std::endl;
}
else {
std::cout << "ํ๋ก๊ทธ๋จ์ด ์๋ ์คํ์ ์ฑ๊ณต์ ์ผ๋ก ์ถ๊ฐ๋์์ต๋๋ค." << std::endl;
}
// ๋ ์ง์คํธ๋ฆฌ ํค ๋ซ๊ธฐ
RegCloseKey(hKey);
}
int main() {
std::wstring appName = L"MyApp"; // ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋กํ ์ด๋ฆ
std::wstring appPath = L"E:\\Office 2022\\HOffice120\\Bin\\Hwp.exe"; // ์คํํ ํ๋ก๊ทธ๋จ์ ๊ฒฝ๋ก
AddToStartup(appName, appPath);
return 0;
}
1. ๋ณ์ ์ ์
์๋ ์คํ ๋์์ ์ฑ ์ด๋ฆ๊ณผ ๊ฒฝ๋ก๋ฅผ ๋ณ์์ ์ ์ฅ
&v13์ ๋ฌธ์์ด "MyApp", &v12์ ๋ฌธ์์ด "E:\\Office 2022\\HOffice120\\Bin\\Hwp.exe" ์ ์ฅ
- &v13
v13 ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์๋ฏธ
๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ - std::allocator
๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ด๋นํ๋ ํ์ค ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์
๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต
2. ํน์ ๋ ์ง์คํธ๋ฆฌ ํค ์ด๊ธฐ
๋ ์ง์คํธ๋ฆฌ ํค๋ฅผ ์ด๊ณ , ๊ทธ ๊ณผ์ ์์ ์๋ฌ ๋ฐ์ ์ ์์ธ (๋ฉ์ธ์ง) ์ถ๋ ฅ
- std::operator<<
์คํธ๋ฆผ ์ฝ์ ์ฐ์ฐ์(operator<<)
์ถ๋ ฅ ์คํธ๋ฆผ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐ ์ฌ์ฉ
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๋ํ๋
* ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ(operator overloading): ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ฐ์ฐ์(+, -, *, << ๋ฑ)๋ฅผ ์ฌ์ฉ์ ์ ์ ํ์ ์ ๋ํด ๋์ํ๋๋ก ํ ์ ์์ - std::char_traits<char>
char์ ๋ํ ํน์ฑ(traits)์ ์ ์ํ๋ ๊ธฐ๋ณธ ๊ตฌํ์ฒด
ํน์ ํ์ ์ ๋ํ ์ฌ๋ฌ ์์ (๋น๊ต, ๋ณต์ฌ, ๊ธธ์ด ์ธก์ ๋ฑ)์ ์ ์ - std::basic_ostream
์คํธ๋ฆผ ์ถ๋ ฅ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ ํด๋์ค
๊ทธ ์ค์์๋ char ํ์ ์ ๋ค๋ฃธ
์ด๋, ํจ์๋ฅผ ํธ์ถํ ๋ ํ์ํ ์ธ์๋ ๋ค์ ๋ ์ง์คํฐ ๋ฐ ์คํ์ ์์๋๋ก ์ ์ฅ๋ฉ๋๋ค. (Window x64 ํ๊ฒฝ ๊ธฐ์ค)
- RCX, RDX, R8, R9, ๋๋จธ์ง๋ ์คํ
RegOpenKeyEx API ํธ์ถ ํ ์๋ฌ ๋ฐ์ ์ ์์ธ ๋ฉ์ธ์ง(&Val)๋ฅผ ์ถ๋ ฅ
3. ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๊ด๋ฆฌ
๋ณ์ ๋ฌธ์์ด์ ํฌ๊ธฐ๋ฅผ ๊ฒ์ฌ
v1 = &v12 = appPath, v2 = &v13 = appName๊ฐ ์ ์ฅ๋์ด ์์
- v12._Mypair._Myval2._Myres
v12์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
- _Mypair._Myval2._Myres
std::basic_string ๊ฐ์ฒด๊ฐ ํ์ฌ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ์ฉ๋
ํ์ฌ ๋ฌธ์์ด์ด ํฌํจํ๊ณ ์๋ ๋ฐ์ดํฐ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ
- _Mypair._Myval2._Myres
- v12._Mypair._Myval2._Myres > 7
v12๊ฐ 7๊ฐ ์ด์์ ๋ฌธ์(wchar_t)๋ฅผ ์ ์ฅํ ์ ์์ ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์๋์ง ํ์ธ
๋ชฉ์ : ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ์ถฉ๋ถํ ๋๋ง ๋ฌธ์์ด ๋ฐ์ดํฐ์ ์ง์ ์ ๊ทผํ๋ ค๋ ๋ชฉ์ ์ด๋ฉฐ, ์ฑ๋ฅ ์ต์ ํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํจ
- ์ 7์ธ์ง??
๋ณดํต ๋ฌธ์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ๋ณดํ์ง๋ง, ์์ ํฌ๊ธฐ์ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ๋์ ํ ๋น์ ํ์ง ์์ต๋๋ค. ์ด๋ฅผ ์์ ๋ฌธ์์ด ์ต์ ํ(SSO, Small String Optimization)๋ผ๊ณ ํฉ๋๋ค. ๊ฐ ์ปดํ์ผ๋ฌ๋ง๋ค ๋ค๋ฅด์ง๋ง ์ ๊ฐ ์ฌ์ฉํ MSVC(Microsoft Visual C++)์ธ ๊ฒฝ์ฐ์ ์ต์ ํ๋ ์ด๊ธฐ ๋ฒํผ ํฌ๊ธฐ๋ 7๋ก ์ค์ ๋ฉ๋๋ค. ํฌ๊ธฐ 7 ์ดํ์ธ ๊ฒฝ์ฐ ๋ด๋ถ ๋ฒํผ์ ์ ์ฅ๋๊ณ , ์ด๊ณผ๋๋ ๊ฒฝ์ฐ์๋ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ๊ฒ ๋ฉ๋๋ค.
std::basic_string(std::string)๋ ์ต๋ 15-16๋ฐ์ดํธ๊น์ง๋ ํ ํ ๋น ์์ด ๋ด๋ถ ๊ณ ์ ๋ ๋ฒํผ์ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ํด๋น ๋ฒํผ์ ํฌ๊ธฐ๋ ์ต๋ 7๊ฐ์ wchar_t(7๊ฐ์ 2๋ฐ์ดํธ ์ ๋์ฝ๋ ๋ฌธ์)๋ฅผ ์ ์ฅํ ์ ์๋ ํฌ๊ธฐ์ ๋๋ค.
∴ MSVC์ std::basic_string<wchar_t> ๊ตฌํ์์ SSO๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์ต๋ ํฌ๊ธฐ = 7
* SSO: ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ด ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์คํ์ ํ ๋นํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ธฐ๋ฒ.
๋ฌธ์์ด์ด ์ผ์ ํฌ๊ธฐ ์ดํ์ผ ๊ฒฝ์ฐ, ๊ทธ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ๋์ ๋ฉ๋ชจ๋ฆฌ(heap)์ ํ ๋นํ์ง ์๊ณ ๋ฌธ์์ด์ ๊ฐ์ฒด ๋ด๋ถ์ ๊ณ ์ ๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฐฉ์
- ์ 7์ธ์ง??
- v12._Mypair._Myval2._Bx._Ptr
v12๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
- _Mypair._Myval2._Bx._Ptr
์ค์ ๋ฌธ์์ด ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
- _Mypair._Myval2._Bx._Ptr
- _Mypair._Myval2._Bx._Buf
std::basic_string ํด๋์ค์์ ๋ฌธ์์ด์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ด๋ถ ๊ตฌ์กฐ์ฒด
SSO ๊ธฐ๋ฒ์ ์ ์ฉํ ๋ ์ฌ์ฉ๋๋ ๊ณ ์ ๋ ๋ฒํผ
std::basic_string์ ๋ด๋ถ ๊ตฌ์กฐ (MSVC ๊ตฌํ)
struct _Mypair {
struct _Myval2 {
size_t _Mysize; // ๋ฌธ์์ด์ ์ค์ ๊ธธ์ด (๋ฌธ์ ๊ฐ์)
size_t _Myres; // ํ ๋น๋ ๋ฒํผ์ ํฌ๊ธฐ (ํ์ฌ ๋ฌธ์์ด์ ์ ์ฅํ ์ ์๋ ์ฉ๋)
union {
wchar_t* _Ptr; // ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ (_Myres > SSO ํฌ๊ธฐ์ผ ๋ ์ฌ์ฉ)
wchar_t _Buf[SSO_SIZE]; // SSO๋ฅผ ์ํ ๊ณ ์ ํฌ๊ธฐ ๋ฒํผ (์์ ๋ฌธ์์ด์ ์ ์ฅ)
} _Bx;
} _Myval2;
};
4. ๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก
๋ ์ง์คํธ๋ฆฌ์์ ํ๋ก๊ทธ๋จ์ ๋ฑ๋กํ๊ณ (RegSetValueExW), ๊ทธ ๊ณผ์ ์์ ์๋ฌ ๋ฐ์ ์ ์์ธ (๋ฉ์์ง) ์ถ๋ ฅ
๊ทธ๋ฆฌ๊ณ ์ด๋ฆฐ ๋ ์ง์คํธ๋ฆฌ ํค๋ฅผ ๋ซ์(RegCloseKey)
- 1u
๋ฐ์ดํฐ ํ์ ์ ๋ํ๋ด๋ฉฐ ๋ฌธ์์ด ํ์ (REG_SZ)์ ์๋ฏธํจ - ODWORD
Windows API์์ ์ฌ์ฉํ๋ ๋งคํฌ๋ก ์ค ํ๋๋ก, 32๋นํธ ๊ฐ์์ ํ์ 16๋นํธ๋ฅผ ์ถ์ถ
DWORD ํ์ ๊ฐ์ ๋ค๋ฃฐ ๋ ์/ํ์ 16๋นํธ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ๋ ์ํฉ์์ ์ฌ์ฉ
* HIDWORD๋ ์์ 16๋นํธ๋ฅผ ์ถ์ถ
- DWORD(Double WORD)
32๋นํธ(4๋ฐ์ดํธ) ํฌ๊ธฐ์ ๋ถํธ ์๋ ์ ์๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ ํ์
- DWORD(Double WORD)
- &unk_140003448
์ฃผ์ ์ฐ์ฐ์ &๋ฅผ ํตํด ํน์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์์นํ ๋ณ์ unk_1440003448๋ฅผ ๊ฐ๋ฆฌํด(unk: unknown)
ํด๋น ์ฃผ์์ ์์นํ ๋ฐ์ดํฐ๋ ๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก ์ฑ๊ณต ์ ์ถ๋ ฅํ๋ ๋ฉ์ธ์ง๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก ์ฑ๊ณต ์ ๋ฉ์ธ์ง - &byte_140003460
byte ์ ๋์ด๊ฐ ๋ถ์ ๋งํผ ๋ฐ์ดํธ ๋จ์์ ๋ฐ์ดํฐ๋ ํน์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ํ๋ด๋ ๋ณ์์ผ ๊ฐ๋ฅ์ฑ์ด ํผ
ํด๋น ์ฃผ์์ ์์นํ ๋ฐ์ดํฐ๋ ๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก ์คํจ ์ ์ถ๋ ฅํ๋ ๋ฉ์ธ์ง๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก ์คํจ ์ ๋ฉ์ธ์ง
'Study > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
AES ์ํธํ ๋ฐ์ดํฐ ์ ์ก ํ๋ก๊ทธ๋จ(C++) ๋ฆฌ๋ฒ์ฑ (1) | 2024.11.11 |
---|---|
๋งํฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ๋์ค์ด์ ๋ธ๋ฆฌ ์ฝ๋ ํน์ง (1) | 2024.11.07 |
SEH, TEB(TIB), PEB์ FS ๋ ์ง์คํฐ๋ฅผ ํตํด ์ ๊ทผํ๋ ๋ฐฉ๋ฒ (0) | 2024.05.14 |
SEH, ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ (0) | 2024.05.13 |
TLS, TLS ์ฝ๋ฐฑํจ์ (0) | 2024.05.09 |