首页
社区
课程
招聘
[求助]如何从资源加载dll
发表于: 2008-8-5 15:43 6489

[求助]如何从资源加载dll

2008-8-5 15:43
6489
目前遇到一个问题,软件使用了第三方的dll,打算将其放入资源,然后运行时从资源里加载该dll,加载成功后使用标准系统API读取该dll的资源,调用该dll中的导出函数.

有以下两种情况
1.纯资源dll,如何从资源加载纯资源的dll
2.含可执行代码的dll,如何从资源加载这类dll

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 219
活跃值: (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
看看我这个合用不,不过我这是用Delphi的,下面是一个例子

也可以下载去看看
e04K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4g2Q4x3X3g2K6K9%4W2Y4P5W2)9J5k6h3y4G2L8g2)9J5c8X3#2&6M7r3q4F1k6g2)9J5k6h3q4K6M7s2S2Q4x3@1k6V1L8%4N6F1i4K6y4p5L8$3E0Q4x3U0k6X3K9h3I4W2M7r3q4@1K9q4)9K6c8s2y4C8P5h3N6*7i4K6t1#2x3X3k6Q4x3U0g2T1x3W2)9J5y4h3k6S2i4K6t1#2j5K6k6Q4x3U0g2T1y4#2)9J5y4e0u0X3i4K6t1#2j5U0c8Q4x3U0g2V1x3#2)9J5y4h3x3@1i4K6t1#2k6r3q4Q4x3U0g2T1y4q4)9J5y4h3f1$3i4K6t1#2j5X3y4Q4x3U0g2V1x3#2)9J5y4h3b7@1i4K6t1#2k6o6S2p5e0p5I4Q4x3U0g2T1x3W2)9J5y4h3p5J5i4K6t1#2j5U0g2Q4x3U0g2X3y4#2)9J5y4h3b7K6i4K6t1#2j5K6y4Q4y4h3k6Q4x3U0g2T1j5g2)9J5y4h3q4X3i4K6t1#2j5$3q4Q4x3U0g2X3k6q4)9J5y4h3u0X3i4K6t1#2k6e0u0Q4y4h3k6r3e0#2u0Q4y4h3k6p5k6h3I4H3K9r3W2Q4y4h3k6$3x3g2)9#2k6U0m8Q4y4h3j5H3i4K6g2X3x3g2)9J5k6i4u0S2M7R3`.`.

{$R MyDll.Res}

{.$DEFINE UseDll}

{$IFDEF UseDLL}
Const
  RawLibApi = 'RawLibApi.DLL';
Function _LoadLibraryA(FileName: PAnsiChar): hModule; Stdcall; External RawLibApi;
Function _LoadLibraryW(FileName: PWideChar): hModule; Stdcall; External RawLibApi;
Function _LoadLibraryFromResourceA(Instance: THandle; Name, ResType: PAnsiChar): hModule; Stdcall; External RawLibApi;
Function _LoadLibraryFromResourceW(Instance: THandle; Name, ResType: PWideChar): hModule; Stdcall; External RawLibApi;
Function _LoadLibraryFromResourceIDA(Instance: THandle; ResID: Integer; ResType: PAnsiChar): hModule; Stdcall; External RawLibApi;
Function _LoadLibraryFromResourceIDW(Instance: THandle; ResID: Integer; ResType: PWideChar): hModule; Stdcall; External RawLibApi;
Function _LoadLibraryMem(lpMemory: Pointer): hModule; Stdcall; External RawLibApi;
Function _GetProcAddress(hModule: hModule; lpProcName: LPCSTR): Pointer; Stdcall; External RawLibApi;
Procedure _FreeLibrary(hModule: hModule); Stdcall; External RawLibApi;
Procedure _LoadMemRunExe(lpMemory: Pointer); Stdcall; External RawLibApi;
{$ELSE}
Uses
  MemLibLoader;
{$ENDIF}

Var
  DllHandle: THandle;
  MsgBox: Function(lpText, LpCaption: PAnsiChar): Integer; Stdcall;
  MsgBoxEx: Function(lpText, LpCaption: PAnsiChar; UType: UINT): Integer; Stdcall;

Procedure TFrmMain.Cmd_ByNameClick(Sender: TObject);
Begin
  If @MsgBox <> Nil Then
    MsgBox('这是按名称调用的函数', '提示');
End;

Procedure TFrmMain.CmdByIndexClick(Sender: TObject);
Begin
  If @MsgBoxEx <> Nil Then
    MsgBoxEx('这是按序号调用的函数', '提示', MB_ICONINFORMATION Or MB_OKCANCEL);
End;

Procedure TFrmMain.SetControls(B: Boolean);
Begin
  Cmd_Load.Enabled := Not B;
  Cmd_Free.Enabled := B;
End;

Procedure TFrmMain.Cmd_LoadClick(Sender: TObject);
Var
  FileName: String;
  Mem: TMemoryStream;
  FileArray: Array Of Byte;
Begin
  SetControls(true);
  FileName := ExtractFilePath(ParamStr(0)) + 'MyDll.Dll';
  Case CBLoadType.ItemIndex Of
    0:                                  //内存
      Begin
        Mem := TMemoryStream.Create;
        Mem.LoadFromFile(FileName);
        DllHandle := _LoadLibraryMem(Mem.Memory);
        Mem.Free;
      End;
    1:                                  //数组
      Begin
        Mem := TMemoryStream.Create;
        Mem.LoadFromFile(FileName);
        SetLength(FileArray, Mem.Size);
        Mem.ReadBuffer(FileArray[0], Mem.Size);
        DllHandle := _LoadLibraryMem(FileArray);
        Mem.Free;
      End;
    2: DllHandle := _LoadLibraryFromResourceA(HInstance, 'MyDLL', 'DLL'); //资源
    3: DllHandle := _LoadLibraryA(PChar(FileName)); //文件
  End;
  If DllHandle <> 0 Then
  Begin
    @MsgBox := _GetProcAddress(DllHandle, 'MsgBox');
    @MsgBoxEx := _GetProcAddress(DllHandle, MakeIntResource($1));
  End Else SetControls(false);
End;

Procedure TFrmMain.Cmd_FreeClick(Sender: TObject);
Begin
  SetControls(false);
  @MsgBox := Nil;
  @MsgBoxEx := Nil;
  _FreeLibrary(DllHandle);
End;

Procedure TFrmMain.FormCreate(Sender: TObject);
Begin
  CBLoadType.ItemIndex := 0;
End;

//==============================================================================

{$I MSComm32.Inc}

Procedure TFrmMain.CmdTestClick(Sender: TObject);
Var
  ActiveXDllHandle: THandle;
  DllGetClassObject: Function(Const CLSID, IID: TGUID; Var Obj): HResult; Stdcall;

  vClassFactory: IClassFactory;
  v: IMSComm;
Begin
  //  ConvFileToArray('C:\Windows\System32\MSComm32.OCX', 'MSComm32');

  ActiveXDllHandle := _LoadLibraryMem(@MSComm32);
  @DllGetClassObject := _GetProcAddress(ActiveXDllHandle, 'DllGetClassObject');
  If @DllGetClassObject <> Nil Then
  Begin
    DllGetClassObject(CLASS_MSComm, IClassFactory, vClassFactory);
    If Assigned(vClassFactory) Then
    Begin
      vClassFactory.CreateInstance(Nil, IMSComm, v);
      If Assigned(v) Then
      Begin
        v.AboutBox;
        v := Nil;
      End;
      vClassFactory := Nil;
    End;
    _FreeLibrary(ActiveXDllHandle);
  End;

End;
2008-8-6 12:16
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
释放到当前目录再调用不行吗
2008-8-6 17:59
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
4
有C++/Delphi的Src自己找找

사랑해
2008-8-6 18:36
0
雪    币: 367
活跃值: (35)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
谢谢各位,我从网上找到一个CMemDll,搞定了,不过兼容性是一个很大的问题,貌似比较适合算法dll,涉及模块句柄的一些应用比较受限制
2008-8-18 17:13
0
游客
登录 | 注册 方可回帖
返回