View difference between Paste ID: ZyAVEqpP and
SHOW: | | - or go back to the newest paste.
1-
1+
#!/bin/sh
2
#
3
# poedCrack - v2.5 (2009-12-03) -- mod25G
4
# For all devices
5
#
6
# Now includes fat binary support
7
#
8
# Latest version always available at: http://www.roapd.com/uploads/poedCrack.gz
9
#
10
# Heavily based on DeCrypt by FloydianSlip
11
#
12
# Many thanks to:
13
# puy0, SaladFork, Flox, Flawless, FloydianSlip, MadHouse, TDDebug
14
15
clear
16
echo "poedCrack 2.5 (091203) by poedgirl -- mod25G"
17
18
if [ ! -e /usr/bin/plutil ]; then
19
        echo "Cannot find plutil (Install Erica Utils from Cydia)"
20
        exit 1
21
fi
22
23
if [ ! -e /usr/bin/gdb ]; then
24
        echo "Cannot find gdb (Install GNU Debugger from Cydia)"
25
        exit 1
26
fi
27
28
if [ ! -e /usr/bin/otool ]; then
29
        echo "Cannot find otool (Install toolchain from Cydia)"
30
        exit 1
31
fi
32
33
if [ ! -e /usr/bin/ldid ]; then
34
        echo "Cannot find ldid (Install Link Identity Editor from Cydia)"
35
        exit 1
36
fi
37
38
#Get and store the whole apps list
39
rm -f /tmp/lsd.tmp
40
ls -d /var/mobile/Applications/*/*.app > /tmp/lsd.tmp
41
42
if [ $# -lt 1 ]; then
43
        echo "Usage: $(basename $0) [<ApplicationName> [<CrackerName> [<CreditFileName>]]]"
44
        echo
45
        cat /tmp/lsd.tmp | cut -f 6 -d '/' | sort -f | sed "s/\\.app/,/" | tr "\n" " "
46
        echo -e "\010\010."
47
        rm -f /tmp/lsd.tmp
48
        exit 1
49
fi
50
51
if [ "$1" = "-e" ]; then
52
        echo "Encrypted apps list:"
53
        ls -d /var/mobile/Applications/*/*.app/SC_Info | sort -f -t \/ -k 6 | while read OneApp
54
        do
55
                echo -n "$(echo "$OneApp" | cut -f 6 -d '/' | sed "s/\\.app/, /")"
56
        done
57
        echo -e "\010\010."
58
        rm -f /tmp/lsd.tmp
59
        exit 1
60
fi
61
62
AppInput=$1
63
CrackerName=$2
64
CreditFile=$3
65
66
if [ ! $CrackerName ]; then
67
        CrackerName="Anonymous"
68
fi
69
70
if [ ! $CreditFile ]; then
71
        CreditFile=$CrackerName
72
fi
73
74
if [ -d "$AppInput" ]; then
75
        tempLoc=$AppInput
76
else
77
        echo "Locating $AppInput"
78
        #Escape the "*" as ".*"
79
        AppGrep=$(echo "/$AppInput\.app" | sed "s/\*/\.\*/g")
80
        tempLoc=$(grep -i "$AppGrep" /tmp/lsd.tmp)
81
        if [ -z "$tempLoc" ]; then
82
                echo "Unable to locate $AppInput"
83
                rm -f /tmp/lsd.tmp
84
                exit 1
85
        fi
86
        AppCount=$(echo "$tempLoc" | wc -l)
87
        if [ $AppCount -gt 1 ]; then
88
                echo "Found $AppCount installation directories:"
89
                echo "$tempLoc"
90
                rm -f /tmp/lsd.tmp
91
                exit 1
92
        fi
93
fi
94
95
#Apps list not needed anymore
96
rm -f /tmp/lsd.tmp
97
98
AppPath=$(dirname "$tempLoc")
99
AppName=$(basename "$tempLoc")
100
AppExec=$(plutil -key CFBundleExecutable "$tempLoc/Info.plist" 2>&1)
101
AppVer=$(plutil -key CFBundleVersion "$tempLoc/Info.plist" 2>&1)
102
AppDisplayName=$(plutil -key CFBundleDisplayName "$tempLoc/Info.plist" 2>&1)
103
if [ "${AppDisplayName:0:6}" = "Error:" ]; then
104
        echo "Unable to get CFBundleDisplayName"
105
        AppDisplayName=$(plutil -key CFBundleName "$tempLoc/Info.plist" 2>&1)
106
        if [ "${AppDisplayName:0:6}" = "Error:" ]; then
107
                echo "Unable to get CFBundleName"
108
                AppDisplayName=$AppExec
109
        fi
110
fi
111
MinOS=$(plutil -key MinimumOSVersion "$tempLoc/Info.plist" 2>&1)
112
if [ "${MinOS:0:6}" = "Error:" ]; then
113
        echo "Unable to get MinOS"
114
        MinOS="0.0.0"
115
fi
116
Patched=""
117
118
if [ ! -d "$AppPath" ]; then
119
        echo "Unable to locate original installation directory"
120
        exit 1
121
fi
122
123
if [ ! -d "$AppPath/$AppName" ]; then
124
        echo "Unable to locate .app directory"
125
        exit 1
126
fi
127
128
if [ ! -e "$AppPath/$AppName/$AppExec" ]; then
129
        echo "Unable to locate executable"
130
        exit 1
131
fi
132
133
if [ ! "$AppName" = "$AppDisplayName.app" ]; then
134
        echo "Found '$AppName' ($AppDisplayName)"
135
else
136
        echo "Found '$AppName'"
137
fi
138
139
echo -n "Creating directories "
140
WorkDir="/tmp/poedCrack-$(date +%Y%m%d-%H%M%S)"
141
NewAppDir="$HOME/Documents/Cracked"
142
143
if [ -e "$WorkDir" ]; then
144
        rm -rf "$WorkDir"
145
fi
146
147
mkdir -p "$WorkDir"
148
149
if [ ! -e "$NewAppDir" ]; then
150
        mkdir -p "$NewAppDir"
151
fi
152
153
if [ ! -d "$WorkDir" -o ! -d "$NewAppDir" ]; then
154
        echo "failed !"
155
        exit 1
156
fi
157
158
echo "and copying some files"
159
mkdir -p "$WorkDir/$AppName"
160
cp -a "$AppPath/$AppName/$AppExec" "$WorkDir/$AppName/"
161
cp -a "$AppPath/$AppName/Info.plist" "$WorkDir/$AppName/"
162
163
164
if [ ! -e "$WorkDir/$AppName/$AppExec" ]; then
165
        echo "Unable to copy application files"
166
        rm -fr "$WorkDir"
167
        exit 1
168
fi
169
170
echo -n "Analyzing application: "
171
172
LipoFail=$(lipo -info "$WorkDir/$AppName/$AppExec" | grep Architectures | awk '{print $2}')
173
if [ ! $LipoFail ]; then
174
        echo "Thin Binary found"
175
        Iterations=1
176
else
177
        echo "Fat Binary found"
178
        echo "Dumping armv6 section"
179
        lipo -thin armv6 "$WorkDir/$AppName/$AppExec" -output "$WorkDir/$AppName/$AppExec-armv6"
180
        CPUType=$(sysctl hw.cpusubtype | grep 6 | awk '{print $2}')
181
        if [ ! $CPUType ]; then
182
                echo "Dumping armv7 section"
183
                dd if="$WorkDir/$AppName/$AppExec" of="$WorkDir/$AppName/$AppExec-swapped" bs=1 count=15 >> /dev/null 2>&1> /dev/null
184
                echo -en "\011" >> "$WorkDir/$AppName/$AppExec-swapped"
185
                dd if="$WorkDir/$AppName/$AppExec" of="$WorkDir/$AppName/$AppExec-swapped" skip=16 bs=1 count=19 oflag=append conv=notrunc >> /dev/null 2>&1> /dev/null
186
                echo -en "\006" >> "$WorkDir/$AppName/$AppExec-swapped"
187
                dd if="$WorkDir/$AppName/$AppExec" of="$WorkDir/$AppName/$AppExec-swapped" skip=1 bs=36 oflag=append conv=notrunc >> /dev/null 2>&1> /dev/null
188
                lipo -thin armv6 "$WorkDir/$AppName/$AppExec-swapped" -output "$WorkDir/$AppName/$AppExec-armv7"
189
                rm "$WorkDir/$AppName/$AppExec-swapped"
190
                Iterations=2
191
        else
192
                echo "Non armv7 compatible CPU: not dumping armv7"
193
                Iterations=1
194
        fi
195
fi
196
        
197
for (( i=1;i<=$Iterations;i++)); do
198
        if [ ! $LipoFail ]; then
199
                AppExecCur=$AppExec
200
        else 
201
                if [ $i -eq 1 ];then
202
                        AppExecCur=$AppExec-armv6
203
                        echo "--- Cracking armv6 section ---"
204
#                       Patched="$Patched arm6"
205
                else
206
                        AppExecCur=$AppExec-armv7
207
                        echo "--- Cracking armv7 section ---"
208
#                       Patched="$Patched arm7"
209
                fi
210
        fi
211
        
212
        CryptID=$(otool -l "$WorkDir/$AppName/$AppExecCur" | grep cryptid | awk '{print $2}')
213
        if [ $CryptID -ne "1" ]; then
214
                echo "Application is not encrypted"
215
                rm -fr "$WorkDir"
216
                exit 1
217
        fi
218
        
219
        CryptSize=$(otool -l "$WorkDir/$AppName/$AppExecCur" | grep cryptsize | awk '{print $2}')
220
        if [ ! $CryptSize ]; then
221
                echo "Unable to find CryptSize"
222
                rm -fr "$WorkDir"
223
                exit 1
224
        fi
225
        
226
        CryptOff=$(otool -l "$WorkDir/$AppName/$AppExecCur" | grep cryptoff | awk '{print $2}')
227
        if [ ! $CryptOff ]; then
228
                        echo "Unable to find CryptOff"
229
                        rm -fr "$WorkDir"
230
                exit 1
231
        fi
232
        
233
        echo "Locating and patching CryptID"
234
        
235
        # - Take first 4KB of the file, convert to hex on 1 long line
236
        # - Find the cryptid command block
237
        # - Compute the offset to patch (01 --> 00)
238
239
        dd bs=4096 count=1 if="$WorkDir/$AppName/$AppExecCur" 2> /dev/null | \
240
        od -A n -t x1 -v | \
241
        tr -d ' ','\n' | \
242
        sed "s/0000002100000014......................01.*/ThisIsItThisIsItThisIsItThisIsItHere!!/g" > "$WorkDir/hex.tmp"
243
        foo=$(echo -ne "\x00" | dd bs=1 seek=$(expr $(($(stat -c%s "$WorkDir/hex.tmp"))) / 2) conv=notrunc status=noxfer of="$WorkDir/$AppName/$AppExecCur" 2>&1> /dev/null)
244
        rm -f "$WorkDir/hex.tmp"
245
        cid=$(otool -l "$WorkDir/$AppName/$AppExecCur" | grep cryptid | awk '{print $2}')
246
        
247
        if [ $cid = "1" ]; then
248
                echo "Unable to patch CryptID"
249
                rm -fr "$WorkDir"
250
                exit 1
251
        fi
252
        
253
        echo "Dumping unencrypted data from application"
254
        
255
        echo -e "set sharedlibrary load-rules \".*\" \".*\" none\r\n\
256
        set inferior-auto-start-dyld off\r\n\
257
        set sharedlibrary preload-libraries off\r\n\
258
        set sharedlibrary load-dyld-symbols off\r\n\
259
        handle all nostop\r\n\
260
        rb doModInitFunctions\r\n
261
        command 1\r\n\
262
        dump memory $WorkDir/dump.bin 0x2000 $(($CryptSize + 0x2000))\r\n\
263
        kill\r\n\
264
        quit\r\n\
265
        end\r\n\
266
        start" > $WorkDir/batch.gdb
267
        
268
        foo=$(gdb -q -e "$AppPath/$AppName/$AppExecCur" -x $WorkDir/batch.gdb -batch > /dev/null 2>&1> /dev/null)
269
        
270
        rm $WorkDir/batch.gdb
271
        
272
        echo -n "Verifying dump "
273
        
274
        DumpSize=$(stat -c%s "$WorkDir/dump.bin")
275
        if [ "$DumpSize" != "$CryptSize" ]; then
276
                echo "failed ! Wrong size ?"
277
                rm -fr "$WorkDir"
278
                exit 1
279
        fi
280
        
281
        echo "and replacing encrypted data"
282
        foo=$(dd seek=1 count=1 obs=4096 ibs=$DumpSize conv=notrunc if="$WorkDir/dump.bin" of="$WorkDir/$AppName/$AppExecCur" 2>&1> /dev/null)
283
        rm "$WorkDir/dump.bin"
284
285
        echo -n "Trying LamerPatcher... "
286
        sed --in-place=.BCK \
287
                -e 's=/Cydia.app=/Czdjb.bpp=g' \
288
                -e 's=SignerIdentity=SjgnfrJdfntjtz=g' \
289
                -e 's=PfdkboFabkqfqv=PgdkcoGackqgqw=g' \
290
                -e 's=Sign\d0\d0\d0\d0erId\d0\d0\d0\d0entity=Sjgn\d0\d0\d0\d0frJd\d0\d0\d0\d0fntjtz=g' \
291
                -e 's=/private/var/lib/apt=/prjvbtf/vbr/ljb/bpt=g' \
292
                -e 's=/Applicat\d0\d0\d0ions/dele\d0\d0\d0teme\.txt=/Bppljcbt\d0\d0\d0jpns/dflf\d0\d0\d0tfmf\.txt=g' \
293
                -e 's=/Appl\d0\d0\d0ications/C\d0\d0ydi\d0a\.app=/Bppl\d0\d0\d0jcbtjpns/C\d0\d0zdj\d0b\.bpp=g' \
294
                -e 's=ations/Cy\d0\d0\d0/Applic\d0pp\d0\d0dia.a=btjpns/Cz\d0\d0\d0/Bppljc\d0pp\d0\d0djb.b=g' \
295
                -e 's=ate/va\d0\d0/priv\d0\d0\d0pt/\d0b/a\d0r/li=btf/vb\d0\d0/prjv\d0\d0\d0pt/\d0b/b\d0r/lj=g' \
296
                -e 's=pinchmedia\.com=pjnchmfdjb\.cpm=g' \
297
                -e 's=admob\.com=bdmpb\.cpm=g' \
298
                -e 's=doubleclick\.net=dpvblfcljck\.nft=g' \
299
                -e 's=googlesyndication\.com=gppglfszndjcbtjpn\.cpm=g' \
300
                -e 's=flurry\.com=flvrrz\.cpm=g' \
301
                -e 's=qwapi\.com=qwbpj\.cpm=g' \
302
                -e 's=mobclix\.com=mpbcljx\.cpm=g' \
303
                -e 's=http://ad\.=http://bd/=g' \
304
                -e 's=http://ads\.=http://bds/=g' \
305
                "$WorkDir/$AppName/$AppExecCur"
306
307
        cmp --silent "$WorkDir/$AppName/$AppExecCur.BCK" "$WorkDir/$AppName/$AppExecCur"
308
        if [ "$?" -ne "0" ]; then
309
                echo "patched something"
310
                Patched="$Patched patched"
311
        else
312
                echo "found nothing"
313
        fi
314
        rm "$WorkDir/$AppName/$AppExecCur.BCK"
315
316
        echo "Signing the application"
317
        foo=$(ldid -s "$WorkDir/$AppName/$AppExecCur" 2>&1> /dev/null)  
318
done
319
320
if [ $LipoFail ]; then
321
        if [ -e "$WorkDir/$AppName/$AppExec-armv7" ]; then
322
                echo "Combining both parts into a fat binary"
323
                lipo -create "$WorkDir/$AppName/$AppExec-armv6" "$WorkDir/$AppName/$AppExec-armv7" -output "$WorkDir/$AppName/$AppExec"
324
                chmod 755 "$WorkDir/$AppName/$AppExec"
325
                rm "$WorkDir/$AppName/$AppExec-armv6"
326
                rm "$WorkDir/$AppName/$AppExec-armv7"
327
        else
328
                echo
329
                mv "$WorkDir/$AppName/$AppExec-armv6" "$WorkDir/$AppName/$AppExec"
330
        fi
331
fi
332
333
# Test MinimumOS version for SignerIdentity needs
334
echo -n "MinOS is '$MinOS': "
335
if [ ${MinOS:0:1} -gt 2 ]; then
336
        echo "no SignerIdentity needed"
337
else
338
        echo "adding SignerIdentity"
339
        cp -a "$WorkDir/$AppName/Info.plist" "$WorkDir/$AppName/Info.backup.plist"
340
        plutil -key 'SignerIdentity' -value 'Apple iPhone OS Application Signing' "$WorkDir/$AppName/Info.plist" 2>&1> /dev/null
341
        plutil -binary "$WorkDir/$AppName/Info.plist" 2>&1> /dev/null
342
        # Timestamp back
343
        touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/$AppName/Info.plist"
344
fi
345
346
# Timestamp back
347
touch -r "$AppPath/$AppName/$AppExec" "$WorkDir/$AppName/$AppExec"
348
349
if [ ! $CrackerName = "Anonymous" ]; then
350
        echo "Adding Credits"
351
        echo "Cracked by $CrackerName" >> "$WorkDir/$AppName/$CreditFile"
352
fi
353
354
echo "Building .ipa (step 1)"
355
mkdir -p "$WorkDir/Payload"
356
if [ ! -e "$WorkDir/Payload" ]; then
357
        echo "Failed to create Payload directory"
358
        rm -fr "$WorkDir"
359
        exit 1
360
fi
361
mv "$WorkDir/$AppName" "$WorkDir/Payload/"
362
363
echo -n "Copying Artwork "
364
if [ -e "$AppPath/iTunesArtwork" ]; then
365
        cp -a "$AppPath/iTunesArtwork" "$WorkDir/"
366
        touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/iTunesArtwork"
367
else
368
        echo "failed !"
369
fi
370
371
echo "and faking Metadata"
372
cp "$AppPath/iTunesMetadata.plist" "$WorkDir/iTunesMetadataSource.plist"
373
plutil -xml "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
374
echo -e "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
375
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\
376
<plist version=\"1.0\">\n\
377
<dict>
378
\t<key>appleId</key>\n\
379
\t<string>Lisa@apple.com</string>\n\
380
\t<key>purchaseDate</key>\n\
381
\t<date>2010-05-05T05:05:05Z</date>" > "$WorkDir/iTunesMetadata.plist"
382
grep -A1 "<key>artistId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
383
grep -A1 "<key>artistName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
384
grep -A1 "<key>buy-only</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
385
grep -A1 "<key>buyParams</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
386
grep -A1 "<key>copyright</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
387
grep -A1 "<key>drmVersionNumber</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
388
grep -A1 "<key>fileExtension</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
389
grep -A1 -m1 "<key>genre</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
390
grep -A1 -m1 "<key>genreId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
391
grep -A1 "<key>itemId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
392
grep -A1 "<key>itemName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
393
grep -A1 "<key>kind</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
394
grep -A1 "<key>playlistArtistName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
395
grep -A1 "<key>playlistName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
396
grep -A1 "<key>price</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
397
grep -A1 "<key>priceDisplay</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
398
grep -A99 "<key>rating</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</dict>" >> "$WorkDir/iTunesMetadata.plist"
399
grep -A1 "<key>releaseDate</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
400
grep -A1 "<key>s</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
401
grep -A1 "<key>softwareIcon57x57URL</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
402
grep -A1 "<key>softwareIconNeedsShine</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
403
grep -A99 "<key>softwareSupportedDeviceIds</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</array>" >> "$WorkDir/iTunesMetadata.plist"
404
grep -A1 "<key>softwareVersionBundleId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
405
grep -A1 "<key>softwareVersionExternalIdentifier</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
406
grep -A99 "<key>softwareVersionExternalIdentifiers</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</array>" >> "$WorkDir/iTunesMetadata.plist"
407
grep -A99 "<key>subgenres</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</array>" >> "$WorkDir/iTunesMetadata.plist"
408
grep -A1 "<key>vendorId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
409
grep -A1 "<key>versionRestrictions</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
410
echo -e "</dict>\n\
411
</plist>\n" >> "$WorkDir/iTunesMetadata.plist"
412
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/iTunesMetadata.plist"
413
414
#Check for possible iTunesMetadata format changes
415
rm -f /tmp/diff.txt
416
diff "$WorkDir/iTunesMetadataSource.plist" "$WorkDir/iTunesMetadata.plist" > /tmp/diff.txt
417
rm -f "$WorkDir/iTunesMetadataSource.plist"
418
NewFields=$(wc -l /tmp/diff.txt | cut -f 1 -d " ")
419
if [ $NewFields -ne "11" ]; then
420
        if [ $NewFields -ne "28" ]; then
421
                echo "Warning: iTunesMetadata format changed"
422
        fi
423
fi
424
rm -f /tmp/diff.txt
425
426
FirstSize=$(du -k -s "$WorkDir" | cut -f 1)
427
echo "Compressing the .ipa (step 1) [$FirstSize kB]"
428
429
if [ $CrackerName = "Anonymous" ]; then
430
        IPAName=$NewAppDir/$(echo $AppDisplayName | sed -e "s: :_:g")\ \(v$AppVer$Patched\ os$(echo $MinOS | sed -e "s:\.::g")\).ipa
431
else
432
        IPAName=$NewAppDir/$(echo $AppDisplayName | sed -e "s: :_:g")\ \(v$AppVer$Patched\ os$(echo $MinOS | sed -e "s:\.::g")\)-$CrackerName.ipa
433
fi
434
435
cd "$WorkDir"
436
rm -f "$IPAName"
437
zip -m -r "$IPAName" * 2>&1> /dev/null
438
cd - 2>&1> /dev/null
439
if [ ! -e "$IPAName" ]; then
440
        echo "Failed to compress the .ipa"
441
        rm -fr "$WorkDir"
442
        exit 1
443
fi
444
445
echo "Building .ipa (step 2)"
446
# Using a SymbolicLink
447
ln -s "$AppPath/" "$WorkDir/Payload"
448
449
SecondSize=$(du -k -s "$AppPath" | cut -f 1)
450
echo "Compressing the .ipa (step 2) [$(expr $SecondSize - $FirstSize) kB]"
451
cd "$WorkDir"
452
# Zip doesn't move/delete, and excludes some files.
453
zip -y -r "$IPAName" Payload/* -x Payload/iTunesArtwork Payload/iTunesMetadata.plist "Payload/Documents/*" "Payload/Library/*" "Payload/tmp/*" "Payload/$AppName/$AppExec" "Payload/$AppName/Info.plist" "Payload/$AppName/SC_Info/*" "Payload/$AppName/_CodeSignature/*" "Payload/$AppName/CodeResources" "Payload/$AppName/ResourceRules.plist" 2>&1> /dev/null
454
rm "$WorkDir/Payload"
455
cd - 2>&1> /dev/null
456
457
echo "Removing temporary files"
458
rm -rf "$WorkDir"
459
460
echo "Created cracked .ipa at $IPAName"