首页
论坛
专栏
课程

[下载] AheadLib修改 支持x64支持类/命名空间

2018-1-31 17:26 7890

[下载] AheadLib修改 支持x64支持类/命名空间

2018-1-31 17:26
7890
上一主题 下一主题
打赏 + 20.00
打赏次数 2 金额 + 20.00
收起 
赞赏  浩天he   +10.00 2018/03/07
赞赏  hackbs   +10.00 2018/02/27
最新回复 (81)
yeyeshun 2 2018-2-28 10:26
51
0
这个主要是这么个用途,变量是必须直接转发的,否则中转dll的变量在一个地址,原始dll的变量在一个地址,运行期间肯定会出问题的。所以必须加上一个判断是否变量的函数。但是方法也许不是很好,现在的判断是要么这个地址不存在dll文件偏移,要么所在文件偏移具有执行权限。
然后其他直接转发的还有一些编译器直接生成的函数或变量,比如带有`和'符号的,虚函数表啥的
csjwaman 24 2018-3-4 09:17
52
0
yeyeshun 这个主要是这么个用途,变量是必须直接转发的,否则中转dll的变量在一个地址,原始dll的变量在一个地址,运行期间肯定会出问题的。所以必须加上一个判断是否变量的函数。但是方法也许不是很好,现在的判断是要 ...
将这个函数修改了一下,不知这样是否正确,请楼主指教:
BOOL WINAPI CAheadLib::IsFunction(const PIMAGE_NT_HEADERS pInh, DWORD dwRva)   //判断函数
{
INT i;
PIMAGE_SECTION_HEADER pIsh;

pIsh = (PIMAGE_SECTION_HEADER)((PBYTE)pInh + sizeof(IMAGE_NT_HEADERS));

if (pInh->OptionalHeader.FileAlignment == pInh->OptionalHeader.SectionAlignment)   //判断文件块对齐与节对齐是否相同
{

for (i = 0; i < pInh->FileHeader.NumberOfSections; i++, pIsh++)
{
if (dwRva >= (pIsh->VirtualAddress))
{
if (((pIsh)->VirtualAddress) + pIsh->Misc.VirtualSize > dwRva)
{
if ((pIsh->Characteristics & IMAGE_SCN_MEM_EXECUTE))
{
return dwRva;
}
else
{
return 0;
}
}
}
}
return 0;
}else{
for (i = 0; i < pInh->FileHeader.NumberOfSections; i++, pIsh++)
{
if (dwRva >= (pIsh->VirtualAddress))
{
if (((pIsh->VirtualAddress) + (pIsh->SizeOfRawData)) > dwRva)
{
if ((pIsh->Characteristics & IMAGE_SCN_MEM_EXECUTE))
{
return dwRva - pIsh->VirtualAddress + pIsh->PointerToRawData;
}
else
{
return 0;
}
}
}
}
return 0;
}
}
最后于 2018-3-4 10:49 被csjwaman编辑 ,原因:
eapple 2018-3-5 08:38
53
0
直接转发,
最后于 2018-3-5 08:50 被eapple编辑 ,原因:
上传的附件:
csjwaman 24 2018-3-5 10:04
54
0
我编译了一下,貌似没有问题呀
上传的附件:
eapple 2018-3-5 10:15
55
0
编译没有问题,直接转发, 是错误的,用这个文件调用的dll,你试试看
最后于 2018-3-5 10:15 被eapple编辑 ,原因:
上传的附件:
eapple 2018-3-5 10:26
56
0
csjwaman 我编译了一下,貌似没有问题呀
可能是IDE问题,用2017编译没问题,用VC6就不行。。
yeyeshun 2 2018-3-5 11:22
57
0
csjwaman yeyeshun 这个主要是这么个用途,变量是必须直接转发的,否则中转dll的变量在一个地址,原始dll的变量在一个地址,运行期间肯定会出问题的。所以必须加上 ...
加了这个判断之后是否对于加壳dll有效?基于什么原理?能不能把函数修改前后,分别对加壳dll生成的文件发来看一下,因为我对这方面的东西也不是特别清楚,如果对照生成结果的话,或许能更容易理解。
yeyeshun 2 2018-3-5 11:25
58
0
eapple 可能是IDE问题,用2017编译没问题,用VC6就不行。。
涉及到编译器版本我就无能为力了。不过vc6确实太老了,很多东西都不一样的了。似乎std库和MFC库的一些实现上都有很大的改变。
csjwaman 24 2018-3-5 15:16
59
0
yeyeshun 涉及到编译器版本我就无能为力了。不过vc6确实太老了,很多东西都不一样的了。似乎std库和MFC库的一些实现上都有很大的改变。
加了壳一般对齐粒度会相同,区段中物理地址和数据长度会被清零,但内存地址和内存数据长度一般不能清零。
最后于 2018-3-5 15:21 被csjwaman编辑 ,原因:
上传的附件:
csjwaman 24 2018-3-5 15:23
60
0
yeyeshun 加了这个判断之后是否对于加壳dll有效?基于什么原理?能不能把函数修改前后,分别对加壳dll生成的文件发来看一下,因为我对这方面的东西也不是特别清楚,如果对照生成结果的话,或许能更容易理解。
我就是用VC6编译的。
yeyeshun 2 2018-3-5 18:02
61
0
csjwaman yeyeshun 涉及到编译器版本我就无能为力了。不过vc6确实太老了,很多东西都不一样的了。似乎std库和MFC库的一些实现上都有很大的改变。 加了壳 ...
看到了,效果非常牛逼。那么会不会对其他正常的东西产生影响?比如一些变量什么的
csjwaman 24 2018-3-5 18:39
62
0
yeyeshun 看到了,效果非常牛逼。那么会不会对其他正常的东西产生影响?比如一些变量什么的
对函数功能不会产生影响。如果原函数本身不能处理变量,那么这个函数也无法处理。
csjwaman 24 2018-3-6 09:53
63
0
完善了一下:

       //if  (pInh->OptionalHeader.FileAlignment  ==  pInh->OptionalHeader.SectionAlignment)      //判断文件块对齐与节对齐是否相同
       if  (pIsh->PointerToRawData  ==  0||  (pIsh)->SizeOfRawData  ==  0)      //判断>PointerToRawData  和  SizeOfRawData  是否为0
这样可能兼容更多加了壳的DLL。
yeyeshun 2 2018-3-6 10:40
64
0
csjwaman 完善了一下: //if (pInh->OptionalHeader.FileAlignment == pInh->OptionalHeader.SectionAlignment) ...
好的,已经更新代码及exe文件,非常感谢!
shichun 2018-3-7 10:39
65
0
感谢分享
shichun 2018-3-7 11:22
66
0
错误        LNK2001        无法解析的外部符号  _prevFunc        请问编译时出现这个错误是什么问题
yeyeshun 2 2018-3-7 11:45
67
0
shichun 错误 LNK2001 无法解析的外部符号 _prevFunc 请问编译时出现这个错误是什么问题
是x64的是吗?需要把与cpp一起生成的一个obj文件添加到你的工程里一起编译
taizhong 2018-3-9 22:29
68
0
好像问题还挺多,,,
我这个小白就不下载了

实都 2018-3-12 15:17
69
0
赞一个,支持X64挺不错的
yber 2018-6-12 06:20
70
0
收藏
csjwaman 24 2018-6-13 21:29
71
0
yeyeshun 是x64的是吗?需要把与cpp一起生成的一个obj文件添加到你的工程里一起编译
x64编译时貌似多出一个类,无法正常编译。请楼主再看看!
上传的附件:
yeyeshun 2 2018-6-29 16:38
72
0
csjwaman x64编译时貌似多出一个类,无法正常编译。请楼主再看看!
不好意思,论坛的登陆机制有问题,显示登陆状态其实没有登陆,我是今天发现应该收到短消息的然而没提示于是点进去看,才发现一直是未登录状态。
这个我用代码暂时无法精确判断出来,手动加入一个空类的定义吧:
class QDir
{

};
csjwaman 24 2018-7-15 22:28
73
0
yeyeshun 不好意思,论坛的登陆机制有问题,显示登陆状态其实没有登陆,我是今天发现应该收到短消息的然而没提示于是点进去看,才发现一直是未登录状态。 这个我用代码暂时无法精确判断出来,手动加入一个空类的定义吧: ...
加了空类后,可以编译成功。但生成的DLL输出函数名中有一个与原DLL不一样。不知什么原因
原函数名为:?getLogDirectory@logging@ecg@@YA?AVQDir@@XZ
新生成的DLL函数为:?getLogDirectory@logging@ecg@@YA?AVQDir@12@XZ
最后于 2018-7-15 23:29 被csjwaman编辑 ,原因:
yeyeshun 2 2018-7-16 10:32
74
0
加你Q了,通过一下。
我的生成没这个问题,VS2013的
新天地 2018-10-28 00:22
75
0
好东西,一定要支持
我是哥布林 2018-11-18 23:43
76
0
有个问题,在遇到dll有导出函数名为空的dll时,导入dll至aheadlib的时候会崩溃,解决方法是在GenerateCode函数中加一个函数名是否为NULL的判断




最后于 2018-11-18 23:55 被我是哥布林编辑 ,原因:
yeyeshun 2 2018-11-19 10:59
77
0
当时没有考虑那么周全,哈哈哈
谢谢补全!
wztuxw 2018-11-20 19:42
78
0
最近用这个发现几个问题:
1、类缺省的构造函数没办法处理,像下面这样的
public: void CATSysSwappableHdl::`default constructor closure'(void)
public ??_FCATSysSwappableHdl@@QEAAXXZ
??_FCATSysSwappableHdl@@QEAAXXZ proc near
xor     r8d, r8d
xor     edx, edx
jmp     ??0CATSysSwappableHdl@@IEAA@PEAVCATSysSwappable@@PEAVCATSysSwapFile@@@Z ;
2、有些类变量可能处理不对
3、编译成功,但是没法运行
倒是将所有的函数和变量都转发倒是可以,不用重新构建类
//函数
#pragma comment(linker, "/EXPORT:??_FCATSysSwappableHdl@@QEAAXXZ=CATSysAllocatorO.??_FCATSysSwappableHdl@@QEAAXXZ,@25")
//变量
#pragma comment(linker, "/EXPORT:??_7CATSysSwappable@@6B@=CATSysAllocatorO.??_7CATSysSwappable@@6B@,@22")

对于函数的处理,个人还是建议按照原版的jmp RAX方式,用intel C++编译器编译,那个用obj链接的函数带返回值的很多都有问题。
//
ALCDECL AheadLib__FCATSysSwappableHdl__QEAAXXZ(void)
{
GetAddress("??_FCATSysSwappableHdl@@QEAAXXZ");
__asm JMP RAX;
}

上面的这个是x64 Catia V5R2x的DLL:CATSysAllocator.dll,只能通过转发函数和变量可行,其他怎么弄都不成功。
yeyeshun 2 2018-11-21 10:11
79
0
嗯,是的,存在很多问题,因为本身我对这方面的理解也不是很深入,然后收集的样本也不全,还有一些我没有办法做到区分的,技术有限做不到的。。。
建议直接转发,这个应该是比较稳的哈哈哈
bxb 2018-12-5 14:30
80
0
谢谢,好东西。
Carlton 2019-2-5 21:01
81
0
azahod 2019-4-26 19:28
82
0
谢谢分享
游客
登录 | 注册 方可回帖
返回