kernel.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // kernel.h
  3. // Meridian
  4. //
  5. // Created by Ben Sparkes on 16/12/2017.
  6. // Copyright © 2017 Ben Sparkes. All rights reserved.
  7. //
  8. #include <mach/mach.h>
  9. enum arg_type {
  10. ARG_LITERAL,
  11. ARG_BUFFER,
  12. ARG_BUFFER_PERSISTENT, // don't free the buffer after the call
  13. ARG_OUT_BUFFER,
  14. ARG_INOUT_BUFFER
  15. };
  16. typedef struct _arg_desc {
  17. uint64_t type;
  18. uint64_t value;
  19. uint64_t length;
  20. } arg_desc;
  21. #define REMOTE_LITERAL(val) &(arg_desc){ARG_LITERAL, (uint64_t)val, (uint64_t)0}
  22. #define REMOTE_BUFFER(ptr, size) &(arg_desc){ARG_BUFFER, (uint64_t)ptr, (uint64_t)size}
  23. #define REMOTE_CSTRING(str) &(arg_desc){ARG_BUFFER, (uint64_t)str, (uint64_t)(strlen(str)+1)}
  24. task_t tfp0;
  25. uint64_t kslide;
  26. uint64_t kernel_base;
  27. uint64_t kern_ucred;
  28. uint64_t kernprocaddr;
  29. kern_return_t mach_vm_write(vm_map_t target_task,
  30. mach_vm_address_t address,
  31. vm_offset_t data,
  32. mach_msg_type_number_t dataCnt);
  33. kern_return_t mach_vm_read_overwrite(vm_map_t target_task,
  34. mach_vm_address_t address,
  35. mach_vm_size_t size,
  36. mach_vm_address_t data,
  37. mach_vm_size_t *outsize);
  38. kern_return_t mach_vm_allocate(vm_map_t,
  39. mach_vm_address_t *,
  40. mach_vm_size_t, int);
  41. kern_return_t mach_vm_deallocate(vm_map_t target,
  42. mach_vm_address_t address,
  43. mach_vm_size_t size);
  44. kern_return_t mach_vm_region(vm_map_t target_task,
  45. mach_vm_address_t *address,
  46. mach_vm_size_t *size,
  47. vm_region_flavor_t flavor,
  48. vm_region_info_t info,
  49. mach_msg_type_number_t *infoCnt,
  50. mach_port_t *object_name);
  51. kern_return_t bootstrap_look_up(mach_port_t port, const char *service, mach_port_t *server_port);
  52. size_t kread(uint64_t where, void *p, size_t size);
  53. size_t kwrite(uint64_t where, const void *p, size_t size);
  54. uint64_t rk64(uint64_t kaddr);
  55. uint32_t rk32(uint64_t kaddr);
  56. void wk64(uint64_t kaddr, uint64_t val);
  57. void wk32(uint64_t kaddr, uint32_t val);
  58. uint64_t remote_alloc(mach_port_t task_port, uint64_t size);
  59. uint64_t alloc_and_fill_remote_buffer(mach_port_t task_port,
  60. uint64_t local_address,
  61. uint64_t length);
  62. void remote_free(mach_port_t task_port, uint64_t base, uint64_t size);
  63. void remote_read_overwrite(mach_port_t task_port,
  64. uint64_t remote_address,
  65. uint64_t local_address,
  66. uint64_t length);
  67. uint64_t binary_load_address(mach_port_t tp);
  68. uint64_t ktask_self_addr(void);
  69. mach_port_t task_for_pid_workaround(int pid);
  70. uint64_t find_port_address(mach_port_name_t port);
  71. uint64_t call_remote(mach_port_t task_port, void* fptr, int n_params, ...);