Einzelnen Beitrag anzeigen

Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#1

CoDOMDocument40.Create --> Prozess friert ein

  Alt 4. Nov 2007, 16:29
Hallo,
Ich befürchte entweder einen ganz ekligen undurchschaubaren Fehler oder einen Leichtsinnsfehler. (Habe bisher fast garnichts mit COM gemacht).

Ich habe folgende DLL, die ich in einen anderen Prozess injeziere (was alles klappt und eigentlich nichts zur Sache tut). Von dort aus möchte ich XML Dateien parsen. Doch es scheitert schon beim instanzieren von IXMLDomDocument2. Der Aufruf "DOMDocument40.Create" friert gleich den ganzen Prozess ein.

Hier mal vereinfacht der Code:

Die DLL:
Delphi-Quellcode:
library DllMain;

uses
  Windows,
  Sysutils,
  ActiveX,
  ComObj,
  ...
  uSettings in 'uSettings.pas';

{$R *.res}

//============================================================================//
procedure Main(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
      begin
       DisableThreadLibraryCalls(hInstance);
       OleCheck(CoInitialize(nil));

        // Init Classes
        ...
        gSet := CSettings.Create(gLog,cvar,ModulePath+'\settings.xml');
        ...
      end;
    DLL_PROCESS_DETACH:
      begin
        ...
        gSet.Free;
        CoUninitialize;
      end;
  end;
end;
//============================================================================//
begin
  DllProc := @Main;
  Main(DLL_PROCESS_ATTACH);
end.
In der uSettings.pas
Delphi-Quellcode:
type
  CSettings = class(TObject)
    public
      constructor Create(log: CDeepLog; cvar: CCVAR; xmlfile: String);
    private
      xmlDoc: IXMLDomDocument2;
      outLog: CDeepLog;
      DoLog : Boolean;
      useXML: Boolean;
      procedure LoadDefaults(var cvar: CCVAR);
      procedure LoadXMLSettings(var cvar: CCVAR);
    end;
implementation
//***************************************************************************//
// //
// CSettings - Implementation //
// //
//***************************************************************************//
constructor CSettings.Create(log: CDeepLog; cvar: CCVAR; xmlfile: String);
begin
  inherited Create;
  outlog := log;
  If Assigned(outlog) Then
    DoLog := True
  Else
    DoLog := False;

  If FileExists(xmlFile) Then
    begin
      // asm
       // db $EB, $FE
     // end;
      xmlDoc := CoDOMDocument40.Create;
      MessageBox(0,'I do never appear :(',':(',$40);
     ...
end;
Das habe ich in OllyDbg mal untersucht. Mal alle Function Calls ab CoDOMDocument40.Create getraced und es läuft darauf hinaus, dass ein Syscall "NtMapViewOfSection" nie zurückkehrt und gleich den ganzen prozess einfrieren lässt.

Delphi-Quellcode:
7C91DC55 B8 6C000000 MOV EAX,6C //0x6C -> NtMapViewOfSection
7C91DC5A BA 0003FE7F MOV EDX,7FFE0300
7C91DC5F FF12 CALL DWORD PTR DS:[EDX] //KiFastSystemCall
7C91DC61 C2 2800 RETN 28 //Kehrt nicht zurück :/

Stack:
 [ESP] 7C91DC61 RETURN to 7C91DC61
0379EE08 7C92C3DA RETURN to 7C92C3DA from 7C91DC55
0379EE0C 00002F64
0379EE10 FFFFFFFF
0379EE14 0379EEDC
0379EE18 00000000
0379EE1C 00000000
0379EE20 00000000
0379EE24 0379EED0
0379EE28 00000001
0379EE2C 00000000
0379EE30 00000004
http://undocumented.ntinternals.net/...OfSection.html

Ich bin eigentlich nicht sehr optimistisch, aber vielleicht hat einer eine Idee.
Danke schonmal für jeden Hinweis.
  Mit Zitat antworten Zitat