tools v1.8
This commit is contained in:
88
Kindle_Mobi_Tools/LZskindle4PCv1_1/EZskindle4PCv1_1_1.cpp
Normal file
88
Kindle_Mobi_Tools/LZskindle4PCv1_1/EZskindle4PCv1_1_1.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <conio.h>
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// Variables
|
||||
int TopazTrue = 0;
|
||||
int strlength = 0;
|
||||
char uinfile[80];
|
||||
char outfile[80];
|
||||
char command[80];
|
||||
char buffer[80];
|
||||
|
||||
// String initialization
|
||||
strcpy(uinfile,"");
|
||||
strcpy(outfile,"");
|
||||
strcpy(buffer,"");
|
||||
strcpy(command,"skindle "); // string preloaded with "skindle "
|
||||
|
||||
|
||||
cout << "\n\n\n Please enter the name of the book to be converted:\n\n ";
|
||||
cout << " Don't forget the prc file extension!\n\n ";
|
||||
cout << " Watch out for zeros and Os. Zeros are skinny and Os are fat.\n\n\n ";
|
||||
|
||||
cin >> uinfile; // get file name of the book to be converted from user
|
||||
|
||||
|
||||
ifstream infile(uinfile);
|
||||
infile.getline(buffer,4);
|
||||
|
||||
|
||||
if (strncmp (buffer,"TPZ",3)==0) // open file and test first 3 char if TPZ then book is topaz
|
||||
{
|
||||
TopazTrue = 1; // This is a Topaz file
|
||||
}
|
||||
|
||||
|
||||
strlength = strlen(uinfile);
|
||||
|
||||
if(strlength > 13)
|
||||
{
|
||||
strncat(outfile,uinfile,10); // Create output file name using first 10 char of input file name
|
||||
}
|
||||
else
|
||||
{
|
||||
strncat(outfile,uinfile, (strlength - 4)); // If file name is less than 10 characters
|
||||
}
|
||||
if(TopazTrue == 1) // This is Topaz Book
|
||||
{
|
||||
strcat(command,"-d "); // Add the topaz switch to the command line
|
||||
|
||||
strcat(outfile,".tpz"); // give tpz file extension to topaz output file
|
||||
} // end of TopazTrue
|
||||
else
|
||||
{
|
||||
strcat(outfile,".azw");
|
||||
} // if not Topaz make it azw
|
||||
|
||||
strcat(command,"-i "); // Add the input switch to the command line
|
||||
strcat(command,uinfile); // add the input file name to the command line
|
||||
strcat(command," -o "); // add the output switch to the command line
|
||||
strcat(command,outfile); // Add the output file name to the command line
|
||||
|
||||
cout << "\n\n The skindle program is called here.\n";
|
||||
cout << " Any errors reported between here and \"The command line used was:\"\n";
|
||||
cout << " Are errors from the skindle program. Not EZskindle4PC.\n\n";
|
||||
|
||||
|
||||
system(command); // call skindle program to convert the book
|
||||
|
||||
|
||||
cout << "\n\n The command line used was:\n\n";
|
||||
cout << " " << command << "\n";
|
||||
cout << "\n\n\n Please note the output file is created from the input";
|
||||
cout << "\n file name. The file extension is changed to tpz for Topaz";
|
||||
cout << "\n files and to azw for non-Topaz files. Also, _EBOK is removed ";
|
||||
cout << "\n from the file name. This is to make it eaiser to identify ";
|
||||
cout << "\n the file with no DRM.";
|
||||
|
||||
|
||||
|
||||
system("PAUSE");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
BIN
Kindle_Mobi_Tools/LZskindle4PCv1_1/EZskindle4PCv1_1_1.exe
Normal file
BIN
Kindle_Mobi_Tools/LZskindle4PCv1_1/EZskindle4PCv1_1_1.exe
Normal file
Binary file not shown.
44
Kindle_Mobi_Tools/LZskindle4PCv1_1/LZskindle Read Me.txt
Normal file
44
Kindle_Mobi_Tools/LZskindle4PCv1_1/LZskindle Read Me.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
LZskindle4PCv1_1 The Lazy skindle program for those who are typing impared
|
||||
|
||||
To setup:
|
||||
|
||||
1. Create a new folder: example C:\skindle
|
||||
|
||||
2. Place LZskindle4PCv1_1.exe and skindle.exe in this folder.
|
||||
|
||||
3. Create 2 subfolders: C:\skindle\input
|
||||
and C:\skindle\output
|
||||
|
||||
|
||||
To run:
|
||||
|
||||
1. Copy the book(s) you wish to remove DRM from into the input directory
|
||||
(leave the originals in my kindle folder).
|
||||
|
||||
2. Double click on LZskindle4PCv1_0.exe
|
||||
|
||||
3. A DOS window will open and will show skindle being called for
|
||||
each book in the input directory.
|
||||
|
||||
4. The books with the DRM removed will now be in the output directory.
|
||||
|
||||
Rev1_1
|
||||
|
||||
fixed program to allow any file extension. My testing indicates that
|
||||
skindle does not care what file extension a file has. If it is a file type
|
||||
that it can convert it will. If the file is not compatible it will close
|
||||
and give an unknown file type message.
|
||||
|
||||
Rev1_0
|
||||
|
||||
If the program is run with no files in the input directory you will get a
|
||||
<EFBFBD>File not Found<6E> error and the program will terminate.
|
||||
|
||||
PLEASE USE ONLY FOR YOUR PERSONAL USE <20> ON BOOKS YOU PAID FOR!!
|
||||
|
||||
This program is provided to allow you to archive your library in a format that
|
||||
will outlast the kindle. Technology moves on and you should not have to reinvest
|
||||
in an entire new library when the Kindle is obsolete. Please do not use this program
|
||||
for piracy.
|
||||
|
||||
|
||||
150
Kindle_Mobi_Tools/LZskindle4PCv1_1/LZskindle4PCv1_1.cpp
Normal file
150
Kindle_Mobi_Tools/LZskindle4PCv1_1/LZskindle4PCv1_1.cpp
Normal file
@@ -0,0 +1,150 @@
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
//#include <conio.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// Variable Declarations ??
|
||||
char buffer[80];
|
||||
int error = 0;
|
||||
// int YesNo = 0;
|
||||
// int exit = 0;
|
||||
// Variables EZskindle4PC
|
||||
int TopazTrue = 0;
|
||||
int strlength = 0;
|
||||
char uinfile[80];
|
||||
char outfile[80];
|
||||
char command[80];
|
||||
char buffer2[20];
|
||||
char tempfile[80];
|
||||
|
||||
// Initialize strings
|
||||
strcpy(uinfile,"");
|
||||
strcpy(outfile,"");
|
||||
strcpy(buffer,"");
|
||||
strcpy(buffer2,"");
|
||||
strcpy(command,"skindle "); // string preloaded with "skindle "
|
||||
|
||||
|
||||
//// Beginning of program code ////////////////////////////////////////////////////////////
|
||||
|
||||
system("dir /b .\\input\\*.* > books.txt"); // Create txt file with list of books
|
||||
// No testing of file type being done
|
||||
// I am letting skindle determing if valid
|
||||
// file type
|
||||
// Read in the list of book file names
|
||||
|
||||
ifstream infile("books.txt");
|
||||
|
||||
do // while not end of file
|
||||
{
|
||||
infile.getline(buffer,50); // load the first 50 characters of the line to buffer
|
||||
|
||||
|
||||
if(strcmp(buffer, "")!= 0) // If there is file name in the buffer do this on last loop buffer will be empty
|
||||
{
|
||||
strcpy(uinfile,buffer); // load file name from buffer
|
||||
|
||||
strcpy(tempfile,".\\input\\"); // load directory name for input files
|
||||
strcat(tempfile,buffer); // load the file name
|
||||
ifstream infile2(tempfile); // open the book file for reading
|
||||
infile2.getline(buffer2,4); // load first 4 char from file
|
||||
|
||||
infile2.close(); // close the book file
|
||||
|
||||
|
||||
if (strncmp (buffer2,"TPZ",3)==0) // open file and test first 3 char if TPZ then book is topaz
|
||||
{
|
||||
TopazTrue = 1; // This is a Topaz file
|
||||
}
|
||||
|
||||
|
||||
strlength = strlen(uinfile);
|
||||
|
||||
if(strlength > 13)
|
||||
{
|
||||
strncat(outfile,uinfile,10); // Create output file name using first 10 char of input file name
|
||||
}
|
||||
else
|
||||
{
|
||||
strncat(outfile,uinfile, (strlength - 4)); // If file name is less than 10 characters
|
||||
}
|
||||
if(TopazTrue == 1) // This is Topaz Book
|
||||
{
|
||||
strcat(command,"-d "); // Add the topaz switch to the command line
|
||||
|
||||
strcat(outfile,".tpz"); // give tpz file extension to topaz output file
|
||||
} // end of TopazTrue
|
||||
else
|
||||
{
|
||||
strcat(outfile,".azw");
|
||||
} // if not Topaz make it azw
|
||||
|
||||
strcat(command,"-i "); // Add the input switch to the command line
|
||||
strcat(command,".\\input\\"); // Add the input directory to the command line
|
||||
strcat(command,uinfile); // add the input file name to the command line
|
||||
strcat(command," -o "); // add the output switch to the command line
|
||||
strcat(command,".\\output\\"); // Add directory for out files
|
||||
strcat(command,outfile); // Add the output file name to the command line
|
||||
|
||||
cout << "\n\n The skindle program is called here.\n";
|
||||
cout << " Any errors reported between here and \"The command line used was:\"\n";
|
||||
cout << " Are errors from the skindle program. Not EZskindle4PC.\n\n";
|
||||
|
||||
|
||||
system(command); // call skindle program to convert the book
|
||||
|
||||
|
||||
cout << "\n\n The command line used was:\n\n";
|
||||
cout << " " << command << "\n\n\n\n";
|
||||
|
||||
|
||||
}// end of file name in the buffer required to prevent execution on EOF
|
||||
|
||||
|
||||
|
||||
strcpy(command,"skindle "); // reset strings and variables for next book
|
||||
strcpy(outfile,"");
|
||||
strcpy(uinfile,"");
|
||||
strcpy(buffer,"");
|
||||
strcpy(buffer2,"");
|
||||
TopazTrue = 0;
|
||||
strlength = 0;
|
||||
|
||||
}while (! infile.eof() ); // no more books in the file
|
||||
|
||||
infile.close(); // close books.txt
|
||||
|
||||
|
||||
// cout << "\n\n\n Do you want to delete all of the books from the input directory?\n\n";
|
||||
// cout << " DO NOT DELETE IF THESE ARE ONLY COPY OF YOUR BOOKS!!!!\n\n";
|
||||
// cout << " Y or N: ";
|
||||
|
||||
|
||||
// do { // while not yes or no
|
||||
// YesNo = getch(); // This is a DOS/Windows console command not standard C may not be
|
||||
// // Usable under Unix or Mac implementations
|
||||
//
|
||||
// if((YesNo == 121)||(YesNo == 89)) // y or Y is true
|
||||
// {
|
||||
// exit = 1; // valid input exit do while loop
|
||||
// cout << "\n\n";
|
||||
// system("del .\\input\\*.*"); // delete everything in the input directory
|
||||
// cout << "\n\n";
|
||||
// }
|
||||
// if((YesNo == 110)||(YesNo == 78)) // n or N is true
|
||||
// {
|
||||
// exit = 1; // valid input exit do while loop
|
||||
// }
|
||||
//
|
||||
// }while (exit != 1);
|
||||
// cout << "\n\nYesNo = " << YesNo << "\n\n";
|
||||
|
||||
system("PAUSE");
|
||||
|
||||
system("del books.txt"); // Delete txt file with list of books
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
BIN
Kindle_Mobi_Tools/LZskindle4PCv1_1/LZskindle4PCv1_1.exe
Normal file
BIN
Kindle_Mobi_Tools/LZskindle4PCv1_1/LZskindle4PCv1_1.exe
Normal file
Binary file not shown.
27
Kindle_Mobi_Tools/LZskindle4PCv1_1/ReadMe.txt
Normal file
27
Kindle_Mobi_Tools/LZskindle4PCv1_1/ReadMe.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
Ezskindle4PC.exe
|
||||
|
||||
This executable program makes using skindle easier for people using Windows PC<50>s.
|
||||
|
||||
I do not know if it will work under any other operating system, however, I have included
|
||||
the source code should anyone want to port it into other operating systems.
|
||||
|
||||
To use this program:
|
||||
|
||||
1. Copy the ezskindle4PC.exe into the same directory with the skindle files.
|
||||
2. Copy the kindle book into the same directory.
|
||||
3. double click the EZskindle4PCv1_0.exe file.
|
||||
a. A DOS window will open and you will be asked for the name of the file you want to work with.
|
||||
4. Type in the book<6F>s file name. (it will look something like B000WCTBTA_EBOK.prc)
|
||||
5. The program will then check if it is a Topaz file and then create the output file name using the
|
||||
first part of the input file name. It will use <20>tpz<70> file extension for Topaz books and will use <20>azw<7A>
|
||||
for non topaz books. The files with the <20>azw<7A> format can be converted to other ebook formats using
|
||||
Calibre. If you want to convert Topaz books to other formats you need to use Topaz tools not skindle.
|
||||
6. The program will then create a command line and call the skindle program to process the book and
|
||||
remove the DRM.
|
||||
7. The program will pause and allow you to see the result of the skindle process.
|
||||
8. Press any key to close the program.
|
||||
|
||||
version 1.1
|
||||
Ok
|
||||
|
||||
Found a new 32 bit compiler and I think I have worked out the kinks.
|
||||
@@ -114,7 +114,7 @@ class MainDialog(Tkinter.Frame):
|
||||
def get_mobipath(self):
|
||||
mobipath = tkFileDialog.askopenfilename(
|
||||
parent=None, title='Select Mobi eBook File',
|
||||
defaultextension='.prc', filetypes=[('Mobi eBook File', '.prc'), ('Mobi eBook File', '.mobi'),
|
||||
defaultextension='.prc', filetypes=[('Mobi eBook File', '.prc'), ('Mobi eBook File', '.azw'),('Mobi eBook File', '.mobi'),
|
||||
('All Files', '.*')])
|
||||
if mobipath:
|
||||
mobipath = os.path.normpath(mobipath)
|
||||
|
||||
@@ -76,6 +76,8 @@ def main(argv=sys.argv):
|
||||
print "Kindle 2 Global serial number detected"
|
||||
elif serial.startswith("B004"):
|
||||
print "Kindle DX serial number detected"
|
||||
elif serial.startswith("B005"):
|
||||
print "Kindle DX International serial number detected"
|
||||
else:
|
||||
print "Warning: unrecognized serial number. Please recheck input."
|
||||
return 1
|
||||
|
||||
@@ -38,8 +38,9 @@
|
||||
# This knowledge leads to a simplification of the test for the
|
||||
# trailing data byte flags - version 5 and higher AND header size >= 0xE4.
|
||||
# 0.15 - Now outputs 'hearbeat', and is also quicker for long files.
|
||||
# 0.16 - And reverts to 'done' not 'done.' at the end for unswindle compatibility.
|
||||
|
||||
__version__ = '0.15'
|
||||
__version__ = '0.16'
|
||||
|
||||
import sys
|
||||
import struct
|
||||
@@ -242,7 +243,7 @@ class DrmStripper:
|
||||
if self.num_sections > records+1:
|
||||
new_data += self.data_file[self.sections[records+1][0]:]
|
||||
self.data_file = new_data
|
||||
print "done."
|
||||
print "done"
|
||||
|
||||
def getResult(self):
|
||||
return self.data_file
|
||||
@@ -255,7 +256,7 @@ if not __name__ == "__main__":
|
||||
description = 'Removes DRM from secure Mobi files'
|
||||
supported_platforms = ['linux', 'osx', 'windows'] # Platforms this plugin will run on
|
||||
author = 'The Dark Reverser' # The author of this plugin
|
||||
version = (0, 1, 5) # The version number of this plugin
|
||||
version = (0, 1, 6) # The version number of this plugin
|
||||
file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to
|
||||
on_import = True # Run this plugin during the import
|
||||
|
||||
|
||||
@@ -38,8 +38,9 @@
|
||||
# This knowledge leads to a simplification of the test for the
|
||||
# trailing data byte flags - version 5 and higher AND header size >= 0xE4.
|
||||
# 0.15 - Now outputs 'hearbeat', and is also quicker for long files.
|
||||
# 0.16 - And reverts to 'done' not 'done.' at the end for unswindle compatibility.
|
||||
|
||||
__version__ = '0.15'
|
||||
__version__ = '0.16'
|
||||
|
||||
import sys
|
||||
import struct
|
||||
@@ -242,7 +243,7 @@ class DrmStripper:
|
||||
if self.num_sections > records+1:
|
||||
new_data += self.data_file[self.sections[records+1][0]:]
|
||||
self.data_file = new_data
|
||||
print "done."
|
||||
print "done"
|
||||
|
||||
def getResult(self):
|
||||
return self.data_file
|
||||
@@ -255,7 +256,7 @@ if not __name__ == "__main__":
|
||||
description = 'Removes DRM from secure Mobi files'
|
||||
supported_platforms = ['linux', 'osx', 'windows'] # Platforms this plugin will run on
|
||||
author = 'The Dark Reverser' # The author of this plugin
|
||||
version = (0, 1, 5) # The version number of this plugin
|
||||
version = (0, 1, 6) # The version number of this plugin
|
||||
file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to
|
||||
on_import = True # Run this plugin during the import
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#! /usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# unswindle.pyw, version 6-rc1
|
||||
# Copyright © 2009 i♥cabbages
|
||||
# unswindle.pyw, version 7
|
||||
# Copyright © 2009-2010 i♥cabbages
|
||||
|
||||
# Released under the terms of the GNU General Public Licence, version 3 or
|
||||
# later. <http://www.gnu.org/licenses/>
|
||||
|
||||
# To run this program install a 32-bit version of Python 2.6 from
|
||||
# Before running this program, you must first install Python 2.6 from
|
||||
# <http://www.python.org/download/>. Save this script file as unswindle.pyw.
|
||||
# Find and save in the same directory a copy of mobidedrm.py. Double-click on
|
||||
# unswindle.pyw. It will run Kindle For PC. Open the book you want to
|
||||
@@ -22,11 +22,14 @@
|
||||
# detect unsupported versions of K4PC
|
||||
# 5 - Work with new (20091222) version of K4PC
|
||||
# 6 - Detect and just copy DRM-free books
|
||||
# 7 - Work with new (20100629) version of K4PC
|
||||
|
||||
"""
|
||||
Decrypt Kindle For PC encrypted Mobipocket books.
|
||||
"""
|
||||
|
||||
from __future__ import with_statement
|
||||
|
||||
__license__ = 'GPL v3'
|
||||
|
||||
import sys
|
||||
@@ -622,8 +625,17 @@ class PC1KeyGrabber(object):
|
||||
0x0054c9e0: '_get_pc1_pid',
|
||||
0x004f8ac9: '_get_book_path',
|
||||
},
|
||||
'd791f52dd2ecc68722212d801ad52cb79d1b6fc9': {
|
||||
0x0041724d: '_i_like_wine',
|
||||
0x004bfe3d: '_no_debugger_here',
|
||||
0x005bd9db: '_no_debugger_here',
|
||||
0x00565920: '_get_pc1_pid',
|
||||
0x0050fde9: '_get_book_path',
|
||||
},
|
||||
}
|
||||
|
||||
MOBI_EXTENSIONS = set(['.prc', '.pdb', '.mobi', '.azw', '.az1', '.azw1'])
|
||||
|
||||
@classmethod
|
||||
def supported_version(cls, hexdigest):
|
||||
return (hexdigest in cls.HOOKS)
|
||||
@@ -658,7 +670,8 @@ class PC1KeyGrabber(object):
|
||||
path = path.decode('utf-16', 'ignore')
|
||||
if u'\0' in path:
|
||||
path = path[:path.index(u'\0')]
|
||||
if path[-4:].lower() not in ('.prc', '.pdb', '.mobi'):
|
||||
root, ext = os.path.splitext(path)
|
||||
if ext.lower() not in self.MOBI_EXTENSIONS:
|
||||
return
|
||||
self.book_path = path
|
||||
|
||||
@@ -667,7 +680,6 @@ class PC1KeyGrabber(object):
|
||||
addr = debugger.read_process_memory(addr, type=ctypes.c_char_p)
|
||||
pid = debugger.read_process_memory(addr, 8)
|
||||
pid = self._checksum_pid(pid)
|
||||
print pid
|
||||
self.book_pid = pid
|
||||
|
||||
def _checksum_pid(self, s):
|
||||
|
||||
Reference in New Issue
Block a user