Get fileSize of info.plist to prevent piracy
Asked Answered
O

4

8

I'm trying to put anti-piracy code in my app. The previous answer to this (which I can't link to because of my member status - sucks) can be easily countered, since the "SignerIdentity" string can be looked for and replaced in the binary using a hex editor.

Instead, checking the fileSize of the info.plist file and comparing it to a reference value sounds more solid (since the info.plist is getting modified here and there when cracking the app). How would I do that? I tried the following but it logs 0.

NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *mainDictionary = [bundle infoDictionary];
NSLog(@"%d", [mainDictionary fileSize]);
Oversupply answered 24/5, 2009 at 5:34 Comment(0)
S
7

You might prevent the noobish crackers from finding references to "SignerIdentity" in your code by applying ROT13 or a similar simple obscuring algorithm http://en.wikipedia.org/wiki/ROT13

After applying ROT13, "SignerIdentity" would become "FvtareVqragvgl".

Anyway, the answer to your question (how you get the size of the Info.plist file):

NSBundle *bundle = [NSBundle mainBundle];
NSString* bundlePath = [bundle bundlePath];

NSFileManager *fileManager = [NSFileManager defaultManager];

NSString* path = [NSString stringWithFormat:@"%@/Info.plist", bundlePath ];

NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:path 
                                                             error:NULL];

if (fileAttributes != nil) {
    NSNumber *fileSize;

    if (fileSize = [fileAttributes objectForKey:NSFileSize]) {
        NSLog(@"File size: %qi\n", [fileSize unsignedLongLongValue]);
    }           
}

Also keep in mind that the size (in bytes) of the Info.plist in your Xcode project directory and the Info.plist inside the bundle may differ. You probably want to build the game once, then look at the size of <your app bundle.app>/Info.plist and then update your antipiracy code.

Sinh answered 24/5, 2009 at 13:46 Comment(2)
Thing is the pirate could change that "FvtareVqragvgl" string to something else and that would check another key in the info.plist.. that will probably be null. The filesize attribute is compared to an int so there's really no easy way to look for it in the binary.Oversupply
update: now // NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:pathP traverseLink:YES]; is deprecated... use: -> ... NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:pathP error:NULL]; ... insteadRondon
M
5

I've never programmed for the iPhone, but couldn't you just take a hash of that file and compare it to a reference, possibly salting the hash value to prevent someone just changing the reference hash to the new one?

Murvyn answered 24/5, 2009 at 13:52 Comment(0)
B
2

that code has still many giveaways:

the string Info.plist is easy to find. NSFileSize is also very suspicious....

Bili answered 19/9, 2009 at 22:47 Comment(0)
C
2

As said here Determining if an iPhone is Jail broken Programmatically it looks like some of the most recent cracked apps installed via install0us don't have their info.plist modified. (at least the info.plist does not contain any signeridentity key). How could we detect the crack in such a case ?

Curlicue answered 11/1, 2010 at 10:21 Comment(3)
did you try to compare the 2 info.plist file sizes?Oversupply
No, but can I make any assumption on the size of the info.plist once downloaded from the appstore by a iPhone user ? Would it be the same as the one when I upload it to the appStore (through iTunes Connect) ? The fact that this file is sometimes in xml, sometimes as a binary does not give me a clear picture of the whole flow for this file :/Curlicue
The filesize would be the one in your .app package of your distribution build. I'm not sure wether Apple changes something in the info.plist file after you submit your app...Oversupply

© 2022 - 2024 — McMap. All rights reserved.