๐Ÿฆ  ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ ๊ตฌํ˜„: C ์–ธ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ณด์•ˆ ์—ฌํ–‰ ๐Ÿ›ก๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿฆ  ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ ๊ตฌํ˜„: C ์–ธ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ณด์•ˆ ์—ฌํ–‰ ๐Ÿ›ก๏ธ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฏธ๋ž˜์˜ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ์ฐพ์•„์™”์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๐Ÿ•ต๏ธโ€โ™‚๏ธ

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์ปดํ“จํ„ฐ ๋ฐ”์ด๋Ÿฌ์Šค๋ผ๊ณ  ํ•˜๋ฉด ๋ฌด์—‡์ด ๋– ์˜ค๋ฅด๋‚˜์š”? ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ปดํ“จํ„ฐ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ๋Š” ๋ฌด์„œ์šด ์กด์žฌ๋ผ๊ณ  ์ƒ๊ฐํ•  ๊ฑฐ์˜ˆ์š”. ํ•˜์ง€๋งŒ ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ฐ”์ด๋Ÿฌ์Šค์™€ ๋งž์„œ ์‹ธ์šฐ๋Š” ์˜์›…, ๋ฐ”๋กœ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฒ๋‹ˆ๋‹ค! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

์ด ์—ฌ์ •์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ปดํ“จํ„ฐ ๋ณด์•ˆ์˜ ์„ธ๊ณ„๋กœ ์ฒซ ๋ฐœ์„ ๋‚ด๋”›๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ์ž, ๊ทธ๋Ÿผ ์šฐ๋ฆฌ์˜ ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฝ”๋”ฉ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ” ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์—, ๋จผ์ € ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์–ด์š”. ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์ด๋‚˜ ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์•…์„ฑ ์†Œํ”„ํŠธ์›จ์–ด(๋ฉ€์›จ์–ด)์˜ ์กด์žฌ๋ฅผ ํƒ์ง€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๐Ÿฆ ๐Ÿšซ

์‹ค์ œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์ •๊ตํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜ ๊ทธ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๋ฒ„์ „์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์˜ ๊ธฐ์ดˆ๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜Š

๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ:

  • ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒ€์‚ฌ
  • ์•Œ๋ ค์ง„ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€
  • ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ–‰๋™ ํŒจํ„ด ๋ถ„์„
  • ๊ฐ์—ผ๋œ ํŒŒ์ผ ๊ฒฉ๋ฆฌ ๋˜๋Š” ์‚ญ์ œ
  • ์‹ค์‹œ๊ฐ„ ๋ณดํ˜ธ ๊ธฐ๋Šฅ

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ์ด ์ค‘์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒ€์‚ฌ์™€ ์•Œ๋ ค์ง„ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ ๊ธฐ๋Šฅ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฑฐ์˜ˆ์š”. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๋‚˜์•„๊ฐ€ ๋ณต์žกํ•œ ๋ณด์•ˆ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์งˆ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๐Ÿ‘

๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ ์ž‘๋™ ์›๋ฆฌ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ ์ž‘๋™ ์›๋ฆฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ์Šค์บ๋„ˆ ๊ฒฐ๊ณผ ๋ณด๊ณ 

์ด ๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ฒ€์‚ฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•œ ํ›„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฐ„๋‹จํ•œ ์Šค์บ๋„ˆ๋„ ์ด์™€ ๋น„์Šทํ•œ ๊ณผ์ •์„ ๋”ฐ๋ฅด๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? ๐Ÿ–ฅ๏ธ

๐Ÿ› ๏ธ C ์–ธ์–ด๋กœ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ ๊ตฌํ˜„ํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ ์Šค์บ๋„ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”:

  • ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฒ€์‚ฌ
  • ๊ฐ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ๋น„๊ต
  • ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ

์ด์ œ ๋‹จ๊ณ„๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? ๐Ÿง‘โ€๐Ÿ’ป

1. ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ ํฌํ•จํ•˜๊ธฐ

๋จผ์ € ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ๋“ค์„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•ด์š”. ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋‹ค๋ฃจ๊ณ , ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ๋“ค์ด์—์š”.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
  

๊ฐ ํ—ค๋” ํŒŒ์ผ์˜ ์—ญํ• ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • stdio.h: ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • stdlib.h: ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ๋‚œ์ˆ˜ ์ƒ์„ฑ ๋“ฑ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • string.h: ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • dirent.h: ๋””๋ ‰ํ† ๋ฆฌ ํƒ์ƒ‰์— ํ•„์š”ํ•œ ํ•จ์ˆ˜์™€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • sys/stat.h: ํŒŒ์ผ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ํ—ค๋” ํŒŒ์ผ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํƒ์ƒ‰ํ•˜๊ณ  ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜Š

2. ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ •์˜ํ•˜๊ธฐ

์‹ค์ œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ์ˆ˜์ฒœ, ์ˆ˜๋งŒ ๊ฐœ์˜ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฐ„๋‹จํ•œ ์Šค์บ๋„ˆ์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋งŒ ์‚ฌ์šฉํ•  ๊ฑฐ์˜ˆ์š”.


#define MAX_SIGNATURES 5
#define SIGNATURE_LENGTH 20

const char virus_signatures[MAX_SIGNATURES][SIGNATURE_LENGTH] = {
    "X5O!P%@AP[4\\PZX54(P^)",
    "EICAR-STANDARD-ANTIVIRUS-TEST-FILE",
    "VIRUS_SIGNATURE_1",
    "MALWARE_PATTERN_2",
    "TROJAN_HORSE_3"
};
  

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” 5๊ฐœ์˜ ๊ฐ€์ƒ์˜ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ •์˜ํ–ˆ์–ด์š”. ์‹ค์ œ๋กœ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” EICAR ํ…Œ์ŠคํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ธ๋ฐ, ์ด๋Š” ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฌดํ•ดํ•œ ํŒŒ์ผ์ด์—์š”. ๋‚˜๋จธ์ง€๋Š” ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ๊ฐ€์ƒ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์ž…๋‹ˆ๋‹ค.

๐Ÿšจ ์ฃผ์˜: ์‹ค์ œ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์˜ˆ์ œ๋Š” ๊ต์œก ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ์‹ค์ œ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3. ํŒŒ์ผ ๊ฒ€์‚ฌ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด์ œ ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”. ์ด ํ•จ์ˆ˜๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ๋น„๊ตํ•  ๊ฑฐ์˜ˆ์š”.


int scan_file(const char *filename) {
    FILE *file = fopen(filename, "rb");
    if (file == NULL) {
        printf("ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: %s\n", filename);
        return -1;
    }

    char buffer[1024];
    size_t bytesRead;
    int found = 0;

    while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
        for (int i = 0; i < MAX_SIGNATURES; i++) {
            if (strstr(buffer, virus_signatures[i]) != NULL) {
                printf("๊ฒฝ๊ณ : ํŒŒ์ผ %s์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐœ๊ฒฌ: %s\n", filename, virus_signatures[i]);
                found = 1;
                break;
            }
        }
        if (found) break;
    }

    fclose(file);
    return found;
}
  

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ด์š”:

  1. ํŒŒ์ผ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ์—ฝ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ 1024๋ฐ”์ดํŠธ์”ฉ ์ฝ์–ด๋“ค์ž…๋‹ˆ๋‹ค.
  3. ์ฝ์–ด๋“ค์ธ ๋‚ด์šฉ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  4. ๋ฐ”์ด๋Ÿฌ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๊ฒ€์‚ฌ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  5. ํŒŒ์ผ์„ ๋‹ซ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๊ฒ€์‚ฌ ๋ฐฉ๋ฒ•์ด์—์š”. ์‹ค์ œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ฃ .

4. ๋””๋ ‰ํ† ๋ฆฌ ํƒ์ƒ‰ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด์ œ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”. ์ด ํ•จ์ˆ˜๋Š” ์žฌ๊ท€์ ์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์–ด์š”.


void scan_directory(const char *path) {
    DIR *dir;
    struct dirent *entry;
    char full_path[1024];

    dir = opendir(path);
    if (dir == NULL) {
        printf("๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: %s\n", path);
        return;
    }

    while ((entry = readdir(dir)) != NULL) {
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name);

        struct stat path_stat;
        stat(full_path, &path_stat);

        if (S_ISREG(path_stat.st_mode)) {
            printf("ํŒŒ์ผ ๊ฒ€์‚ฌ ์ค‘: %s\n", full_path);
            scan_file(full_path);
        } else if (S_ISDIR(path_stat.st_mode)) {
            printf("๋””๋ ‰ํ† ๋ฆฌ ๊ฒ€์‚ฌ ์ค‘: %s\n", full_path);
            scan_directory(full_path);
        }
    }

    closedir(dir);
}
  

์ด ํ•จ์ˆ˜์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. ์ง€์ •๋œ ๊ฒฝ๋กœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  2. ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๊ฐ ํ•ญ๋ชฉ(ํŒŒ์ผ ๋˜๋Š” ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ)์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  3. ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ(".")์™€ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ("..")๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
  4. ๊ฐ ํ•ญ๋ชฉ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. ํ•ญ๋ชฉ์ด ํŒŒ์ผ์ธ ๊ฒฝ์šฐ scan_file ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  6. ํ•ญ๋ชฉ์ด ๋””๋ ‰ํ† ๋ฆฌ์ธ ๊ฒฝ์šฐ ์žฌ๊ท€์ ์œผ๋กœ scan_directory ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋น ์ง์—†์ด ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋“ค์ด ํ˜‘๋ ฅํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ์˜ ํ•จ์ˆ˜๋“ค๋„ ์„œ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿค

5. ๋ฉ”์ธ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ์˜ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋ฉ”์ธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("์‚ฌ์šฉ๋ฒ•: %s <๊ฒ€์‚ฌํ•  ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ>\n", argv[0]);
        return 1;
    }

    printf("๋ฐ”์ด๋Ÿฌ์Šค ๊ฒ€์‚ฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค...\n");
    scan_directory(argv[1]);
    printf("๊ฒ€์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n");

    return 0;
}
  

์ด ๋ฉ”์ธ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋ช…๋ น์ค„ ์ธ์ž๋กœ ๊ฒ€์‚ฌํ•  ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  2. ์ธ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ œ๊ณต๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์‚ฌ์šฉ๋ฒ•์„ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒ€์‚ฌ ์‹œ์ž‘ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  4. scan_directory ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒ€์‚ฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฒ€์‚ฌ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ์˜ ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๊ฐ€ ์™„์„ฑ๋˜์—ˆ์–ด์š”! ๐ŸŽ‰

๐Ÿ’ก ํŒ: ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์–ด์š”:


gcc virus_scanner.c -o virus_scanner
./virus_scanner /path/to/scan
    

์—ฌ๊ธฐ์„œ /path/to/scan์€ ๊ฒ€์‚ฌํ•˜๊ณ  ์‹ถ์€ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ด ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ์‹ค์ œ ์•ˆํ‹ฐ๋ฐ”์ด๋Ÿฌ์Šค ์†Œํ”„ํŠธ์›จ์–ด์— ๋น„ํ•˜๋ฉด ๋งค์šฐ ๊ธฐ๋ณธ์ ์ด์ง€๋งŒ, ๋ฐ”์ด๋Ÿฌ์Šค ๊ฒ€์ถœ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์šฐ๋“ฏ์ด, ์šฐ๋ฆฌ๋„ ์ด๋ ‡๊ฒŒ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ ์  ๋” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๐Ÿ˜Š

๐Ÿš€ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ์˜ ๊ฐœ์„  ๋ฐฉํ–ฅ

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋งŒ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ์•ˆํ‹ฐ๋ฐ”์ด๋Ÿฌ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์ •๊ตํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ . ์šฐ๋ฆฌ์˜ ์Šค์บ๋„ˆ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”?

1. ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์„ 

ํ˜„์žฌ ์šฐ๋ฆฌ์˜ ์Šค์บ๋„ˆ๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํƒ์ง€ํ•˜๊ณ  ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ฐ”์ด๋Ÿฌ์Šค ์ œ์ž‘์ž๋“ค์ด ์‰ฝ๊ฒŒ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์ƒˆ๋กœ์šด ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํƒ์ง€ํ•˜๊ธฐ ์–ด๋ ค์›Œ์š”.
  • ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์š”.

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

๊ฐœ์„  ๋ฐฉ์•ˆ:

  • ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์‚ฌ์šฉ
  • ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ด์šฉํ•œ ํŒจํ„ด ๋งค์นญ
  • ๊ธฐ๊ณ„ ํ•™์Šต์„ ํ†ตํ•œ ๋™์  ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ƒ์„ฑ

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”:


#include <openssl/sha.h>

// ํŒŒ์ผ์˜ SHA-256 ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
void calculate_file_hash(const char *filename, unsigned char hash[SHA256_DIGEST_LENGTH]) {
    FILE *file = fopen(filename, "rb");
    if (!file) return;

    SHA256_CTX sha256;
    SHA256_Init(&sha256);

    const int bufSize = 32768;
    unsigned char *buffer = malloc(bufSize);
    int bytesRead = 0;

    while((bytesRead = fread(buffer, 1, bufSize, file))) {
        SHA256_Update(&sha256, buffer, bytesRead);
    }

    SHA256_Final(hash, &sha256);

    fclose(file);
    free(buffer);
}

// ํ•ด์‹œ์™€ ์•Œ๋ ค์ง„ ์•…์„ฑ ํŒŒ์ผ ํ•ด์‹œ๋ฅผ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜
int is_malicious_file(unsigned char hash[SHA256_DIGEST_LENGTH]) {
    // ์•Œ๋ ค์ง„ ์•…์„ฑ ํŒŒ์ผ์˜ ํ•ด์‹œ ๋ชฉ๋ก
    const char *known_malicious_hashes[] = {
        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        // ๋” ๋งŽ์€ ํ•ด์‹œ ์ถ”๊ฐ€...
    };

    char hash_string[SHA256_DIGEST_LENGTH*2+1];
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
        sprintf(&hash_string[i*2], "%02x", hash[i]);

    for(int i = 0; i < sizeof(known_malicious_hashes)/sizeof(known_malicious_hashes[0]); i++) {
        if(strcmp(hash_string, known_malicious_hashes[i]) == 0)
            return 1;
    }

    return 0;
}
  

์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๋Œ€์‹  ํ•ด์‹œ๊ฐ’์„ ๋น„๊ตํ•˜๋ฏ€๋กœ ๋” ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ์กฐ์–ธ์„ ๋ฐ›์•„ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜Š

2. ํœด๋ฆฌ์Šคํ‹ฑ ๋ถ„์„ ๋„์ž…

์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ธฐ๋ฐ˜ ํƒ์ง€๋งŒ์œผ๋กœ๋Š” ์ƒˆ๋กœ์šด ํ˜•ํƒœ์˜ ์•…์„ฑ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์š”. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ํœด๋ฆฌ์Šคํ‹ฑ ๋ถ„์„์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํœด๋ฆฌ์Šคํ‹ฑ ๋ถ„์„์€ ํŒŒ์ผ์˜ ํ–‰๋™์ด๋‚˜ ํŠน์„ฑ์„ ๋ถ„์„ํ•˜์—ฌ ์•…์„ฑ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ๋“ค์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์‹œ์Šคํ…œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ˆ˜์ • ์‹œ๋„
  • ํŠน์ • ๋„คํŠธ์›Œํฌ ํฌํŠธ๋กœ์˜ ์—ฐ๊ฒฐ ์‹œ๋„
  • ์ž๊ธฐ ๋ณต์ œ ํ–‰์œ„
  • ์•”ํ˜ธํ™”๋œ ์ฝ”๋“œ ์„น์…˜์˜ ์กด์žฌ

์ด๋ฅผ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:


int heuristic_check(const char *filename) {
    FILE *file = fopen(filename, "rb");
    if (!file) return 0;

    char buffer[1024];
    size_t bytesRead;
    int suspicion_level = 0;

    while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
        // ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋ฌธ์ž์—ด ์ฒดํฌ
        if (strstr(buffer, "CreateRemoteThread")) suspicion_level++;
        if (strstr(buffer, "VirtualAlloc")) suspicion_level++;
        if (strstr(buffer, "WriteProcessMemory")) suspicion_level++;

        // ์•”ํ˜ธํ™”๋œ ์„น์…˜ ์ฒดํฌ (์˜ˆ์‹œ: ๋†’์€ ์—”ํŠธ๋กœํ”ผ)
        if (calculate_entropy(buffer, bytesRead) > 7.5) suspicion_level++;
    }

    fclose(file);

    return (suspicion_level > 3); // ์˜์‹ฌ ์ˆ˜์ค€์ด ์ž„๊ณ„๊ฐ’์„ ๋„˜์œผ๋ฉด ์•…์„ฑ์œผ๋กœ ๊ฐ„์ฃผ
}
  

์ด ํ•จ์ˆ˜๋Š” ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์˜์‹ฌ์Šค๋Ÿฌ์šด API ํ˜ธ์ถœ์ด๋‚˜ ์•”ํ˜ธํ™”๋œ ์„น์…˜์˜ ์กด์žฌ๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์ด๋ฉฐ, ์‹ค์ œ ์•ˆํ‹ฐ๋ฐ”์ด๋Ÿฌ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์ •๊ตํ•œ ํœด๋ฆฌ์Šคํ‹ฑ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3. ์ƒŒ๋“œ๋ฐ•์Šค ๋ถ„์„ ์ถ”๊ฐ€

๋” ๋‚˜์•„๊ฐ€, ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒŒ์ผ์„ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ(์ƒŒ๋“œ๋ฐ•์Šค)์—์„œ ์‹คํ–‰ํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์–ด์š”. ์ด๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์˜ ์‹ค์ œ ๋™์ž‘์„ ๊ด€์ฐฐํ•˜๊ณ  ์•…์„ฑ ์—ฌ๋ถ€๋ฅผ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒŒ๋“œ๋ฐ•์Šค ๋ถ„์„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋ณต์žกํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

  1. ๊ฐ€์ƒ ํ™˜๊ฒฝ ์„ค์ •: ์•ˆ์ „ํ•œ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒŒ์ผ ์‹คํ–‰: ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ–‰๋™ ๋ชจ๋‹ˆํ„ฐ๋ง: ํŒŒ์ผ์˜ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ, ๋„คํŠธ์›Œํฌ ํ™œ๋™, ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ ๋“ฑ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ถ„์„: ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์•…์„ฑ ํ–‰์œ„๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ณด๊ณ ์„œ ์ƒ์„ฑ: ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ C๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•˜์ง€๋งŒ, ๊ธฐ์กด์˜ ์ƒŒ๋“œ๋ฐ•์Šค ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, Cuckoo Sandbox์™€ ๊ฐ™์€ ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int run_in_sandbox(const char *filename) {
    char command[256];
    snprintf(command, sizeof(command), "cuckoo submit %s", filename);
    
    FILE *fp = popen(command, "r");
    if (fp == NULL) {
        printf("์ƒŒ๋“œ๋ฐ•์Šค ์‹คํ–‰ ์‹คํŒจ\n");
        return -1;
    }

    char output[1024];
    while (fgets(output, sizeof(output), fp) != NULL) {
        printf("%s", output);
    }

    int status = pclose(fp);
    return status;
}
  

์ด ํ•จ์ˆ˜๋Š” Cuckoo Sandbox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” ์ด ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์•…์„ฑ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ์‹ค์‹œ๊ฐ„ ๋ณดํ˜ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์Šค์บ๋„ˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ๋งŒ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ์•ˆํ‹ฐ๋ฐ”์ด๋Ÿฌ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹œ์Šคํ…œ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šด์˜ ์ฒด์ œ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ๋ฅผ ํ›„ํ‚นํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

Windows ์‹œ์Šคํ…œ์„ ์˜ˆ๋กœ ๋“ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:


#include <windows.h>

VOID CALLBACK FileIOCompletionRoutine(
    DWORD dwErrorCode,
    DWORD dwNumberOfBytesTransfered,
    LPOVERLAPPED lpOverlapped)
{
    // ํŒŒ์ผ I/O ์™„๋ฃŒ ํ›„ ์ฒ˜๋ฆฌ
}

int start_real_time_protection() {
    HANDLE hDir = CreateFile("C:\\",
                             FILE_LIST_DIRECTORY,
                             FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                             NULL,
                             OPEN_EXISTING,
                             FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
                             NULL);

    if (hDir == INVALID_HANDLE_VALUE) {
        printf("๋””๋ ‰ํ† ๋ฆฌ ํ•ธ๋“ค ์ƒ์„ฑ ์‹คํŒจ\n");
        return -1;
    }

    char buffer[1024];
    DWORD bytesReturned;
    OVERLAPPED overlapped;

    while (TRUE) {
        ReadDirectoryChangesW(
            hDir,
            &buffer,
            sizeof(buffer),
            TRUE,
            FILE_NOTIFY_CHANGE_FILE_NAME |
            FILE_NOTIFY_CHANGE_DIR_NAME |
            FILE_NOTIFY_CHANGE_ATTRIBUTES |
            FILE_NOTIFY_CHANGE_SIZE |
            FILE_NOTIFY_CHANGE_LAST_WRITE |
            FILE_NOTIFY_CHANGE_SECURITY,
            &bytesReturned,
            &overlapped,
            FileIOCompletionRoutine);

        // ์—ฌ๊ธฐ์„œ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰
    }

    CloseHandle(hDir);
    return 0;
}
  

์ด ์ฝ”๋“œ๋Š” ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„

๋งŽ์€ ํ˜„๋Œ€์ ์ธ ์•…์„ฑ์ฝ”๋“œ๋“ค์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ๋ฐ›๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœ์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณด์•ˆ์„ ํ•œ์ธต ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

libpcap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ์บก์ฒ˜ ๋ฐ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:


#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

void packet_handler(u_char *user_data, const struct pcap_pkthdr *pkthdr, const u_char *packet) {
    struct ip *ip_header;
    struct tcphdr *tcp_header;
    
    ip_header = (struct ip*)(packet + 14); // ์ด๋”๋„ท ํ—ค๋” ๊ฑด๋„ˆ๋›ฐ๊ธฐ
    
    if (ip_header->ip_p == IPPROTO_TCP) {
        tcp_header = (struct tcphdr*)(packet + 14 + ip_header->ip_hl*4);
        
        printf("Source IP: %s\n", inet_ntoa(ip_header->ip_src));
        printf("Destination IP: %s\n", inet_ntoa(ip_header->ip_dst));
        printf("Source Port: %d\n", ntohs(tcp_header->th_sport));
        printf("Destination Port: %d\n", ntohs(tcp_header->th_dport));
        
        // ์—ฌ๊ธฐ์„œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒจํ„ด ์ฒดํฌ
        // ์˜ˆ: ์•Œ๋ ค์ง„ C&C ์„œ๋ฒ„ IP, ์˜์‹ฌ์Šค๋Ÿฌ์šด ํฌํŠธ ๋ฒˆํ˜ธ ๋“ฑ
    }
}

int start_network_monitoring() {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    
    handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf);
    if (handle == NULL) {
        fprintf(stderr, "pcap_open_live() failed: %s\n", errbuf);
        return -1;
    }
    
    pcap_loop(handle, -1, packet_handler, NULL);
    
    pcap_close(handle);
    return 0;
}
  

์ด ์ฝ”๋“œ๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ , TCP ํŒจํ‚ท์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” ์ด ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋„คํŠธ์›Œํฌ ํ™œ๋™์„ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒŸ Pro Tip: ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„์€ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‹ค์ œ ์ œํ’ˆ์— ์ ์šฉํ•  ๋•Œ๋Š” ๋ฒ•์ , ์œค๋ฆฌ์  ๊ณ ๋ ค์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽ“ ๊ฒฐ๋ก  ๋ฐ ํ•™์Šต ํฌ์ธํŠธ

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณด์•˜์–ด์š”. ์ด ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ ๋“ค์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค:

  1. ๊ธฐ๋ณธ ์›๋ฆฌ์˜ ์ดํ•ด: ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ์˜ ๊ธฐ๋ณธ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
  2. ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ, ๋””๋ ‰ํ† ๋ฆฌ ํƒ์ƒ‰ ๋“ฑ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ์ตํ˜”์Šต๋‹ˆ๋‹ค.
  3. ๋ณด์•ˆ ๊ฐœ๋…: ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ธฐ๋ฐ˜ ํƒ์ง€, ํœด๋ฆฌ์Šคํ‹ฑ ๋ถ„์„, ์ƒŒ๋“œ๋ฐ•์‹ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๊ฐœ๋…์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.
  4. ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๊ธฐ๋ณธ์ ์ธ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๋ถ„์„ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
  5. ์ตœ์ ํ™”์™€ ์„ฑ๋Šฅ: ๋Œ€๋Ÿ‰์˜ ํŒŒ์ผ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ ๊ตฌํ˜„์„ ๋„˜์–ด์„œ, ์‹œ์Šคํ…œ ๋ณด์•ˆ์˜ ๊ธฐ์ดˆ๋ฅผ ์ดํ•ดํ•˜๋Š” ์ข‹์€ ์‹œ์ž‘์ ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์•ˆํ‹ฐ๋ฐ”์ด๋Ÿฌ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์ •๊ตํ•˜์ง€๋งŒ, ์ด ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค์„ ํ™•์žฅํ•˜๊ณ  ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐ€๋ฉด ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—๋Š” ํฐ ์ฑ…์ž„์ด ๋”ฐ๋ฅธ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์ฃผ์„ธ์š”. ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ์ •๋ณด์™€ ์‹œ์Šคํ…œ ์•ˆ์ „์„ ์ง€ํ‚ค๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•ญ์ƒ ์ตœ์‹  ๋ณด์•ˆ ๋™ํ–ฅ์„ ํ•™์Šตํ•˜๊ณ , ์œค๋ฆฌ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์ด ์ปดํ“จํ„ฐ ๋ณด์•ˆ์˜ ์„ธ๊ณ„์— ํฅ๋ฏธ๋ฅผ ๋Š๋ผ๊ณ , ๋” ๊นŠ์ด ์žˆ๋Š” ํ•™์Šต์„ ์ด์–ด๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋ณด์•ˆ ๋ถ„์•ผ์—์„œ๋„ ๋Š์ž„์—†์ด ํ•™์Šตํ•˜๊ณ  ๋ฐœ์ „ํ•ด ๋‚˜๊ฐ€์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ๊ณผ ๋…ธ๋ ฅ์ด ๋” ์•ˆ์ „ํ•œ ๋””์ง€ํ„ธ ์„ธ์ƒ์„ ๋งŒ๋“œ๋Š” ๋ฐ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿš€๐Ÿ”’

๐Ÿ’ก ๋‹ค์Œ ๋‹จ๊ณ„: ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ๋ฐœ์ „๋œ ๋ณด์•ˆ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด:

  • ๋จธ์‹  ๋Ÿฌ๋‹์„ ํ™œ์šฉํ•œ ์•…์„ฑ์ฝ”๋“œ ํƒ์ง€ ์‹œ์Šคํ…œ
  • ๋„คํŠธ์›Œํฌ ์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ (IDS)
  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ (WAF)

์ด๋Ÿฐ ํ”„๋กœ์ ํŠธ๋“ค์„ ํ†ตํ•ด ๋” ๊นŠ์ด ์žˆ๋Š” ๋ณด์•ˆ ์ง€์‹๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ์Šต๋“ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!