首页
社区
课程
招聘
[下载] AheadLib修改 支持x64支持类/命名空间
发表于: 2018-1-31 17:26 41287

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

2018-1-31 17:26
41287
收藏
免费 6
支持
分享
打赏 + 20.00雪花
打赏次数 2 雪花 + 20.00
 
赞赏  浩天he   +10.00 2018/03/07
赞赏  hackbs   +10.00 2018/02/27
最新回复 (101)
雪    币: 749
活跃值: (2354)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
76
有个问题,在遇到dll有导出函数名为空的dll时,导入dll至aheadlib的时候会崩溃,解决方法是在GenerateCode函数中加一个函数名是否为NULL的判断




最后于 2018-11-18 23:55 被我是哥布林编辑 ,原因:
2018-11-18 23:43
0
雪    币: 767
活跃值: (3415)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
77
当时没有考虑那么周全,哈哈哈
谢谢补全!
2018-11-19 10:59
0
雪    币: 107
活跃值: (200)
能力值: ( 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,只能通过转发函数和变量可行,其他怎么弄都不成功。
2018-11-20 19:42
0
雪    币: 767
活跃值: (3415)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
79
嗯,是的,存在很多问题,因为本身我对这方面的理解也不是很深入,然后收集的样本也不全,还有一些我没有办法做到区分的,技术有限做不到的。。。
建议直接转发,这个应该是比较稳的哈哈哈
2018-11-21 10:11
0
雪    币: 1085
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bxb
80
谢谢,好东西。
2018-12-5 14:30
0
雪    币: 10
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
81
2019-2-5 21:01
0
雪    币: 35
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
82
谢谢分享
2019-4-26 19:28
0
雪    币: 2
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
83
 还是有很多问题 x64非常复杂的c++动态库支持不是很好,自动生成的类格式基本是错的需要自己手动更改。我的动态库上个函数,几个 类而已,手动修改 再撸一下应该问题就不大了, 感谢
2019-7-20 22:45
0
雪    币: 287
活跃值: (142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
84
VS2019 是可以编译的
2019-10-31 17:36
0
雪    币: 12332
活跃值: (5103)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
85

编译时提示 “enum”类型重定义
2020-2-29 15:00
0
雪    币: 202
活跃值: (16)
能力值: ( 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编辑 ,原因: 输入错误
2020-3-12 11:51
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
87
好东西收藏 了
2020-4-4 20:18
0
雪    币: 37
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
88
yeyeshun 支持x64了。有需求的朋友们就吃点亏当小白鼠了,有问题请回帖反馈,谢谢!
用这个工具我加载dll,就闪退了。是怎么回事呢
2020-7-26 17:47
0
雪    币: 37
能力值: ( 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();

}

}


2020-7-26 18:11
0
雪    币: 244
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
90
mb_gicbogrv 接上一个回复,加载大部分dll没问题,但是加载要搞的一个dll,出现程序闪退。调试发现,其中存在一个vector在没有内容的情况下调用.back()等。就自己在这个加了个vector是否为空的判断,发 ...
看我的帖子
2020-7-29 10:42
0
雪    币: 522
活跃值: (4826)
能力值: ( 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编辑 ,原因:
2022-3-7 18:54
0
雪    币: 522
活跃值: (4826)
能力值: ( 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编辑 ,原因:
2022-3-7 20:02
0
雪    币: 522
活跃值: (4826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
93
yeyeshun 有源码,大哥自己重新编译下就好了

能分享一下那个OBJ的源码吗?就是prevFunc、setFunc、endFunc这三个函数的源代码。

最后于 2022-3-7 21:42 被glopen编辑 ,原因:
2022-3-7 20:10
0
雪    币: 767
活跃值: (3415)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
94
太久了。。。源码找不到了
2022-3-8 21:14
0
雪    币: 522
活跃值: (4826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
95
yeyeshun 太久了。。。源码找不到了
代码应该不复杂吧,好奇为啥要把这三个函数整成obj,而不是源码
2022-3-19 13:16
0
雪    币: 6
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
96
glopen 代码应该不复杂吧,好奇为啥要把这三个函数整成obj,而不是源码
因为x64不能内嵌汇编,只能用obj解决
2022-3-19 17:45
0
雪    币: 6
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
97
yeyeshun 太久了。。。源码找不到了

AheadLib_x64.exe  拖入附件中的dll(选的“即时调用函数(I)”),直接崩溃。 该dll导出函数全部是正规的。


上传的附件:
2022-3-19 17:50
0
雪    币: 522
活跃值: (4826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
98
咖啡_741298 因为x64不能内嵌汇编,只能用obj解决

不能内嵌,但可以放在单独asm文件中进行编译链接啊

最后于 2022-3-21 23:45 被glopen编辑 ,原因:
2022-3-21 23:44
0
雪    币: 33
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
99
多谢分享
2022-6-24 09:56
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
100
编译起来后原DLL打不开
2022-7-24 14:32
0
游客
登录 | 注册 方可回帖
返回
//