//---------------------------------------------------------------------- // find_cstring_in_heap // // Finds a C string inside one or more currently valid malloc blocks. //---------------------------------------------------------------------- malloc_match * find_cstring_in_heap (const char *s, int check_vm_regions) { g_matches.clear(); if (s == NULL || s[0] == '\0') { printf ("error: invalid argument (empty cstring)\n"); return NULL; } // Setup "info" to look for a malloc block that contains data // that is the C string passed in aligned on a 1 byte boundary range_contains_data_callback_info_t data_info; data_info.type = eDataTypeContainsData; // Check each block for data data_info.data.buffer = (uint8_t *)s; // What data? The C string passed in data_info.data.size = strlen(s); // How many bytes? The length of the C string data_info.data.align = 1; // Data doesn't need to be aligned, so set the alignment to 1 data_info.match_count = 0; // Initialize the match count to zero data_info.done = false; // Set done to false so searching doesn't stop data_info.unique = false; // Set to true when iterating on the vm_regions range_callback_info_t info = { enumerate_range_in_zone, range_info_callback, &data_info, check_vm_regions }; foreach_zone_in_this_process (&info); g_matches.dump(); return g_matches.data(); }
//---------------------------------------------------------------------- // find_block_for_address // // Find the malloc block that whose address range contains "addr". //---------------------------------------------------------------------- malloc_match * find_block_for_address (const void *addr, int check_vm_regions) { g_matches.clear(); // Setup "info" to look for a malloc block that contains data // that is the C string passed in aligned on a 1 byte boundary range_contains_data_callback_info_t data_info; data_info.type = eDataTypeAddress; // Check each block to see if the block contains the address passed in data_info.addr = (uintptr_t)addr; // What data? The C string passed in data_info.match_count = 0; // Initialize the match count to zero data_info.done = false; // Set done to false so searching doesn't stop data_info.unique = false; // Set to true when iterating on the vm_regions range_callback_info_t info = { enumerate_range_in_zone, range_info_callback, &data_info, check_vm_regions }; foreach_zone_in_this_process (&info); return g_matches.data(); }
//---------------------------------------------------------------------- // find_pointer_in_memory // // Finds a pointer value inside one or more currently valid malloc // blocks. //---------------------------------------------------------------------- malloc_match * find_pointer_in_memory (uint64_t memory_addr, uint64_t memory_size, const void * addr) { g_matches.clear(); // Setup "info" to look for a malloc block that contains data // that is the pointer range_contains_data_callback_info_t data_info; data_info.type = eDataTypeContainsData; // Check each block for data data_info.data.buffer = (uint8_t *)&addr; // What data? The pointer value passed in data_info.data.size = sizeof(addr); // How many bytes? The byte size of a pointer data_info.data.align = sizeof(addr); // Align to a pointer byte size data_info.match_count = 0; // Initialize the match count to zero data_info.done = false; // Set done to false so searching doesn't stop data_info.unique = false; // Set to true when iterating on the vm_regions range_info_callback (mach_task_self(), &data_info, stack_logging_type_generic, memory_addr, memory_size); return g_matches.data(); }
//---------------------------------------------------------------------- // find_objc_objects_in_memory // // Find all instances of ObjC classes 'c', or all ObjC classes if 'c' is // NULL. If 'c' is non NULL, then also check objects to see if they // inherit from 'c' //---------------------------------------------------------------------- malloc_match * find_objc_objects_in_memory (void *isa, int check_vm_regions) { g_matches.clear(); if (g_objc_classes.Update()) { // Setup "info" to look for a malloc block that contains data // that is the pointer range_contains_data_callback_info_t data_info; data_info.type = eDataTypeObjC; // Check each block for data data_info.objc.match_isa = isa; data_info.objc.match_superclasses = true; data_info.match_count = 0; // Initialize the match count to zero data_info.done = false; // Set done to false so searching doesn't stop data_info.unique = false; // Set to true when iterating on the vm_regions range_callback_info_t info = { enumerate_range_in_zone, range_info_callback, &data_info, check_vm_regions }; foreach_zone_in_this_process (&info); } return g_matches.data(); }
//---------------------------------------------------------------------- // find_pointer_in_heap // // Finds a pointer value inside one or more currently valid malloc // blocks. //---------------------------------------------------------------------- malloc_match * find_pointer_in_heap (const void * addr, int check_vm_regions) { g_matches.clear(); // Setup "info" to look for a malloc block that contains data // that is the pointer if (addr) { range_contains_data_callback_info_t data_info; data_info.type = eDataTypeContainsData; // Check each block for data data_info.data.buffer = (uint8_t *)&addr; // What data? The pointer value passed in data_info.data.size = sizeof(addr); // How many bytes? The byte size of a pointer data_info.data.align = sizeof(addr); // Align to a pointer byte size data_info.match_count = 0; // Initialize the match count to zero data_info.done = false; // Set done to false so searching doesn't stop data_info.unique = false; // Set to true when iterating on the vm_regions range_callback_info_t info = { enumerate_range_in_zone, range_info_callback, &data_info, check_vm_regions }; foreach_zone_in_this_process (&info); } return g_matches.data(); }