Jitex icon indicating copy to clipboard operation
Jitex copied to clipboard

Intercept method with multiple ret instructions

Open Hitmasu opened this issue 2 years ago • 0 comments

Currently, Jitex only expects one 'ret' instruction AND as the last instruction in the body. When the method has multiple 'ret' instructions, we're not covering all paths.

Example:

MSIL Body from DateTime.Now:

[0] = {Instruction} call System.DateTime get_UtcNow()
[1] = {Instruction} stloc.0 
[2] = {Instruction} ldloc.0 
[3] = {Instruction} ldloca.s 2
[4] = {Instruction} call System.TimeSpan GetDateTimeNowUtcOffsetFromUtc(System.DateTime, Boolean ByRef)
[5] = {Instruction} stloc.s 4
[6] = {Instruction} ldloca.s 4
[7] = {Instruction} call Int64 get_Ticks()
[8] = {Instruction} stloc.1 
[9] = {Instruction} ldloca.s 0
[10] = {Instruction} call Int64 get_Ticks()
[11] = {Instruction} ldloc.1 
[12] = {Instruction} add 
[13] = {Instruction} stloc.3 
[14] = {Instruction} ldloc.3 
[15] = {Instruction} ldc.i8 3155378975999999999
[16] = {Instruction} bgt.un.s 37
[17] = {Instruction} ldloc.2 
[18] = {Instruction} brtrue.s 17
[19] = {Instruction} ldloc.3 
[20] = {Instruction} ldc.i8 -9223372036854775808
[21] = {Instruction} or 
[22] = {Instruction} newobj Void .ctor(UInt64)
[23] = {Instruction} ret   <------------------------------------- HERE
[24] = {Instruction} ldloc.3 
[25] = {Instruction} ldc.i8 -4611686018427387904
[26] = {Instruction} or 
[27] = {Instruction} newobj Void .ctor(UInt64)
[28] = {Instruction} ret <------------------------------------- AND HERE
[29] = {Instruction} ldloc.3 
[30] = {Instruction} ldc.i4.0 
[31] = {Instruction} conv.i8 
[32] = {Instruction} blt.s 11
[33] = {Instruction} ldc.i8 -6067993060854775809
[34] = {Instruction} br.s 9
[35] = {Instruction} ldc.i8 -9223372036854775808
[36] = {Instruction} newobj Void .ctor(UInt64)
[37] = {Instruction} ret  <------------------------------- WE JUST EXPECTED THIS RET

That will cause an unexpected return.

#85

Hitmasu avatar Jul 25 '23 13:07 Hitmasu