BYTE* zu unsigned in HEX



  • Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..

    Bei Fenstertitel einfach "Module Leser" eingeben.
    Ätzenderweise ist auf "Str" nicht die Gleiche Zahl wie vorher ausgegeben.

    #include <iostream> 
    #include <windows.h> 
    #include <tlhelp32.h> 
    #include <sstream> 
    
    using namespace std; 
    
    int main() 
    { 
        SetConsoleTitle("Module Leser"); 
    
        DWORD dwProcessId; 
        string strTitel; 
        MODULEENTRY32 lpModuleEntry; 
        HWND hWnd; 
        stringstream Str; 
        unsigned int BASIS_HIER; 
    
        while(1){ 
        do{ 
            cout << "Fenstertitel: "; 
            getline(cin, strTitel); 
            hWnd = FindWindow(0, strTitel.c_str()); 
    
        }while(!hWnd); 
        cout << endl; 
    
        GetWindowThreadProcessId(hWnd, &dwProcessId); 
        HANDLE hproc        = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); 
        HANDLE hSnapShot    = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId); 
        if(!hSnapShot||!hproc) 
            return 0; 
    
        lpModuleEntry.dwSize = sizeof(lpModuleEntry); 
        BOOL bModule = Module32First(hSnapShot, &lpModuleEntry); 
    
        while(bModule) 
        { 
                cout << lpModuleEntry.szModule << "\t\t" << hex << (DWORD)lpModuleEntry.modBaseAddr << endl; 
    
                if(lpModuleEntry.szModule == "kernel32.dll") 
                    Str << hex << (unsigned)lpModuleEntry.modBaseAddr; 
    
                bModule = Module32Next(hSnapShot, &lpModuleEntry); 
        } 
        CloseHandle(hSnapShot); 
        cout << endl << Str << endl << endl; 
      } 
    
    }
    

  • Mod

    Kürze den Code aufs wesentliche. Was soll das ganze Windowszeugs?

    cout << endl << Str << endl << endl;
    

    Hier gibst du einen Stream aus. Macht vermutlich nicht das, was du denkst, was es macht.

    Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..

    Entweder drückst du dich dumm aus oder das Vorhaben ist Quatsch. Arithmetische Datentypen (wie unsigned int) speichern den Wert einer Zahl, keine spezielle Darstellung.



  • cout << endl << Str << endl << endl;
    

    Hier gibst du einen Stream aus. Macht vermutlich nicht das, was du denkst, was es macht.

    -Ich nehme an der Stream müssten den gleichen Wert wie eine Zahl ausgeben(?)

    Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..

    Entweder drückst du dich dumm aus oder das Vorhaben ist Quatsch. Arithmetische Datentypen (wie unsigned int) speichern den Wert einer Zahl, keine spezielle Darstellung.[/quote]

    -Gut, ich habe stringstream nur benutzt um die Zahl von Dezimal in Hexadezimal umzurechnen. Bzw ich möchte das Ergebnis von lpModuleEntry.modBaseAddr in Hexadezimal umrechnen, und dieses Ergebnis in einen unsigned packen o.O



  • cout << (unsigned)lpModuleEntry.modBaseAddr;

    Gibt mir den richtigen Wert aus.

    unsigned int BASIS_HIER;
    BASIS_HIER = (unsigned)lpModuleEntry.modBaseAddr;
    cout << BASIS_HIER;

    Gibt mir den falschen Wert. DWORD will auch nicht.



  • Okay hat sich erledigt. Ich dachte mir schon die ganze Zeit daß ich einen Logik-Fehler habe. 😃
    cout << hex konvertiert auch das Zukünftige und der unsigned kann zugewiesen werden. Google wird's Danken. 🙄



  • Außerdem braucht man strcmp.


  • Mod

    moinsen schrieb:

    cout << endl << Str << endl << endl;
    

    Hier gibst du einen Stream aus. Macht vermutlich nicht das, was du denkst, was es macht.

    -Ich nehme an der Stream müssten den gleichen Wert wie eine Zahl ausgeben(?)

    Jetzt rate mal, warum ich wohl gesagt habe, dass es vermutlich nicht das macht, was du denkst, was es macht.

    Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..

    Entweder drückst du dich dumm aus oder das Vorhaben ist Quatsch. Arithmetische Datentypen (wie unsigned int) speichern den Wert einer Zahl, keine spezielle Darstellung.

    -Gut, ich habe stringstream nur benutzt um die Zahl von Dezimal in Hexadezimal umzurechnen. Bzw ich möchte das Ergebnis von lpModuleEntry.modBaseAddr in Hexadezimal umrechnen, und dieses Ergebnis in einen unsigned packen o.O

    Jetzt hast du wiederholt gesagt, dass du das machen möchtest, wovon ich dir gerade eben gesagt habe, dass es nicht geht. Das ist so, als wolltest du eine Zahl hexadezimal auf einem Rechenschieber speichern. Das macht einfach keinen Sinn! Hexadezimal ist eine Darstellung, eine Folge von Zeichen. Integer speichern Zahlenwerte, unabhängig von irgendeiner Darstellung.


  • Mod

    Integer speichern Zahlenwerte, unabhängig von irgendeiner Darstellung.

    Das ist offenbar ungünstig formuliert, wo doch der Standard spezifisch von einer Darstellung (representation) spricht und sogar festlegt dass diese binär sein muss.

    §3.9.1/7 schrieb:

    The representations of integral types shall define values by use of a pure binary numeration system.

    Aber hier liegt ja auch der Witz: Ein int wird einen Wert stets binär darstellen, und kennt daher gar keine anderen Zahlbasen.


  • Mod

    Arcoth schrieb:

    Integer speichern Zahlenwerte, unabhängig von irgendeiner Darstellung.

    Das ist offenbar ungünstig formuliert, wo doch der Standard spezifisch von einer Darstellung (representation) spricht und sogar festlegt dass diese binär sein muss.

    §3.9.1/7 schrieb:

    The representations of integral types shall define values by use of a pure binary numeration system.

    Aber hier liegt ja auch der Witz: Ein int wird einen Wert stets binär darstellen, und kennt daher gar keine anderen Zahlbasen.

    Guter Einwand! Den Absatz habe ich irgendwie vergessen, weil er nie von Belang ist. Dann formuliere ich um:
    Ganzzahldatentypen speichern Zahlenwerte. Intern werden diese zwar immer binär dargestellt, was aber niemals von Belang ist, außer man lässt sich tatsächlich mal eine Variable Byte für Byte ausgeben.


  • Mod

    Intern werden diese zwar immer binär dargestellt, was aber niemals von Belang ist, außer man lässt sich tatsächlich mal eine Variable Byte für Byte ausgeben.

    ... oder man arbeitet auf Bitebene.



  • Nur ein kleiner Einwurf: Bitt einen xxxptr_t bzw. XXX_PTR Typen verwenden wenn man Zeiger in Integers konvertieren möchte/muss.
    Also z.B. intptr_t oder uintptr_t aus dem Standard oder INT_PTR , UINT_PTR oder DWORD_PTR vom Windows SDK.

    Sonst stehen die Chancen schlecht wenn man mal ne 64 Bit Version laufen lassen möchte.


Anmelden zum Antworten