首页
社区
课程
招聘
[原创]如何中断Themida的MessageBox对话框
发表于: 2011-9-19 14:46 26987

[原创]如何中断Themida的MessageBox对话框

2011-9-19 14:46
26987
收藏
免费 6
支持
分享
最新回复 (37)
雪    币: 146
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
看不懂,先收藏,以后再看
2011-10-24 00:41
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
27
user32.dll 读到内存中就能调用了?不需要进行内存映射吗,导入表都不用处理?
MeAddr=MeAddr-(DWORD)hMod;
这个是计算函数的相对偏移,和直接把文件映射到内存里的偏移是不一样的。
2011-10-24 08:09
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
28
cntrump 说的 也是我好奇,你这个demo是怎么跑通的
这种方法 我分析过
只要获得加载dll的首地址
剩下破解就简单了
如果要实现,最少要注意二点
1.dll加载正常
2.自己调用正常
2011-10-24 08:35
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
29
标题和内容,如何联系起来
2012-4-15 13:22
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
楼主仿佛换头像了。。。。。。
2012-4-15 14:06
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
31
PAGE_READWRITE

call过去无法执行,另外没有重定位

编译了无法正确运行,请楼主明示...
2012-4-15 14:11
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
这个能正确运行。。
2012-5-31 10:54
0
雪    币: 2853
活跃值: (2658)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
33
同问,没有重定位,如何运行成功??
2012-5-31 11:15
0
雪    币: 6593
活跃值: (4572)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
34
感谢啊,学到东西了
2013-5-20 13:25
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
感觉像我们这些初级者有点看不懂。
2013-6-10 00:59
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
36
偶然翻到这帖子,为了帮助那些不理解的人,忍不住废话几句。

我想楼主的本意是讲为什么在系统DLL的API地址处断不到想断的函数。
因为Themida/WinLicense对kernel32.dll、user32.dll和advapi32.dll进行了特别处理,所以断不下来。在其他保护软件中也可以看到类似方法。

至于示例代码就不要追究了,并不严谨!说穿了就是File Offset和VA的转换问题。

楼主用了:CreateFileA, VirtualAlloc, ReadFile;而YangCoCol更是“偷懒”:VirtualAlloc, memcpy。大家最关心的问题是:重定位,IAT等都没有处理,为什么它能跑起来?
那你需要想一想“重定位”到底发生了没有、IAT到底是Thunk还是Bind,就不难理解了。

Themida/WinLicense作为一个成熟的产品,可不能这样简单处理。
它用了三个API来载入文件映像:CreateFile,CreateFileMapping和MapViewOfFile,接下来完成必须做的初始化工作。剩下的各种转换等函数借用了"Matt Pietrek"的PEDUMP代码。

因为GetProcAddress不能用了,那么TMD/WL是怎么取得这三个系统DLL里API的地址呢?大概象这样(借用一下楼主的原型):
FARPROC GetApiAddr(LPVOID lpFileImageBase, DWORD FuncNameHash, CHAR FuncNameFirstChar);


其中lpFileImageBase是DLL文件映像基址,在一个目标中可以断VirtualAlloc配合ImageSize得到,或者等目标跑起来后在"Memory Map"中按ImageSize很容易地找到。
FuncNameHash是它根据各API函数名计算的一个Hash,计算方法在各版本中基本相同。
FuncNameFirstChar是API函数名的第一个字符,用于限制搜索范围,缩短时间。

这样你可以自己生成一张对照表:FuncName, APIAddr, FuncNameHash 。断到你想断的任何一个API。我在以前关于WinLicense的帖子中曾经提过。
2013-7-25 12:16
0
雪    币: 97697
活跃值: (200854)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
37
+1
2013-7-26 14:22
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
38
kernel32如果载入到建议加载的位置,就不用重定位。某个api函数中需要用到的自己的函数,是由重定位解决的,需要用的导入函数,是由ff15或者ff25 xxxxxxx决定的,后面的xxxxxxxx是IAT中的位置,没载入到基址需要重定位,否则不需要。也就是说,只要kernel32载入到建议地址,以普通文件载入的kernel32的代码,使用的IAT就是真实的kernel32的IAT来跳转到ntdll的导出函数(kernel32只依赖ntdll)。
上面misthill大牛问题的答案是没有重定位,只是中转作用?
xp不知道kernel32是不是能保证载入到建议地址,win7是不能的,每次kernel32的位置都在变。而且win7每次virtuallloc的位置也不同。
2013-7-27 12:26
0
游客
登录 | 注册 方可回帖
返回
//