<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EC%9D%B4%EC%98%81%ED%98%B8%2F%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EF%BC%831</id>
	<title>이영호/미니프로젝트＃1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EC%9D%B4%EC%98%81%ED%98%B8%2F%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EF%BC%831"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EC%9D%B4%EC%98%81%ED%98%B8/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EF%BC%831&amp;action=history"/>
	<updated>2026-05-15T10:29:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EC%9D%B4%EC%98%81%ED%98%B8/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EF%BC%831&amp;diff=66658&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:30, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EC%9D%B4%EC%98%81%ED%98%B8/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EF%BC%831&amp;diff=66658&amp;oldid=prev"/>
		<updated>2021-02-07T05:30:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; 소규모 프로젝트를 진행 하려 한다.&lt;br /&gt;
 예상 라인수는 2000~3000 라인 정도이며 프로젝트를 더 커질수록 라인수의 가변성 또한 존재한다.&lt;br /&gt;
 &lt;br /&gt;
 // 한가지 웃긴것은 C++로 짜면 C와 동일한 기능을 가졌음에도 라인의 수가 3배 이상 늘어난다는 것이다.&lt;br /&gt;
 // 6000~9000라인 정도 되려나...&lt;br /&gt;
 // 그런데 더 웃긴것은 C++에 숙달되면 C보다 0.8배 정도로 시간이 단축된다는 것이다.&lt;br /&gt;
 // 클래스의 상속성으로 인해 기존의 클래스를 고치지 않아서 인것 같다.&lt;br /&gt;
 &lt;br /&gt;
 만들것 : IRC bot&lt;br /&gt;
 목적 : irc에 접속해 있는 유저들을 자동적으로 공격하는 프로그램. &amp;amp;amp; 차후 AI(망할 엉터리 AI 패러다임) bot이나 타자봇을 집어넣을 예정&lt;br /&gt;
 OS : Linux 체제&lt;br /&gt;
 Language : C &amp;amp;amp; Linux System Function&lt;br /&gt;
 &lt;br /&gt;
 방법론 : 프로세스를 여러개 만들어 비교적 프로그램이 쉬워지게 만든다.&lt;br /&gt;
 주의점 : Zombie Process를 만들지 않도록 System Call 을 잘 관리한다.&lt;br /&gt;
 &lt;br /&gt;
 1. Client Console에 메세지를 입력하면 IRC Server로 문자열을 전송한다. -&amp;amp;gt; Main Process&lt;br /&gt;
 2. 서버로부터 메세지 중 PING 부분 처리 -&amp;amp;gt; 1번째 Child Process&lt;br /&gt;
 3. 서버의 메세지 중 타유저들이 명령하는 것 처리 -&amp;amp;gt; 2번째 Chile Process&lt;br /&gt;
  (3번에서 Master가 누군지 알아보게 하는 것 -&amp;amp;gt; Private 메세지로 패스워드를 넘겨 IP를 인증 받는 방식.)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 main.c -&amp;amp;gt; IRC Server로 메세지를 보내는 역할을 하고 자식 프로세스를 생성한다.&lt;br /&gt;
 parse.c -&amp;amp;gt; IRC Server로 부터 오는 메세지를 파싱한다.&lt;br /&gt;
 file.c -&amp;amp;gt; 파일 입출력을 다루는 함수와 메세지들을 Log하는 부분을 담당한다. 일단 프로그램을 어느 정도 만들고 구현하도록한다.&lt;br /&gt;
 request.c -&amp;amp;gt; IRC Server로 부터 날아오는 PING에 대한 PONG 처리.&lt;br /&gt;
 bot.c -&amp;amp;gt; 봇에 관한 함수. &lt;br /&gt;
 attack_#.c(# == 임의의 숫자) -&amp;amp;gt; 공격 함수. 요즘 보안홀들을 체크하여 보안홀들을 공격하는 함수들을 집어넣자.&lt;br /&gt;
 // 향후 프로그램이 커지면 네트워크 부분은 따로 모듈을 만들어 낸다.&lt;br /&gt;
 connect.c -&amp;amp;gt; 네트워크 부분.    // 아마 커진것 같다.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 (2일에 한번씩 컴퓨터를 사용하므로...)&lt;br /&gt;
 우선 구현할 부분 : main의 일부, parse의 PING 처리부분, request 부분&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 나중에 아랫부분만 컴파일 해보자. 컴파일러가 없다! 에러가 나올지 모른다.&lt;br /&gt;
 // signal은 나중에.&lt;br /&gt;
 // fork 부분만 구현한다.&lt;br /&gt;
&lt;br /&gt;
 // 구분하지 않은 파일. 이 파일을 각 파일로 나눈다.&lt;br /&gt;
 // 심심해서 짜본걸 여기에 적음.&lt;br /&gt;
 // 자동으로 #linux 채널까지 접속 됨.&lt;br /&gt;
 // 각파일로 나눈 차후 채널로의 privmsg와 process call을 mirc처럼 분리해서 넣어야함.&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdlib.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;sys/wait.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;sys/types.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;sys/socket.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;netdb.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;unistd.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;arpa/inet.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define MSG_MAX 1024&lt;br /&gt;
 #define NICK    &amp;quot;whoami_&amp;quot;&lt;br /&gt;
 #define HOST    &amp;quot;irc.hanirc.org&amp;quot;&lt;br /&gt;
 #define PORT    &amp;quot;6667&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 void error_handling(char *msg);&lt;br /&gt;
 void handler(int sig);&lt;br /&gt;
 &lt;br /&gt;
 typedef struct _info{&lt;br /&gt;
         char *nick;&lt;br /&gt;
         char *host;&lt;br /&gt;
         char *port;&lt;br /&gt;
         char *user_name;&lt;br /&gt;
         char *user_whois1;&lt;br /&gt;
         char *user3;&lt;br /&gt;
         char *user_whois2;&lt;br /&gt;
 } INFO;&lt;br /&gt;
 &lt;br /&gt;
 INFO info = {NICK, HOST, PORT, &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;};&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char *argv[])&lt;br /&gt;
 {&lt;br /&gt;
         int sockfd;&lt;br /&gt;
         struct sockaddr_in ina;&lt;br /&gt;
         struct sigaction act;&lt;br /&gt;
         struct hostent *h;&lt;br /&gt;
         pid_t pid;&lt;br /&gt;
         char msg[MSG_MAX];&lt;br /&gt;
         int msg_len;&lt;br /&gt;
         char check_ping[7];&lt;br /&gt;
         char pong[11];&lt;br /&gt;
         int join_flag = 0;&lt;br /&gt;
 &lt;br /&gt;
         sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);&lt;br /&gt;
         if(sockfd == -1)&lt;br /&gt;
                 error_handling(&amp;quot;socket() error: sockfd&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         h = gethostbyname(info.host);&lt;br /&gt;
 &lt;br /&gt;
         memset(&amp;amp;amp;ina, 0, sizeof(ina));&lt;br /&gt;
         ina.sin_family = AF_INET;&lt;br /&gt;
         ina.sin_addr = *(struct in_addr *)h-&amp;amp;gt;h_addr_list[0];&lt;br /&gt;
         ina.sin_port = htons(atoi(info.port));&lt;br /&gt;
 &lt;br /&gt;
         if(connect(sockfd, (struct sockaddr *)&amp;amp;amp;ina, sizeof(ina)) == -1)&lt;br /&gt;
                 error_handling(&amp;quot;connect() error: &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         act.sa_handler = handler;&lt;br /&gt;
         sigemptyset(&amp;amp;amp;act.sa_mask);&lt;br /&gt;
         act.sa_flags = 0;&lt;br /&gt;
 &lt;br /&gt;
         sigaction(SIGCHLD, &amp;amp;amp;act, 0);&lt;br /&gt;
 &lt;br /&gt;
         pid = fork();&lt;br /&gt;
 &lt;br /&gt;
         if(pid == -1)&lt;br /&gt;
                 error_handling(&amp;quot;fork() error: &amp;quot;);&lt;br /&gt;
         else if(pid == 0){&lt;br /&gt;
                 while(1){&lt;br /&gt;
                         msg_len = recv(sockfd, msg, MSG_MAX-1, 0);&lt;br /&gt;
                         if(msg_len &amp;amp;gt; 0){&lt;br /&gt;
                                                                 msg[msg_len] = &amp;#039;&amp;#039;;&lt;br /&gt;
                                 printf(msg);&lt;br /&gt;
                                                 }&lt;br /&gt;
 &lt;br /&gt;
                         if(strstr(msg, &amp;quot;NOTICE AUTH :*** Checking Ident&amp;quot;) != NULL){&lt;br /&gt;
                                 sleep(1);&lt;br /&gt;
                                 sprintf(msg, &amp;quot;user %s %s %s %sn&amp;quot;, info.user_name, info.user_whois1, info.user3, info.user_whois2);&lt;br /&gt;
                                 send(sockfd, msg, strlen(msg), 0);&lt;br /&gt;
                                 sprintf(msg, &amp;quot;NICK %sn&amp;quot;, info.nick);&lt;br /&gt;
                                 send(sockfd, msg, strlen(msg), 0);&lt;br /&gt;
                                 printf(&amp;quot;Connect Initialization Succeed!n&amp;quot;);&lt;br /&gt;
                         }&lt;br /&gt;
                         else{&lt;br /&gt;
                                 sscanf(msg, &amp;quot;%6c%s&amp;quot;,check_ping, pong);&lt;br /&gt;
 &lt;br /&gt;
                                 if(strncmp(check_ping, &amp;quot;PING :&amp;quot;, 6) == 0){&lt;br /&gt;
                                         sprintf(msg, &amp;quot;PONG %sn&amp;quot;, pong);&lt;br /&gt;
                                         send(sockfd, msg, strlen(msg), 0);&lt;br /&gt;
 &lt;br /&gt;
                                         if(join_flag == 0){&lt;br /&gt;
                                                 sleep(1);&lt;br /&gt;
                                                 join_flag = 1;&lt;br /&gt;
                                                 send(sockfd, &amp;quot;join #linuxn&amp;quot;, 12, 0);&lt;br /&gt;
                                         }&lt;br /&gt;
                                 }&lt;br /&gt;
                         }&lt;br /&gt;
 &lt;br /&gt;
                         msg[0] = &amp;#039;&amp;#039;;&lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
                 exit(0);&lt;br /&gt;
         }&lt;br /&gt;
         else{&lt;br /&gt;
                 fprintf(stderr, &amp;quot;Child Process Created!: pid = %dn&amp;quot;, pid);&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         while(1){&lt;br /&gt;
                 fgets(msg, MSG_MAX, stdin);&lt;br /&gt;
                 send(sockfd, msg, strlen(msg), 0);&lt;br /&gt;
 &lt;br /&gt;
                 if(strcmp(msg, &amp;quot;quitn&amp;quot;) == 0)&lt;br /&gt;
                         break;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         kill(0, SIGKILL);                // 부모가 종료하면 자식 프로세스 모두 종료한다.&lt;br /&gt;
 &lt;br /&gt;
         return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void error_handling(char *msg)&lt;br /&gt;
 {&lt;br /&gt;
         fprintf(stderr, &amp;quot;%sn&amp;quot;, msg);&lt;br /&gt;
         exit(-1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void handler(int sig)&lt;br /&gt;
 {&lt;br /&gt;
         pid_t pid;&lt;br /&gt;
         int last;&lt;br /&gt;
 &lt;br /&gt;
         pid = waitpid(-1, &amp;amp;amp;last, WNOHANG);&lt;br /&gt;
         fprintf(stderr, &amp;quot;Child Process Closed!: pid = %d, WEXITSTATUS = %Xn&amp;quot;, pid, WEXITSTATUS(last));&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>