Autor Beitrag
D3lta
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 05.08.09 19:26 
hi, ich habe folgende dll:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
#include <windows.h>

HINSTANCE hInst; 
DWORD PostDLLFunc, GetPixelDLLFunc, SetCursorDLLFunc; 
HWND hWnd;


__declspec(naked) BOOL WINAPI __stdcall myPostMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
   __asm
   {
      mov  edi, edi
         push ebp
         mov  ebp, esp
         jmp [PostDLLFunc]
   }
}

__declspec(naked) BOOL WINAPI __stdcall myGetPixel(HDC )
{
   __asm
   {
      mov  edi, edi
         push ebp
         mov  ebp, esp
         jmp [GetPixelDLLFunc]
   }
}

__declspec(naked) BOOL WINAPI __stdcall mySetCursorPos(int x, int y)
{
   __asm
   {
      mov  edi, edi
         push ebp
         mov  ebp, esp
         jmp [SetCursorDLLFunc]
   }
}

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReason*/)
{
   switch (dwReason)
   {
      
   case DLL_PROCESS_ATTACH:
      {
         if (PostDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            PostDLLFunc = (DWORD)GetProcAddress(hInst, "PostMessageA") + 5; 
         }
         if (GetPixelDLLFunc == NULL) {
            hInst = LoadLibrary("gdi32.dll");
            GetPixelDLLFunc = (DWORD)GetProcAddress(hInst, "GetPixel") + 5; 
         }
         if (SetCursorDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            SetCursorDLLFunc = (DWORD)GetProcAddress(hInst, "SetCursorPos") + 5; 
         }
      }
      break;
      
   case DLL_THREAD_ATTACH:
      {
         if (PostDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            PostDLLFunc = (DWORD)GetProcAddress(hInst, "PostMessageA") + 5; 
         }
         if (GetPixelDLLFunc == NULL) {
            hInst = LoadLibrary("gdi32.dll");
            GetPixelDLLFunc = (DWORD)GetProcAddress(hInst, "GetPixel") + 5; 
         }
         if (SetCursorDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            SetCursorDLLFunc = (DWORD)GetProcAddress(hInst, "SetCursorPos") + 5; 
         }
      }
      break;
   case DLL_THREAD_DETACH:
      {
         if (hInst != NULL) {
            // Un-Load DLL
            ::FreeLibrary(hInst);
            hInst = NULL;
         } 
      }
      break;
   case DLL_PROCESS_DETACH:
      {
         if (hInst != NULL) {
            // Un-Load DLL
            ::FreeLibrary(hInst);
            hInst = NULL;
         } 
      }
      break;
   }
   return TRUE;
}

und möchte die nun in meinem delphi programm benutzen

daher mach ich folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
function mySetCursorPos(
x, y:integer;
external 's.dll' name 'mySetCursorPos';


später is das ja dann denk ich doch mal so aufrufbar:
ausblenden Delphi-Quelltext
1:
mySetCursorPos(x, y);					

-> aber ich krieg die ganze zeit fehler, anscheinend hab ich die function hier falsch aufgebaut, kann mir wer sagen, was ich falsch gemacht habe? :)

danke =)

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 05.08.2009 um 23:25
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.08.09 20:11 
ausblenden Delphi-Quelltext
1:
2:
3:
function mySetCursorPos(
x, y:integer; stdcall;
external 's.dll' name 'mySetCursorPos';

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 05.08.09 20:55 
danke, so hatte ichs aber auch schon, habs jetzt trotzdem nochmal getestet aber steht immer noch das paar parameter fehlen..

kann das daran liegen das ich über der function noch eine function habe die aus einer anderen dll liest? dann probier ichs mal einzeln aber iwie isses komisch... :(

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.08.09 20:56 
das liegt dann eher am Aufruf, wie sieht der denn aus?

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 05.08.09 21:01 
das is ja mein prob, ich hab das noch gar nicht aufgerufen
der gibt mir den fehler schon an der function selbst :(

hier ist die compilierte dll, falls du mal versuchen möchtest :)
www.sendspace.com/file/vqnvf6
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.08.09 21:06 
Hab kein Delphi zum testen. Wann kommt denn der Fehler? Beim Laden der dll? Dann ist der Funktionsname nicht richtig geschrieben bzw. die dll (s.dll= wird nicht gefunden. Wenn du die Funktion aufrufen kannst und das Programm abstürzt dann hast die falsche Aufrufkonvention / flasche Parameter.

Wie sieht deine Delphi Implementation aus?

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 05.08.09 21:12 
hier hab ich mal nen screenshot vom compilieren
Screenshot

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.08.09 21:15 
ausblenden Delphi-Quelltext
1:
function mySetCursorPos(x, y:integer): Boolean; stdcall; external 's.dll' name 'mySetCursorPos';					

Hatte ich gar nicht bemerkt (eine Funktion hat immer einen Rückgabewert, bei SetCurorPos ist es ein Boolean)

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 05.08.09 21:18 
programm läuft jetzt

jetzt müsste ich die function ja aufrufen können über mySetCursorPos(x, y)
x und y werte hab ich vorher festgelegt bzw. z.B mySetCursorPos(500, 500);
aber ich krieg damit schon beim kompilieren ne fehlermeldung

anwendung konnte nicht initialisiert werden...
kommt beim compilieren.. wird also noch compiliert aber kann dann nicht mehr gestartet werden
die function wird ja nichtmal von anfang an benutzt
lediglich wird die function deklariert <- dannach lässt sich das programm starten
sobald ich dann aber mit mysetcursorpos(x,y) compiliere crasht das programm oO
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 06.08.09 12:34 
hier wird die dll in glaub "autoit" benutzt
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Func _MouseMove ($dllHandle, $hwnd, $posx, $posy)
    Local $result
    ; Get Cursor position revlativ to global screen coordinates
    Local $tpoint = DllStructCreate("int X;int Y")
    DllStructSetData($tpoint, "X", $posx)
    DllStructSetData($tpoint, "Y", $posy)
    _WinAPI_ClientToScreen($hwnd, $tpoint)
    ; Set Cursor
    $result = DllCall($dllHandle, "long", "mySetCursorPos", "int", DllStructGetData($tpoint, "X"), "int", DllStructGetData($tpoint, "Y"))
    Return $tpoint
EndFunc



ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
         WinActivate($flyffHwnd)
            Local $pos = WinGetPos(HWnd($flyffHwnd))
            Local $posx = 10
            Local $posy = 10
            while $posx < $pos[2] - 10
                While $posy < $pos[3] -10
                    _MouseMove($dllHandle, $flyffHwnd, $posx, $posy)
                    $posy += 10
                    Sleep(10)
                WEnd
                $posx += 10
                $posy = 10
            WEnd


vll kann mir ja wer damit helfen :)
wie gesagt, function is drin = programm kann compiliert werden
function wird irgendwo dann ausgeführt (programm stürtzt gleich beim start ab wobei die function in nem ausgeschalteten timer drinsteckt..
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 06.08.09 15:02 
Ich kann mir nicht vorstellen das dein Programm abschmiert ohne dir irgend eine Meldung anzuzeigen. Diese Meldung könntest du uns ruhig mal posten.
Zudem, bist du dir sicher das die Dll auch von deiner Exe gefunden wird? Sich also im gleichen Verzeichnis wie die Exe befindet?
Ist Dll mit Sicherheit nativ? Also keine DOT NET Dll?

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 06.08.09 15:14 
tut mir leid, hier ein screenshot wenn ich compiliere

img5.imagebanana.com/img/9co1zw6/scr2.gif <- fehlermeldung und untendrunter hab ich noch die function und meinen aufruf dazu geschrieben..

zu der dll kann ich nich so wirklich viel sagen, ich hab die aus nem forum (source)

hier:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
#include <windows.h>

HINSTANCE hInst; 
DWORD PostDLLFunc, GetPixelDLLFunc, SetCursorDLLFunc; 
HWND hWnd;


__declspec(naked) BOOL WINAPI __stdcall myPostMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
   __asm
   {
      mov  edi, edi
         push ebp
         mov  ebp, esp
         jmp [PostDLLFunc]
   }
}

__declspec(naked) BOOL WINAPI __stdcall myGetPixel(HDC )
{
   __asm
   {
      mov  edi, edi
         push ebp
         mov  ebp, esp
         jmp [GetPixelDLLFunc]
   }
}

__declspec(naked) BOOL WINAPI __stdcall mySetCursorPos(int x, int y)
{
   __asm
   {
      mov  edi, edi
         push ebp
         mov  ebp, esp
         jmp [SetCursorDLLFunc]
   }
}

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReason*/)
{
   switch (dwReason)
   {
      
   case DLL_PROCESS_ATTACH:
      {
         if (PostDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            PostDLLFunc = (DWORD)GetProcAddress(hInst, "PostMessageA") + 5; 
         }
         if (GetPixelDLLFunc == NULL) {
            hInst = LoadLibrary("gdi32.dll");
            GetPixelDLLFunc = (DWORD)GetProcAddress(hInst, "GetPixel") + 5; 
         }
         if (SetCursorDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            SetCursorDLLFunc = (DWORD)GetProcAddress(hInst, "SetCursorPos") + 5; 
         }
      }
      break;
      
   case DLL_THREAD_ATTACH:
      {
         if (PostDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            PostDLLFunc = (DWORD)GetProcAddress(hInst, "PostMessageA") + 5; 
         }
         if (GetPixelDLLFunc == NULL) {
            hInst = LoadLibrary("gdi32.dll");
            GetPixelDLLFunc = (DWORD)GetProcAddress(hInst, "GetPixel") + 5; 
         }
         if (SetCursorDLLFunc == NULL) {
            hInst = LoadLibrary("user32.dll");
            SetCursorDLLFunc = (DWORD)GetProcAddress(hInst, "SetCursorPos") + 5; 
         }
      }
      break;
   case DLL_THREAD_DETACH:
      {
         if (hInst != NULL) {
            // Un-Load DLL
            ::FreeLibrary(hInst);
            hInst = NULL;
         } 
      }
      break;
   case DLL_PROCESS_DETACH:
      {
         if (hInst != NULL) {
            // Un-Load DLL
            ::FreeLibrary(hInst);
            hInst = NULL;
         } 
      }
      break;
   }
   return TRUE;
}


und hier noch die exports.def

ausblenden Quelltext
1:
2:
3:
4:
5:
LIBRARY "BypassedDLLCalls" 
EXPORTS
         myPostMessageA
     myGetPixel
     mySetCursorPos



(mit Visual C++2008 compilierbar)

hier habe ich die dll hier:
www.ingamers.de/flyf...rundlagen-90026.html

vll hilft das ja :)

die dll hab ich natürlich im selben verzeichnis..
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 06.08.09 16:05 
Ich verstehe echt nicht ganz was dir die Verwendung dieser DLL bringen soll. Alle drei exportierten Funktionen sind in der User32.dll enthalten. Und wenn du sie von dort verwendest dürfte es auch ohne Probleme funktionieren.
Denn das was da beim initialisieren der Dll angestellt wird ist nichts anderes wie genau die drei Funktionen, die exportiert werden, zu laden. Wobei aus irgend einem Grund die Startadresse der Funktionen geändert wird.

myPostMessageA = PostMessageA in User32.dll
myGetPixel = GetPixel in User32.dll
mySetCursorPos = SetCursorPos in User32.dll

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 06.08.09 16:13 
jo, das is der sinn davon das ich die startadressen der functionen verändere :)

haste eine idee wie ich die function richtig in delphi benutzen kann? =)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 06.08.09 17:29 
Ich verstehe erhlich gesagt nicht was dir das bringen soll. Denn du weist ja sicherlich nicht wie die Funktionen intern aufgebaut sind. Da einfach mal so ein (oder 5) Byte weiter hinten anzufangen halte ich da für recht gefährlich.
Ich denke das der Fehler auf ein Problem im DllMain hindeutet. Denn wenn das laden der Dll nicht klappen würde sähe die Meldung beim Start der Exe anders aus.
Bist du dir sicher das du DllMain richtig deklariert hast?
ausblenden C#-Quelltext
1:
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReason*/)					

Müsste das nicht eigentlich so sein?
ausblenden C#-Quelltext
1:
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReason)					

Oder den letzten Parameter ganz weg?

So wie ich das sehe produzierst du im DllMain einen Nullpointer, wo das sein könnte sehe ich aber nicht.
Das könntest du aber mit VS rausbekommen indem du die Dll mit dem Debugger startest. (Haltepunkt in DllMain stellen)

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
D3lta Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 06.08.09 17:45 
so leute, danke für eure hilfe so wies aussieht is anscheinend wirklich meine dll mist..

ich hab jetzt eine andere dafür verwendet und das funktioniert reibungslos. dafür hab ich halt leider nich die dll source.

sinn und zweck davon ist es z.B. gameguard zu umgehen da dieser z.B. setcursorpos verbiegt

daher einfachw o anders einspringen lassen und es geht wieder :)