Schade. Sieht so aus als würde die Funktion der 2. Instanz der Kernel32.dll die Funktion der ersten Instanz von ntdll.dll aufrufen
Ich habe die Funktion LoadLibraryA aus der kernel32.dll gewählt. Sie ruft _stricmp aus der ntdll.dll auf.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, uallProtect, uallHook;
var
old_stricmp, next_stricmp:
function(
const str1, str2: Pchar): Integer;
[...
type Form1 Kram]
ntdll,
kernel32: Integer;
implementation
{$R *.dfm}
function new_stricmp(
const str1, str2: Pchar): Integer;
begin
Messagebox(0,'
Old Function called','
Error',MB_ICONWARNING);
result := old_stricmp(str1,str2);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadLibraryA('
twain32.dll');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
SafeLoadLibraryA:
function(lpLibFileName: PAnsiChar): HMODULE;
begin
ntdll := ForceLoadLibraryNt('
ntdll.dll');
kernel32 := ForceLoadLibraryNt('
kernel32.dll');
If (ntdll = GetModulehandle('
ntdll.dll'))
or
(kernel32 = GetModulehandle('
kernel32.dll'))
Then raise Exception.Create('
Failed loading Libs');
@SafeLoadLibraryA := GetProcAddress(kernel32,'
LoadLibraryA');
SafeLoadLibraryA('
twain32.dll');
end;
procedure TForm1.Button3Click(Sender: TObject);
var
h: Integer;
begin
h := GetModuleHandle('
ntdll.dll');
if h > 0
then
begin
@old_stricmp := GetProcAddress(h,'
_stricmp');
if @old_stricmp <>
nil then
uallHook.HookCode(@old_stricmp,@new_stricmp,@next_stricmp);
end;
end;
end.
Zuerst Button3 um den Hook zu attachen. Dann Button1 um zu gucken ob korrekt gehookt wurde. Und zuletzt Button2 um zu gucken ob das zutrifft, was ich vorhin gesagt habe.
Leider kommt bei beiden Buttons die MsgBox
EDIT: Ok. Ich hab nochmal genauer geguckt.
Ich kann GetProcAddress nicht auf die 2. geladene
DLL anweden, warum auch immer
Delphi-Quellcode:
user32 := ForceLoadLibraryNt('
user32.dll');
If (user32 = GetModulehandle('
user32.dll'))
Then raise Exception.Create('
Failed loading Lib');
If Integer(GetProcAddress(user32,'
MessageboxA')) <> 0
Then
@SafeMessageBoxA := GetProcAddress(user32,'
MessageBoxA')
Else
ShowMessage('
go fuck urself');
Ich bekomm die ShowMessage.
EDIT2:
Ok. Ich bin verzweifelt. BRECHIIIIIIIIIII
Ne, jetz ernsthaft. Ich habe die Demo hsflibrary.dpr von brechis uallCollection ausprobiert und bekamm folgende Fehlermeldung bei den Forcelibrary-Funktionen:
Zitat:
---------------------------
hsflibrary.exe - Illegales Verschieben einer System-
DLL
---------------------------
Die System-
DLL "kernel32.dll" wurde im Speicher verschoben. Die Anwendung wird nicht einwandfrei ausgeführt. Die Datei wurde verschoben, da die
DLL "" einen Adressbereich belegt, der für Windows-System-DLLs reserviert ist. Besorgen Sie sich vom
DLL-Lieferanten eine neue
DLL.
---------------------------
OK
---------------------------
Wie verschieben? ich dachte, die
dll wird einfach ein 2. Mal reingeladen? Und warum überhaupt kernel32.dll. Es sollte doch die opengl32.dll öfters reingeladen werden.
(Ja ich habe ForceLoadLibrary
Nt benutzt)