Malware/malware analysis

[Qakbot ๋ถ„์„ (2)] PE ํฌ๋งท ์กฐ์ž‘ ๋ฐ API ๋ฆฌ์กธ๋น™

์œค์ •_ 2025. 2. 4. 16:17

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ ์–ธํŒจํ‚นํ•œ Qakbot ์•…์„ฑ์ฝ”๋“œ๋ฅผ ์ด์–ด์„œ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” PE ํฌ๋งท๊ณผ API ๋ฆฌ์กธ๋น™์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ํ•ด์‹œ(SHA256)๋Š” 73e4969db4253f9aeb2cbc7462376fb7e26cc4bb5bd23b82e2af0eaaf5ae66a8์ž…๋‹ˆ๋‹ค.

 

 

 

[ Capa๋ฅผ ํ†ตํ•ด ์Šค์บ” ]

๋จผ์ € ์–ธํŒจํ‚นํ•œ DLL์„ Capa๋กœ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Capa๋Š” PE, ELF, .NET, shellcode ๊ฐ™์€ ์‹คํ–‰ํŒŒ์ผ์ด๋‚˜ ์ƒŒ๋“œ๋ฐ•์Šค ๋ณด๊ณ ์„œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ํ•ด๋‹น ํŒŒ์ผ์˜ ๊ธฐ๋Šฅ์„ ํƒ์ง€ํ•˜์—ฌ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. IDA plugin์œผ๋กœ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(Capa Explorer).

 

์•„๋ž˜๋Š” Capa๋ฅผ ํ†ตํ•ด ์–ธํŒจํ‚น๋œ DLL์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ถœ๋ ฅํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

Capa๋ฅผ ํ†ตํ•ด ์–ป์€ ์•…์„ฑ์ฝ”๋“œ ๋ถ„์„์— ๋„์›€์ด ๋˜๋Š” ์ •๋ณด(์ง•ํ›„)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • HTTP ์กฐ์ž‘(manipulation)
  • Adler32 ์ฒดํฌ์„ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • CRC32 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ํ•ด์‹œ ๋ฐ์ดํ„ฐ
  • Base64 ์ธ์ฝ”๋”ฉ ๋ฐ์ดํ„ฐ
  • XOR ์—ฐ์‚ฐ์ด ์‚ฌ์šฉ๋œ ์ธ์ฝ”๋”ฉ ๋ฐ์ดํ„ฐ
  • SHA1 ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • Mersenne Twister
  • ํŒŒ์ผ ์—ด๊ฑฐ(file enumeration) ์ž‘์—…
  • Import Table ์žฌ๊ตฌ์„ฑ ์ž‘์—…

 

์ด ์ •๋ณด๋“ค์„ ์ด์šฉํ•˜์—ฌ DllEntryPoint ํ•จ์ˆ˜๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ถ„์„์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

[ ์ƒ์„ธ ๋ถ„์„ ]

DllEntryPoint

DllEntryPoint ํ•จ์ˆ˜์˜ 30๋ฒˆ์งธ ์ค„์˜ ์„œ๋ธŒ๋ฃจํ‹ด sub_10009773๋ฅผ ๋จผ์ € ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

sub_10009773

 

์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํฌ๊ธฐ์ด๊ณ  ๋‘ ๋ฒˆ์งธ(unk_1001D5A8)์™€ ์„ธ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ(unk_1001E3F8)๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ ๋ธ”๋กญ์ž…๋‹ˆ๋‹ค. v1๊ณผ v2์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.

unk_1001E3F8๋Š” ๊ธธ์ด๋กœ ๋ณด์•„ ํ‚ค ๋ฌธ์ž์—ด๋กœ ์ถ”์ธก๋ฉ๋‹ˆ๋‹ค.

 

 

์ด์–ด์„œ sub_1000865C ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sub_1000865C ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€ 27๋ฒˆ์งธ ์ค„์—์„œ ํฅ๋ฏธ๋กœ์šด ์—ฐ์‚ฐ ๋ฃจํ‹ด์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

a2, a3, a5๋Š” ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ a2๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋กญ1(unk_1001D5A8), a3๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋กญ2(unk_1001E3F8)์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ๋ฌธ์ž์—ด๋กœ ์ถ”์ธก๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋กญ1๊ณผ ํ‚ค๋กœ ์ถ”์ธก๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋กญ2, ๊ทธ๋ฆฌ๊ณ  XOR ์—ฐ์‚ฐ ๋ฃจํ‹ด์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋””์ฝ”๋”ฉ์„ ์œ„ํ•œ ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ์ถ”์ธก๋ฉ๋‹ˆ๋‹ค.

 

์•Œ๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ธŒ๋ฃจํ‹ด(sub_10009773 → mw_decode_string_table, sub_1000865C → mw_decode_string_table), ์ธ์ˆ˜, ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

 

sub_10008773

๋‹ค์‹œ DllEntryPoint๋กœ ๋Œ์•„์™€ 32๋ฒˆ์งธ ์ค„์˜ sub_10008773 ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sub_10008773๋Š” mw_ww_string_length๋กœ, sub_1000C52C๋Š” mw_str_length_char๋กœ, sub_100087CB๋Š” mw_str_length_wchar๋กœ ๊ฐ๊ฐ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์ธ์ˆ˜/๋ณ€์ˆ˜ ์ด๋ฆ„๋„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

15, 17๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ -1์ธ์ง€ -2์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

mw_ww_string_length (sub_10008773)์˜ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ char_or_wchar๋Š” ํฌ๊ธฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. char_or_wchar๊ฐ€ -1์ธ์ง€ -2์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ "-1"์€ "char"๋ฅผ ์˜๋ฏธํ•˜๊ณ  "-2"๋Š” "wchar"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด mw_str_length_char (sub_1000C52C)์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” _BYTE์ด๊ณ , mw_str_length_wchar (sub_100087CB)์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” _WORD์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

  • char
    • 1๋ฐ”์ดํŠธ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
    • _byte๋Š” 1๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ char๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” _byte๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

  • wchar
    • ๋ณดํ†ต 2๋ฐ”์ดํŠธ(๋˜๋Š” 4๋ฐ”์ดํŠธ) ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • _word๋Š” 2๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ wchar๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” _word๋กœ ๋‹ค๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์„œ๋ธŒ๋ฃจํ‹ด sub_10008773 (mw_ww_string_length)์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ ์ดํ›„ ์ฝ”๋“œ์—์„œ๋„ ์ž์ฃผ ์“ฐ์ž…๋‹ˆ๋‹ค.

 

 

 

sub_10012C0A

DllEntryPoint ์„œ๋ธŒ๋ฃจํ‹ด 36๋ฒˆ์งธ ์ค„์˜ sub_10012C0A ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ 60๊ณผ 128์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ 16์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด 0x3C, 0x80์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ 0x3C๋Š” IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด์˜ e_lfanew ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, 0x80์€ IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด ๋‚ด์˜ Import Directory(_IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  • IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด
    • DOS ํ—ค๋”์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋กœ, DOS ์‹œ์Šคํ…œ์—์„œ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • DOS ํŒŒ์ผ ํฌ๋งท์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ทธ ์ค‘ e_lfanew ํ•„๋“œ๋Š” PE ํ—ค๋”์˜ ์˜คํ”„์…‹์œผ๋กœ 0x3C ์ฃผ์†Œ์— ์œ„์น˜ํ•ด์žˆ์Šต๋‹ˆ๋‹ค.

  • IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด
    • PE ํ—ค๋” ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” PE ํŒŒ์ผ ๋‚ด์—์„œ ํŠน์ •ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์„ ์ง€์ •ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์šด์˜์ฒด์ œ๋Š” ์‹คํ–‰ ํŒŒ์ผ ๋‚ด์˜ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฐพ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด ๋‚ด์—์„œ VirtualAddress ๊ฐ’์ด 0x80์ด๋ฉด, Import Directory๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    • Import Directory
      • PE ํŒŒ์ผ์˜ import table์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
      • import table์€ _IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

      • _IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด
        • import table์˜ ํ•ญ๋ชฉ์„ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.
        • ๊ฐ _IMAGE_IMPORT_DESCRIPTOR ํ•ญ๋ชฉ์€ PE ํŒŒ์ผ์— import๋˜๋Š” ํ•จ์ˆ˜๋‚˜ DLL์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ด ์ •๋ณด๋“ค์„ ํ†ตํ•ด ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ PE ํฌ๋งท์„ ์กฐ์ž‘(PE format manipulation) ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Structures ํƒญ์—์„œ ํ‘œ์ค€ ๊ตฌ์กฐ์ฒด _IMAGE_DOS_HEADER์™€ _IMAGE_IMPORT_DESCRIPTOR๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋‹ค์‹œ ์˜์‚ฌ ์ฝ”๋“œ๋กœ ๋Œ์•„์™€์„œ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐ์ฒด ์„ ํƒ
    • e_lfanew ํ‘œํ˜„ ๋ฐ”๊พธ๊ธฐ
      • ์˜คํ”„์…‹ 60(0x3C)์— ๋Œ€ํ•ด Select a structure(๋‹จ์ถ•ํ‚ค T)์œผ๋กœ _IMAGE_DOS_HEADER๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ(๋‹จ์ถ•ํ‚ค F5)ํ•ฉ๋‹ˆ๋‹ค.

    • ์ˆซ์ž ํ‘œํ˜„ ๋ฐ”๊พธ๊ธฐ
      • ์ˆซ์ž "20"์„ ํด๋ฆญํ•˜๊ณ  Select a structure(๋‹จ์ถ•ํ‚ค T)์„ ๋ˆ„๋ฅธ ํ›„ _IMAGE_IMPORT_DESCRIPTOR๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  F5๋ฅผ ๋ˆŒ๋Ÿฌ ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ํƒ€์ž… ๋ฐ”๊พธ๊ธฐ
    • ๋ณ€์ˆ˜ v3
      • v3๋ฅผ Set type(๋‹จ์ถ•ํ‚ค Y)๋ฅผ "int v3"์—์„œ "_IMAGE_IMPORT_DESCRIPTOR *v3"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ(๋‹จ์ถ•ํ‚ค F5)ํ•ฉ๋‹ˆ๋‹ค.
      • ์˜คํ”„์…‹ 128(0x80)์€ 0x3C์œผ๋กœ๋ถ€ํ„ฐ 0x80์„ ์˜๋ฏธํ•˜๋ฉฐ _IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด(ImportDirectory)๋ฅผ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” PE ํ˜•์‹์„ ์ฐธ๊ณ ํ•˜๋ฉด _IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด์— ์†ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ€์ˆ˜ dword_1001E664
      • ๋ณ€์ˆ˜ dword_1001E664์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ํƒ€์ž…์„ "int"์— "_IMAGE_IMPORT_DESCRIPTOR *"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ(๋‹จ์ถ•ํ‚ค F5)ํ•ฉ๋‹ˆ๋‹ค.

 

์œ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์„œ๋ธŒ๋ฃจํ‹ด ๋ฐ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พผ ํ›„์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

 

๋˜ํ•œ mw_w_construct_import_structures (sub_1000881A) ์„œ๋ธŒ๋ฃจํ‹ด๋„ ์ˆ˜์ •ํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

๊ทธ๋ฆฌ๊ณ  mw_HeapAlloc (sub_100087B5) ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€์„œ HeapAlloc API์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— Enum member(๋‹จ์ถ•ํ‚ค M)๋ฅผ ๋ˆŒ๋Ÿฌ HEAP_ZERO_MEMORY๋ฅผ ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

์„œ๋ธŒ๋ฃจํ‹ด mw_construct_import_structures (sub_10008892)๋„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

sub_10012C0A (mw_prepare_Import_Structures) ์„œ๋ธŒ๋ฃจํ‹ด๊ณผ ๊ทธ ๋ฃจํ‹ด ์† ํ•จ์ˆ˜๋“ค(sub_1000881A(mw_w_construct_import_structures), sub_10008892(mw_construct_import_structures))์€ ๊ตฌ์กฐ์ฒด๋ฅผ ํ†ตํ•ด ํž™ ๊ด€๋ จ ์ž‘์—…์„ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

 

 

sub_1000E369

๋‹ค์Œ์œผ๋กœ๋Š” DllEntryPoint ํ•จ์ˆ˜์˜ 37๋ฒˆ์งธ ์ค„์˜ sub_1000E369 ์„œ๋ธŒ๋ฃจํ‹ด์„ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sub_1000E369 ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€์—๋Š” sub_1000E31E์™€ sub_10008773์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ sub_1000E369 ์„œ๋ธŒ๋ฃจํ‹ด์˜ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜๋ฉด 13๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ ,

 

์ด์ „์— ๋ถ„์„ํ–ˆ๋˜ mw_w_decode_string_table (sub_10009773) ํ•จ์ˆ˜๋„ ๋ณด์ด๋Š”๋ฐ, ์ด ํ•จ์ˆ˜์˜ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜๋ฉด 23๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

 

 

12๋ฒˆ์งธ ์ค„์—๋Š” ํ˜•์‹์ ์ธ ์ด๋ฆ„์ด ์•„๋‹Œ dword_1001E684๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” .data ์„น์…˜์—์„œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

 

์ด ์ •๋ณด๋“ค์€ API ๋ฆฌ์กธ๋น™์˜ ํฐ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

  • API Resloving
    • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(DLL)์—์„œ ํ•จ์ˆ˜๋‚˜ ๊ธฐํ˜ธ(symbol)๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

    • ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ฐพ๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

    • API ๋ฆฌ์กธ๋น™์€ ํฌ๊ฒŒ ์ •์  ๋ฆฌ์กธ๋น™๊ณผ ๋™์  ๋ฆฌ์กธ๋น™์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
      • ์ •์  ๋ฆฌ์กธ๋น™: ์ปดํŒŒ์ผ ํƒ€์ž„์— API ์ฃผ์†Œ๊ฐ€ ์ด๋ฏธ ๊ฒฐ์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ ์ฃผ๋กœ ๋ง์ปค๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ๋™์  ๋ฆฌ์กธ๋น™: ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋Ÿฐํƒ€์ž„์— API ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ, ์ฃผ๋กœ LoadLibrary์™€ GetProcAddress์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

 

์ด์–ด์„œ sub_1000E369 ์„œ๋ธŒ๋ฃจํ‹ด 14๋ฒˆ์งธ ์ค„์˜ sub_1000E31E์— ๋“ค์–ด๊ฐ€์„œ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

sub_1000E31E๋กœ ๋“ค์–ด์™€๋ณด๋‹ˆ ์ด์ „์— ๋ดค๋˜ HeapAlloc์˜ ๋ž˜ํผ(wrapper) ํ•จ์ˆ˜์ธ mw_HeapAlloc๋„ ์žˆ๊ณ , ์ฒ˜์Œ ๋ณด๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์ธ sub_1000E15A๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

sub_1000E15A์—๋„ ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ž˜ ์•Œ๋ ค์ง„ 10์ง„์ˆ˜๋“ค(60, 120, 124 ๋“ฑ)์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ๋ฃจํ‹ด sub_1000C52C์™€ sub_1000D5AA๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • XOR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • 16์ง„์ˆ˜ 0x6C6C642E๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • LoadLibrary()์™€ GetProcAddress()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

์ด ์ •๋ณด๋“ค์„ ํ†ตํ•ด ๋™์  API ๋ฆฌ์กธ๋น™ ๊ณผ์ •์ด๋ผ๋Š” ๊ฒƒ์„ ํ™•์‹คํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•ž์œผ๋กœ ๋ฆฌ๋ฒ„์‹ฑ ๊ณผ์ •์ด ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  sub_1000E15A์˜ ์„œ๋ธŒ๋ฃจํ‹ด/๋ณ€์ˆ˜ ์ด๋ฆ„๋“ค์„ ์ •๋ฆฌํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

1) 60(0x3C)์„ e_lfanew ํ•„๋“œ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

  - Select a structure(๋‹จ์ถ•ํ‚ค T)์œผ๋กœ _IMAGE_DOS_HEADER๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

2) v3๋ฅผ Set type(๋‹จ์ถ•ํ‚ค Y)๋ฅผ "int v3"์—์„œ " _IMAGE_NT_HEADERS* v3"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 

3) Structures ํƒญ์—์„œ ํ‘œ์ค€ ๊ตฌ์กฐ์ฒด _IMAGE_EXPORT_DESCRIPTOR๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

4) 120(0x78)์„ Export Directory ํ•„๋“œ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

  - Select a structure(๋‹จ์ถ•ํ‚ค T)์œผ๋กœ _IMAGE_EXPORT_DESCRIPTOR๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

5) v4๋ฅผ Set type(๋‹จ์ถ•ํ‚ค Y)๋ฅผ "int v4"์—์„œ "_IMAGE_EXPORT_DIRECTORY* v4"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 

6) ApplyCalleeType ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•˜์—ฌ LoadLibraryA()์™€ GetProcAddress() ํ˜ธ์ถœ์„ ๋” ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ApplyCalleeType ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ/๋ฐ˜ํ™˜๊ฐ’ ํƒ€์ž…์„ ์ถ”์ •ํ•˜์—ฌ ์ •๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

API์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๊ณ  Edit → Plugins → ApplyCalleeType → Use Standard Type๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น API ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

LoadLibraryA

 

7) ์„œ๋ธŒ๋ฃจํ‹ด ๋ฐ ๋ณ€์ˆ˜๋ช…์„ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

 

์ด ๊ณผ์ •์„ ์™„๋ฃŒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์˜๊ฒŒ ์ •๋ฆฌ๋œ mw_hashing_api (sub_1000E15A) ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ 49๋ฒˆ ์ค„์˜ XOR ์—ฐ์‚ฐ์—์„œ 0x218FE95B๋ผ๋Š” ์ƒ์ˆ˜๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” XOR ํ‚ค์ž…๋‹ˆ๋‹ค.

 

 

mw_hashing_api (sub_1000E15A) ์„œ๋ธŒ๋ฃจํ‹ด ๋ถ„์„์ด ์•„์ง ๋๋‚œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด 49๋ฒˆ์งธ ์ค„์˜ sub_1000D5AA์— ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ XOR ์—ฐ์‚ฐ๊ณผ ๋น„ํŠธ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์ด ๊ฒฐํ•ฉ๋œ ์—ฐ์‚ฐ ๊ณผ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” CRC ๊ณ„์‚ฐ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ capa๋กœ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด์„œ๋„ CRC32 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ํ•ด์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” CRC32 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณ„์‚ฐ์„ ํ•˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

CRC32 ๊ณ„์‚ฐ ์„œ๋ธŒ๋ฃจํ‹ด์— ๋งž๊ฒŒ ์„œ๋ธŒ๋ฃจํ‹ด/๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์˜ˆ์˜๊ฒŒ ์ •๋ฆฌํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ( sub_1000D5AA ์„œ๋ธŒ๋ฃจํ‹ด๋ช…: mw_crc32)

 

 

๋‹ค์‹œ sub_1000E369 (mw_w_function_api_resolving) ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

mw_w_function_api_resolving (sub_1000E369)์˜ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด 13๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ sub_1000606C ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

sub_1000606C ์„œ๋ธŒ๋ฃจํ‹ด์— ๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

sub_1000606C ์„œ๋ธŒ๋ฃจํ‹ด์— ๋“ค์–ด์™€๋ณด๋‹ˆ ํƒ์ƒ‰๋˜์ง€ ์•Š์€ ๋ฐ”์ดํŠธ ์ฐธ์กฐ(unk_)๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์•”ํ˜ธํ™”๋œ ๋ฐ”์ดํŠธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋ฅผ ๋”๋ธ” ์›Œ๋“œ๋กœ ๋ณ€ํ™˜ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด dword๋“ค์ด CRC32 ํ•ด์‹œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

 

ํ•ด์‹œ ๋ฐ์ดํ„ฐ๋“ค์ด ์žˆ์œผ๋‹ˆ HashDB ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. HashDB๋ฅผ ํ†ตํ•ด ํŠน์ • ํ•ด์‹œ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € XOR ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Edit → Plugins → HashDB๋กœ ์ด๋™ํ•˜์—ฌ XOR ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Enable XOR๋ฅผ ํด๋ฆญํ•˜์—ฌ 218FE95B (mw_hashing_api ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ๋ณธ xor ํ‚ค)๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Refresh Algorithms๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ํ•ด์‹œ(1E4E54D6h)๋ฅผ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•ด์„œ HashDB Hunt Algorithm์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

์ƒ๊ฐํ•œ๋Œ€๋กœ crc32 ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํƒ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. crc32๋ฅผ ํด๋ฆญํ•˜์—ฌ OK๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

 

 

์ด์ œ ๋ฌธ์ž์—ด ํ•ด์‹œ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฒซ ๋ฒˆ์งธ ํ•ด์‹œ๋ฅผ ๋‹ค์‹œ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•˜์—ฌ HashDB Lookup์„ ํด๋ฆญํ•˜๋ฉด

 

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ํ•ด๋‹น ํ•ด์‹œ๊ฐ€ kernel32.dll์˜ LoadLibraryA ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

์ด ๋ชจ๋“  ํ•ด์‹œ๋Š” ๋™์ผํ•œ ๋ชจ๋“ˆ์˜ CRC32 ํ•ด์‹œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํ•ด์‹œ(dword_1001BA30 ๋ฐ์ดํ„ฐ)๋ฅผ IDA ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ฐ€์ ธ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ํ•ด์‹œ๋ฅผ ์„ ํƒํ•˜์—ฌ HashDB Scan IAT๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

 

์Šค์บ”์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์บ” ๊ฒฐ๊ณผ ์ผ๋ถ€

 

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ชจ๋“  ํ•ด์‹œ ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ .rdata ์„น์…˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์Šค์บ”ํ•œ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์˜ API ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ฐพ์•„์„œ ๋ชจ๋“  ๋ฐ”์ดํŠธ ๋ธ”๋ก์„ ์„ ํƒํ•˜๊ณ (์ œ๋กœ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๊นŒ์ง€) ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•œ ํ›„ HuntDB Scan IAT๋ฅผ ์„ ํƒํ•˜์—ฌ ์Šค์บ” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ท€์ฐฎ์ง€๋งŒ∼

์•„๋ž˜๋Š” HuntDB Scan IAT๊ฐ€ ๋ชจ๋‘ ์™„๋ฃŒ๋œ (์ผ๋ถ€) ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. 

 

 

๋ชจ๋“  API ์ด๋ฆ„์„ ๋ณตํ˜ธํ™”ํ•˜์˜€์œผ๋‹ˆ ์ด์ œ ๊ฐ DLL์—์„œ API ๋ธ”๋ก์„ ์ €์žฅํ•  ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋กœ ๋ณตํ˜ธํ™”ํ•œ API๋“ค์€ ๋ชจ๋‘ kernel32.dll์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น API๋“ค์„ ๋ชจ๋‘ ์„ ํƒํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•œ ํ›„ Create struct from select๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ๊ฐ API๋“ค์— ๋Œ€ํ•ด ๋™์ผํ•˜๊ฒŒ ์ž‘์—…ํ•ด์ค๋‹ˆ๋‹ค. 

๊ทธ๋Ÿฐ ๋‹ค์Œ Strucrtures ํƒญ์—์„œ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๋‹ค์‹œ sub_1000606C ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋Œ์•„์˜ค๋ฉด ํ•ด์‹œ ๋ฐ์ดํ„ฐ(dword) ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€์ ์œผ๋กœ sub_1000606C ์„œ๋ธŒ๋ฃจํ‹ด๋ช…์„ mw_iat_construction์œผ๋กœ ๋ฐ”๊พธ๊ณ , ๋ณ€์ˆ˜๋ช…๋“ค๋„ ์ˆ˜์ •ํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์œ ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ด๋ ‡๊ฒŒ PE ํฌ๋งท์„ ์ถ”๊ฐ€ํ•˜๊ณ  API๋ฅผ ๋ชจ๋‘ ์ถ”์ถœ์„ ์™„๋ฃŒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€๋Š” ๋‹ค์Œ๋ฒˆ์— ์ด์–ด์„œ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

 

Ref. "Malware Analysis Series(MAS) – Article 2", Alexandre Borges