Skip to content

Commit f7c841d

Browse files
authored
Merge pull request #1793 from tunz/tunz/dotnet-fixes
[dotnet] Fix garbage collected hooks and wrong signature
2 parents c75f374 + 03a793e commit f7c841d

File tree

2 files changed

+32
-13
lines changed

2 files changed

+32
-13
lines changed

bindings/dotnet/UnicornEngine/InternalHooks.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ type internal BlockHookInternal = delegate of IntPtr * Int64 * Int32 * IntPtr ->
1414
type internal InterruptHookInternal = delegate of IntPtr * Int32 * IntPtr -> unit
1515

1616
[<UnmanagedFunctionPointer(CallingConvention.Cdecl)>]
17-
type internal MemReadHookInternal = delegate of IntPtr * Int64 * Int32 * IntPtr -> unit
17+
type internal MemReadHookInternal = delegate of IntPtr * Int32 * Int64 * Int32 * IntPtr -> unit
1818

1919
[<UnmanagedFunctionPointer(CallingConvention.Cdecl)>]
20-
type internal MemWriteHookInternal = delegate of IntPtr * Int64 * Int32 * Int64 * IntPtr -> unit
20+
type internal MemWriteHookInternal = delegate of IntPtr * Int32 * Int64 * Int32 * Int64 * IntPtr -> unit
2121

2222
[<UnmanagedFunctionPointer(CallingConvention.Cdecl)>]
2323
type internal EventMemHookInternal = delegate of IntPtr * Int32 * Int64 * Int32 * Int64 * IntPtr-> Boolean

bindings/dotnet/UnicornEngine/Unicorn.fs

+30-11
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
3232
let _outHooks = new List<(OutHook * Object)>()
3333
let _syscallHooks = new List<(SyscallHook * Object)>()
3434
let _disposablePointers = new List<nativeint>()
35+
let _hookInternals = new List<Object>();
3536

3637
let _eventMemMap =
3738
[
@@ -153,7 +154,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
153154
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, userData))
154155

155156
if _codeHooks |> Seq.isEmpty then
156-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new CodeHookInternal(trampoline))
157+
let codeHookInternal = new CodeHookInternal(trampoline)
158+
_hookInternals.Add(codeHookInternal)
159+
let funcPointer = Marshal.GetFunctionPointerForDelegate(codeHookInternal)
157160
let hh = new UIntPtr(allocate(IntPtr.Size))
158161
match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_CODE, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
159162
| Some e -> raise e | None -> ()
@@ -172,7 +175,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
172175
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, userData))
173176

174177
if _blockHooks |> Seq.isEmpty then
175-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new BlockHookInternal(trampoline))
178+
let blockHookInternal = new BlockHookInternal(trampoline)
179+
_hookInternals.Add(blockHookInternal)
180+
let funcPointer = Marshal.GetFunctionPointerForDelegate(blockHookInternal)
176181
let hh = new UIntPtr(allocate(IntPtr.Size))
177182
match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_BLOCK, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
178183
| Some e -> raise e | None -> ()
@@ -188,7 +193,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
188193
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, intNumber, userData))
189194

190195
if _interruptHooks |> Seq.isEmpty then
191-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new InterruptHookInternal(trampoline))
196+
let interruptHookInternal = new InterruptHookInternal(trampoline)
197+
_hookInternals.Add(interruptHookInternal)
198+
let funcPointer = Marshal.GetFunctionPointerForDelegate(interruptHookInternal)
192199
let hh = new UIntPtr(allocate(IntPtr.Size))
193200
match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_INTR, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, hookBegin, hookEnd) |> this.CheckResult with
194201
| Some e -> raise e | None -> ()
@@ -202,12 +209,14 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
202209
hookDel _interruptHooks callback
203210

204211
member this.AddMemReadHook(callback: MemReadHook, userData: Object, beginAddr: Int64, endAddr: Int64) =
205-
let trampoline(u: IntPtr) (addr: Int64) (size: Int32) (user: IntPtr) =
212+
let trampoline(u: IntPtr) (_eventType: Int32) (addr: Int64) (size: Int32) (user: IntPtr) =
206213
_memReadHooks
207214
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, userData))
208215

209216
if _memReadHooks |> Seq.isEmpty then
210-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new MemReadHookInternal(trampoline))
217+
let memReadHookInternal = new MemReadHookInternal(trampoline)
218+
_hookInternals.Add(memReadHookInternal)
219+
let funcPointer = Marshal.GetFunctionPointerForDelegate(memReadHookInternal)
211220
let hh = new UIntPtr(allocate(IntPtr.Size))
212221
match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_MEM_READ, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
213222
| Some e -> raise e | None -> ()
@@ -218,12 +227,14 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
218227
hookDel _memReadHooks callback
219228

220229
member this.AddMemWriteHook(callback: MemWriteHook, userData: Object, beginAddr: Int64, endAddr: Int64) =
221-
let trampoline(u: IntPtr) (addr: Int64) (size: Int32) (value: Int64) (user: IntPtr) =
230+
let trampoline(u: IntPtr) (_eventType: Int32) (addr: Int64) (size: Int32) (value: Int64) (user: IntPtr) =
222231
_memWriteHooks
223232
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, value, userData))
224233

225234
if _memWriteHooks |> Seq.isEmpty then
226-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new MemWriteHookInternal(trampoline))
235+
let memWriteHookInternal = new MemWriteHookInternal(trampoline)
236+
_hookInternals.Add(memWriteHookInternal)
237+
let funcPointer = Marshal.GetFunctionPointerForDelegate(memWriteHookInternal)
227238
let hh = new UIntPtr(allocate(IntPtr.Size))
228239
match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_MEM_WRITE, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
229240
| Some e -> raise e | None -> ()
@@ -247,7 +258,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
247258
|> Seq.filter(fun eventFlag -> (eventType &&& eventFlag) <> 0)
248259
|> Seq.filter(fun eventFlag -> _memEventHooks.[eventFlag] |> Seq.isEmpty)
249260
|> Seq.iter(fun eventFlag ->
250-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new EventMemHookInternal(trampoline))
261+
let memEventHookInternal = new EventMemHookInternal(trampoline)
262+
_hookInternals.Add(memEventHookInternal)
263+
let funcPointer = Marshal.GetFunctionPointerForDelegate(memEventHookInternal)
251264
let hh = new UIntPtr(allocate(IntPtr.Size))
252265
match binding.HookAddNoarg(_eng.[0], hh, eventFlag, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 1, uint64 0) |> this.CheckResult with
253266
| Some e -> raise e | None -> ()
@@ -272,7 +285,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
272285
|> Seq.last
273286

274287
if _inHooks |> Seq.isEmpty then
275-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new InHookInternal(trampoline))
288+
let inHookInternal = new InHookInternal(trampoline)
289+
_hookInternals.Add(inHookInternal)
290+
let funcPointer = Marshal.GetFunctionPointerForDelegate(inHookInternal)
276291
let hh = new UIntPtr(allocate(IntPtr.Size))
277292
match binding.HookAddArg0(_eng.[0], hh, Common.UC_HOOK_INSN, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 1, uint64 0, X86.UC_X86_INS_IN) |> this.CheckResult with
278293
| Some e -> raise e | None -> ()
@@ -288,7 +303,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
288303
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, port, size, value, userData))
289304

290305
if _outHooks |> Seq.isEmpty then
291-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new OutHookInternal(trampoline))
306+
let outHookInternal = new OutHookInternal(trampoline)
307+
_hookInternals.Add(outHookInternal)
308+
let funcPointer = Marshal.GetFunctionPointerForDelegate(outHookInternal)
292309
let hh = new UIntPtr(allocate(IntPtr.Size))
293310
match binding.HookAddArg0(_eng.[0], hh, Common.UC_HOOK_INSN, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 1, uint64 0, X86.UC_X86_INS_OUT) |> this.CheckResult with
294311
| Some e -> raise e | None -> ()
@@ -304,7 +321,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
304321
|> Seq.iter(fun (callback, userData) -> callback.Invoke(this, userData))
305322

306323
if _syscallHooks |> Seq.isEmpty then
307-
let funcPointer = Marshal.GetFunctionPointerForDelegate(new SyscallHookInternal(trampoline))
324+
let syscallHookInternal = new SyscallHookInternal(trampoline)
325+
_hookInternals.Add(syscallHookInternal)
326+
let funcPointer = Marshal.GetFunctionPointerForDelegate(syscallHookInternal)
308327
let hh = new UIntPtr(allocate(IntPtr.Size))
309328
match binding.HookAddArg0(_eng.[0], hh, Common.UC_HOOK_INSN, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 1, uint64 0, X86.UC_X86_INS_SYSCALL) |> this.CheckResult with
310329
| Some e -> raise e | None -> ()

0 commit comments

Comments
 (0)