能力值:
( LV3,RANK:20 )
76 楼
有个问题,在遇到dll有导出函数名为空的dll时,导入dll至aheadlib的时候会崩溃,解决方法是在GenerateCode函数中加一个函数名是否为NULL的判断
最后于 2018-11-18 23:55
被我是哥布林编辑
,原因:
能力值:
( LV7,RANK:140 )
77 楼
当时没有考虑那么周全,哈哈哈 谢谢补全!
能力值:
( LV2,RANK:10 )
78 楼
最近用这个发现几个问题:
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,只能通过转发函数和变量可行,其他怎么弄都不成功。
能力值:
( LV7,RANK:140 )
79 楼
嗯,是的,存在很多问题,因为本身我对这方面的理解也不是很深入,然后收集的样本也不全,还有一些我没有办法做到区分的,技术有限做不到的。。。 建议直接转发,这个应该是比较稳的哈哈哈
能力值:
( LV2,RANK:10 )
80 楼
谢谢,好东西。
能力值:
( LV2,RANK:10 )
81 楼
能力值:
( LV2,RANK:10 )
82 楼
谢谢分享
能力值:
( LV2,RANK:10 )
83 楼
还是有很多问题 x64非常复杂的c++动态库支持不是很好,自动生成的类格式基本是错的需要自己手动更改。我的动态库上个函数,几个 类而已,手动修改 再撸一下应该问题就不大了, 感谢
能力值:
( LV2,RANK:10 )
84 楼
VS2019 是可以编译的
能力值:
( LV2,RANK:10 )
85 楼
编译时提示 “enum”类型重定义
能力值:
( LV3,RANK:30 )
86 楼
发现了一个bug:
在生成的.obj文件中, 函数endFunc中保存函数返回地址的rbx寄存器, 在x64 fastcall的定义中rbx寄存器属于[]非易失性] 使用前必须保存, 这里会导致一个崩溃, 修改为r10即可;
这是之前的:
endFunc:
pop rbx ; 弹出endFunc的返回地址
add rsp,28h ; 去除劫持函数中预留的0x28大小空间(影子空间+)
pop rbx ; 弹出劫持函数的返回地址到rbx中保留
pop rcx ; 弹出参数1
pop rdx ; 弹出参数2
pop r8 ; 弹出参数3
pop r9 ; 弹出参数4
sub rsp,20h ; 恢复因弹出导致的栈顶变化
push rbx ; 压栈外部的返回地址
jmp qword ptr [rax] ; 跳转到真实函数的入口
ret ; 这里应该是执行不到的
这是修改后的
endFunc:
pop r10 ; 弹出endFunc的返回地址
add rsp,28h ; 去除劫持函数中预留的0x28大小空间(影子空间+局部变量?)
pop r10 ; 弹出劫持函数的返回地址到r10中保留
pop rcx ; 弹出参数1
pop rdx ; 弹出参数2
pop r8 ; 弹出参数3
pop r9 ; 弹出参数4
sub rsp,20h ; 恢复因弹出导致的栈顶变化
push r10 ; 压栈外部的返回地址
jmp qword ptr [rax] ; 跳转到真实函数的入口
ret ; 这里应该是执行不到的
这是微软对x64 fastcall约定的寄存器存储说明:
Caller/Callee saved registers The registers RAX, RCX, RDX, R8, R9, R10, R11, XMM0-5, and the upper portions of YMM0-15 and ZMM0-15 are considered volatile and must be considered destroyed on function calls (unless otherwise safety-provable by analysis such as whole program optimization). On AVX512VL, the ZMM, YMM, and XMM registers 16-31 are volatile.
The registers RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15, and XMM6-15 are considered nonvolatile and must be saved and restored by a function that uses them.
最后于 2020-3-12 11:57
被skygarth编辑
,原因: 输入错误
能力值:
( LV1,RANK:0 )
87 楼
好东西收藏 了
能力值:
( LV1,RANK:0 )
88 楼
yeyeshun
支持x64了。有需求的朋友们就吃点亏当小白鼠了,有问题请回帖反馈,谢谢!
用这个工具我加载dll,就闪退了。是怎么回事呢
能力值:
( LV1,RANK:0 )
89 楼
接上一个回复,加载大部分dll没问题,但是加载要搞的一个dll,出现程序闪退。调试发现,其中存在一个vector在没有内容的情况下调用.back()等。
就自己在这个加了个vector是否为空的判断,发现竟然可以了。新手不懂,是否修改了一个bug哈。
(AheadLib.CPP文件的1600行左右)
vector<string> vecPrefix;
getPrefix(vecPrefix, stParse.Result[stParseFunc::rName].c_str());
string strClassName;
if (!stParse.Result[stParseFunc::rAccess].empty())
{
//楼主附件里的原代码
//strClassName = vecPrefix.back();
//vecPrefix.pop_back();
//修改- 增加vector是否为空的判断
if (!vecPrefix.empty())
{
strClassName = vecPrefix.back();
vecPrefix.pop_back();
}
}
能力值:
( LV1,RANK:0 )
90 楼
mb_gicbogrv
接上一个回复,加载大部分dll没问题,但是加载要搞的一个dll,出现程序闪退。调试发现,其中存在一个vector在没有内容的情况下调用.back()等。就自己在这个加了个vector是否为空的判断,发 ...
看我的帖子
能力值:
( LV2,RANK:10 )
91 楼
StriveXjun
https://github.com/strivexjun/AheadLib-x86-x64
yes师傅可以看看我写的这个,可以识别导出数据函数、中转函数。 你这个编译成x64,有个bug,ulong得改成uint64_t
//获取导出表信息
//
PIMAGE_EXPORT_DIRECTORY exports;
if (m_isx64)
{
exports = (PIMAGE_EXPORT_DIRECTORY)\
((ULONG )dosHead + ntHead64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
}
改成:
if (m_isx64)
{
exports = (PIMAGE_EXPORT_DIRECTORY)\
((uint64_t )dosHead + ntHead64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
}
最后于 2022-3-7 19:36
被glopen编辑
,原因:
能力值:
( LV2,RANK:10 )
92 楼
skygarth
发现了一个bug:在生成的.obj文件中, 函数endFunc中保存函数返回地址的rbx寄存器, 在x64 fastcall的定义中rbx寄存器属于[]非易失性] 使用前必须保存, 这里会导致一个崩溃 ... .text$mn:0000000000000019 ; void __fastcall endFunc()
.text$mn:0000000000000019 public endFunc
.text$mn:0000000000000019 endFunc proc near
.text$mn:0000000000000019 000 5B pop rbx
.text$mn:000000000000001A -08 48 83 C4 28 add rsp, 28h
.text$mn:000000000000001E -30 5B pop rbx
.text$mn:000000000000001F -38 59 pop rcx
.text$mn:0000000000000020 -40 5A pop rdx
.text$mn:0000000000000021 -48 41 58 pop r8
.text$mn:0000000000000023 -50 41 59 pop r9
.text$mn:0000000000000025 -58 48 83 EC 20 sub rsp, 20h
.text$mn:0000000000000029 -38 53 push rbx
.text$mn:000000000000002A -30 FF 20 jmp qword ptr [rax]
.text$mn:000000000000002A endFunc endp ; sp-analysis failed
IDA提示sp-analysis failed
.text$mn:0000000000000025 -58 48 83 EC 20 sub rsp, 20h
这句改成:
.text$mn:0000000000000025 -58 48 83 EC 50 sub rsp, 50h
最后于 2022-3-7 20:04
被glopen编辑
,原因:
能力值:
( LV2,RANK:10 )
93 楼
yeyeshun 有源码,大哥自己重新编译下就好了 能分享一下那个OBJ的源码吗?就是prevFunc、setFunc、endFunc这三个函数的源代码。
最后于 2022-3-7 21:42
被glopen编辑
,原因:
能力值:
( LV7,RANK:140 )
94 楼
太久了。。。源码找不到了
能力值:
( LV2,RANK:10 )
95 楼
yeyeshun
太久了。。。源码找不到了
代码应该不复杂吧,好奇为啥要把这三个函数整成obj,而不是源码
能力值:
( LV2,RANK:10 )
96 楼
glopen
代码应该不复杂吧,好奇为啥要把这三个函数整成obj,而不是源码
因为x64不能内嵌汇编,只能用obj解决
能力值:
( LV2,RANK:10 )
97 楼
yeyeshun
太久了。。。源码找不到了
AheadLib_x64.exe 拖入附件中的dll(选的“即时调用函数(I)”),直接崩溃。 该dll导出函数全部是正规的。
上传的附件:
能力值:
( LV2,RANK:10 )
98 楼
咖啡_741298
因为x64不能内嵌汇编,只能用obj解决 不能内嵌,但可以放在单独asm文件中进行编译链接啊
最后于 2022-3-21 23:45
被glopen编辑
,原因:
能力值:
( LV2,RANK:10 )
99 楼
多谢分享
能力值:
( LV1,RANK:0 )
100 楼
编译起来后原DLL打不开