首页
社区
课程
招聘
[原创]一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL
发表于: 2012-4-12 23:14 60345

[原创]一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL

2012-4-12 23:14
60345
收藏
免费 6
支持
分享
最新回复 (67)
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
好复杂的dll加载..l.
2012-4-18 22:19
0
雪    币: 58
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
mark一下 ,!
2012-4-19 23:14
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
28
不错的分享,顺便提些问题

1. 关于计算PE文件在内存中的大小
int CMemLoadDLL::CalcTotalImageSize()
这个函数计算大小过于复杂,应该可以直接使用 pNTHeader->OptionalHeader.SizeOfImage

2. 将PE从文件复制到内存
void CMemLoadDLL::CopyDLLDatas(void* pDest, void* pSrc)

  int HeaderSize = pNTHeader->OptionalHeader.SizeOfHeaders;
  int SectionSize = pNTHeader->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
  int MoveSize = HeaderSize + SectionSize;
  //复制头和段信息
  memmove(pDest, pSrc, MoveSize);
其实 pNTHeader->OptionalHeader.SizeOfHeaders 大小已经包含section header的大小,不知道为什么要重复计算。

3. 重定位信息的处理
if( (DWORD)(pLocData[i] & 0xF000) == 0x00003000) //这是一个需要修正的地址
只需要处理类型是3的relocation?

4. 输出节的处理
BOOL CMemLoadDLL::FillRavAddress(void *pImageBase)
DLL的加载是件很复杂的事,这个代码里没有看到如何处理 “绑定输入”?还有“ForwarderChain ”?的情况。

5. 输出的情况和上面类似,也有forwarder的情况。
FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lpProcName)
2012-4-20 16:52
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
29
原贴在这里,转发要注明出处啊。

http://www.zeroplace.cn/article.asp?id=122
2012-4-20 17:20
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
mark 一下加密dll内存加载。感谢楼主
2012-4-21 07:34
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
31
很详细,但强度的确不行的
2012-4-21 09:18
0
雪    币: 181
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
矛和盾永远存在。世上并没有绝对的安全,包括此例。
2012-4-21 10:16
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
mark  学习
2012-4-21 18:10
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
34
顶,m学习学习学习
2012-4-21 22:27
0
雪    币: 615
活跃值: (580)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
35
好文章,好文章,怎么能不顶呢,什么想法都有,
2012-4-22 10:41
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
https://github.com/fancycode/MemoryModule/tarball/v0_0_3

这个老外在2004年就开始了....,2012年最新的v0.03版本支持x64位的DLL
2012-4-23 09:31
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
37
最后一个问题,又有一个疑问,
5. 输出的情况和上面类似,也有forwarder的情况。
FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lpProcName)

能够直接使用GetProcAddress(),传入module的加载地址来获得指定函数嘛?
2012-4-23 09:38
0
雪    币: 1054
活跃值: (1258)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
mark
2012-4-24 02:59
0
雪    币: 322
活跃值: (56)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
39
MemoryModule是目前我一直在用的,比较稳定和可靠,尚未发现不兼容的问题,推荐大家使用此库。
2012-4-24 09:38
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
mark一下 学习内存加载dll
2012-4-24 22:38
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
写的很不错,很清晰,最好将源码以附件的方式提供,这样排版更清楚一些。
2012-5-2 20:43
0
雪    币: 248
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
写的很精彩,学学
2012-5-2 21:54
0
雪    币: 322
活跃值: (56)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
43
此贴为其他网站转自我的原创文章,请留意签名和邮箱,此文章在几年前已经在程序员杂志由本人发表,先贴出来大家一起分享思路,另外比较完善的内存加载DLL的库请到:

https://github.com/fancycode/MemoryModule/tarball/v0_0_3

下载MemoryModule.c,兼容性最好。
2012-5-3 11:31
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
44
为什么注入游戏的程序再执行上面的内存加载的时候会出错,其实也不是出错,就是createthread无法创建线程,创建线程之后线程函数不运行,请问这是怎么会事儿呢?
2012-8-8 15:05
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
有必要吗.导入表动态一下,virtualalloc,固定基止,就是一段内存而已,多麻烦这样.
2012-8-11 22:07
0
雪    币: 221
活跃值: (2306)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
46
给个实例,看的明白一些。。谢谢了。。
2012-8-14 13:12
0
雪    币: 64
活跃值: (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
好深奥。
2012-8-15 13:31
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
48
mark一个,估计很快会用到
2012-8-15 15:40
0
雪    币: 342
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
mark一下,留为备用
2012-8-15 15:58
0
雪    币: 76
活跃值: (206)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
50
mark
2013-4-15 16:37
0
游客
登录 | 注册 方可回帖
返回
//