1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/c++/přepis-cli-parametrů/přepis-cli-parametrů.cpp Tue Nov 21 00:20:27 2017 +0100
1.3 @@ -0,0 +1,79 @@
1.4 +/**
1.5 + * Přepis CLI parametrů
1.6 + * Copyright © 2017 František Kučera (frantovo.cz)
1.7 + *
1.8 + * This program is free software: you can redistribute it and/or modify
1.9 + * it under the terms of the GNU General Public License as published by
1.10 + * the Free Software Foundation, either version 3 of the License, or
1.11 + * (at your option) any later version.
1.12 + *
1.13 + * This program is distributed in the hope that it will be useful,
1.14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.16 + * GNU General Public License for more details.
1.17 + *
1.18 + * You should have received a copy of the GNU General Public License
1.19 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
1.20 + */
1.21 +
1.22 +#include <stdlib.h>
1.23 +#include <iostream>
1.24 +#include <wchar.h>
1.25 +#include <locale.h>
1.26 +
1.27 +
1.28 +using namespace std;
1.29 +
1.30 +void cekej() {
1.31 + wprintf(L"Stiskněte Enter pro pokračování…");
1.32 + getwchar();
1.33 +}
1.34 +
1.35 +void napoveda(const string nazevProgramu) {
1.36 + wprintf(L"Vypište si parametry jedním z následujících příkazů:\n");
1.37 + wprintf(L"\tcat /proc/$(pidof %s)/cmdline | xargs -0 -n1 echo\n", nazevProgramu.c_str());
1.38 + wprintf(L"\tps aux | grep '[ ]%s'\n", nazevProgramu.c_str());
1.39 +}
1.40 +
1.41 +/**
1.42 + * 1) Program vypíše zadané parametry (argumenty příkazového řádku) a zastaví se (čeká na potvrzení uživatelem).
1.43 + * 2) Uživatel si vypíše proces a jeho parametry v druhém terminálu.
1.44 + * 3) Program přepíše svoje parametry – např. 'heslo' → 'xxxxx'.
1.45 + * 4) Uživatel si opět vypíše informace o procesu a vidí, že původní informace (v praxi např. hesla) jsou pryč.
1.46 + * 5) Program se ukončí.
1.47 + */
1.48 +int main(int argc, char* argv[]) {
1.49 +
1.50 + setlocale(LC_ALL,"");
1.51 +
1.52 + string nazevProgramu = argv[0];
1.53 +
1.54 + if (argc == 1) { // 1 = jen název programu, ale žádné parametry
1.55 + wprintf(L"Není, co přepisovat – příště prosím zadejte nějaké parametry – např.\n");
1.56 + wprintf(L"\t%s aaa bbb ccc\n", nazevProgramu.c_str());
1.57 + return 1;
1.58 + }
1.59 +
1.60 + wprintf(L"Přehled zadaných parametrů:\n");
1.61 + for (int i = 1; i < argc; i++) {
1.62 + wprintf(L"\t%d = %s\n", i, argv[i]);
1.63 + }
1.64 +
1.65 + napoveda(nazevProgramu);
1.66 + cekej();
1.67 +
1.68 + // Nahradíme všechny znaky ve všech parametrech, aby nebylo možné přečíst původní hodnoty (např. hesla).
1.69 + // Pracujeme zde na úrovni bajtů, takže pokud parametr obsahoval vícebajtové znaky, bude mít po nahrazení více znaků (ale stejně bajtů).
1.70 + // Stále bude možné zjistit délku původních parametrů (v bajtech).
1.71 + for (int i = 1; i < argc; i++) {
1.72 + char * arg = argv[i];
1.73 + while (*arg) *arg++= 'x';
1.74 + }
1.75 + // Pokud bychom začínali od nuly (i = 0), přepsali bychom i samotný název programu!
1.76 + // Možná už jste ve výpisu procesů někdy viděli názvy, které neodpovídají žádné binárce.
1.77 + // Program se tak může maskovat – nicméně i tak bude symbolický odkaz v /proc/…/exe ukazovat na jeho binárku.
1.78 +
1.79 + wprintf(L"Parametry byly přepsány!\n");
1.80 + napoveda(nazevProgramu);
1.81 + cekej();
1.82 +}