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

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

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

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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

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

也可以下载去看看
http://u.skygz.com/mypane.aspx?down=ok&filepath=skygz%2f%b2%fa%c6%b7%2f%b4%d3%c4%da%b4%e6%bc%d3%d4%d8DLL%b2%a2%b5%f7%d3%c3_%ba%af%ca%fd%bf%e2_FOR_Delphi_v1_0_0_1.rar

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