Skip to content

Commit 9020740

Browse files
committed
Fix ref proxy type erasure generate unverifiable code
1 parent 38a87bb commit 9020740

1 file changed

Lines changed: 16 additions & 1 deletion

File tree

Confuser.Runtime/RefProxy.Strong.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,26 @@ internal static void Initialize(RuntimeFieldHandle field, byte opKey) {
5454

5555
DynamicILInfo info = dm.GetDynamicILInfo();
5656
info.SetLocalSignature(new byte[] { 0x7, 0x0 });
57-
var code = new byte[2 * argTypes.Length + 6];
57+
var code = new byte[(2 + 5) * argTypes.Length + 6];
5858
int index = 0;
59+
var mParams = method.GetParameters();
60+
int mIndex = method.IsConstructor ? 0 : -1;
5961
for (int i = 0; i < argTypes.Length; i++) {
6062
code[index++] = 0x0e;
6163
code[index++] = (byte)i;
64+
65+
var mType = mIndex == -1 ? method.DeclaringType : mParams[mIndex].ParameterType;
66+
if (!mType.IsValueType) {
67+
var cToken = info.GetTokenFor(mType.TypeHandle);
68+
code[index++] = 0x74;
69+
code[index++] = (byte)cToken;
70+
code[index++] = (byte)(cToken >> 8);
71+
code[index++] = (byte)(cToken >> 16);
72+
code[index++] = (byte)(cToken >> 24);
73+
}
74+
else
75+
index += 5;
76+
mIndex++;
6277
}
6378
code[index++] = (byte)((byte)fieldInfo.Name[Mutation.KeyI8] ^ opKey);
6479
int dmToken = info.GetTokenFor(method.MethodHandle);

0 commit comments

Comments
 (0)