tools v5.4.1
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
Kindle for Android
|
||||
------------------
|
||||
|
||||
Kindle for Android uses a different scheme to generate its books specific PIDs than Kindle for PC, Kindle for iPhone/iPad, and standalone Kindles.
|
||||
|
||||
Unfortunately, K4Android uses an "account secrets" file that would only be available if the device were jail-broken and even then someone would have to figure out how to decode this secret information in order to reverse the process.
|
||||
|
||||
Instead of trying to calculate the correct PIDs for each book from this primary data, "Me" (a commenter who posted to the ApprenticeAlf site) came up with a wonderful idea to simply modify the Kindle 3 for Android application to store the PIDs it uses to decode each book in its "about activity" window. This list of PIDS can then be provided to MobiDeDRM.py, which in its latest incarnations allows a comma separated list of pids to be passed in, to successfully remove the DRM from that book. Effectively "Me" has created an "Unswindle" for the Kindle for Android 3 application!
|
||||
|
||||
Obviously, to use "Me"'s approach, requires an Android Developer's Certificate (to sign the modified application) and access to and knowledge of the developer tools, but does not require anything to be jail-broken.
|
||||
|
||||
This is a copy the detailed instructions supplied by "Me" to the ApprenticeAlf blog in the comments. The kindle3.patch described below is included in this folder in the tools:
|
||||
|
||||
From the ApprenticeAlf Comments:
|
||||
|
||||
"Me" writes:
|
||||
|
||||
A better solution seems to create a patched version of the Kindle apk which either logs or displays it’s PID. I created a patch to both log the pid list and show it in the Kindle application in the about activity screen. The pid list isn’t available until the DRMed book has been opened (and the list seem to differ for different books).
|
||||
|
||||
To create the patched kindle apk a certificate must be created (http://developer.android.com/guide/publishing/app-signing.html#cert) and the apktool must be build from source (all subprojects) as long as version 1.4.2 isn’t released (http://code.google.com/p/android-apktool/wiki/BuildApktool).
|
||||
|
||||
These are the steps to pull the original apk from the Android device, uninstall it, create a patched apk and install that (tested on a rooted device, but I think all steps should also work on non-rooted devices):
|
||||
|
||||
adb pull /data/app/com.amazon.kindle-1.apk kindle3.apk
|
||||
adb uninstall com.amazon.kindle
|
||||
apktool d kindle3.apk kindle3
|
||||
cd kindle3
|
||||
patch -p1 < ../kindle3.patch
|
||||
cd ..
|
||||
apktool b kindle3 kindle3_patched.apk
|
||||
jarsigner -verbose -keystore kindle.keystore kindle3_patched.apk kindle
|
||||
zipalign -v 4 kindle3_patched.apk kindle3_signed.apk
|
||||
adb install kindle3_signed.apk
|
||||
|
||||
kindle3.patch (based on kindle version 3.0.1.70) is available on pastebin:
|
||||
http://pastebin.com/LNpgkcpP
|
||||
|
||||
Have fun!
|
||||
|
||||
Comment by me — June 9, 2011 @ 9:01 pm | Reply
|
||||
|
||||
Hi me,
|
||||
Wow! Great work!!!!
|
||||
|
||||
With your patch, you have created the equivalent of Unswindle for the Kindle for Android app and it does not even require jailbreaking!
|
||||
|
||||
Very nice work indeed!
|
||||
|
||||
Comment by some_updates — June 10, 2011 @ 4:28 am | Reply
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
diff -ru kindle3_orig/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali kindle3/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali
|
||||
--- kindle3_orig/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali
|
||||
+++ kindle3/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
.field private security:Lcom/mobipocket/android/library/reader/AndroidSecurity;
|
||||
|
||||
+.field private pidList:Ljava/lang/String;
|
||||
+
|
||||
|
||||
# direct methods
|
||||
.method public constructor <init>(Lcom/mobipocket/android/library/reader/AndroidSecurity;Lcom/amazon/kcp/application/AndroidDeviceType;)V
|
||||
@@ -28,6 +30,10 @@
|
||||
.line 26
|
||||
iput-object p2, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->deviceType:Lcom/amazon/kcp/application/AndroidDeviceType;
|
||||
|
||||
+ const-string v0, "Open DRMed book to show PID list."
|
||||
+
|
||||
+ iput-object v0, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->pidList:Ljava/lang/String;
|
||||
+
|
||||
.line 27
|
||||
new-instance v0, Ljava/lang/StringBuilder;
|
||||
|
||||
@@ -175,4 +181,26 @@
|
||||
move-result-object v0
|
||||
|
||||
return-object v0
|
||||
+.end method
|
||||
+
|
||||
+.method public getPidList()Ljava/lang/String;
|
||||
+ .locals 1
|
||||
+
|
||||
+ .prologue
|
||||
+ .line 15
|
||||
+ iget-object v0, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->pidList:Ljava/lang/String;
|
||||
+
|
||||
+ return-object v0
|
||||
+.end method
|
||||
+
|
||||
+.method public setPidList(Ljava/lang/String;)V
|
||||
+ .locals 0
|
||||
+ .parameter "value"
|
||||
+
|
||||
+ .prologue
|
||||
+ .line 11
|
||||
+ iput-object p1, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->pidList:Ljava/lang/String;
|
||||
+
|
||||
+ .line 12
|
||||
+ return-void
|
||||
.end method
|
||||
diff -ru kindle3_orig/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali kindle3/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali
|
||||
--- kindle3_orig/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali
|
||||
+++ kindle3/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali
|
||||
@@ -27,3 +27,9 @@
|
||||
|
||||
.method public abstract getPid()Ljava/lang/String;
|
||||
.end method
|
||||
+
|
||||
+.method public abstract getPidList()Ljava/lang/String;
|
||||
+.end method
|
||||
+
|
||||
+.method public abstract setPidList(Ljava/lang/String;)V
|
||||
+.end method
|
||||
\ No newline at end of file
|
||||
diff -ru kindle3_orig/smali/com/amazon/kcp/info/AboutActivity.smali kindle3/smali/com/amazon/kcp/info/AboutActivity.smali
|
||||
--- kindle3_orig/smali/com/amazon/kcp/info/AboutActivity.smali
|
||||
+++ kindle3/smali/com/amazon/kcp/info/AboutActivity.smali
|
||||
@@ -32,9 +32,11 @@
|
||||
invoke-direct {v6, v1}, Ljava/util/ArrayList;-><init>(I)V
|
||||
|
||||
.line 36
|
||||
- const v1, 0x7f0b0005
|
||||
+ invoke-static {}, Lcom/amazon/kcp/application/DeviceInformationProviderFactory;->getProvider()Lcom/amazon/kcp/application/IDeviceInformationProvider;
|
||||
|
||||
- invoke-virtual {p0, v1}, Lcom/amazon/kcp/info/AboutActivity;->getString(I)Ljava/lang/String;
|
||||
+ move-result-object v0
|
||||
+
|
||||
+ invoke-interface {v0}, Lcom/amazon/kcp/application/IDeviceInformationProvider;->getPidList()Ljava/lang/String;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
diff -ru kindle3_orig/smali/com/amazon/system/security/Security.smali kindle3/smali/com/amazon/system/security/Security.smali
|
||||
--- kindle3_orig/smali/com/amazon/system/security/Security.smali
|
||||
+++ kindle3/smali/com/amazon/system/security/Security.smali
|
||||
@@ -884,6 +884,15 @@
|
||||
|
||||
.line 332
|
||||
:cond_1
|
||||
+
|
||||
+ const-string v1, "PID list"
|
||||
+ invoke-static {}, Lcom/amazon/kcp/application/DeviceInformationProviderFactory;->getProvider()Lcom/amazon/kcp/application/IDeviceInformationProvider;
|
||||
+ move-result-object v0
|
||||
+ invoke-static {v7}, Ljava/util/Arrays;->toString([Ljava/lang/Object;)Ljava/lang/String;
|
||||
+ move-result-object v2
|
||||
+ invoke-interface {v0, v2}, Lcom/amazon/kcp/application/IDeviceInformationProvider;->setPidList(Ljava/lang/String;)V
|
||||
+ invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
|
||||
+
|
||||
return-object v7
|
||||
|
||||
:cond_2
|
||||
@@ -0,0 +1,74 @@
|
||||
Kindle for Android
|
||||
------------------
|
||||
|
||||
Kindle for Android uses a different scheme to generate its books specific PIDs than Kindle for PC, Kindle for iPhone/iPad, and standalone Kindles.
|
||||
|
||||
Unfortunately, K4Android uses an "account secrets" file that would only be available if the device were jail-broken and even then someone would have to figure out how to decode this secret information in order to reverse the process.
|
||||
|
||||
Instead of trying to calculate the correct PIDs for each book from this primary data, "Me" (a commenter who posted to the ApprenticeAlf site) came up with a wonderful idea to simply modify the Kindle 3 for Android application to store the PIDs it uses to decode each book in its "about activity" window. This list of PIDS can then be provided to MobiDeDRM.py, which in its latest incarnations allows a comma separated list of pids to be passed in, to successfully remove the DRM from that book. Effectively "Me" has created an "Unswindle" for the Kindle for Android 3 application!
|
||||
|
||||
"Me"'s original patch was for Kindle for Android version 3.0.1.70. Now "Me II" has created a patch for Kindle for Android version 3.7.0.108 and new instructions, since some of the previous steps are no longer necessary.
|
||||
|
||||
From the ApprenticeAlf Comments:
|
||||
|
||||
|
||||
"Me II" writes:
|
||||
|
||||
Since “Me”‘s old method for getting PIDs from Kindle for Android is outdated and no longer works with newer versions of the app, I decided I’d take a stab at bringing it up to date. It took a little fiddling to get everything working, considering how much has changed since the last patch, but I managed to do it. The process is pretty much identical to “Me”‘s original instructions, with a few minor changes.
|
||||
|
||||
1) You don’t need to build apktool from source. You can just grab the binaries from here for whatever OS you’re running: http://code.google.com/p/android-apktool/
|
||||
2) When you sign the rebuilt APK, use the following command instead of the one in the instructions:
|
||||
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore kindle.keystore kindle3_patched.apk kindle
|
||||
3) It no longer logs the PIDs, only displays them within the app.
|
||||
|
||||
You can get the new patch, for version 3.7.0.108, here: http://pastebin.com/6FN2cTSN
|
||||
|
||||
And here’s a screenshot of the updated menu: http://imgur.com/BbFVF (sorry for the Japanese, I was too lazy to change my phone’s language).
|
||||
|
||||
Subsequently, "s" wrote:
|
||||
|
||||
For others it would be useful to add the keystore generation command into the help file:
|
||||
keytool -genkey -v -keystore kindle.keystore -alias kindle -keyalg RSA -keysize 2048 -validity 10000
|
||||
As well as location of prc’s on android being (with sdcard):
|
||||
/mnt/sdcard/Android/data/com.amazon.kindle/files/
|
||||
|
||||
"s" also reported success with using the patch on version 3.7.1.8, although I recommend using the 3.7.0.108 version just in case.
|
||||
|
||||
|
||||
"Me"'s original instructions, from the ApprenticeAlf Comments:
|
||||
|
||||
"Me" writes:
|
||||
|
||||
A better solution seems to create a patched version of the Kindle apk which either logs or displays it’s PID. I created a patch to both log the pid list and show it in the Kindle application in the about activity screen. The pid list isn’t available until the DRMed book has been opened (and the list seem to differ for different books).
|
||||
|
||||
To create the patched kindle apk a certificate must be created (http://developer.android.com/guide/publishing/app-signing.html#cert) and the apktool must be build from source (all subprojects) as long as version 1.4.2 isn’t released (http://code.google.com/p/android-apktool/wiki/BuildApktool).
|
||||
|
||||
These are the steps to pull the original apk from the Android device, uninstall it, create a patched apk and install that (tested on a rooted device, but I think all steps should also work on non-rooted devices):
|
||||
|
||||
adb pull /data/app/com.amazon.kindle-1.apk kindle3.apk
|
||||
adb uninstall com.amazon.kindle
|
||||
apktool d kindle3.apk kindle3
|
||||
cd kindle3
|
||||
patch -p1 < ../kindle3.patch
|
||||
cd ..
|
||||
apktool b kindle3 kindle3_patched.apk
|
||||
jarsigner -verbose -keystore kindle.keystore kindle3_patched.apk kindle
|
||||
zipalign -v 4 kindle3_patched.apk kindle3_signed.apk
|
||||
adb install kindle3_signed.apk
|
||||
|
||||
kindle3.patch (based on kindle version 3.0.1.70) is available on pastebin:
|
||||
http://pastebin.com/LNpgkcpP
|
||||
|
||||
Have fun!
|
||||
|
||||
Comment by me — June 9, 2011 @ 9:01 pm | Reply
|
||||
|
||||
Hi me,
|
||||
Wow! Great work!!!!
|
||||
|
||||
With your patch, you have created the equivalent of Unswindle for the Kindle for Android app and it does not even require jailbreaking!
|
||||
|
||||
Very nice work indeed!
|
||||
|
||||
Comment by some_updates — June 10, 2011 @ 4:28 am | Reply
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
diff -ru kindle3.7.0.108_orig/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali kindle3.7.0.108/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali
|
||||
--- kindle3.7.0.108_orig/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali
|
||||
+++ kindle3.7.0.108/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali
|
||||
@@ -43,6 +43,8 @@
|
||||
|
||||
.field private security:Lcom/mobipocket/android/library/reader/AndroidSecurity;
|
||||
|
||||
+.field private pidList:Ljava/lang/String;
|
||||
+
|
||||
.field private totalMemory:J
|
||||
|
||||
|
||||
@@ -78,6 +80,10 @@
|
||||
|
||||
.line 132
|
||||
iput-object p2, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->deviceType:Lcom/amazon/kcp/application/AmazonDeviceType;
|
||||
+
|
||||
+ const-string v0, "Open DRMed book to show PID list."
|
||||
+
|
||||
+ iput-object v0, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->pidList:Ljava/lang/String;
|
||||
|
||||
.line 133
|
||||
sget-object v0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->TAG:Ljava/lang/String;
|
||||
@@ -1242,3 +1248,25 @@
|
||||
|
||||
return-wide v0
|
||||
.end method
|
||||
+
|
||||
+.method public getPidList()Ljava/lang/String;
|
||||
+ .locals 1
|
||||
+
|
||||
+ .prologue
|
||||
+ .line 15
|
||||
+ iget-object v0, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->pidList:Ljava/lang/String;
|
||||
+
|
||||
+ return-object v0
|
||||
+.end method
|
||||
+
|
||||
+.method public setPidList(Ljava/lang/String;)V
|
||||
+ .locals 0
|
||||
+ .parameter "value"
|
||||
+
|
||||
+ .prologue
|
||||
+ .line 11
|
||||
+ iput-object p1, p0, Lcom/amazon/kcp/application/AndroidDeviceInformationProvider;->pidList:Ljava/lang/String;
|
||||
+
|
||||
+ .line 12
|
||||
+ return-void
|
||||
+.end method
|
||||
\ No newline at end of file
|
||||
diff -ru kindle3.7.0.108_orig/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali kindle3.7.0.108/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali
|
||||
--- kindle3.7.0.108_orig/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali
|
||||
+++ kindle3.7.0.108/smali/com/amazon/kcp/application/IDeviceInformationProvider.smali
|
||||
@@ -30,3 +30,9 @@
|
||||
|
||||
.method public abstract getPid()Ljava/lang/String;
|
||||
.end method
|
||||
+
|
||||
+.method public abstract getPidList()Ljava/lang/String;
|
||||
+.end method
|
||||
+
|
||||
+.method public abstract setPidList(Ljava/lang/String;)V
|
||||
+.end method
|
||||
\ No newline at end of file
|
||||
diff -ru kindle3.7.0.108_orig/smali/com/amazon/kcp/info/AboutActivity.smali kindle3.7.0.108/smali/com/amazon/kcp/info/AboutActivity.smali
|
||||
--- kindle3.7.0.108_orig/smali/com/amazon/kcp/info/AboutActivity.smali
|
||||
+++ kindle3.7.0.108/smali/com/amazon/kcp/info/AboutActivity.smali
|
||||
@@ -493,6 +493,57 @@
|
||||
return-void
|
||||
.end method
|
||||
|
||||
+.method private populatePIDList()V
|
||||
+ .locals 7
|
||||
+
|
||||
+ .prologue
|
||||
+ .line 313
|
||||
+ invoke-static {}, Lcom/amazon/kcp/application/DeviceInformationProviderFactory;->getProvider()Lcom/amazon/kcp/application/IDeviceInformationProvider;
|
||||
+
|
||||
+ move-result-object v0
|
||||
+
|
||||
+ invoke-interface {v0}, Lcom/amazon/kcp/application/IDeviceInformationProvider;->getPidList()Ljava/lang/String;
|
||||
+
|
||||
+ move-result-object v1
|
||||
+
|
||||
+ .line 314
|
||||
+ .local v1, PidList:Ljava/lang/String;
|
||||
+ iget-object v3, p0, Lcom/amazon/kcp/info/AboutActivity;->groupItemList:Ljava/util/List;
|
||||
+
|
||||
+ new-instance v4, Lcom/amazon/kcp/info/AboutActivity$GroupItem;
|
||||
+
|
||||
+ const-string v5, "PID List"
|
||||
+
|
||||
+ const v6, 0x1
|
||||
+
|
||||
+ invoke-direct {v4, p0, v5, v6}, Lcom/amazon/kcp/info/AboutActivity$GroupItem;-><init>(Lcom/amazon/kcp/info/AboutActivity;Ljava/lang/String;Z)V
|
||||
+
|
||||
+ invoke-interface {v3, v4}, Ljava/util/List;->add(Ljava/lang/Object;)Z
|
||||
+
|
||||
+ .line 315
|
||||
+ new-instance v2, Ljava/util/ArrayList;
|
||||
+
|
||||
+ invoke-direct {v2}, Ljava/util/ArrayList;-><init>()V
|
||||
+
|
||||
+ .line 316
|
||||
+ .local v2, children:Ljava/util/List;,"Ljava/util/List<Lcom/amazon/kcp/info/AboutActivity$DetailItem;>;"
|
||||
+ new-instance v3, Lcom/amazon/kcp/info/AboutActivity$DetailItem;
|
||||
+
|
||||
+ const-string v4, "PIDs"
|
||||
+
|
||||
+ invoke-direct {v3, p0, v4, v1}, Lcom/amazon/kcp/info/AboutActivity$DetailItem;-><init>(Lcom/amazon/kcp/info/AboutActivity;Ljava/lang/String;Ljava/lang/String;)V
|
||||
+
|
||||
+ invoke-interface {v2, v3}, Ljava/util/List;->add(Ljava/lang/Object;)Z
|
||||
+
|
||||
+ .line 317
|
||||
+ iget-object v3, p0, Lcom/amazon/kcp/info/AboutActivity;->detailItemList:Ljava/util/List;
|
||||
+
|
||||
+ invoke-interface {v3, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z
|
||||
+
|
||||
+ .line 318
|
||||
+ return-void
|
||||
+.end method
|
||||
+
|
||||
.method private populateDisplayItems()V
|
||||
.locals 1
|
||||
|
||||
@@ -539,6 +590,9 @@
|
||||
invoke-direct {p0}, Lcom/amazon/kcp/info/AboutActivity;->populateDisplayInformation()V
|
||||
|
||||
.line 190
|
||||
+ invoke-direct {p0}, Lcom/amazon/kcp/info/AboutActivity;->populatePIDList()V
|
||||
+
|
||||
+ .line 191
|
||||
return-void
|
||||
|
||||
.line 172
|
||||
diff -ru kindle3.7.0.108_orig/smali/com/amazon/system/security/Security.smali kindle3.7.0.108/smali/com/amazon/system/security/Security.smali
|
||||
--- kindle3.7.0.108_orig/smali/com/amazon/system/security/Security.smali
|
||||
+++ kindle3.7.0.108/smali/com/amazon/system/security/Security.smali
|
||||
@@ -926,6 +926,16 @@
|
||||
sget-object v0, Lcom/amazon/system/security/Security;->CUSTOM_PID_FOR_BUNDLED_DICTIONARY_DRM:Ljava/lang/String;
|
||||
|
||||
aput-object v0, v6, v8
|
||||
+
|
||||
+ invoke-static {}, Lcom/amazon/kcp/application/DeviceInformationProviderFactory;->getProvider()Lcom/amazon/kcp/application/IDeviceInformationProvider;
|
||||
+
|
||||
+ move-result-object v5
|
||||
+
|
||||
+ invoke-static {v6}, Ljava/util/Arrays;->toString([Ljava/lang/Object;)Ljava/lang/String;
|
||||
+
|
||||
+ move-result-object v2
|
||||
+
|
||||
+ invoke-interface {v5, v2}, Lcom/amazon/kcp/application/IDeviceInformationProvider;->setPidList(Ljava/lang/String;)V
|
||||
|
||||
.line 353
|
||||
return-object v6
|
||||
Reference in New Issue
Block a user