关于定义类成员导出函数需要注意的一些问题

1:如果是想自己定义的导出函数在IDA中看起来和你的函数名称一样的话应该在项目中定义相应的xxxxxx.def文件。

在def文件中定义对应的C++函数名如如下:

LIBRARY
EXPORTS
MyWSASend @1
MyWSAIoctl @2
Mysetsockopt @3
Myrecv @4
Myconnect @5
SetHookFlag @6

这样在编译出来的dll中就可以用GetProcAddress填写对应的导出函数名,而不需要加一些奇怪的字符串。

2:类导出函数的动态调用需要注意一个问题就是第一个参数是类的this指针,但是我们在外部调用的时候往往无法获得这个类的this指针。所以这里我们就传入一个nullptr否则会出现堆栈不平,程序崩溃。

 pfn_WSASend pfn_func = (pfn_WSASend)MyWSASend;
 rv = pfn_func(nullptr, socket_, &write_buffer, 1, &num, 0,
 &core_->write_overlapped_, NULL);


3:在类的实现上面也有一点小的变化就是所以涉及到类成员变量的引用,都必须经过一次封装。否则在动态调用函数内部用到成员变量会崩溃。


XbNetApiProtect g_netProtect; 初始化


private:
IUnderlyingApi * GetApiWSASend(void);
IUnderlyingApi * GetApiWSAIoctl(void);
IUnderlyingApi * GetApisetsockopt(void);
IUnderlyingApi * GetApirecv(void);
IUnderlyingApi * GetApiconnect(void);
bool GetHookFlag(void);
void SetRealHookFlag(bool valuebool);


private:
IUnderlyingApi * ApiWSASend;
IUnderlyingApi * ApiWSAIoctl;
IUnderlyingApi * Apisetsockopt;
IUnderlyingApi * Apirecv;
IUnderlyingApi * Apiconnect;
bool is_protect_;


bool XbNetApiProtect::GetHookFlag(void) <<<封装的取类成员变量的函数
{
return is_protect_;
}


int __stdcall XbNetApiProtect::MyWSASend(SOCKET s, _In_reads_(dwBufferCount) LPWSABUF lpBuffers, _In_ DWORD dwBufferCount, _Out_opt_ LPDWORD lpNumberOfBytesSent, _In_ DWORD dwFlags, _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
int retvalue;
if (!g_netProtect.GetHookFlag()) <<<比如如果这里直接写is_protect_其实在调用this->is_protect_由于this指针传过来的时候是nullptr,所以必须经过封装
{
return WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);
}


int params[] = { s, (int)lpBuffers, dwBufferCount, (int)lpNumberOfBytesSent, dwFlags, (int)lpOverlapped, (int)lpCompletionRoutine };
retvalue = (int)(g_netProtect.GetApiWSASend())->Invoke((void **)&params);
return retvalue;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值