首页
社区
课程
招聘
[求助]C++函数导出的未知DLL如何编写
发表于: 2010-5-5 01:45 8231

[求助]C++函数导出的未知DLL如何编写

2010-5-5 01:45
8231
已知一个DLL导出的是C++函数,例如

?CleanUp@CPleione@pleione@@QAE_NXZ

我想实现一个函数转发DLL插在中间,但是遇到问题,因为这个函数的类没有定义,请教各位高人这种DLL如何实现函数转发?

ALCPP public: bool __thiscall pleione::CPleione::CleanUp(void)
{
	GetAddress("?CleanUp@CPleione@pleione@@QAE_NXZ");
	__asm JMP EAX;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
2
用序数,DLL的每一个导出都有序数的,1 2 3 4……这样排
2010-5-6 13:27
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢提示,但是做DLL劫持的函数转发是没办法用序号的吧?因为调用者可能是根据类名来调用的,能解决这个问题吗?
2010-5-8 01:05
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我该如何在自己写的DLL中导出同名的函数,其实一开始主要就是这个问题,因为用名称或序号GetProcAddress都是可以成功的
?CleanUp@CPleione@pleione@@QAE_NXZ
2010-5-8 01:08
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
完全用汇编来写你的转发DLL就行了。
2010-5-8 04:23
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
6
名字也好,序数也好,关键是你自己首先要定位导出函数,然后Hook它没商量!

我经常用IDA找到函数的16进制地址,然后用C#去Hook这个函数
2010-5-8 07:41
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你说的hook函数是怎么做法?你是直接修改内存的吧。
我是可以在内存中修改这些函数的内容或参数,但我想要的是一个完整的DLL替换原来的DLL,而不是直接做内存补丁,所以要做一个DLL工程。
2010-5-12 14:41
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你做过吗?C函数名是标准的,能编译通过,而C++导出函数名有?@等字符,是无法编译过的,还原成类名就会变成未定义的错误。
2010-5-12 14:47
0
雪    币: 952
活跃值: (1971)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
自己建个空类就行了
2010-5-12 14:52
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
函数的类没有定义,你随便定义一个不就行了,如下:
struct pleione
{
        struct CPleione
        {
                bool __declspec(dllexport) CleanUp(void);
        };
};
然后写函数实现:
bool pleione::CPleione::CleanUp(void)
{
  GetAddress("?CleanUp@CPleione@pleione@@QAE_NXZ");
  __asm JMP EAX;
}
2010-5-12 15:02
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
你这样JMP EAX恐怕出去就回不来了
2010-5-12 19:30
0
雪    币: 952
活跃值: (1971)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
意思到了就行吧? 写个代理函数就行了
2010-5-12 20:20
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
没有你想的那么麻烦的 在PE文件里 本身就有一种模式叫做转发 也就是当你调用一个A.DLL里的一个函数的时候系统会自动转发,其调用B.DLL里面对应的函数
我只知道数据结构是什么样的 能自己实现  
编译器应该有相应的声明 你加上声明就ok 这个我没用过 你自己查
2010-5-13 19:18
0
雪    币: 44
活跃值: (24)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
完全不懂DLL劫持吧?
Jmp出去不需要回来,原版真正的函数又不是没retn。
看雪加密解密第三版有ws2_32.dll劫持示例,用的就是这种方法。
2010-5-14 21:09
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
你完全不懂!
2010-5-15 16:53
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
郁闷了哥哥的《甲壳2》 也不必这里来发火嘛
既然哥哥说的是“恐怕”,那一定是有机会出错的
2010-5-15 18:38
0
雪    币: 206
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
jmp之前注意保存ecx就行,因为用vc编译的class,this指针就在ecx里
2010-6-18 10:42
0
游客
登录 | 注册 方可回帖
返回
//