Entwickler-Ecke
Open Source Projekte - myhook unit (injecten von dlls, API hook)
uall@ogc - Sa 26.02.05 14:24
Titel: myhook unit (injecten von dlls, API hook)
geeigenet für dll injection in andere prozesse, API hooks etc.
funktionen:
Delphi-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: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212:
| function mygetOwnModuleHandle: integer; stdcall;
function myLoadLibrary(dllname: pchar): integer; stdcall; overload;
function myLoadLibrary(dllname, name: pchar): integer; stdcall; overload;
function myFreeLib(module: integer): boolean; stdcall;
function myCreateRemoteThread(pid: cardinal; p: pointer): boolean; stdcall;
function myInjectLibrary2(pid: cardinal; dlln: pchar): pointer; stdcall;
function myInjectLibrary(pid: cardinal; dlln: pchar): boolean; stdcall;
function myVirtualAllocEx(pid: cardinal; size: cardinal): pointer; stdcall;
function myVirtualFreeEx(pid: cardinal; memaddr: pointer; size: cardinal): boolean; stdcall;
function myOpenThread(access: integer; inherithandle: boolean; tid: integer): integer; stdcall;
function myGetThread(pid: integer): integer; stdcall;
function myFindProcessThread(exenames: pchar): integer; stdcall;
function myFindModulesInProcess(pid: cardinal): pchar; stdcall;
function myHookApiIAT(modulehandle: integer; oldfunction, myfunction: pointer): boolean; stdcall; overload;
function myHookApiIAT(oldfunction, myfunction: pointer): boolean; stdcall; overload;
function myInjectLibraryUnsecure(pid: cardinal; dlln: pchar): boolean; stdcall;
function myInjectLibraryUnsecure2(pid: cardinal; dlln: pchar): boolean; stdcall;
function myInstructionLength(addr: pointer): integer; stdcall;
function myHookAPIJMP(oldfunction,yourfunction: pointer; var nextfunction: pointer): boolean; stdcall;
function myUnhookAPIJMP(nextfunction: pointer): boolean;
function myHookAPIJMPUnsecure(oldfunction,yourfunction: pointer; var nextfunction: pointer): boolean; stdcall; assembler;
function myUnhookApiJMPunsecure(nextfunction: pointer): boolean; stdcall; assembler;
function myFindProcess(exenames: pchar): integer; stdcall;
function myCreateRemoteThreadUnsecure(pid: cardinal; addr: pointer; NTuseCRT: boolean): cardinal; stdcall;
function myisNT: boolean; stdcall;
function myGetProcAddr(module: integer; procname: pchar): pointer; stdcall;
function myGetDebugPrivilege: boolean; stdcall; |
Moderiert von UGrohne: Link entfernt.
Christian S. - Sa 26.02.05 14:25
Hallo!
Bitte beschreibe Deine Unit ein wenig, damit man auch weiß, worum es geht!
MfG
Christian
uall@ogc - Fr 04.03.05 14:52
2 neue funktionen hinzugefügt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function myForceLoadLibraryA(name: pchar): integer; stdcall;
function myGhostLibrary(lib: integer): boolean; stdcall; |
F34r0fTh3D4rk - Di 29.03.05 14:14
angenommen ich lade damit eine gefakte opengl32.dll in den prozess, dann muss ich doch nur die funktionen in die fake dll eintragen, die ich brauche, die anderen sind schon im speicher, oder ?
werden dann nur die "alten" funktionen überschrieben ?
Delphi-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:
| library fakeogl32;
uses windows;
const opengl32 = 'C:\windows\system32\opengl32.dll';
type HGLRC = THandle;
type GLenum = Cardinal;
const GL_TRIANGLE_STRIP = $0005; GL_TRIANGLE_FAN = $0006; GL_DEPTH_TEST = $0B71;
procedure oldglBegin (mode: GLenum); stdcall; external opengl32 name 'glBegin'; procedure glDisable (cap: GLenum); stdcall; external opengl32 name 'glDisable'; procedure glEnable (cap: GLenum); stdcall; external opengl32 name 'glEnable';
procedure glBegin(mode: glenum); stdcall; begin if (mode = GL_TRIANGLE_STRIP) or (mode = GL_TRIANGLE_FAN) then glDisable(GL_DEPTH_TEST) else glEnable(GL_DEPTH_TEST); end;
exports glBegin;
begin end. |
reicht das als dll aus, um sie dann als wallhack in cs zu laden ?
wird alles andere übernommen ?
BenBE - Di 29.03.05 14:35
Ich glaubs nicht, da der Normalen GetProcAddress-Funktion die ganzen anderen Methoden aus der OGL fehlen würden --> Fehler.
Du könntest aber einen GetProcAddress-Hook machen, der bei Angabe des OGL-Handles erst prüft, ob die Funktionen bei dir drin stehen und wenn dies nicht der Fall ist, diese aus der eigentlichen OGL nachladen.
F34r0fTh3D4rk - Di 29.03.05 14:45
ich dachte, das wäre bei der funktion automatisch, also dass das alte im speicher durch das neue ersetzt wird, nur muss man die dll ja erstmal kompilieren können ^^
uall@ogc - Di 29.03.05 14:48
nein geht so nicht
1.) solltest in einer dll die glBegin etc. dynamisch laden (nicht statisch) d.h. mit GetProcAddress holen -> d.h. du musst gegebenfalls vorher selber die opgnl32.dll laden falls sie noch nicht im speicher ist
2.) danach kannste nen API jmp hook machen (myHookApiJmp) und zwar mit den parametern @oldglBegin (die aus der opengl32.dll) @myglBegin (deine glBegin functkion) @nextglBegin (die funktion die du aufrufen musst anstatt der originalen glBegin da diese ja gehookt wurde, also die funktion die du dann wieder in myglBegin benutzen kannst)
F34r0fTh3D4rk - Di 29.03.05 14:53
ok werde ich so machen, hab ja genug beispiele von dir :D
bart rox !
@uall: hab beim thread (asm code an spiel schicken) noch was editiert, gucks dir an
uall@ogc - Di 29.03.05 14:53
Delphi-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:
| library hackdll;
uses windows, myhook;
type GLenum = Cardinal; const GL_TRIANGLE_STRIP = $0005; GL_TRIANGLE_FAN = $0006; GL_DEPTH_TEST = $0B71;
var nextglBegin: procedure (mode: GLenum); stdcall; oldglBegin: procedure (mode: GLenum); stdcall; oldglDisable: procedure (cap: GLenum); stdcall; oldglEnable: procedure (cap: GLenum); stdcall;
procedure myglBegin(mode: glenum); stdcall; begin if (mode = GL_TRIANGLE_STRIP) or (mode = GL_TRIANGLE_FAN) then oldglDisable(GL_DEPTH_TEST) else oldglEnable(GL_DEPTH_TEST); nextglBegin(mode); end;
var hogl: integer; begin hogl := GetModuleHandle('opengl32.dll'); if hogl = 0 then hogl := LoadLibaryA('opengl32.dll');
@oldglBegin := GetProcAddress(oglh,'glBegin'); @oldglEnable := GetProcAddress(oglh,'glEnable'); @oldglDisable := GetProcAddress(oglh,'glDisable');
myhook.myHookAPIJMP(@oldglBegin,@myglBegin,@nextglBegin); end. |
die dll sollte dann so aussehen (ungetestet) wenn du nun die in den speicher lädst fänst du immer glBegin ab
F34r0fTh3D4rk - Di 29.03.05 14:55
oh, danke fürs beispiel :D
wie lade ich die jetzt von der exe aus ?
mit function myInjectLibrary(pid: cardinal; dlln: pchar): boolean; stdcall; ?
uall@ogc - Di 29.03.05 14:58
hatte vergessen die original glBegin funktion aufzurufen,wenn das nicht machst dann flackert das bild und du siehst nichst mehr
aber pass auf das du nextGlbegin aufrufst und nicht oldglBegin da wir ja oldglBegin gehookt haben und es sonst zu einer endlosschleife kommen würde
F34r0fTh3D4rk - Di 29.03.05 15:01
meinst du die zeile
aus der myglbegin ?
uall@ogc - Di 29.03.05 15:02
jo genau die
F34r0fTh3D4rk - Di 29.03.05 15:06
hab gestern versucht text anzeigen zu lassen, beim starten habe ich gesehen, dass mein konsolen text blau war, hab ich gedacht, ist ja auch mal schön, aber im spiel hatte ich nur blaues bild ^^ (guck mal bei asm befehl an spiel schicken, ich glaub ich mach da aber gleich mal nen neuen thread für auf ^^)
//ist aber doch sehr cs spezifisch die frage, kannst eh nur du wissen ^^
dann lass ichs ^^
ich schick dir ne pm !
F34r0fTh3D4rk - Sa 18.03.06 12:17
îch hab mich mal wieder dran versucht, weil ich grad nichts zu tun habe:
glhook.dll
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:
| library glhook;
uses windows, SysUtils, uallhook;
type GLenum = cardinal; const GL_TRIANGLE_STRIP = $0005; GL_TRIANGLE_FAN = $0006; GL_DEPTH_TEST = $0B71; var oldglBegin, nextglBegin: procedure(mode: GLenum); stdcall; oldglDisable: procedure(cap: GLenum); stdcall; oldglEnable: procedure(cap: GLenum); stdcall;
procedure myglBegin(mode: glenum); stdcall; begin if (mode = GL_TRIANGLE_STRIP) or (mode = GL_TRIANGLE_FAN) then oldglDisable(GL_DEPTH_TEST) else oldglEnable(GL_DEPTH_TEST); nextglBegin(mode); end;
procedure injectmain; var h: integer; begin h := GetModuleHandle('opengl32.dll'); if h = 0 then LoadLibraryA('opengl32.dll'); if h > 0 then begin @oldglBegin := GetProcAddress(h, 'glBegin'); @oldglEnable := GetProcAddress(h, 'glEnable'); @oldglDisable := GetProcAddress(h, 'glDisable'); if @oldglBegin <> nil then uallHook.HookCode(@oldglBegin, @myglBegin, @nextglBegin); end; end;
procedure uninjectmain; begin uallHook.UnhookCode(@nextglBegin); end;
procedure dllmain(dwReason: integer); begin case dwreason of DLL_PROCESS_ATTACH: injectmain; DLL_PROCESS_DETACH: uninjectmain; end; end;
begin DLLProc := @DLLMain; DLLMain(1); end. |
hack.exe
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| program hack;
{$APPTYPE CONSOLE}
uses windows, uallHook, uallProcess, uallUtil;
var pid: integer; begin pid := uallProcess.FindProcess('cstrike.exe'); if pid = 0 then pid := uallProcess.FindProcess('hl.exe'); if pid <> 0 then begin if uallHook.InjectLibrary(pid,pchar(uallUtil.GetExeDirectory + 'glhook.dll')) <> nil then MessageBox(0, 'Injection successful', nil, 0) else MessageBox(0, 'Injection failed', nil, 0); end; end. |
das war nur zu testzwecken, weil ich mal was anderes vorhatte, jedoch schmiert cs nach der injektion ab, warum ?
oern - So 19.03.06 20:41
Gibt es vieleicht noch einen anderen Downloadlink der oben funktioniert nicht :cry:
uall@ogc - So 19.03.06 21:07
@FearOfTheDark:
uallProcess kann auch mehrere Namen als Parameter bekommen, dann findet der einen von den Prozessen
für HL wäre da z.b. sowas gedacht:
Delphi-Quelltext
1:
| uallProcess.FindProcess('hl.exe' + #13#10 + 'cstrike.exe' + #13#10 + 'czero.exe'); |
F34r0fTh3D4rk - Mo 20.03.06 15:05
das ist schön, leider funktioniert es nicht, das game schmiert einfach nur ab :lol:
ich habe mir mal andere loader von dir angeguckt, auch den SE Lite Loader, der import die inject funktionen ja von der dll, die er in den prozess injiziert, wo liegt der zweck dessen ?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!