Releases: 0cyn/ktool
Release 2.0.0
This has been a long time coming, I wanted to keep something stable on pip while I
didn't really have the time to get things to that point. I have been really busy with work, and given its work in a field related to this project I
didn't work on it a lot. This resulted in 2 years of me pushing updates every now and then and not actually putting anything
on pip.
So I am doing that now. There may be regressions. Please inform me.
I am mainly getting this out because I made a HUGE improvement to the chained fixup stuff.
It was bad and implemented 1/12th of the spec and now it is good and does everything :)
- ACTUAL chained fixup processing. Full device/arch/system coverage.
- Including Rebase Opcode processing even though we have no use for them in the CLI, just in case you need to check your own parser.
- Huge refactor. Re-did a LOT of stuff I wanted to get fixed.
- armv7 / arm64_32 support
MachOImageHeader.replace_load_commandMachOImageHeaderiteratorVM.detranslate--force-misaligned-vmutil.detect_filetype- Expanded Swift Support. We're not "there" yet, but there's more now than there was.
- Unit test improvements and fixes
- Fix rpath re-serialization
- Restructure the sublibraries.
- Disable mmaped IO by default.
- Bitfield Struct Support
- Union Support
- Better memory map fallback support
- Better VM mapping structure
- Hotfixes for Queue bugs and the legacy setup.py installation method.
- Fix windows-curses dep
Way more that I didn't mention here, this is 2 years worth of commits I'm not going to dig through currently. Enjoy!
1.3.0 - Insert fixes + refactor
Class Renames:
Dyld -> MachOImageLoader
ImageHeader -> MachOImageHeader
LD64 class was removed
insert_load_cmd(load_command, index=-1, suffix=None) and remove_load_command(index) added to MachOImageHeader which supports adding and removing all types of load commands now.
ktool.dyld module renamed to ktool.loader, now contains only code relevant specifically to loading the Image class from a standard MachO
Image class and a few others moved to new image.py, in which contained code is a non-platform-specific abstraction not tied to MachO.
Fixes:
- Rewritten load command injection should fix issues with round-tripping and producing bad patches. A ton of unit testing for this area was added to try and maintain this.
- Fix for some issues on certain weird linux environments
Improvements:
- ktool no longer tries to guess the property getter/setter; it decodes it from the actual standard attr_string or generates it from the property name if none is specified. This avoids potential false positives and also clarifies when non-standard ones are used. We also decode whether a property is @ dynamic but do not encode that in the header yet.
- json output for properties now embeds attr_string, getter, and setter.
- More unit tests
1.2.1 - Bugfix update, mostly
New
- ImageHeader can now be created from arbitrarily values (ImageHeader.from_values())
- New Constructable LoadCommand + Segment currently used in tandem with old Segment wrapper.
- Unit tests!
--fdecflag for dump, which forward declares private class imports
Fixes
- BytesIO fixes
- Fix lc insertion
- Fix with mmaped IO loader
- Program no longer crashes on unimplemented load commands
- Better VM segment input verification
- Properly null pad strings in structs
- Minor fixes in help messages
- Fix a crash with the codesign parser
- Fix (one) missing Chained Fixup structure.
- Fix relative method list parsing when relative addresses are negative
- Much better error handling in objc parsing
- Better info on bad load commands
1.2.0
- Added entitlement parsing
- Added Codesign information to GUI.
- Added json dumping for all mach-o/obj-c metadata
- Fixed an issue with
Slice.find()on 32 bit files - Further sped up struct loading substantially.
- Fixed issues with the patcher.
Tool
- Added
ktool csfor interacting with codesigning info - Added
ktool jsonfor dumping metadata as json - Implemented
ktool -V
Library
Documentation has been mostly updated to reflect new additions
Codesign Info
- Added
CodesignInfoclass, accessible viaimage.codesign_info- Entitlements accessible via
codesign_info.entitlements
- Entitlements accessible via
Serialization
The majority of objects containing relevant/important metadata about the image now contain a .serialize() function, which returns json-formattable dictionaries containing relevant metadata.
Struct Parser
- Redid the method in which
.rawbytes are generated, eliminating the bottleneck created by that feature - Added support for field "sizes" being another Struct type
File Backing
- Added a
BackingFileclass to further abstract out the direct file reads - Added a
SlicedBackingFileclass to even further abstract out slices within a file. This fixed a confusing issue with theSlice.find()search utility in 32 bit files. This also abstracts out the patching functionality in order to keep that code more sane.
Patcher
- Refactored the majority of the
LD64class and its patching methods to now rebuild the entire header and write it via a singleslice.patch()
Parsing of more codesign related information, along with adding more relevant data to json dumps to come.
1.1.4
Nothing too crazy, a lot of cleanup/refactoring, a few additions
GUI
- Structs will now be rendered with an indentation for readability
- Scrolling now supports PGUP + PGDOWN
Image
.vm_realign() - Computes image alignment (after the imageheader has been loaded) and sets up (or re-sets-up) the proper VM translator for the image.
Slice
CPU subtype now masks out the ABI bits.
VM Address Translation
Added a new VM translator, based on how low-level memory paging works. It is up to 2x faster than the old manual translator.
It falls back to the legacy method whenever images cannot be mapped to 16k/4k pages.
- Refactor: ->
get_file_address()->translate() - New Attribute:
.detag_kern_64- Set this to automatically detag 64 bit kernel pointers being translated - New Attribute:
.detag_64- Set this to detag 64 bit pointers (remove chained fixup data)
ObjC
A lot more fallback/safe failure stuff. You can now load a binary extracted using the default dyld_extractor.bundle (although objc data will still not be processable, as the offsets are entirely junk and likely irreperable without access to the entire cache).
Structs
.render_indented() - Return a string similar to str(struct_instance) but with linebreaks and indentation.
Internal:
Struct sizes now actually contain two values; the high 2 bytes represent the type of the field, and the low 2 bytes represent the size of the data in that field.
loading a field as bytes uses the size type_bytes | <size>. loading a field as a string is done with char_t[size]. Unsigned ints now internally use the 0x10000 mask instead of being represented by -<size>
kcache parsing:
1.1.3
watchOS kcache extraction + minor bug fixes
TUI
- Add support for
--no-mmapflag (needed on windows) inopencommand - Only detag kext addresses on 64 bit kcaches
ktool.macho
MachOFile -
- Fix an issue where 32 bit little endian files wouldn't be recognized.
ktool.kcache -
- Add support for armv7k kernelcaches
1.1.1
This release builds on the baseline kernelcache processing shipped with 1.1.0
- Added a modified version of the python stdlib plistlib that actually works in
ktool.kplistlib - Added the kcache stuff to the help strings.
GUI
- Temporarily dropped the non-implemented title menus
- Added a new one named "Help", and moved the old default info text to that
GUI Kernel Cache Loader
- Added a full Loader specifically for KernelCaches
- Info specific to Kernel Caches
- Creates a View listing kexts and allow browsing their attributes and prelink info
ktool.kcache
KernelCache
Added Attributes:
.prelink_info-> prelink info dict for the Mach Kernel psuedoextension.version-> Release Version (semantic) of the kernel
Kext
Added Attributes:
Note: Do not rely on any of these not being empty
.prelink_info-> Dict[str, Any] with info for this kext pulled straight from the plist in__PRELINK_INFO:__info..development_region.executable_name.id-> will always be the same as.name.bundle_name-> Plaintext readable proper name of the bundle (like, "Libkern Extension").package_type-> AlwaysKEXT.info_string-> Informative (maybe) string describing the kext.version_str-> (Probably) the same as.version
1.1.0
This release mainly adds merged-type kernelcache parsing.
kmacho module
- Added support for
LC_THREAD,LC_UNIXTHREAD, andLC_MAIN - Added mapping for
LC_LOAD_UPWARD_DYLIB
ktool module
New! ktool.kcache
KernelCache class:
.mach_kernel: Image -> Image representing the Mach Kernel itself
.kexts: List[Kext] -> List of Kext objects embedded in this kernel
Kext class:
.name -> kext name
.version: str -> kext version
.mach_header -> Mach-O Header of the Kext
.image -> Image representing this Kext
_VirtualMemoryMap
- Added support (and detagging) for 64 bit kernel address space.
Image
- added
.entry_pointattribute, which points to the address (in VM Space) of the program's entry point, if anLC_THREAD,LC_UNIXTHREAD, orLC_MAINwas in the header - added
.thread_stateattribute, which holds the entry thread state if anLC_THREAD/LC_UNIXTHREADwas defined
GUI
- Fix: Window wont crash when a view is empty
Release 1.0.0
🎉 🎉 🎉 🎉
This release includes the changelog from 1.0.0rc0
Changes
- Terminal Output is now highlighted
- Table rendering in terminal output now has ansi support
- Added
--classflag todump - Chained Fixup Support! iOS 15 binaries, etc can now have their imports processed. It's rudimentary, but damnit, it works :)
- Fixed ENCRYPTION_INFO_COMMAND handling
- Function Starts table processing
- Remove unneeded
packagingdependency in favor of just hackily usingsetuptools's vendored version. This is a hack, but reportedly, procursus (an iOS bootstrap) cant handle building one ofpackaging's build dependencies, so this makes that work. - heavily improved non-mmap implementation
Swift
Extremely Rudimentary swift processing. It's just the groundwork, and shouldn't really be counted as a feature yet, but binaries with swift wont break it anymore, and it can read some basic info about swift types (and list swift types)
Structs
- Rewrite it again to handle signed int field processing automatically
- Rewrite it again again so my IDE properly recognizes the fields exist, without slowing down processing too much
Internal Stuff
- Migrated the entire project to poetry and refactored some of the project layout.
Release 1.0.0 RC 0
🎉 🎉 🎉 🎉
Changes
- Chained Fixup Support! iOS 15 binaries, etc can now have their imports processed. It's rudimentary, but damnit, it works :)
- Fixed ENCRYPTION_INFO_COMMAND handling
- Function Starts table processing
- Remove unneeded
packagingdependency in favor of just hackily usingsetuptools's vendored version. This is a hack, but reportedly, procursus (an iOS bootstrap) cant handle building one ofpackaging's build dependencies, so this makes that work. - heavily improved non-mmap implementation
Swift
Extremely Rudimentary swift processing. It's just the groundwork, and shouldn't really be counted as a feature yet, but binaries with swift wont break it anymore, and it can read some basic info about swift types (and list swift types)
Structs
- Rewrite it again to handle signed int field processing automatically
- Rewrite it again again so my IDE properly recognizes the fields exist, without slowing down processing too much
