🧼C, C++/자체제작 프로그램및 배포

파일 자가복제 C++ #1

Mawile 2020. 11. 5.
728x90

 

개발환경 >> DevCpp

언어 >> C++11

운영체제 >> Windows10

 

 


안녕하세요!

이번에는 C++에서 파일을 자가복제하는방법에 대해서

알려드리겠습니다.

파일자가복제는 웜,악성코드등등에서 쓰이는기능들입니다.

일단 이번에 소개드릴내용들은

예를들어서 현재 내가 작업하고 있는 c++파일의 이름이 "Main.cpp"이면 Main.cpp를 불러오고

"dp.cpp"이면은 dp.cpp를 불러오는 방법입니다!!

그럼.... 시작하겠습니다.....!


 

<<  소스코드  >>

#include <iostream>
#include <cstring>
using namespace std;

class fileName{
	private:
		string str;
		char ret[1000]={0};
		int index,i,cnt;
		
	public:
	char* none(){
		str = __FILE__;
		ret[1000]={0};
		cnt=0;
		
		while(1){
			index = str.find("\\");
			if(index==-1) break;
			for(i=0;i<=index;i++) str[i]='\0';
		}
		for(i=0;i<str.size();i++){
			if(str[i]=='\0') cnt++;
			else if(str[i]!='\0') ret[i-cnt]=str[i];
		}
		for(i=0;i<strlen(ret);i++)
			if(ret[i]=='.') {
				index=i;
				break;
		}
		for(i=index;i<strlen(ret);i++) ret[i]='\0';
		return ret;
	}
	char* origin(){
		str = __FILE__;
		ret[1000]={0};
		cnt=0;
			
		while(1){
			index = str.find("\\");
			if(index==-1) break;
			for(i=0;i<=index;i++) str[i]='\0';
		}
		for(i=0;i<str.size();i++){
			if(str[i]=='\0') cnt++;
			else if(str[i]!='\0') ret[i-cnt]=str[i];
		}
		return ret;
	}
	char* custom(const char* name){
		str = __FILE__;
		ret[1000]={0};
		cnt=0;
			
		while(1){
			index = str.find("\\");
			if(index==-1) break;
			for(i=0;i<=index;i++) str[i]='\0';
		}
		for(i=0;i<str.size();i++){
			if(str[i]=='\0') cnt++;
			else if(str[i]!='\0') ret[i-cnt]=str[i];
		}
		for(i=0;i<strlen(ret);i++)
			if(ret[i]=='.') {
				index=i;
				break;
			}
		for(i=index+1;i<strlen(ret);i++) ret[i]='\0';
		strcat(ret,name);
		return ret;
	}
};

int main(){
	fileName fn;
	cout << fn.none() << endl;
	cout << fn.origin() << endl;
	cout << fn.custom("exe");
}

저가 fileName이라는 클래스를 만들었습니다

멤버 함수는 none() , origin() , custom()입니다.

 

만약에 현재 내가 작업하고 있는 c++파일 이름이 "DP123.cpp"일 경우

none함수는 "DP123"을 반환합니다.

origin함수는 "DP123.cpp"를 반환합니다.

custom함수는 "DP123. 첫 번째 인자"를 반환합니다.

 

 

 

그러면 이걸 이용해서 자가복제 프로그램을 만들어보겠습니다

 

 

<<  응용(파일자가복제)  >>

#include <iostream>
#include <cstring>
using namespace std;

class fileName{
	private:
		string str;
		char ret[1000]={0};
		int index,i,cnt;
		
	public:
	char* none(){
		str = __FILE__;
		ret[1000]={0};
		cnt=0;
		
		while(1){
			index = str.find("\\");
			if(index==-1) break;
			for(i=0;i<=index;i++) str[i]='\0';
		}
		for(i=0;i<str.size();i++){
			if(str[i]=='\0') cnt++;
			else if(str[i]!='\0') ret[i-cnt]=str[i];
		}
		for(i=0;i<strlen(ret);i++)
			if(ret[i]=='.') {
				index=i;
				break;
		}
		for(i=index;i<strlen(ret);i++) ret[i]='\0';
		return ret;
	}
	char* origin(){
		str = __FILE__;
		ret[1000]={0};
		cnt=0;
			
		while(1){
			index = str.find("\\");
			if(index==-1) break;
			for(i=0;i<=index;i++) str[i]='\0';
		}
		for(i=0;i<str.size();i++){
			if(str[i]=='\0') cnt++;
			else if(str[i]!='\0') ret[i-cnt]=str[i];
		}
		return ret;
	}
	char* custom(const char* name){
		str = __FILE__;
		ret[1000]={0};
		cnt=0;
			
		while(1){
			index = str.find("\\");
			if(index==-1) break;
			for(i=0;i<=index;i++) str[i]='\0';
		}
		for(i=0;i<str.size();i++){
			if(str[i]=='\0') cnt++;
			else if(str[i]!='\0') ret[i-cnt]=str[i];
		}
		for(i=0;i<strlen(ret);i++)
			if(ret[i]=='.') {
				index=i;
				break;
			}
		for(i=index+1;i<strlen(ret);i++) ret[i]='\0';
		strcat(ret,name);
		return ret;
	}
};

int main(){
	fileName fn;
	char ret,copied[1000]={0};
	
	sprintf(copied,"copied_%s",fn.custom("exe"));
	FILE *pfile1 = fopen(fn.custom("exe"),"rb");
	FILE *pfile2 = fopen(copied,"wb");
	
	while(1){
		ret=fgetc(pfile1);
		if(!feof(pfile1)) fputc(ret,pfile2);
		else break;
	}
	
	fclose(pfile1);
	fclose(pfile2);
}

 

 

<<  원리  >>

__FILE__매크로와 find함수를 활용했습니다

 

 

 

 


 

 

 

이해안가시는 부분있으면 댓글로 질문주세요...!

그러면 짧은 글 봐주셔서 감사합니다!

 

 

 

[[[   다음 글   ]]]

 

 

파일 자가복제 C++ #2

개발환경 >> DevCpp 언어 >> C++11 WINAPI 64bit 운영체제 >> Windows10 [[[  지난 글  ]]] > DevCpp 언어 >> C++11 운영체제 >> Windows10 안녕하세요! 이번에는 C++에서 파일을 자가복제하는방법에 대해서 알..

mawile.tistory.com

 

728x90

댓글