VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: 19900603

[分享] 我也来个内存加载Dll

  [复制链接]
 楼主| 发表于 2015-1-10 22:37:08 | 显示全部楼层
本帖最后由 19900603 于 2015-1-11 19:31 编辑

不能加载加了壳的 Dll 确实很让人郁闷。。。
晚上又重新缕了下源码。。。与PEtool 里的参数 对比了下。。
居然没找到导入表,百度了N篇文章终于找到问题了。。。。。
原来是 FirstThunk 和 OriginalFirstThunk 的原因

参考文章(老外写的PE文件格式)
http://win32assembly.programminghorizon.com/pe-tut6.html


源码里已经修复 可以正常加载加了压缩壳的Dll了。。。
测试压缩工具
ASPACK
NSPACK
UPX没测试。。。加不上壳- -!
求分,求精华

游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1威望 +13 人气 +3 收起 理由
startbin321 + 13 + 3 能加载加壳的dll 就该精华

查看全部评分

回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2015-1-11 22:31:21 | 显示全部楼层
这个要顶,测试一下
回复 支持 反对

使用道具 举报

发表于 2015-1-12 00:22:26 | 显示全部楼层
期待DLL自动隐藏(据说也是修改PE)

点评

40楼 加分 - -!  发表于 2015-1-12 23:36
回复 支持 反对

使用道具 举报

发表于 2015-1-12 15:37:19 | 显示全部楼层

果断回帖,如果沉了就是我弄沉的很有成就感。
回复 支持 反对

使用道具 举报

发表于 2015-1-12 15:56:37 | 显示全部楼层
好用吗?有试过?
回复 支持 反对

使用道具 举报

发表于 2015-1-12 16:04:37 | 显示全部楼层
19900603 发表于 2015-1-10 22:37
不能加载加了壳的 Dll 确实很让人郁闷。。。
晚上又重新缕了下源码。。。与PEtool 里的参数 对比了下。。 ...

每个函数要写一个空的函数,这样比较累,要是不用写也能实现就更强了。
回复 支持 反对

使用道具 举报

发表于 2015-1-12 16:04:58 | 显示全部楼层
19900603 发表于 2015-1-10 22:37
不能加载加了壳的 Dll 确实很让人郁闷。。。
晚上又重新缕了下源码。。。与PEtool 里的参数 对比了下。。 ...

每个函数要写一个空的函数,这样比较累,要是不用写也能实现就更强了。
回复 支持 反对

使用道具 举报

发表于 2015-1-12 16:05:35 | 显示全部楼层
这样就可以把DLL加到资源文件中,然后动态调用了,很不错,可以把EXE做成单文件方式了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-12 18:49:00 | 显示全部楼层
本帖最后由 19900603 于 2015-1-12 18:51 编辑
qq275158045 发表于 2015-1-12 00:22
期待DLL自动隐藏(据说也是修改PE)


试试吧。。。不知道有木有Bug  缺少的API自己补全吧。。。我VB自动引用TLB 很少声明API
对了如果是VB内声明API Hide前要把所有API调用一次
用完记得 VirtualFree  - -!
  1. Private Type MEMORY_BASIC_INFORMATION
  2.      BaseAddress As Long
  3.      AllocationBase As Long
  4.      AllocationProtect As Long
  5.      RegionSize As Long
  6.      State As Long
  7.      Protect As Long
  8.      lType As Long
  9. End Type
  10. Private Declare Function VirtualAlloc Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
  11. Private Declare Function VirtualFree Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
  12. Private Declare Function VirtualQuery Lib "kernel32" (lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long

  13. Private Function GetModuleLength(hModule As Long) As Long
  14.     Dim MemBasic As MEMORY_BASIC_INFORMATION
  15.     Dim ret As Long
  16.     Dim Offset As Long
  17.     Dim oldp As Long
  18.     Do
  19.         ret = VirtualQuery(ByVal hModule + Offset, MemBasic, LenB(MemBasic))
  20.         If ret = LenB(MemBasic) And MemBasic.AllocationBase = hModule Then
  21.             Rem 返回成功
  22.             Offset = Offset + MemBasic.RegionSize
  23.         Else
  24.             Rem 返回失败
  25.             GetModuleLength = Offset
  26.             Exit Do
  27.         End If
  28.     Loop
  29. End Function
  30.                                                                     
  31. Public Function HideModule(hModule As Long) As Boolean
  32.     Dim Libsize As Long
  33.     Dim buf     As Long
  34.     Const MEM_COMMIT                          As Long = &H1000&
  35.     Const MEM_RESERVE                         As Long = &H2000&
  36.     Const PAGE_EXECUTE_READWRITE              As Long = &H40&
  37.     Rem 获取模块占用内存大小,暴力搜内存页
  38.     Libsize = GetModuleLength(hModule)
  39.     If Libsize = 0 Then Exit Function
  40.     Rem 申请内存缓冲区
  41.     buf = GlobalAlloc(0, Libsize)
  42.     Rem 拷贝数据到缓冲区
  43.     CopyMemory ByVal buf, ByVal hModule, Libsize
  44.     Rem 释放Dll
  45.     While FreeLibrary(hModule) <> 0
  46.         Rem 直到把所有引用全部释放完毕为止
  47.         Rem 这里最好加个检测。。。如果某些Dll释放不了 会卡死滴
  48.     Wend
  49.     Rem 在原来的模块位置重新申请内存
  50.     hModule = VirtualAlloc(ByVal hModule, Libsize, MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
  51.     If hModule = 0 Then
  52.         Rem 申请失败 释放缓冲区
  53.         GlobalFree ByVal buf
  54.         Exit Function
  55.     End If
  56.     Rem 把缓冲区数据拷贝进去
  57.     CopyMemory ByVal hModule, ByVal buf, Libsize
  58.     Rem 释放掉缓冲区内存
  59.     GlobalFree ByVal buf
  60.     Rem 返回成功
  61.     HideModule = True
  62. End Function
复制代码

评分

参与人数 1威望 +13 人气 +3 收起 理由
qq275158045 + 13 + 3 好像有BUG

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2015-1-13 02:32:00 | 显示全部楼层
19900603 发表于 2015-1-12 18:49
试试吧。。。不知道有木有Bug  缺少的API自己补全吧。。。我VB自动引用TLB 很少声明API
对了如果是VB内 ...

奇怪我这样调用程序直接蹦了。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

看45楼 找了篇帖子 翻译过来了。。 不过编译需要用到我那个IDE插件  发表于 2015-1-13 19:54
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-5-29 04:42

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表