franta-hg@54: /** franta-hg@54: * Přepis CLI parametrů franta-hg@54: * Copyright © 2017 František Kučera (frantovo.cz) franta-hg@54: * franta-hg@54: * This program is free software: you can redistribute it and/or modify franta-hg@54: * it under the terms of the GNU General Public License as published by franta-hg@54: * the Free Software Foundation, either version 3 of the License, or franta-hg@54: * (at your option) any later version. franta-hg@54: * franta-hg@54: * This program is distributed in the hope that it will be useful, franta-hg@54: * but WITHOUT ANY WARRANTY; without even the implied warranty of franta-hg@54: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the franta-hg@54: * GNU General Public License for more details. franta-hg@54: * franta-hg@54: * You should have received a copy of the GNU General Public License franta-hg@54: * along with this program. If not, see . franta-hg@54: */ franta-hg@54: franta-hg@54: #include franta-hg@54: #include franta-hg@54: #include franta-hg@54: #include franta-hg@54: franta-hg@54: franta-hg@54: using namespace std; franta-hg@54: franta-hg@54: void cekej() { franta-hg@54: wprintf(L"Stiskněte Enter pro pokračování…"); franta-hg@54: getwchar(); franta-hg@54: } franta-hg@54: franta-hg@54: void napoveda(const string nazevProgramu) { franta-hg@54: wprintf(L"Vypište si parametry jedním z následujících příkazů:\n"); franta-hg@54: wprintf(L"\tcat /proc/$(pidof %s)/cmdline | xargs -0 -n1 echo\n", nazevProgramu.c_str()); franta-hg@54: wprintf(L"\tps aux | grep '[ ]%s'\n", nazevProgramu.c_str()); franta-hg@54: } franta-hg@54: franta-hg@54: /** franta-hg@54: * 1) Program vypíše zadané parametry (argumenty příkazového řádku) a zastaví se (čeká na potvrzení uživatelem). franta-hg@54: * 2) Uživatel si vypíše proces a jeho parametry v druhém terminálu. franta-hg@54: * 3) Program přepíše svoje parametry – např. 'heslo' → 'xxxxx'. franta-hg@54: * 4) Uživatel si opět vypíše informace o procesu a vidí, že původní informace (v praxi např. hesla) jsou pryč. franta-hg@54: * 5) Program se ukončí. franta-hg@54: */ franta-hg@54: int main(int argc, char* argv[]) { franta-hg@54: franta-hg@54: setlocale(LC_ALL,""); franta-hg@54: franta-hg@54: string nazevProgramu = argv[0]; franta-hg@54: franta-hg@54: if (argc == 1) { // 1 = jen název programu, ale žádné parametry franta-hg@54: wprintf(L"Není, co přepisovat – příště prosím zadejte nějaké parametry – např.\n"); franta-hg@54: wprintf(L"\t%s aaa bbb ccc\n", nazevProgramu.c_str()); franta-hg@54: return 1; franta-hg@54: } franta-hg@54: franta-hg@54: wprintf(L"Přehled zadaných parametrů:\n"); franta-hg@54: for (int i = 1; i < argc; i++) { franta-hg@54: wprintf(L"\t%d = %s\n", i, argv[i]); franta-hg@54: } franta-hg@54: franta-hg@54: napoveda(nazevProgramu); franta-hg@54: cekej(); franta-hg@54: franta-hg@54: // Nahradíme všechny znaky ve všech parametrech, aby nebylo možné přečíst původní hodnoty (např. hesla). franta-hg@54: // Pracujeme zde na úrovni bajtů, takže pokud parametr obsahoval vícebajtové znaky, bude mít po nahrazení více znaků (ale stejně bajtů). franta-hg@54: // Stále bude možné zjistit délku původních parametrů (v bajtech). franta-hg@54: for (int i = 1; i < argc; i++) { franta-hg@54: char * arg = argv[i]; franta-hg@54: while (*arg) *arg++= 'x'; franta-hg@54: } franta-hg@54: // Pokud bychom začínali od nuly (i = 0), přepsali bychom i samotný název programu! franta-hg@54: // Možná už jste ve výpisu procesů někdy viděli názvy, které neodpovídají žádné binárce. franta-hg@54: // Program se tak může maskovat – nicméně i tak bude symbolický odkaz v /proc/…/exe ukazovat na jeho binárku. franta-hg@54: franta-hg@54: wprintf(L"Parametry byly přepsány!\n"); franta-hg@54: napoveda(nazevProgramu); franta-hg@54: cekej(); franta-hg@54: }