player43 发表于 2023-11-14 19:14

C#引用C的dll传递参数问题

最近用C#调用一个DLL内的未导出函数 给整蒙圈了IDA反汇编出来的结果是这样的:

函数内部是这样子的 :

我尝试使用C#的 【cdecl】规范去调用这个函数,但是参数居然都是在堆栈里面的,请问一下大神,如何才能使用寄存器传递前两个参数?

vcdemon 发表于 2023-11-14 19:22

其实就是指针变量,C#里对应的类型是 IntPtr,先想办法把C#的变量转成IntPtr指针地址,然后传参就行了

go4399 发表于 2023-11-15 11:13

IDA分析的参数类型有可能是错的;
__usercall 用汇编写个封装dll,把调用方式转成stdcall或cdecl,C#再去调用封装dll
参考https://stackoverflow.com/questions/4102981/what-is-wrong-with-this-usercall-wrapper这个思路

player43 发表于 2023-11-15 18:19

vcdemon 发表于 2023-11-14 19:22
其实就是指针变量,C#里对应的类型是 IntPtr,先想办法把C#的变量转成IntPtr指针地址,然后传参就行了

谢谢大佬但是这样是不行的 C#的编译器会把参数全部放在堆栈中 ,但是原版函数是EAX ECX传递前两个参数 ,如果按照4个参数来写,堆栈就不平衡了

player43 发表于 2023-11-15 18:21

go4399 发表于 2023-11-15 11:13
IDA分析的参数类型有可能是错的;
__usercall 用汇编写个封装dll,把调用方式转成stdcall或cdecl,C#再去 ...

想过 但是不想多个DLL 哈哈 无奈的办法也只能那么去搞了我试过用C++:
__asm {
mov ecx,param2
mov eax param1
}
然后下面func(param3,param4); 这样是可以的
页: [1]
查看完整版本: C#引用C的dll传递参数问题