Filename des ausgeführten C++ Programmes ermitteln & SQL-Incections verhindern & PC eindeutig identivfizieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Filename des ausgeführten C++ Programmes ermitteln & SQL-Incections verhindern & PC eindeutig identivfizieren

    Weis jemand ob und wie es möglich ist den Dateinamen seines eigenen C++ Programmes zu ermitteln?
    Den Pfad vom Programm kann man ja einfach per folgendem Code ermitteln aber wieso finde ich im ganzen Internet keine Möglichkeit den eigenen Dateinamen zu ermitteln?

    Quellcode

    1. CFBundleRef mainBundle = CFBundleGetMainBundle();
    2. CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
    3. if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
    4. {
    5. std::cout << "Error";
    6. }
    7. else
    8. {
    9. CFRelease(resourcesURL);
    10. std::cout << "Current Path: " << path << std::endl;
    11. }
    Alles anzeigen
  • Ne der Pfad ist "/Users/nico/Library/Developer/Xcode/DerivedData/MIDI_Harfe_Mac-bcvayvzjqdomjdhgqeynzktbfuqf/Build/ jedoch brauche ich den Namen der der bei mir z.B. MIDI_Harfe_Mac ist. leider kann ich den nicht einfach im code angeben da die Datei ja umbenennt werden könnte.

    Vielen Danke noch für den Tip mit argv[0] ist wirklich viel einfacher, gibt jedoch auch nur den Pfad.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von nicoboss ()

  • So habe es jetzt per Splitten des Strings geschafft. :)
    Ich habe einfach argv[0] genommen zugeschnitten. :)

    @Thallius Ich brauche dies hauptsächlich für die Update Funktion. Ausserdem dient es zur Verschlüsslung des Hashes der mein Programm an einen Bestimmten Computer bindet. Weiteres über diese Art von Kopierschutz könnt ihr unter vbarchiv.net/workshop/workshop…t-online-aktivierung.html nachlesen. Es ist zwar in Visual Basic aber ausser Application.ExecutablePath konnte ich alles in C++ übersetzen. Zusätzlich wird auch noch von der Application ein Hash erstellt um Modifizierungen zu verhindern. Also eigentlich brauche ich dies sogar 3mal. 1mal nur Programmname und 2mal mit Pfad. :)
  • gritsch schrieb:


    auch macht es keinen sinn die systemversion, RAM-größe etc in den hash zu nehmen sonst ist das ganze nach einer änderung ja ungültig.


    Kannst Du das mal bitte Microsoft mitteilen, damit ich nicht einmal im Jahr nach dem Systemwechsel mitten in der Nacht mit der Hotline telefonieren muss, um mein Word neu freischalten zu lassen? Danke! :cursing: ;)
  • Ich brauche natürlich nicht den Applicationsname als Hash sondern lese mit ihm per ifstream myfile (Executable_Path); die Applicationsdatei ein.

    @gritsch was ist an diesem php code so witzig?
    @zerm danke kannte ich noch nicht
    @kmr Mittlerweile haben die zum Glück die Aktivierung um einiges verbessert.

    Ihr könnt mir ja gerne sagen, was alles noch an dieser Hashfunktion schlecht ist. Aus Platzgründen habe ich die GetMac Funktion nicht gepostet. Ich bin immer für Verbesserungsvorschläge bereit. Um das Problem mit Hardwareveränderung zu lösen, kann jeder Lizenzschlüssel 10mal aktiviert werden.

    C-Quellcode

    1. void GetHash(void)
    2. {
    3. string sys_fingerprint;
    4. stringstream sys_fingerprint_ss;
    5. sys_fingerprint_ss << GetMAC() << get_cpu_freq_max() << get_sys_info() << statvfs_vfs();
    6. sys_fingerprint=sys_fingerprint_ss.str();
    7. cout << sys_fingerprint << endl;
    8. hash<string> hash_fn;
    9. std::size_t str_hash = hash_fn(sys_fingerprint);
    10. std::cout << str_hash << '\n';
    11. }
    12. #include <stdio.h>
    13. #include <stdint.h>
    14. #include <sys/types.h>
    15. #include <sys/sysctl.h>
    16. string get_sys_info(void)
    17. {
    18. uint64_t freq = 0;
    19. uint64 sys_info[] = {0,0,0,0,0,0};
    20. size_t size = sizeof(freq);
    21. if (sysctlbyname("hw.memsize", &sys_info[0], &size, NULL, 0) < 0)
    22. {
    23. perror("sysctl");
    24. }
    25. if (sysctlbyname("hw.ncpu", &sys_info[1], &size, NULL, 0) < 0)
    26. {
    27. perror("sysctl");
    28. }
    29. if (sysctlbyname("hw.physicalcpu_max", &sys_info[2], &size, NULL, 0) < 0)
    30. {
    31. perror("sysctl");
    32. }
    33. if (sysctlbyname("hw.logicalcpu_max", &sys_info[3], &size, NULL, 0) < 0)
    34. {
    35. perror("sysctl");
    36. }
    37. if (sysctlbyname("hw.tbfrequency", &sys_info[4], &size, NULL, 0) < 0)
    38. {
    39. perror("sysctl");
    40. }
    41. if (sysctlbyname("hw.busfrequency_max", &sys_info[5], &size, NULL, 0) < 0)
    42. {
    43. perror("sysctl");
    44. }
    45. /*
    46. //Die restlichen 3 habe ich nicht zum laufen gebracht da ich dass mit diesen Struct und Strings in konbination mit sysctlbyname nicht verstehe.
    47. struct cpu_bootinfo *cpu_bootinfo = NULL;
    48. size = *cpu_bootinfo;
    49. if (sysctlbyname("machdep.bootinfo", &cpu_bootinfo, &size, NULL, 0) < 0)
    50. {
    51. perror("sysctl");
    52. }
    53. cout << cpu_bootinfo << endl;
    54. string sys_info_machine;
    55. size = sizeof(sys_info_machine);
    56. if (sysctlbyname("hw.machine", &sys_info_machine, &size, NULL, 0) < 0)
    57. {
    58. perror("sysctl");
    59. }
    60. cout << sys_info_machine << endl;
    61. string sys_info_model = "";
    62. size = sizeof(sys_info_model);
    63. if (sysctlbyname("hw.model", &sys_info_model, &size, NULL, 0) < 0)
    64. {
    65. perror("sysctl");
    66. }
    67. cout << sys_info_model << endl;
    68. */
    69. stringstream freq_ss;
    70. freq_ss << (hex) << (uint64_t)sys_info[0] << (uint64_t)sys_info[1] << (uint64_t)sys_info[2] << (uint64_t)sys_info[3] << (uint64_t)sys_info[4] << (uint64_t)sys_info[5];
    71. return freq_ss.str();
    72. }
    73. string get_cpu_freq_max(void)
    74. {
    75. uint64_t freq = 0;
    76. size_t size = sizeof(freq);
    77. if (sysctlbyname("hw.cpufrequency_max", &freq, &size, NULL, 0) < 0)
    78. {
    79. perror("sysctl");
    80. }
    81. stringstream cpu_freq_max_ss;
    82. cpu_freq_max_ss << (hex) << (unsigned long)freq;
    83. return cpu_freq_max_ss.str();
    84. }
    85. #include <sys/statvfs.h>
    86. string statvfs_vfs( void )
    87. {
    88. struct statvfs vfs;
    89. stringstream statvfs_vfs_ss;
    90. statvfs_vfs_ss << (hex) << (unsigned long) vfs.f_fsid << (unsigned long) vfs.f_namemax;
    91. return statvfs_vfs_ss.str();
    92. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von nicoboss ()

  • gritsch schrieb:

    naja, witzig ist es eigentlich nicht... SQL-Injections.

    Gibs dafür nich magic_quotes??? :P

    gritsch schrieb:

    auch die MAC-adresse(n) gehören zu den veränderlichen werten einer maschine. hängt aber auch davon ab wie diese ausgelesen werden (aktive interfaces, oder immer das gleiche etc...)

    Ja frag mich mal. Hab vier+ MAC Adressen und eine dumme Software, die auf MAC beschränkt ......
    C++
  • Wenn ihr ja schon so viel über diese doofen SQL-Incections wisst, könnt ihr mir bitte sagen, was ich an diesem Code verändern muss um diese zu verhindern? Ich habe auf Wikipedia irgendwas von .mysql_real_escape_string gelesen aber verstehe nicht wo einsetzen.

    PHP-Quellcode

    1. <?php
    2. $h='localhost';
    3. $u='31879_nanticopy';
    4. $p='mein_Passwort';
    5. $db=new mysqli($h, $u, $p, '31879_nanticopy');
    6. $c=0;
    7. $cnt=0;
    8. $enable=0;
    9. $app=$_GET['app'];
    10. $key=$_GET['key'];
    11. $q=$db->query("SELECT * FROM `Keys` WHERE `AppID` = '" . $app . "' AND `Key` = '" . $key . "'");
    12. while($x=$q->fetch_assoc()) {
    13. $c++;
    14. $cnt=$x['Activated'];
    15. }
    16. if ($c>0) $enable=1;
    17. if ($enable==1) echo '1;';
    18. else echo '0;';
    19. if ($cnt>0) {
    20. $q=$db->query("UPDATE `Keys` SET `Activated`=`Activated`-1 WHERE `AppID` LIKE '".
    21. $app."' AND `Key` LIKE '" . $key . "'");
    22. }
    23. echo $cnt;
    24. $db->close();
    25. ?>
    Alles anzeigen


    Als MAC Adressen habe ich das letzte dass nicht 00:00:00:00:00 ist. Ich habe auch 2 verschiedene. Wie kann das sein? Wie finde ich jetzt mit C++ die echte? Oder gibt es noch eine andere ID mit der man einen PC eindeutig identifizieren kann oder würde mein Hash auch ohne MAC Adresse trotzdem noch genügend systemgebunden sein? Auch gegen eine MAC Adresse spricht ihre Manipulierbarkeit. Ist wenigstens die vfs.f_fsid (file space id) einzigartig?
  • Nein, nicht mit escapen rumpfuschen sondern einfach Prepared Statements verwenden!

    jedes interface hat seine eigene MAC-adresse. du musst also immer das gleiche nehmen nicht das aktive, das erste oder letzte (sonst hat der arme user zu hause im WLAN eine andere computer-id als im büro wo der laptop im LAN hängt).

    du machst dir um die ganze geschichte aber viel zu viel sorgen und gehst nur den leuten auf den sack die es kaufen wollen.
    denn die die es nicht kaufen wollen, laden es sich bei boerse.bz oder sonstwo runter (und glaub mir, es ist ein klacks das ganze ding auszuhebeln das du in tagelanger arbeit schreibst).
    also wie immer: auf funktionen konzentrieren, einen fairen preis verlangen und denen die bezahlen bloß nicht mit lizenzmüll auf den zeiger gehen (sonst kaufen die kein update und auch kein anderes produkt von dir...)
  • nicoboss schrieb:

    Wenn ihr ja schon so viel über diese doofen SQL-Incections wisst, könnt ihr mir bitte sagen, was ich an diesem Code verändern muss um diese zu verhindern? Ich habe auf Wikipedia irgendwas von .mysql_real_escape_string gelesen aber verstehe nicht wo einsetzen.


    "Bei Wikipedia was gelesen …". Da kriege ich Sodbrennen. So eine Software willst Du zahlenden Kunden andrehen? Eigne Dir zum Thema Sicherheit Wissen aus vernünftigen Quellen an. Alles andere ist fahrlässig.
  • So, mittlerweile habe ich alles hingekriegt:

    So bekommt man den Application Name sowie den Pfad je nach Wünschen separat oder zusammen:

    Quellcode

    1. #include <libgen.h>
    2. int main( int argc, char *argv[] )
    3. (...)
    4. cout << argv[0];
    5. char *dirc, *basec, *bname, *dname;
    6. char *path = argv[0];
    7. dirc = strdup(path);
    8. basec = strdup(path);
    9. dname = dirname(dirc);
    10. bname = basename(basec);
    11. printf("dirname=%s, basename=%s\n", dname, bname);
    Alles anzeigen



    Glücklickerweise muss ich keine Angst von illegalen Raubkopien haben, da das ganze Programm ja an eine Externe, zusätzlich zum Programm erworbene Hardware gebunden ist. Was bringt ein Programm dass vom Mikrocontroller empfangende Signale weiterleitet, wenn man gar nicht die dazu passende Hardware hat? Mir geht es mit der Onlineaktivierung mehr darum zu sehen wer auf welchem Betriebssystem welche Version meines Programmes benutzt um die Mikrocontroller Freameware möglichst für alle kompatibel zu halten. Ausserdem will ich nicht, dass wenn jemand versucht die Hardware nachzumachen gerade noch mein Programm hat. Und schlussendlich mache ich hauptsächlich eh alles nur um was zu lernen.

    Ich mag die Hardware-UCID da im Normalfall immer gleich ist und somit einen Maschinen spezifischen Schlüssel stark verbesser. Zusätzlich mit den werten aus #include <sys/sysctl.h> und ein bischen rumspielen mit mathe und einigen std::hash<string> hash_fn; bekommt man schnell einen ziemlich guten Maschinen spezifischen Schlüssel:

    C-Quellcode

    1. #include "CoreFoundation/CoreFoundation.h"
    2. #include <IOKit/IOKitLib.h>
    3. void get_platform_uuid(char * buf, int bufSize)
    4. {
    5. io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/");
    6. CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
    7. IOObjectRelease(ioRegistryRoot);
    8. CFStringGetCString(uuidCf, buf, bufSize, kCFStringEncodingMacRoman);
    9. CFRelease(uuidCf);
    10. }
    Alles anzeigen



    Und folgender PHP Code verhindert eine SQL Incection:

    PHP-Quellcode

    1. <?php
    2. $h='localhost';
    3. $u='31879_nanticopy';
    4. $p='mein_Passwort';
    5. $db=new mysqli($h, $u, $p, '31879_nanticopy');
    6. $c=0;
    7. $cnt=0;
    8. $enable=0;
    9. $app=$_GET['app'];
    10. $key=$_GET['key'];
    11. $os=$_GET['os'];
    12. $sth = $db->prepare('SELECT * FROM `Keys` WHERE `AppID` = ? AND `Key` = ?');
    13. $sth->bind_Param('ss', $app, $key);
    14. $sth->execute();
    15. $sth->bind_result($fetch_vornamen, $fetch_nachnamen, $fetch_kundennummer, $fetch_key, $fetch_windows, $fetch_mac, $fetch_linux, $fetch_activated, $fetch_app);
    16. while($x=$sth->fetch()) {
    17. $c++;
    18. if ($os == "Windows") {
    19. $cnt=$fetch_windows;
    20. } elseif ($os == "Mac") {
    21. $cnt=$fetch_mac;
    22. } elseif ($os == "Linux") {
    23. $cnt=$fetch_linux;
    24. } else {
    25. echo "Ihr Betriebssystem ist ungueltig!";
    26. }
    27. }
    28. if ($c>0) $enable=1;
    29. if ($enable==1) echo '1;';
    30. else echo '0;';
    31. if ($cnt>0) {
    32. if ($os == "Windows") {
    33. $q = $db->prepare('UPDATE `Keys` SET `Windows`=`Windows`-1 WHERE `AppID` LIKE ? AND `Key` LIKE ?');
    34. } elseif ($os == "Mac") {
    35. $q = $db->prepare('UPDATE `Keys` SET `Mac`=`Mac`-1 WHERE `AppID` LIKE ? AND `Key` LIKE ?');
    36. } elseif ($os == "Linux") {
    37. $q = $db->prepare('UPDATE `Keys` SET `Linux`=`Linux`-1 WHERE `AppID` LIKE ? AND `Key` LIKE ?');
    38. } else {
    39. echo "Ihr Betriebssystem ist ungueltig!";
    40. }
    41. $q->bind_Param('ss', $app, $key);
    42. $q->execute();
    43. $a = $db->prepare('UPDATE `Keys` SET `Activated`=`Activated`+1 WHERE `AppID` LIKE ? AND `Key` LIKE ?');
    44. $a->bind_Param('ss', $app, $key);
    45. $a->execute();
    46. }
    47. echo $cnt;
    48. $db->close();
    49. ?>
    Alles anzeigen



    :) Vielen Dank für eure Hilfe! :)
  • von memory-leaks noch nie was gehört?

    und klar, wenn jemand hardware nachbaut dann investiert er keine 3 minuten um auch die software freizuschalten? und wovon träumst du nachts?

    außerdem frage ich mich wie du aus einem hash bzw einer unique-id all die infos wieder ausliest? die schickst du doch sicher getrennt mit, also brauchst du den hash gar nicht (wenns dir nicht um kunden-gängelung geht).

    wenn du was lernen willst dann lerne das: geh den kunden nicht auf den sack. ich habe mir sagen lassen dass vor allem geräte an denen spezielle hardware (deine) hängt, nicht unbedingt im inet hängen!