吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 465|回复: 4
收起左侧

[求助] C#引用C的dll传递参数问题

[复制链接]
player43 发表于 2023-11-14 19:14
最近用C#调用一个DLL内的未导出函数 给整蒙圈了  IDA反汇编出来的结果是这样的:
image.png
函数内部是这样子的 :
image.png
我尝试使用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); 这样是可以的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-10 17:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表