Skip to content

Instantly share code, notes, and snippets.

@iddoeldor
Created June 6, 2018 15:25
Show Gist options
  • Save iddoeldor/e9578caef8151c79688af7cb0af326cd to your computer and use it in GitHub Desktop.
Save iddoeldor/e9578caef8151c79688af7cb0af326cd to your computer and use it in GitHub Desktop.
dump keychain to json
#import <UIKit/UIKit.h>
#import <Security/Security.h>
#import "sqlite3.h"
NSArray * getKeychainObjectsForSecClass(CFTypeRef kSecClassType) {
NSMutableDictionary *genericQuery = [[NSMutableDictionary alloc] init];
[genericQuery setObject:(id)kSecClassType forKey:(id)kSecClass];
[genericQuery setObject:(id)kSecMatchLimitAll forKey:(id)kSecMatchLimit];
[genericQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes];
[genericQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef];
[genericQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
NSArray *keychainItems = nil;
if (SecItemCopyMatching((CFDictionaryRef)genericQuery, (CFTypeRef *)&keychainItems) != noErr) {
keychainItems = nil;
}
[genericQuery release];
return keychainItems;
}
NSMutableString * printGenericPassword(NSDictionary *passwordItem) {
NSMutableString *str = [[NSMutableString alloc] init];
[str appendString:@"{"];
NSString *outFormat = @"\"%@\":\"%@\",";
for (NSString *aKey in passwordItem.allKeys) {
[str appendFormat:outFormat, aKey, [passwordItem valueForKey:aKey]];
}
[str deleteCharactersInRange:NSMakeRange([str length] - 1, 1)]; // remove last comma
[str appendString:@"},"];
return str;
}
void printResultsForSecClass(NSArray *keychainItems, CFTypeRef kSecClassType) {
NSMutableString *str = [[NSMutableString alloc] init];
NSDictionary *keychainItem;
for (keychainItem in keychainItems) {
if (kSecClassType == kSecClassGenericPassword) {
[str appendString: printGenericPassword(keychainItem) ];
}
}
[str deleteCharactersInRange:NSMakeRange([str length] - 1, 1)];
[[NSFileHandle fileHandleWithStandardOutput] writeData: [str dataUsingEncoding: NSNEXTSTEPStringEncoding]];
return;
}
int main(int argc, char **argv)
{
id pool = [NSAutoreleasePool new];
NSMutableArray *arguments = [[NSMutableArray alloc] init];
[arguments addObject:(id)kSecClassGenericPassword];
[[NSFileHandle fileHandleWithStandardOutput] writeData: [@"[\n" dataUsingEncoding: NSNEXTSTEPStringEncoding]];
for (id kSecClassType in (NSArray *) arguments) {
NSArray *keychainItems = getKeychainObjectsForSecClass((CFTypeRef)kSecClassType);
printResultsForSecClass(keychainItems, (CFTypeRef)kSecClassType);
[keychainItems release];
}
[[NSFileHandle fileHandleWithStandardOutput] writeData: [@"]" dataUsingEncoding: NSNEXTSTEPStringEncoding]];
[pool drain];
}
GCC_BIN=`xcrun --sdk iphoneos --find gcc`
SDK=`xcrun --sdk iphoneos --show-sdk-path`
#support iPhone 3GS and above, delete armv6 to avoid SDK error
ARCH_FLAGS=-arch armv7 -arch armv7s -arch arm64
LDFLAGS =\
-F$(SDK)/System/Library/Frameworks/\
-F$(SDK)/System/Library/PrivateFrameworks/\
-framework UIKit\
-framework CoreFoundation\
-framework Foundation\
-framework CoreGraphics\
-framework Security\
-framework CoreTelephony\
-lobjc\
-lsqlite3\
-bind_at_load
GCC_ARM = $(GCC_BIN) -Os -Wimplicit -isysroot $(SDK) $(ARCH_FLAGS)
default: main.o list
@$(GCC_ARM) $(LDFLAGS) main.o -o keychain_dumper
main.o: main.m
$(GCC_ARM) -c main.m
clean:
rm -f keychain_dumper *.o
list:
security find-identity -pcodesigning
@printf '\nTo codesign, please run: \n\tCER="<40 character hex string for certificate>" make codesign\n'
codesign:
codesign -fs "$(CER)" --entitlements entitlements.xml keychain_dumper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment