首页
社区
课程
招聘
[讨论]这种call咋调用
发表于: 2024-9-27 10:28 2966

[讨论]这种call咋调用

2024-9-27 10:28
2966
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 9744
活跃值: (6522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
建议往里点直接调用InternalCall,里面的InternalCall是标准的调用约定,无非就是多写几个参数
2024-9-27 20:32
0
雪    币: 1449
活跃值: (4483)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我的小拇指啊 建议往里点直接调用InternalCall,里面的InternalCall是标准的调用约定,无非就是多写几个参数
参数多到不想分析
2024-9-27 21:58
0
雪    币: 9744
活跃值: (6522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
逆向爱好者 参数多到不想分析
那你可以定义个参数结构体,把数据对齐好,然后用QWORD读出来按顺序传入,或者用汇编跟mono invoke
2024-9-27 23:10
0
雪    币: 9744
活跃值: (6522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
struct vec3
{
	float x, y, z;
};

struct linecast_param
{
	vec3 beg;
	int pad_0;
	vec3 end;
	int pad_1;
}

void* linecast_address;

void linecast(const vec3& beg, const vec3& end)
{
	linecast_param param = {};
	param.beg = beg;
	param.end = end;

	QWORD* data = (QWORD*)&param;

	RaycastHit hitInfo = {};
	int layerMask = -1
    
    // public static bool Linecast(Vector3 start, Vector3 end, out RaycastHit hitInfo, int layerMask)
	((void(*)(...))linecast_address)(&hitinfo, layerMask, 0, 0, data[0], data[1], data[2], data[3]);
}

我记得顺序好像是这样的,具体你得调试看看,我以前就是这么直接调用的。
这种调用约定好像只有unity 5.6有,之后的版本结构体都是传指针了

2024-9-27 23:26
0
雪    币: 1449
活跃值: (4483)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我的小拇指啊 那你可以定义个参数结构体,把数据对齐好,然后用QWORD读出来按顺序传入,或者用汇编跟mono invoke
我扣汇编调用这个call,在主线程调用也崩溃,我调试了崩溃指令就是向堆栈写入了xmm6后就崩溃了,然后我就分配0x10对齐的堆栈再调用,然后其他地方又蹦了…………
2024-9-28 16:52
0
雪    币: 1449
活跃值: (4483)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
我的小拇指啊 struct vec3 { float x, y, z; }; struct linecast_ ...
这个LineCast封装了好多………
2024-9-28 16:54
0
雪    币: 1449
活跃值: (4483)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我感觉是不行的………我目前解决办法就是调用外面的call,那个call只有本人实体和对象实体 。
2024-9-28 16:57
0
游客
登录 | 注册 方可回帖
返回
//