Study/study

์ž๋™ ์‹คํ–‰ ๋“ฑ๋ก ํ”„๋กœ๊ทธ๋žจ(C++) ๋ฆฌ๋ฒ„์‹ฑ

์œค์ •_ 2024. 11. 5. 16:44

ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์„ ์ž๋™ ์‹คํ–‰ํ•˜๋„๋ก ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋กํ•˜๋Š” 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๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ์˜ ๋ ˆ์ง€์Šคํ„ฐ

 

RegOpenKeyEx API ํ˜ธ์ถœ ํ›„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ ๋ฉ”์„ธ์ง€(&Val)๋ฅผ ์ถœ๋ ฅ

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์˜คํ”ˆ ์‹คํŒจ ์‹œ ๋ฉ”์„ธ์ง€

 

 

 

3. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๊ด€๋ฆฌ

๋ณ€์ˆ˜ ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๋ฅผ ๊ฒ€์‚ฌ

v1 = &v12 = appPath, v2 = &v13 = appName๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์Œ

 

  • v12._Mypair._Myval2._Myres
    v12์˜ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์ด ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

    • _Mypair._Myval2._Myres
      std::basic_string ๊ฐ์ฒด๊ฐ€ ํ˜„์žฌ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์šฉ๋Ÿ‰
      ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ

  • 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)์— ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ณ ์ •๋œ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹


  • v12._Mypair._Myval2._Bx._Ptr
    v12๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ

    • _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๋ฐ”์ดํŠธ) ํฌ๊ธฐ์˜ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…

  • &unk_140003448
    ์ฃผ์†Œ ์—ฐ์‚ฐ์ž &๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์œ„์น˜ํ•œ ๋ณ€์ˆ˜ unk_1440003448๋ฅผ ๊ฐ€๋ฆฌํ‚ด(unk: unknown)
    ํ•ด๋‹น ์ฃผ์†Œ์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ๋ก ์„ฑ๊ณต ์‹œ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„ธ์ง€
    ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ๋ก ์„ฑ๊ณต ์‹œ ๋ฉ”์„ธ์ง€
  • &byte_140003460
    byte ์ ‘๋‘์–ด๊ฐ€ ๋ถ™์€ ๋งŒํผ ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋‚˜ ํŠน์ • ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํผ
    ํ•ด๋‹น ์ฃผ์†Œ์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ๋ก ์‹คํŒจ ์‹œ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„ธ์ง€
    ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ๋ก ์‹คํŒจ ์‹œ ๋ฉ”์„ธ์ง€