巧用函数返回地址获取导出函数的直接调用模块

目的: 实现调用DLL中检测调用来源模块


描述:开发三方接口时经常会遇到模块校验,常见做法有如下几种

1. 在接口中开放参数,专门用于校验 

2. 在接口DLL中校验调用模块

本文主要介绍第2种的实现方法


实现原理:

假设有函数 Add(a+b);

从C/C++角度看,貌似没有办法在Add函数中知道是谁调用了它.

从汇编角度看,在Add函数调用流程如下;

1. push 参数b

2. push 参数a

3. Call   函数Add , 在Call的时会将Add函数下一行代码地址做为返回地址,压栈

4. 到达Add函数的代码位置开始堆栈平衡操作,其中EBP寄存器会记录栈底的指针

5. 开始Add函数的执行

方法:

1.在第4步堆栈平衡操作中,EBP存储的是栈底的指针,

2.在第3步call调用时会将调用Add函数的下一条指令地址压栈,

3.如果能获取此地址,那么根据VirtualQuery查询到的指针基址,

4.此基址就是调用函数的模块句柄(HOMDULE),

5.使用GetModuleFileName可以获取模块的路径.

6.根据模块路径,我们可以检查模块的名称,

7.根据模块路径,可以获取版权,数字签名等信息做为校验的依据.


int c Add(int a ,int b)
{
//获取调用模块名称sart
PVOID pAddress = NULL;
PVOID tmpEAX = NULL;
_asm{
MOV tmpEAX , eax
mov eax , [ebp+4]
MOV pAddress ,eax 
mov eax , tmpEAX
}


MEMORY_BASIC_INFORMATION mbi;
HMODULE hModule = NULL;
TCHAR buffer[1024] = {0};
if (::VirtualQuery(pAddress,&mbi,sizeof(mbi)) != 0)
{
hModule = (HMODULE)mbi.AllocationBase;
GetModuleFileName(hModule,buffer,1024);
}
//获取调用模块名称end
return a+b;
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 可以通过 C++ 模块来扩展其功能,实现 C++ 模块函数调用需要使用 Node.js 提供的 `N-API` 接口。下面是一个简单的例子,演示了如何在 C++ 模块中实现一个函数,并在 Node.js 中调用函数并传递参数。 C++ 模块代码: ```cpp #include <node_api.h> napi_value add(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); int32_t a, b; napi_get_value_int32(env, args[0], &a); napi_get_value_int32(env, args[1], &b); napi_value result; napi_create_int32(env, a + b, &result); return result; } napi_value Init(napi_env env, napi_value exports) { napi_value fn; napi_create_function(env, nullptr, 0, add, nullptr, &fn); napi_set_named_property(env, exports, "add", fn); return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) ``` 上述代码定义了一个 `add` 函数,该函数接受两个整数参数,返回它们的和。然后将该函数导出为 Node.js 模块的一个属性。 在 Node.js 中调用函数: ```javascript const addon = require('./build/Release/addon'); console.log(addon.add(1, 2)); // 3 ``` 上述代码首先通过 `require` 函数引入了 C++ 模块,然后调用模块的 `add` 函数,并传入两个整数参数。`add` 函数返回它们的和,该和被输出到控制台上。 这是一个简单的例子,演示了如何在 C++ 模块中实现函数,并在 Node.js 中调用函数并传递参数。具体实现方式可以根据实际情况来进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值