# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1511220027 -3600
# Node ID 2a22f9959ea39a4d66366e3154e9093cd26b4720
# Parent  516358e07f9d84e8b9b7790da21dc26e4309af93
přepis-cli-parametrů: první verze

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