[C++] Dll unbekannter Fehler

03/13/2011 22:10 v0lle#1
Hey Com,

ich habe mal versucht eine dll für das Spiel Pinball das standardgemäß auf Windows enthalten ist zu coden. Es enthält nur einen Pointer unzwar den um die Punktezahl zu ändern, es klappt aber nicht richtig, anstatt die Punktezahl zu ändern beendet er einfach den Prozess. Vielleicht könntet ihr mir helfen. ;)

PHP Code:
#include <windows.h>

DWORD Addr_Base PINBALL.EXE+0x0025040;
DWORD Offset[1] = {0x52};

void HackThread(){
    
MessageBoxA(NULL"Inject""Injection successful, F5 - Change Score"MB_OK);
    while(
true){
        if(
GetAsyncKeyState(VK_F5)){
            
DWORD Address = *(DWORD*)(Addr_Base);
            
Address = *(DWORD*)(Address Offset[0]);
            
DWORD Value = *(DWORD*)(Address Offset[1]);

            if(
Value == 1){
                *(
DWORD*)(Address Offset[1]) = 99999;
            }else{
                *(
DWORD*)(Address Offset[1]) = 0;
            }
            
Sleep(250);
        }

        
Sleep(50);
    }
}

BOOL WINAPI DllMain(HINSTANCE HMODULEDWORD dwReasonLPVOID lpvReserved){
    if(
dwReason == DLL_PROCESS_ATTACH)
        
CreateThread(00, (LPTHREAD_START_ROUTINE)HackThread000);
    return 
true;

03/13/2011 22:55 mydoom#2
Code:
DWORD Addr_Base = [COLOR="Red"]PINBALL.EXE+[/COLOR]0x0025040;
Und das kannst du so kompilieren? Sollte eigentlich nicht klappen.

//EDIT:

Code:
[COLOR="Red"]void[/COLOR] HackThread(){
Das ist leider auch kein guter Code. "DWORD WINAPI" wäre besser.

//EDIT²:

Außerdem solltest du dir nochmal den Return-Type von GetAsyncKeyState() ansehen. So wie du es verwendest kann das auch zu Problemen führen:

Quote:
Originally Posted by MSDN
Return Value

Type: SHORT

If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

The return value is zero for the following cases:

* The current desktop is not the active desktop
* The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.
03/14/2011 06:32 v0lle#3
Danke erst mal. ^^
Ich meld mich noch mal, wenn weitere Probleme auftreten sollten.
03/14/2011 13:36 MrSm!th#4
Code:
+offset[1]
Ist der grund.
Dein array hat nur ein element, du greifst aber auf zwei zu
03/15/2011 22:10 v0lle#5
Funktioniert noch nicht , ich hab jetzt die Zeile auf Offset[2] geändert, wenn ich die dll Datei injecte stürzt der Prozess ab.
03/15/2011 23:31 mydoom#6
Der Index eines Arrays beginnt (in C/C++) bei Null. Das erste Element muss demnach mit dem Index Null angesprochen werden. In deinem Fall wäre das Offset[0].
03/16/2011 14:58 v0lle#7
Die Zuordnung eines Arrays der Größe 0 ist doch aber nicht möglich.
03/16/2011 17:37 MrSm!th#8
Du solltest vielleicht erstmal die Sprache lernen, bevor du Dlls schreibst!

Code:
DWORD Offset[1] = {0x52};
Dein Array hat nur ein Element!
Code:
      DWORD Value = *(DWORD*)(Address + Offset[1]);
Du willst mit [1] aber auf das zweite zugreifen!
Lösch diese Zeile und alle anderen, die auf [1] zugreifen, einfach aus dem Code oder füg ein zweites Offset hinzu.