@@ -32,6 +32,7 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
32
32
let _outHooks = new List<( OutHook * Object)>()
33
33
let _syscallHooks = new List<( SyscallHook * Object)>()
34
34
let _disposablePointers = new List< nativeint>()
35
+ let _hookInternals = new List< Object>();
35
36
36
37
let _eventMemMap =
37
38
[
@@ -153,7 +154,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
153
154
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, addr, size, userData))
154
155
155
156
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)
157
160
let hh = new UIntPtr( allocate( IntPtr.Size))
158
161
match binding.HookAddNoarg(_ eng.[ 0 ], hh, Common.UC_ HOOK_ CODE, new UIntPtr( funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
159
162
| Some e -> raise e | None -> ()
@@ -172,7 +175,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
172
175
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, addr, size, userData))
173
176
174
177
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)
176
181
let hh = new UIntPtr( allocate( IntPtr.Size))
177
182
match binding.HookAddNoarg(_ eng.[ 0 ], hh, Common.UC_ HOOK_ BLOCK, new UIntPtr( funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
178
183
| Some e -> raise e | None -> ()
@@ -188,7 +193,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
188
193
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, intNumber, userData))
189
194
190
195
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)
192
199
let hh = new UIntPtr( allocate( IntPtr.Size))
193
200
match binding.HookAddNoarg(_ eng.[ 0 ], hh, Common.UC_ HOOK_ INTR, new UIntPtr( funcPointer.ToPointer()), IntPtr.Zero, hookBegin, hookEnd) |> this.CheckResult with
194
201
| Some e -> raise e | None -> ()
@@ -202,12 +209,14 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
202
209
hookDel _ interruptHooks callback
203
210
204
211
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 ) =
206
213
_ memReadHooks
207
214
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, addr, size, userData))
208
215
209
216
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)
211
220
let hh = new UIntPtr( allocate( IntPtr.Size))
212
221
match binding.HookAddNoarg(_ eng.[ 0 ], hh, Common.UC_ HOOK_ MEM_ READ, new UIntPtr( funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
213
222
| Some e -> raise e | None -> ()
@@ -218,12 +227,14 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
218
227
hookDel _ memReadHooks callback
219
228
220
229
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 ) =
222
231
_ memWriteHooks
223
232
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, addr, size, value, userData))
224
233
225
234
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)
227
238
let hh = new UIntPtr( allocate( IntPtr.Size))
228
239
match binding.HookAddNoarg(_ eng.[ 0 ], hh, Common.UC_ HOOK_ MEM_ WRITE, new UIntPtr( funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with
229
240
| Some e -> raise e | None -> ()
@@ -247,7 +258,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
247
258
|> Seq.filter( fun eventFlag -> ( eventType &&& eventFlag) <> 0 )
248
259
|> Seq.filter( fun eventFlag -> _ memEventHooks.[ eventFlag] |> Seq.isEmpty)
249
260
|> 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)
251
264
let hh = new UIntPtr( allocate( IntPtr.Size))
252
265
match binding.HookAddNoarg(_ eng.[ 0 ], hh, eventFlag, new UIntPtr( funcPointer.ToPointer()), IntPtr.Zero, uint64 1 , uint64 0 ) |> this.CheckResult with
253
266
| Some e -> raise e | None -> ()
@@ -272,7 +285,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
272
285
|> Seq.last
273
286
274
287
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)
276
291
let hh = new UIntPtr( allocate( IntPtr.Size))
277
292
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
278
293
| Some e -> raise e | None -> ()
@@ -288,7 +303,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
288
303
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, port, size, value, userData))
289
304
290
305
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)
292
309
let hh = new UIntPtr( allocate( IntPtr.Size))
293
310
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
294
311
| Some e -> raise e | None -> ()
@@ -304,7 +321,9 @@ and Unicorn(arch: Int32, mode: Int32, binding: IBinding) =
304
321
|> Seq.iter( fun ( callback , userData ) -> callback.Invoke( this, userData))
305
322
306
323
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)
308
327
let hh = new UIntPtr( allocate( IntPtr.Size))
309
328
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
310
329
| Some e -> raise e | None -> ()
0 commit comments