Showing preview only (450K chars total). Download the full file or copy to clipboard to get everything.
Repository: ernw/AndroTickler
Branch: master
Commit: 501a29252979
Files: 174
Total size: 16.0 MB
Directory structure:
gitextract_nqfytlgy/
├── .gradle/
│ ├── 8.8/
│ │ └── dependencies-accessors/
│ │ └── gc.properties
│ ├── 8.9/
│ │ ├── dependencies-accessors/
│ │ │ └── gc.properties
│ │ └── gc.properties
│ ├── buildOutputCleanup/
│ │ └── cache.properties
│ └── vcs-1/
│ └── gc.properties
├── LICENSE
├── README.md
├── Tickler.conf
├── build.gradle
├── libs/
│ ├── jars/
│ │ ├── aacommons-cli-1.3.jar
│ │ ├── apktool.jar
│ │ ├── apktool_2.2.2.jar
│ │ ├── commons-cli-1.3.1.jar
│ │ ├── commons-cli-1.3.jar
│ │ ├── commons-codec-1.10.jar
│ │ ├── commons-io-2.4.jar
│ │ ├── commons-io-2.6.jar
│ │ ├── jd-core-java-1.2.jar
│ │ ├── json-simple-1.1.1.jar
│ │ └── procyon-decompiler-0.5.30.jar
│ └── notJars/
│ ├── Keystore/
│ │ └── Tickler.keystore
│ ├── dex2jar-2.1/
│ │ ├── LICENSE.txt
│ │ ├── NOTICE.txt
│ │ ├── bin/
│ │ │ ├── dex-tools
│ │ │ └── dex-tools.bat
│ │ ├── d2j-apk-sign.bat
│ │ ├── d2j-apk-sign.sh
│ │ ├── d2j-asm-verify.bat
│ │ ├── d2j-asm-verify.sh
│ │ ├── d2j-baksmali.bat
│ │ ├── d2j-baksmali.sh
│ │ ├── d2j-class-version-switch.bat
│ │ ├── d2j-class-version-switch.sh
│ │ ├── d2j-decrypt-string.bat
│ │ ├── d2j-decrypt-string.sh
│ │ ├── d2j-dex-recompute-checksum.bat
│ │ ├── d2j-dex-recompute-checksum.sh
│ │ ├── d2j-dex-weaver.bat
│ │ ├── d2j-dex-weaver.sh
│ │ ├── d2j-dex2jar.bat
│ │ ├── d2j-dex2jar.sh
│ │ ├── d2j-dex2smali.bat
│ │ ├── d2j-dex2smali.sh
│ │ ├── d2j-jar-access.bat
│ │ ├── d2j-jar-access.sh
│ │ ├── d2j-jar-weaver.bat
│ │ ├── d2j-jar-weaver.sh
│ │ ├── d2j-jar2dex.bat
│ │ ├── d2j-jar2dex.sh
│ │ ├── d2j-jar2jasmin.bat
│ │ ├── d2j-jar2jasmin.sh
│ │ ├── d2j-jasmin2jar.bat
│ │ ├── d2j-jasmin2jar.sh
│ │ ├── d2j-smali.bat
│ │ ├── d2j-smali.sh
│ │ ├── d2j-std-apk.bat
│ │ ├── d2j-std-apk.sh
│ │ ├── d2j_invoke.bat
│ │ ├── d2j_invoke.sh
│ │ └── lib/
│ │ ├── ST4-4.0.8.jar
│ │ ├── antlr-3.5.2.jar
│ │ ├── antlr-runtime-3.5.2.jar
│ │ ├── antlr4-4.5.jar
│ │ ├── antlr4-runtime-4.5.jar
│ │ ├── asm-debug-all-4.1.jar
│ │ ├── asm-debug-all-5.0.3.jar
│ │ ├── d2j-base-cmd-2.1-SNAPSHOT.jar
│ │ ├── d2j-jasmin-2.1-SNAPSHOT.jar
│ │ ├── d2j-smali-2.1-SNAPSHOT.jar
│ │ ├── dex-ir-2.1-SNAPSHOT.jar
│ │ ├── dex-reader-2.1-SNAPSHOT.jar
│ │ ├── dex-reader-api-2.1-SNAPSHOT.jar
│ │ ├── dex-tools-2.1-SNAPSHOT.jar
│ │ ├── dex-translator-2.1-SNAPSHOT.jar
│ │ ├── dex-writer-2.1-SNAPSHOT.jar
│ │ ├── dx-1.7.jar
│ │ ├── dx-23.0.0.jar
│ │ ├── open-source-license.txt
│ │ └── org.abego.treelayout.core-1.0.1.jar
│ └── fridaScripts/
│ ├── enumerate_classes.py
│ ├── get_attributes_output.js
│ └── unpin_sslContext.py
└── src/
└── main/
└── java/
├── .gradle/
│ └── 2.10/
│ └── taskArtifacts/
│ └── cache.properties
├── actions/
│ ├── Comparer.java
│ ├── Comparer_Old.java
│ ├── Searcher.java
│ └── Snapshots.java
├── apk/
│ ├── ApkSigner.java
│ ├── ApkToolClass.java
│ ├── ApkToolDude.java
│ ├── AppBroker.java
│ ├── Decompiler.java
│ └── newApks/
│ ├── CreateApk.java
│ ├── Debuggable.java
│ ├── INewApk.java
│ └── NougatMitM.java
├── attacks/
│ ├── ActivityStarter.java
│ ├── Broadcaster.java
│ ├── ProviderAttacker.java
│ ├── StartAttack.java
│ └── Starter.java
├── base/
│ ├── Base64Util.java
│ ├── CopyUtil.java
│ ├── DOMXMLReader.java
│ ├── FileUtil.java
│ ├── JsonParser.java
│ ├── OtherUtil.java
│ ├── SearchUtil.java
│ ├── Tickler.java
│ ├── TicklerGeneral.java
│ └── XMLReader.java
├── cliGui/
│ ├── OutBut.java
│ └── TicklerCLI.java
├── code/
│ ├── ClassExtras.java
│ ├── ExtrasUtil.java
│ └── JavaSqueezer.java
├── commandExec/
│ └── Commando.java
├── components/
│ ├── Action.java
│ ├── Activity.java
│ ├── Application.java
│ ├── Category.java
│ ├── DataUri.java
│ ├── IActivityService.java
│ ├── IComponent.java
│ ├── Intent.java
│ ├── Manifest.java
│ ├── Permission.java
│ ├── Provider.java
│ ├── Receiver.java
│ ├── Service.java
│ ├── UsesPermission.java
│ └── old/
│ ├── Action.java
│ ├── Activity.java
│ ├── Application.java
│ ├── Category.java
│ ├── DataUri.java
│ ├── IActivityService.java
│ ├── IComponent.java
│ ├── Intent.java
│ ├── Manifest.java
│ ├── Permission.java
│ ├── Provider.java
│ ├── Receiver.java
│ ├── Service.java
│ ├── UsesPermission.java
│ └── XMLReader.java
├── db/
│ └── DatabaseTester.java
├── device/
│ └── Packagez.java
├── docs/
│ └── helpMsg.txt
├── exceptions/
│ └── TNotFoundEx.java
├── frida/
│ ├── FridaBase.java
│ ├── FridaCli.java
│ ├── FridaEnumerateClasses.java
│ ├── FridaGetArgsAndReturn.java
│ ├── FridaInit.java
│ ├── FridaJsAction.java
│ ├── FridaJsScript.java
│ ├── FridaPythonScript.java
│ ├── FridaScript.java
│ ├── FridaSetValue.java
│ ├── FridaUnpinSslContext.java
│ └── FridaVars.java
├── info/
│ ├── InfoGathering.java
│ ├── InfoGatheringReporting.java
│ └── ListComponents.java
├── initialization/
│ ├── TicklerChecks.java
│ ├── TicklerConst.java
│ └── TicklerVars.java
├── logs/
│ ├── LogReader.java
│ └── LogReaderController.java
└── manifest/
├── ManifestAnalyzer.java
├── ManifestDealer.java
└── handlers/
├── DataUriHandler.java
└── IntentHandler.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .gradle/8.8/dependencies-accessors/gc.properties
================================================
================================================
FILE: .gradle/8.9/dependencies-accessors/gc.properties
================================================
================================================
FILE: .gradle/8.9/gc.properties
================================================
================================================
FILE: .gradle/buildOutputCleanup/cache.properties
================================================
#Fri Mar 07 17:06:23 CET 2025
gradle.version=8.8
================================================
FILE: .gradle/vcs-1/gc.properties
================================================
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
**AndroTickler**
=================
A java tool that helps to pentest Android apps faster, more easily and more efficiently. AndroTickler offers many features of information gathering, static and dynamic checks that cover most of the aspects of Android apps pentesting. It also offers several features that pentesters need during their pentests. AndroTickler also integrates with Frida to provide method tracing and manipulation. It was previously published under the name of **Tickler**.
AndroTickler requires a linux host and a rooted Android device connected to its USB port. The tool does not install anything on the Android device, it only creates a *Tickler* directory on /sdcard . AndroTickler depends on Android SDK to run commands on the device and copy app's data to *TicklerWorkspace* directory on the host for further analysis. *TicklerWorkspace* is the working directory of AndroTickler and each app has a separate subdirectory in *TicklerWorkspace* which can contain the following (depending on user actions):
- DataDir directory: a copy of the data directory of the app
- extracted directory: Output of apktool on the app, contains smali code, resources, libraries...etc.
- bgSnapshots directory: Contains background snapshots copied from the device.
- images directory: contains any screenshots taken for the app.
- JavaCode directory: Contains app's Java code decompiled by dex2jar and JD tools
- logs directory: contains log files produced by -t -log, as explained below
- transfers: files and directories copied from the device to the host using -copy2host
- AndroidManifest.xml: The manifest file of the app as per apktool
- base.apk: the APK file of the app, installed on the device
- debuggable.apk: a debuggable version of the app, produced by -dbg
*libs* directory and *Tickler.conf* configuration file exist in the same directory of the jar file. The configuration file sets the location of *TicklerDir* directory on the host and *Tickler* on /sdcard of the android device. If the configuration file does not exist or these 2 directories are not set, then default values will be used (Tickler\_workspace on the current directory and /sdcard/Tickler respectively). *Tickler_lib* directory contains some Java libraries and external tools used by AndroTickler such as apktool and dex2jar.
AndroTickler highly depends on the following tools, so they should exist on your machine before using it:
- Java 7 or higher
- Android SDK tools (adb and friends)
- sqlite3
Other tools are required for some features, but AndroTickler can still run without them:
- Frida
- jarsigner
How to build it
================
1) Build tool from code
gradle build
2) Move AndroTickler.jar is to the same directory as Tickler_lib directory and Tickler.conf file (automatically created in build/libs)
3) Set dex2jar to executable (libs/notJars//dex2jar-2.1/d2j-dex2jar.sh and libs/notJars//dex2jar-2.1/d2j_invoke.sh)
4) Connect your Android device with the application-to-test installed on
**Note**: If building the source code fails, you can download the latest compiled release from the [releases](https://github.com/ernw/AndroTickler/releases) tab
The current version does the following:
Command help
=============
java -jar AndroTickler.jar -h
Information gathering/Static analysis:
======================================
List installed Apps on the device:
java -jar AndroTickler.jar -pkgs
Searches for an app (package) installed on the device, whose package name contains the searchKey
java -jar AndroTickler.jar -findPkg <searchKey>
### package without extra attributes
java -jar AndroTickler.jar -pkg <package> [other options]
Any command with a -pkg option (whether used with any of the following options or not), does the following actions if they have not been done before:
- Copies the app from the device
- Extracts the Manifest file of the app
- Decompiles the app to Java code using dex2jar and JD tools
### General Info
java -jar AndroTickler.jar -pkg <package> -info
Returns the following information:
- App's user ID
- App's Directories path
- If the app's code indicate usage of external storage
- App's directories that already exist in External storage
- Content URIs in the code
- If the app is backable
- If the app is debuggable
- Data schemes (like iOS IPC)
- The permissions it uses
## Code Squeezing
java -jar AndroTickler.jar -pkg <package> -squeeze [short | <codeLocation> ]
Fetches the following from the decompiled Java code of the app:
- Log messages
- Any indication of possible user credentials
- Java comments
- Used libs
- URLs in code
- Usage of shared preferences
- Usage of external storage
- Common components such as OkHttp and WebView
Unsurprisingly, its output is usually huge, so it is recommended to redirect the command's output to a file
*short*
Squeezes only the decompiled code that belongs to the developer. For example, if an app has a package name of com.notEnaf.myapp, then *squeeze short* squeezes only the code in com/notEnaf directory.
*<codeLocation>*
Squeezes the code only in *codeLocation* directory. Helpful to limit your search or squeeze the source code if available.
## Listing Components
java -jar AndroTickler.jar -pkg <package> -l [-exp] [-v]
Lists all components of the app
*-exp*
Shows only exported components
*-v*
Gives more detailed information for each component:
- Component type
- Whether exported or not
- Its intent filters
- The tool checks the corresponding Java class to each component and returns all possible intent extras
### Listing any kind of components
java -jar AndroTickler.jar -pkg <package> -l [-act | -ser | -rec | -prov ] [-exp] [-v]
- -act : activities
- -ser : services
- -rec: broadcast receivers
- -prov: Content providers
- -exp: show only exported components of any of the above type
## Databases
java -jar AndroTickler.jar -pkg <package> -db [|e|l|d] [nu]
By default, all -db commands update the app's data storage directory on the host before running the check.
*no attribute OR e*
Tests whether the databases of the app are encrypted. It is the default action in case no option is given after -db flag.
*l*
Lists all databases of the app. Encrypted databases might not be detected.
*d*
Takes a sqlite dump of any of the unencrypted databases.
*nu*
noUpdate: runs any of the above options without updating the app's data directory on the host.
## Data Storage Directory Comparison
java -jar AndroTickler.jar -pkg <package> -diff [d|detailed]
Copies the data storage directory of the app (to DataDirOld) then asks the user to do the action he wants and to press Enter when he's done. Then it copies the data storage directory again (to DataDir) and runs diff between them to show which files got added, deleted or modified.
*d|detailed*
Does the same as the normal -diff command, also shows what exactly changed in text files and unencrypted databases.
## Search
### Code
java -jar AndroTickler.jar -pkg <package> -sc <key> [<customLocation>]
Searches for the *key* in the following locations:
- The decompiled Java code of the app
- res/values/strings.xml
- res/values/arrays.xml
Search is case insensitive.
*<customLocation>*
Replaces the decompiled Java code location with the custom location.
### Storage
java -jar AndroTickler.jar -pkg <package> -sd <key>
Searches the Data storage directory of the app for the given key
Tickling
=========
Triggers components of the app, by all possible combinations of intents. For example, if an activity has an intent-filter of 2 possible actions and 3 data URI schemes, then AndroTickler will trigger this activity with all possible combinations of this intent. Additionally, AndroTickler captures the intent extras mentioned in the Java class corresponding to the component, assign them dummy values and add them to the possible intent combinations. Only extras of type boolean, string, int and float are supported.
if the *-exp* option is used, then the components will be triggered without root privileges or any special permissions. If not, then the components will be trigged with root privileges. This helps to test the app in 2 different scenarios: against normal-privileged or high-privileged attackers.
Before triggering components, AndroTickler prints all the commands to be executed. Then for each command, it triggers the component, prints the command then waits for the user. This gives the user enough time to do any extra checks after the command's execution. Before the user moves on to the next command, he's given the option to capture a screenshot of the device for PoC documentation.
java -jar AndroTickler.jar -pkg <package> -t [-all | -exp] [target] [-log]
*target* as explained with list command, can be:
- -act : activities. starts the (activity/activities) with all intent combinations as explained above
- -ser : services. starts the service(s) with all intent combinations as explained above
- -rec: broadcast receivers: sends all possible broadcast messages that would match the broadcast receiver(s)
- -prov: Content providers: queries the content provider(s)
if no value, then the target is all of the above
*[-comp] <component_name>*
Specifies one component only. You can also use *<component_name>* directly without -comp flag.
*-exp*
AndroTickler uses normal privileges to trigger only the exported targets.
*-all*
The default option. AndroTickler uses root privileges to trigger the exported targets
*-log*
Captures all logcat messages generated during the triggering session. Log file is saved in logs subdirectory.
Frida:
======
Frida should be installed on your host machine. Also the location of Frida server on the Android device should be added to *Tickler.conf* file in the *Frida_server_path* entry
## Capture Arguments and return value
java -jar AndroTickler.jar -pkg <package> -frida vals <ClassName> <MethodName> <NumberOfArgs> [-reuse]
Displays arguments and return value of this method (only primitive datatypes and String)
*reuse*
In case of vals and set options, Frida creates/updates a Frida script of that functionality. You can modify the created script as you want, then if you want to run it through AndroTickler, then use *-reuse* option so that it doesn't get overridden.
## Modify Arguments or Return Value
java -jar AndroTickler.jar -pkg <package> -frida set <ClassName> <MethodName> <NumberOfArgs> <NumberOfArgToModify> <newValue>[-reuse]
Sets the argument number *NumberOfArgToModify* to *newValue* (only primitive datatypes and String).
*NumberOfArgToModify* starts with 0: First argument --> NumberOfArgToModify = 0, ...etc
To modify return value --> set NumberOfArgToModify to *ret*
## Run JS Frida script
java -jar AndroTickler.jar -pkg <package> -frida script <scriptPath>
Runs a frida JS script located at *scriptPath* on your host
Enumerate loaded classes:
java -jar AndroTickler.jar -pkg <package> -frida enum
Other Features
=================
### Debuggable version
java -jar AndroTickler.jar -pkg <package> -dbg
Creates a debuggable version of the app, which can be installed on the device and debugged using any external tool.
AndroTickler comes with a keystore to sign the debuggable apk, but it requires *jarsigner* tool on the host.
### Custom version
java -jar AndroTickler.jar -pkg <package> -apk <decompiledDirectory>
Builds an apk file from a directory, signs it and installs it.
### Background Snapshots
java -jar AndroTickler.jar [-pkg <package>] [-bg|--bgSnapshots]
Copies the background snapshots taken by the device (works with and without -pkg option) to *bgSnapshots* subdirectory.
### Copy files / directories
Copy Data storage directory:
java -jar AndroTickler.jar -pkg <package> -dataDir [dest]
Copies Data storage directory to DataDir
*dest*
Optional name of the destination directory, which will be located anyway at *transfers* sudirectory.
Copy any file / directory:
java -jar AndroTickler.jar -pkg <package> -cp2host <source_path> [dest]
Copies files / directories from the android devices.
- source_path is the absolute location of what you want to copy from the android device
- dest: optional name of the destination directory, which will be located anyway at *transfers* sudirectory.
If dest option is not given then the directory's name will be the timestamp of the transaction.
### Screenshot
java -jar AndroTickler.jar [-pkg <package>] -screen
- Captures the current screenshot of the device and saves them in *images* subdirectory
- Works with or without the package flag
### Note
For the options that do not require -pkg option, their data will be saved at *Tickler_Dir*/NoPackage
Examples:
=========
java -jar AndroTickler.jar -pkg <package> -t -act -exp
Triggers exported activities
java -jar AndroTickler.jar -pkg <package> -t -prov -log
Queries all content providers and saves logcat messages until the tool stops execution
java -jar AndroTickler.jar -pkg <package> -t <component_name>
Triggers the component, type of triggering depends on the type of the component
java -jar AndroTickler.jar -pkg de.not3naf.myApp -frida set de.not3naf.myApp.myActivity myMethod 2 0 "newValue"
Hooks to the method "myMethod" that has 2 arguments and changes value of the first argument (args[0]) to "newValue"
java -jar AndroTickler.jar -pkg de.not3naf.myApp -frida set de.not3naf.myApp.myActivity myMethod 2 2 false
Hooks to the method "myMethod" that has 2 arguments and changes the return value to boolean false
================================================
FILE: Tickler.conf
================================================
Tickler_local_directory =
Tickler_sdcard_directory = /sdcard/Tickler/
Frida_server_path = /data/local/tmp/frida-server
================================================
FILE: build.gradle
================================================
apply plugin: 'java'
apply plugin: 'eclipse'
repositories {
jcenter()
mavenCentral()
}
dependencies {
compile 'org.slf4j:slf4j-api:1.7.13'
compile files('libs/jars/commons-cli-1.3.jar')
compile files('libs/jars/commons-io-2.4.jar')
compile files('libs/jars/apktool_2.2.2.jar')
compile files('libs/jars/commons-codec-1.10.jar')
compile files('libs/jars/jd-core-java-1.2.jar')
compile files('libs/jars/json-simple-1.1.1.jar')
runtime files('libs/jars/commons-cli-1.3.jar')
runtime fileTree(dir: 'libs/jars', include: '*.jar')
}
jar {
baseName='AndroTickler'
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
'Main-Class': 'cliGui.TicklerCLI'
)
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
================================================
FILE: libs/jars/apktool.jar
================================================
[File too large to display: 15.6 MB]
================================================
FILE: libs/notJars/dex2jar-2.1/LICENSE.txt
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: libs/notJars/dex2jar-2.1/NOTICE.txt
================================================
dex2jar - Tools to work with android .dex and java .class files
Copyright (c) 2009-2014 Panxiaobo
contributors
- Bob Pan <pxb1988#gmail.com>
- Enea Stanzani <aeneas.ltr#gmail.com>
- t3stwhat <t3stwhat#gmail.com>
- paulhooijenga <paulhooijenga#gmail.com>
- yyjdelete <yyjdelete#gmail.com>
- jcmdev0 <jcmdev0#gmail.com>
================================================
FILE: libs/notJars/dex2jar-2.1/bin/dex-tools
================================================
#!/usr/bin/env sh
##############################################################################
##
## dex-tools start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/.." >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="dex-tools"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and DEX_TOOLS_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/lib/ST4-4.0.8.jar:$APP_HOME/lib/org.abego.treelayout.core-1.0.1.jar:$APP_HOME/lib/antlr4-runtime-4.5.jar:$APP_HOME/lib/d2j-smali-2.1-SNAPSHOT.jar:$APP_HOME/lib/dex-writer-2.1-SNAPSHOT.jar:$APP_HOME/lib/antlr-runtime-3.5.2.jar:$APP_HOME/lib/asm-debug-all-5.0.3.jar:$APP_HOME/lib/dex-translator-2.1-SNAPSHOT.jar:$APP_HOME/lib/dex-reader-2.1-SNAPSHOT.jar:$APP_HOME/lib/dx-23.0.0.jar:$APP_HOME/lib/dex-reader-api-2.1-SNAPSHOT.jar:$APP_HOME/lib/antlr4-4.5.jar:$APP_HOME/lib/dex-tools-2.1-SNAPSHOT.jar:$APP_HOME/lib/d2j-jasmin-2.1-SNAPSHOT.jar:$APP_HOME/lib/dex-ir-2.1-SNAPSHOT.jar:$APP_HOME/lib/d2j-base-cmd-2.1-SNAPSHOT.jar:$APP_HOME/lib/antlr-3.5.2.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $DEX_TOOLS_OPTS -classpath "\"$CLASSPATH\"" com.googlecode.dex2jar.tools.BaseCmd "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/bin/dex-tools.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem dex-tools startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..
@rem Add default JVM options here. You can also use JAVA_OPTS and DEX_TOOLS_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\lib\ST4-4.0.8.jar;%APP_HOME%\lib\org.abego.treelayout.core-1.0.1.jar;%APP_HOME%\lib\antlr4-runtime-4.5.jar;%APP_HOME%\lib\d2j-smali-2.1-SNAPSHOT.jar;%APP_HOME%\lib\dex-writer-2.1-SNAPSHOT.jar;%APP_HOME%\lib\antlr-runtime-3.5.2.jar;%APP_HOME%\lib\asm-debug-all-5.0.3.jar;%APP_HOME%\lib\dex-translator-2.1-SNAPSHOT.jar;%APP_HOME%\lib\dex-reader-2.1-SNAPSHOT.jar;%APP_HOME%\lib\dx-23.0.0.jar;%APP_HOME%\lib\dex-reader-api-2.1-SNAPSHOT.jar;%APP_HOME%\lib\antlr4-4.5.jar;%APP_HOME%\lib\dex-tools-2.1-SNAPSHOT.jar;%APP_HOME%\lib\d2j-jasmin-2.1-SNAPSHOT.jar;%APP_HOME%\lib\dex-ir-2.1-SNAPSHOT.jar;%APP_HOME%\lib\d2j-base-cmd-2.1-SNAPSHOT.jar;%APP_HOME%\lib\antlr-3.5.2.jar
@rem Execute dex-tools
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %DEX_TOOLS_OPTS% -classpath "%CLASSPATH%" com.googlecode.dex2jar.tools.BaseCmd %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable DEX_TOOLS_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%DEX_TOOLS_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-apk-sign.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.ApkSign %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-apk-sign.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.ApkSign" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-asm-verify.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.AsmVerify %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-asm-verify.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.AsmVerify" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-baksmali.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.d2j.smali.BaksmaliCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-baksmali.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.d2j.smali.BaksmaliCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-class-version-switch.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.ClassVersionSwitch %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-class-version-switch.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.ClassVersionSwitch" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-decrypt-string.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.DecryptStringCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-decrypt-string.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.DecryptStringCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex-recompute-checksum.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.DexRecomputeChecksum %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex-recompute-checksum.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.DexRecomputeChecksum" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex-weaver.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.DexWeaverCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex-weaver.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.DexWeaverCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex2jar.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.Dex2jarCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex2jar.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.Dex2jarCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex2smali.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.d2j.smali.BaksmaliCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-dex2smali.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.d2j.smali.BaksmaliCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar-access.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.JarAccessCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar-access.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.JarAccessCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar-weaver.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.JarWeaverCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar-weaver.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.JarWeaverCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar2dex.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.Jar2Dex %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar2dex.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.Jar2Dex" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar2jasmin.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.d2j.jasmin.Jar2JasminCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jar2jasmin.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.d2j.jasmin.Jar2JasminCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jasmin2jar.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.d2j.jasmin.Jasmin2JarCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-jasmin2jar.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.d2j.jasmin.Jasmin2JarCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-smali.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.d2j.smali.SmaliCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-smali.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.d2j.smali.SmaliCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-std-apk.bat
================================================
@echo off
REM
REM dex2jar - Tools to work with android .dex and java .class files
REM Copyright (c) 2009-2013 Panxiaobo
REM
REM Licensed under the Apache License, Version 2.0 (the "License");
REM you may not use this file except in compliance with the License.
REM You may obtain a copy of the License at
REM
REM http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.
REM
REM call d2j_invoke.bat to setup java environment
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.StdApkCmd %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j-std-apk.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.StdApkCmd" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/d2j_invoke.bat
================================================
@echo off
REM better invocation scripts for windows from lanchon, release in public domain. thanks!
REM https://code.google.com/p/dex2jar/issues/detail?id=192
setlocal enabledelayedexpansion
set LIB=%~dp0lib
set CP=
for %%X in ("%LIB%"\*.jar) do (
set CP=!CP!%%X;
)
java -Xms512m -Xmx1024m -cp "%CP%" %*
================================================
FILE: libs/notJars/dex2jar-2.1/d2j_invoke.sh
================================================
#!/bin/sh
#
# dex2jar - Tools to work with android .dex and java .class files
# Copyright (c) 2009-2013 Panxiaobo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# copy from $Tomcat/bin/startup.sh
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
#
_classpath="."
if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath};`cygpath -w ${k}`"
done
else
for k in "$PRGDIR"/lib/*.jar
do
_classpath="${_classpath}:${k}"
done
fi
java -Xms512m -Xmx1024m -classpath "${_classpath}" "$@"
================================================
FILE: libs/notJars/dex2jar-2.1/lib/open-source-license.txt
================================================
==== dx-*.jar
Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0.html
==== antlr-*.jar
[The BSD License]
Copyright (c) 2003-2007, Terence Parr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of the author nor the names of its contributors
may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
==== asm-*.jar
ASM: a very small and fast Java bytecode manipulation framework
Copyright (c) 2000-2005 INRIA, France Telecom
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holders nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: libs/notJars/fridaScripts/enumerate_classes.py
================================================
#!/usr/bin/python
import frida
import sys
appName= sys.argv[1]
print(appName)
# put your javascript-code here
jscode= """
Java.perform(
function(){
var grepped = "ssl";
Java.enumerateLoadedClasses(
{
"onMatch": function(className){
//if (className.toLowerCase().includes(grepped))
console.log(className)
},
"onComplete":function(){}
}
)
})
"""
# startup frida and attach to com.android.chrome process on a usb device
session = frida.get_usb_device().attach(appName)
# create a script for frida of jsccode
script = session.create_script(jscode)
# and load the script
script.load()
session.detach()
================================================
FILE: libs/notJars/fridaScripts/get_attributes_output.js
================================================
setTimeout(function(){
Java.perform(function () {
var className = Java.use("java.lang.String");
className.equals.implementation = function (arg0) {
var returnValue = this.equals(arg0);
console.log("Input: "+arg0);
if (returnValue != null ) {console.log("Output: "+returnValue.toString());}
return returnValue;
};
});
},0);
================================================
FILE: libs/notJars/fridaScripts/unpin_sslContext.py
================================================
#!/usr/bin/python
import frida
import sys
appName= sys.argv[1]
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
js= """
//Originally written by Piergiovanni Cipolloni : https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/
Java.perform(function (){
console.log("");
console.log("[.] Cert Pinning Bypass/Re-Pinning");
var CertificateFactory = Java.use("java.security.cert.CertificateFactory");
var FileInputStream = Java.use("java.io.FileInputStream");
var BufferedInputStream = Java.use("java.io.BufferedInputStream");
var X509Certificate = Java.use("java.security.cert.X509Certificate");
var KeyStore = Java.use("java.security.KeyStore");
var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");
var SSLContext = Java.use("javax.net.ssl.SSLContext");
// Load CAs from an InputStream
console.log("[+] Loading our CA...")
cf = CertificateFactory.getInstance("X.509");
try {
var fileInputStream = FileInputStream.$new("/data/local/tmp/not3naf.cer");
}
catch(err) {
console.log("[o] " + err);
}
var bufferedInputStream = BufferedInputStream.$new(fileInputStream);
var ca = cf.generateCertificate(bufferedInputStream);
bufferedInputStream.close();
var certInfo = Java.cast(ca, X509Certificate);
console.log("[o] Our CA Info: " + certInfo.getSubjectDN());
// Create a KeyStore containing our trusted CAs
console.log("[+] Creating a KeyStore for our CA...");
var keyStoreType = KeyStore.getDefaultType();
var keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");
var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
console.log("[+] Our TrustManager is ready...");
console.log("[+] Hijacking SSLContext methods now...")
console.log("[-] Waiting for the app to invoke SSLContext.init()...")
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {
console.log("[o] App invoked javax.net.ssl.SSLContext.init...");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);
console.log("[+] SSLContext initialized with our custom TrustManager!");
}
});
"""
session = frida.get_usb_device().attach(appName)
script = session.create_script(js)
script.load()
#session.detach()
================================================
FILE: src/main/java/.gradle/2.10/taskArtifacts/cache.properties
================================================
#Fri Mar 06 02:03:30 CET 2020
================================================
FILE: src/main/java/actions/Comparer.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package actions;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import base.CopyUtil;
import base.FileUtil;
import base.OtherUtil;
import commandExec.Commando;
import db.DatabaseTester;
import initialization.TicklerConst;
import initialization.TicklerVars;
public class Comparer {
private Commando commando;
private FileUtil fileTrans;
private CopyUtil copyz;
private String dataDirOld, extDirOld, storageOld;
public Comparer() {
this.copyz = new CopyUtil();
this.commando = new Commando();
this.fileTrans = new FileUtil();
}
/*
public void diffOld(boolean detailed) {
this.clearDataDirs();
this.copyz.copyDataDir(TicklerVars.appTickDir+"DataDirOld/");
System.out.println("\n\n>>>>>>>>>>>>>>>> Go crazy then press Enter to compare data directories....\n");
OtherUtil.pressAnyKeySilent();
//Copy both local and external storage
copyz.copyDataDir();
// copyz.copyStorage();
String command = "diff -rq "+ TicklerVars.appTickDir+"DataDirOld/ "+TicklerVars.appTickDir+"DataDir/";
String output = this.commando.executeCommand(command);
System.out.println(output.replace(TicklerVars.appTickDir, "[Tickler_App_Dir]/"));
if (output.isEmpty())
System.out.println("No change in the app's Data directory");
else
System.out.println("\n...Where [Tickler_App_Dir] is "+TicklerVars.appTickDir);
if (detailed){
this.diffDetailed(output);
}
}
*/
public void diff(boolean detailed) {
//Init here
this.storageOld = TicklerVars.transferDir+TicklerConst.DIFF_OLD_STORAGE;
this.dataDirOld = this.storageOld+TicklerConst.DATA_DIR_NAME;
this.extDirOld = this.storageOld+TicklerConst.EXTERNAL_STORAGE_Dir;
String old_storage=TicklerConst.DIFF_OLD_STORAGE.substring(0, TicklerConst.DIFF_OLD_STORAGE.length()-1);
this.clearDataDirs();
// this.copyz.copyStorage(TicklerConst.DIFF_OLD_STORAGE);
this.copyz.copyStorage(old_storage);
System.out.println("\n\n>>>>>>>>>>>>>>>> Go crazy then press Enter to compare data directories....\n");
OtherUtil.pressAnyKeySilent();
copyz.copyStorage();
String command = "diff -rq "+ this.dataDirOld +" "+TicklerVars.dataDir;
String output = this.commando.executeCommand(command);
System.out.println(output.replace(TicklerVars.appTickDir, "[Tickler_App_Dir]/"));
// Quick and Dirty: Repeated for external storage
command = "diff -rq "+ this.extDirOld +" "+TicklerVars.extDataDir;
output = this.commando.executeCommand(command);
System.out.println(output.replace(TicklerVars.appTickDir, "[Tickler_App_Dir]/"));
if (output.isEmpty())
System.out.println("No change in the app's Data directory");
else
System.out.println("\n...Where [Tickler_App_Dir] is "+TicklerVars.appTickDir);
if (detailed){
this.diffDetailed(output);
}
}
/**
* A detailed output of changed files:
* 1) text files: classic diff output
* 2) DB files: dump and show the difference
* @param output: output of undetailed diff
*/
public void diffDetailed(String output){
System.out.println("\nDetailed Comparison result:\n===========================\n");
//1- get file names
ArrayList<String> diffFileNames = this.getDiffFileNames(output);
if (!diffFileNames.isEmpty()){
//2- diff files
for (String s:diffFileNames)
checkFileTypeAndCompare(s);
}
}
private ArrayList<String> getDiffFileNames(String output){
ArrayList<String> filePathsArray = new ArrayList<String>();
String[] opArray=output.split("\n");
if (opArray.length>0 && opArray[0]!=""){
for (String s:opArray)
{
Matcher m = Pattern.compile("differ$").matcher(s);
if (m.find()){
String filePath = s.split(" ")[1];
filePathsArray.add(filePath);
}
}
}
return filePathsArray;
}
private void checkFileTypeAndCompare(String fileName){
File f = new File(fileName);
String output,fileTypeCommand;
fileTypeCommand = this.fileTrans.fileType(f);
DatabaseTester dbT = new DatabaseTester();
///File is a text file or human readable
if (fileTypeCommand.contains("text")){
//File is a text file
this.compareTextfiles(fileName);
}
//If the file is a database file
else if (dbT.isFileDB(f)){
this.compareDB(f);
}
}
private void compareTextfiles(String fileName){
String command,output,fName;
fName=this.fileTrans.getFileNameFromPath(fileName);
System.out.println("---------- "+fName+" ----------");
command="diff "+fileName+" "+fileName.replace("DataDirOld", "DataDir");
output=this.commando.executeCommand(command);
System.out.println(output+"\n");
}
/**
* Comapres between 2 DBs by string diff their dumps
* @param f
*/
private void compareDB(File f){
DatabaseTester dbT = new DatabaseTester();
String filePath=f.getAbsolutePath();
String oldDump = dbT.dumpDBToFile(filePath,null);
String newDump = dbT.dumpDBToFile(filePath.replace("DataDirOld", "DataDir"),null);
System.out.println("------- Database File: "+f.getName()+" -------");
String command = "diff "+ oldDump+" "+newDump;
String output = this.commando.executeCommand(command);
System.out.println(output);
this.fileTrans.deleteFromHost(oldDump);
this.fileTrans.deleteFromHost(newDump);
}
/**
* Clears Datadir, ExtDataDir and their old versions before diff
*/
private void clearDataDirs(){
// this.fileTrans.warnOverrideAndDelete(TicklerVars.appTickDir+"DataDirOld/");
// this.fileTrans.warnOverrideAndDelete(TicklerVars.dataDir);
String[] directories = {TicklerVars.dataDir,TicklerVars.extDataDir,this.dataDirOld,this.extDirOld};
for (String dir: directories) {
this.fileTrans.warnOverrideAndDelete(dir);
}
}
}
================================================
FILE: src/main/java/actions/Comparer_Old.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package actions;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import base.CopyUtil;
import base.FileUtil;
import base.OtherUtil;
import commandExec.Commando;
import db.DatabaseTester;
import initialization.TicklerConst;
import initialization.TicklerVars;
public class Comparer_Old {
private Commando commando;
private FileUtil fileTrans;
private CopyUtil copyz;
private String dataDirOld, extDirOld, storageOld;
public Comparer_Old() {
this.copyz = new CopyUtil();
this.commando = new Commando();
this.fileTrans = new FileUtil();
this.dataDirOld = TicklerVars.appTickDir+TicklerConst.DATA_DIR_OLD;
this.extDirOld = TicklerVars.appTickDir+TicklerConst.EXT_DIR_OLD;
this.storageOld = TicklerVars.appTickDir+"Storage_old/";
}
public void diffOld(boolean detailed) {
this.clearDataDirs();
this.copyz.copyDataDir(TicklerVars.appTickDir+"DataDirOld/");
System.out.println("\n\n>>>>>>>>>>>>>>>> Go crazy then press Enter to compare data directories....\n");
OtherUtil.pressAnyKeySilent();
//Copy both local and external storage
copyz.copyDataDir();
// copyz.copyStorage();
String command = "diff -rq "+ TicklerVars.appTickDir+"DataDirOld/ "+TicklerVars.appTickDir+"DataDir/";
String output = this.commando.executeCommand(command);
System.out.println(output.replace(TicklerVars.appTickDir, "[Tickler_App_Dir]/"));
if (output.isEmpty())
System.out.println("No change in the app's Data directory");
else
System.out.println("\n...Where [Tickler_App_Dir] is "+TicklerVars.appTickDir);
if (detailed){
this.diffDetailed(output);
}
}
public void diff(boolean detailed) {
this.clearDataDirs();
this.copyz.copyStorage(this.storageOld);
System.out.println("\n\n>>>>>>>>>>>>>>>> Go crazy then press Enter to compare data directories....\n");
OtherUtil.pressAnyKeySilent();
copyz.copyStorage();
String command = "diff -rq "+ this.dataDirOld +" "+TicklerVars.dataDir;
}
/**
* A detailed output of changed files:
* 1) text files: classic diff output
* 2) DB files: query and show the difference
* @param output: output of undetailed diff
*/
public void diffDetailed(String output){
System.out.println("\nDetailed Comparison result:\n===========================\n");
//1- get file names
ArrayList<String> diffFileNames = this.getDiffFileNames(output);
if (!diffFileNames.isEmpty()){
//2- diff files
for (String s:diffFileNames)
checkFileTypeAndCompare(s);
}
}
private ArrayList<String> getDiffFileNames(String output){
ArrayList<String> filePathsArray = new ArrayList<String>();
String[] opArray=output.split("\n");
if (opArray.length>0 && opArray[0]!=""){
for (String s:opArray)
{
Matcher m = Pattern.compile("differ$").matcher(s);
if (m.find()){
String filePath = s.split(" ")[1];
filePathsArray.add(filePath);
}
}
}
return filePathsArray;
}
private void checkFileTypeAndCompare(String fileName){
File f = new File(fileName);
String output,fileTypeCommand;
fileTypeCommand = this.fileTrans.fileType(f);
DatabaseTester dbT = new DatabaseTester();
///File is a text file or human readable
if (fileTypeCommand.contains("text")){
//File is a text file
this.compareTextfiles(fileName);
}
//If the file is a database file
else if (dbT.isFileDB(f)){
this.compareDB(f);
}
}
private void compareTextfiles(String fileName){
String command,output,fName;
fName=this.fileTrans.getFileNameFromPath(fileName);
System.out.println("---------- "+fName+" ----------");
command="diff "+fileName+" "+fileName.replace("DataDirOld", "DataDir");
output=this.commando.executeCommand(command);
System.out.println(output+"\n");
}
/**
* Comapres between 2 DBs by string diff their dumps
* @param f
*/
private void compareDB(File f){
DatabaseTester dbT = new DatabaseTester();
String filePath=f.getAbsolutePath();
String oldDump = dbT.dumpDBToFile(filePath,null);
String newDump = dbT.dumpDBToFile(filePath.replace("DataDirOld", "DataDir"),null);
System.out.println("------- Database File: "+f.getName()+" -------");
String command = "diff "+ oldDump+" "+newDump;
String output = this.commando.executeCommand(command);
System.out.println(output);
this.fileTrans.deleteFromHost(oldDump);
this.fileTrans.deleteFromHost(newDump);
}
/**
* Clears Datadir, ExtDataDir and their old versions before diff
*/
private void clearDataDirs(){
// this.fileTrans.warnOverrideAndDelete(TicklerVars.appTickDir+"DataDirOld/");
// this.fileTrans.warnOverrideAndDelete(TicklerVars.dataDir);
String[] directories = {TicklerVars.dataDir,TicklerVars.extDataDir,this.dataDirOld,this.extDirOld};
for (String dir: directories) {
this.fileTrans.warnOverrideAndDelete(dir);
}
}
}
================================================
FILE: src/main/java/actions/Searcher.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package actions;
import java.util.ArrayList;
import java.io.File;
import java.util.AbstractMap.SimpleEntry;
import base.Base64Util;
import base.CopyUtil;
import base.FileUtil;
import base.OtherUtil;
import base.SearchUtil;
import cliGui.OutBut;
import db.DatabaseTester;
import info.InfoGathering;
import initialization.TicklerConst;
import initialization.TicklerVars;
public class Searcher {
private SearchUtil searchUtil;
private String codeLoc;
private CopyUtil copyUtil;
private FileUtil fileUtil;
public Searcher() {
this.searchUtil = new SearchUtil();
this.codeLoc = TicklerVars.jClassDir;
this.copyUtil = new CopyUtil();
this.fileUtil = new FileUtil();
}
/**
* Searches for a key in decompiled java code and in strings.xml
* @param key
*/
public void sC(String key,boolean all){
ArrayList<SimpleEntry> hits = this.searchInCodeWithOption(key, all);
OtherUtil.printSimpleEntryArray(hits, this.codeLoc, "[Java_Code_Dir]");
//Search in Manifest
ArrayList<SimpleEntry> result = new ArrayList<>();
result = this.searchUtil.search4KeyInDirFName(TicklerVars.tickManifestFile, key);
if (!result.isEmpty()) {
OutBut.printH2("Search results in Manifest File");
OtherUtil.printSimpleEntryArray(result, TicklerVars.tickManifestFile, "[res]");
}
// Search for a key in res directory and print the results
this.searchInRes(key);
}
private ArrayList<String> sCInFile(File file, String fileName, String key){
ArrayList<String> result = new ArrayList<>();
if (file.exists()){
OutBut.printH2("Searching for "+key+" in "+fileName);
result = this.searchUtil.findInFile(file, key);
}
return result;
}
/**
* Search for a key in the res directory and print the results
* @param key
* @return
*/
private void searchInRes(String key){
ArrayList<SimpleEntry> result = new ArrayList<>();
String resDir= TicklerVars.extractedDir+"res/";
result = this.searchUtil.search4KeyInDirFName(resDir, key);
if (!result.isEmpty()) {
OutBut.printH2("Search results in res directory");
OtherUtil.printSimpleEntryArray(result, resDir, "[res]");
}
}
/**
* Search fo rkey in strings and arrays.xml but I don't all it as it is replaced by searchinRes()
* @param key
*/
private void searchInStringsArrays(String key) {
File stringsXml = new File(TicklerVars.extractedDir+"res/values/strings.xml");
File arraysXml = new File(TicklerVars.extractedDir+"res/values/arrays.xml");
ArrayList<String> hits2 = this.sCInFile(stringsXml, "strings.xml", key);
hits2.addAll(this.sCInFile(arraysXml, "arrays.xml", key));
if (!hits2.isEmpty())
for (String s: hits2)
OutBut.printNormal(" "+s+"\n");
}
/**
* Searches in source code in a custom location.
* @param key
* @param loc
*/
public void scCustomCodeLoc(String key, String codeRoot){
if (codeRoot != null){
String codeRootNotHome=codeRoot.replace("~", System.getProperty("user.home"));
File cR = new File(codeRootNotHome);
if (cR.exists()){
this.codeLoc = codeRootNotHome;
}
else
{
OutBut.printError("The code location you entered "+codeRoot+" does not exist");
OutBut.printStep("Using decompiled Java code from the APK....");
}
}
this.sC(key,false);
}
/**
* Searches in code based on option: sc_all --> all = true, sc --> all=false
* @param key
* @param all
* @return
*/
private ArrayList<SimpleEntry> searchInCodeWithOption(String key, boolean all){
ArrayList<SimpleEntry> hits = new ArrayList<>();
if (all){
OutBut.printH2("Searching for "+key+" in Decompiled Java Code");
hits = this.searchUtil.search4KeyInDirFName(this.codeLoc, key) ;
}
else {
OutBut.printH2("Searching for "+key+" in Decompiled Code of the app");
hits = this.searchUtil.searchForKeyInJava(key, this.codeLoc);
}
return hits;
}
/**
* Search for a key in the Data directory of an App, including files and unencrypted databases.
* Also search for the key in clear text and in Base64 format
* Also check in External Dir if exists
* @param key
*/
public void searchForKeyInDataDir(String key, boolean isCopy){
if (isCopy){
OutBut.printStep("Updating Data Directory");
CopyUtil copyz = new CopyUtil();
copyz.copyDataDir();
}
else {
OutBut.printWarning("Data storage directory is not updated");
}
//Search in files
OutBut.printH2("Searching Files in Data Directory of the app");
ArrayList<SimpleEntry> hits = this.searchUtil.search4KeyInDirFName(TicklerVars.dataDir, key);
OtherUtil.printSimpleEntryArray(hits, TicklerVars.dataDir, "[Data_Dir]");
// Search Base64
this.base64Search(key);
//Search in DB
OutBut.printH2("Searching Files in the app's unencrypted databases");
DatabaseTester db = new DatabaseTester();
db.searchForKeyInDb(key);
//search in external memory
this.searchExternalStorage(key);
}
private void base64Search(String key){
Base64Util b64 = new Base64Util();
ArrayList<String> base64Hits = b64.searchB64DataDir(key);
if (!base64Hits.isEmpty()){
OutBut.printH2("The key is base64 encrypted in the following file(s)");
for (String s: base64Hits){
String filePath = s.replaceAll(this.codeLoc, "[Data_Dir]");
System.out.println("#FileName: "+filePath);
}
}
}
/**
* Copy external storage into transfers file
* Then saerch in it
* Copying code moved to CopyUtil and a new method is created only to search there
* @param key
*/
/*
private void searchExternalStorage(String key) {
InfoGathering info = new InfoGathering();
FileUtil fU = new FileUtil();
String extDir = info.getSdcardDirectory().replaceAll("\\n", "");
String destExtDir=TicklerVars.transferDir+TicklerConst.COPIED_EXTERNAL_STORAGE_NAME;
if (!extDir.isEmpty()){
OutBut.printH2("Searching the app's external memory");
fU.copyDirToHost(extDir, destExtDir,true);
System.out.println("");
OutBut.printStep("Copying External Storage Directory: "+extDir+"\n");
ArrayList<SimpleEntry> hits = this.searchUtil.search4KeyInDirFName(destExtDir, key);
OtherUtil.printSimpleEntryArray(hits, extDir, "[External_Dir]");
}
}*/
/**
* Searching for a key in External Directory
* @param key
*/
private void searchExternalStorage(String key) {
//OutBut.printStep("Updating External Storage Directory\n");
if ( fileUtil.isExistOnDevice(TicklerVars.extDataDir)) {
copyUtil.copyExtDir(TicklerVars.extDataDir);
ArrayList<SimpleEntry> hits = this.searchUtil.search4KeyInDirFName(TicklerVars.extDataDir, key);
OtherUtil.printSimpleEntryArray(hits, TicklerVars.extDataDir, "[External_Dir]");
}
}
}
================================================
FILE: src/main/java/actions/Snapshots.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package actions;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import base.FileUtil;
import cliGui.OutBut;
import commandExec.Commando;
import initialization.TicklerVars;
public class Snapshots {
private Commando commando;
private FileUtil fileTrans;
public Snapshots() {
this.commando = new Commando();
this.fileTrans = new FileUtil();
}
public void takeSnapshot(){
String timestamp = new SimpleDateFormat("dd.MM.yy_HH.mm.ss").format(new Date());
String imgName = TicklerVars.pkgName+"_"+timestamp+".png";
String path=TicklerVars.sdCardPath+imgName;
//In case of no package
this.fileTrans.createDirOnDevice(TicklerVars.sdCardPath);
this.executeSnapshot(path);
String imgDir=TicklerVars.imageDir;
this.fileTrans.createDirOnHost(imgDir);
this.fileTrans.pullFromSDcard(path, imgDir);
if (new File(TicklerVars.imageDir+imgName).exists())
OutBut.printStep("Screenshot taken succesfully and saved at "+TicklerVars.imageDir+imgName);
}
public void executeSnapshot(String path) {
String command = "screencap -p "+path;
this.commando.execADB(command);
}
public void getBackGroundSnapshots(){
//quick and dirty: try both locations
// String path = "/data/system/recent_images";
String[] paths = {"/data/system_ce/0/recent_images","/data/system/recent_images", "/data/system_ce/0/snapshots/" };
this.fileTrans.createDirOnHost(TicklerVars.bgSnapshotsDir);
OutBut.printH1("Collecting stored Background screenshots");
OutBut.printH2("Screenshots are stored in only one of the following location. So ignore \"Directory does not exist\" errors if 1 location does not report any error");
System.out.println();
System.out.println("Copying Background snapshots to host...");
for (String path : paths)
this.fileTrans.copyDirToHost(path, TicklerVars.bgSnapshotsDir,false);
}
}
================================================
FILE: src/main/java/apk/ApkSigner.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk;
import java.io.File;
import cliGui.OutBut;
import commandExec.Commando;
import initialization.TicklerVars;
/**
* Signs an APK if Jarsigner exists on the device
* @author aabolhadid
*
*/
public class ApkSigner {
private boolean checkJarsigner(){
//check if jarsigner exists
Commando commando = new Commando();
String cmd = "jarsigner -h";
int result = commando.executeProcessListPrintOP(cmd, false);
if (result == 0)
return true;
return false;
}
private boolean isKeyStoreExist(){
File keystore = new File(TicklerVars.keyStore);
return keystore.exists();
}
public boolean signApk(String apkPath){
boolean ok = false;
if (!this.checkJarsigner()){
OutBut.printWarning("Cannot sign the new apk because jarsigner is not found on the host");
OutBut.printNormal("\nThe debuggable apk needs to be signed, in order to be installed on the device.\njarsigner can be installed by installing Java JDK\n");
}
//jarsigner exists
else if (!this.isKeyStoreExist()){
OutBut.printError("Keystore needed to sign the new apk is not found at "+TicklerVars.keyStore);
}
else{
OutBut.printStep("Signing the app using Tickler keystore");
String cmd = "jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore "+TicklerVars.keyStore+" -storepass itsalright "+apkPath+" Tickler";
Commando commando = new Commando();
int result = commando.executeProcessListPrintOP(cmd, true);
if (result == 0)
ok = true;
}
return ok;
}
}
================================================
FILE: src/main/java/apk/ApkToolClass.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.commons.io.FileUtils;
import base.FileUtil;
import brut.androlib.Androlib;
import brut.androlib.ApkDecoder;
import brut.androlib.ApkOptions;
import cliGui.OutBut;
import commandExec.Commando;
import exceptions.TNotFoundEx;
import initialization.TicklerVars;
/**
* Responsible for APKtool actions
* @author aabolhadid
*
*/
public class ApkToolClass {
String debuggableApk;
public ApkToolClass(){
this.debuggableApk = TicklerVars.appTickDir+"debuggable.apk";
}
/**
* APK tool decompiles the apk into Manifest, res dir and Smali files,
* @throws TNotFoundEx if apktool fails to get the manifest file
* @param apkPath
*/
public void apkToolDecode(String apkPath) throws TNotFoundEx{
FileUtil fileT = new FileUtil();
brut.androlib.ApkDecoder dec = new ApkDecoder();
File apkPathFile = new File(apkPath);
dec.setApkFile(apkPathFile);
this.deleteExistingDecodedDir();
try {
File file = new File("/dev/null");
PrintStream ps = new PrintStream(new FileOutputStream(file));
System.setErr(ps);
dec.setOutDir(new File (TicklerVars.extractedDir));
dec.decode();
System.setErr(System.err);
}
catch(Exception e){
e.printStackTrace();
}
try {
fileT.copyOnHost(TicklerVars.extractedDir+"AndroidManifest.xml", TicklerVars.tickManifestFile,true);
}
catch(Exception e){
OutBut.printError("Decompilation failed and Manifest cannot be obtained");
TNotFoundEx eNotFound = new TNotFoundEx("Decompilation failed and Manifest cannot be obtained");
throw eNotFound;
}
}
/**
* Compile a customized app to an apk
* @param dirPath the directory of the modififed app
* @param apkPath output apk
*/
public void apkToolCompile(String dirPath, String apkPath){
String tempApktoolLog = TicklerVars.logDir+"debuggableCompile.log";
ApkOptions apkOptions = new ApkOptions();
try{
File file = new File(tempApktoolLog);
OutBut.printH3("APKTool output:");
new Androlib(apkOptions).build(new File(dirPath), new File(apkPath));
}
catch(Exception e){
e.printStackTrace();
}
}
private void deleteExistingDecodedDir(){
File decodedDir = new File (TicklerVars.extractedDir);
if (decodedDir.exists()){
try{
FileUtils.deleteDirectory(decodedDir);
System.out.println("Existing SMALI directory will be deleted....");
}
catch(IOException e){
System.out.println("Cannot delete old extracted directory "+decodedDir.getAbsolutePath()+"\nPlease delete it manually and repeat");;
}
}
}
}
================================================
FILE: src/main/java/apk/ApkToolDude.java
================================================
package apk;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import base.FileUtil;
import brut.androlib.Androlib;
import brut.androlib.ApkOptions;
import cliGui.OutBut;
import commandExec.Commando;
import exceptions.TNotFoundEx;
import initialization.TicklerVars;
// Replacing ApkToolClass in this version to run apktool.jar ... rewritten in v3
public class ApkToolDude {
String debuggableApk;
public ApkToolDude(){
this.debuggableApk = TicklerVars.appTickDir+"debuggable.apk";
}
/**
* Normal apkdecode as pervious versions... decompiling resources
* @param apkPath
* @throws TNotFoundEx
*/
public void apkToolDecode(String apkPath) throws TNotFoundEx {
String args = " d -o "+TicklerVars.extractedDir+" "+apkPath;
this.apkToolDecodeGeneral(apkPath, args);
}
private void apkToolDecodeGeneral(String apkPath, String args) throws TNotFoundEx{
FileUtil fileT = new FileUtil();
File apkPathFile = new File(apkPath);
try {
File file = new File("/dev/null");
PrintStream ps = new PrintStream(new FileOutputStream(file));
System.setErr(ps);
this.executeApktoolCommand(args);
System.setErr(System.err);
}
catch(Exception e){
e.printStackTrace();
}
try {
fileT.copyOnHost(TicklerVars.extractedDir+"AndroidManifest.xml", TicklerVars.tickManifestFile,true);
}
catch(Exception e){
OutBut.printError("Decompilation failed and Manifest cannot be obtained");
TNotFoundEx eNotFound = new TNotFoundEx("Decompilation failed and Manifest cannot be obtained");
throw eNotFound;
}
}
public void apkToolCompile(String dirPath, String apkPath){
String tempApktoolLog = TicklerVars.logDir+"debuggableCompile.log";
String args = " b "+dirPath+" -o "+apkPath;
// ApkOptions apkOptions = new ApkOptions();
try{
File file = new File(tempApktoolLog);
OutBut.printH3("APKTool output:");
this.executeApktoolCommand(args);
// new Androlib(apkOptions).build(new File(dirPath), new File(apkPath));
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* Wrapper of apktool.jar
* @param args
*/
private void executeApktoolCommand(String args) {
Commando command = new Commando();
String cmd = "java -jar "+TicklerVars.apktoolPath + args;
command.executeProcessString(cmd);
}
}
================================================
FILE: src/main/java/apk/AppBroker.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import base.OtherUtil;
import cliGui.OutBut;
import commandExec.Commando;
import components.Activity;
import components.Manifest;
import initialization.TicklerVars;
/**
* Starts, stops, (un)install apps, backs up data dir before installation of an enhanced app
* @author aabolhadid
*
*/
public class AppBroker {
private String pkgName,outputPath,sdCardPath;
private Commando commando;
/**
* @param laucher
* @param pkgName
*/
public AppBroker(Activity laucher,String pkgName) {
super();
this.pkgName = pkgName;
this.commando = new Commando();
this.sdCardPath=TicklerVars.sdCardPath;
}
public AppBroker(String pkgName) {
super();
this.pkgName = pkgName;
this.commando = new Commando();
}
public String forceStopApp() {
return "am force-stop "+this.getPkgName();
}
///////////////////////// Install and Uninstall
public void installApk(String apk){
String command = "adb install "+apk;
this.commando.executeProcessListPrintOP(command, true);
}
public void uninstallPackage(String pkgName){
String command = "pm uninstall "+pkgName;
this.commando.execRootPrintOP(command);
}
//////////////////////Backup Data Directory
public void backupDataDir(String bkpLoc){
File destLoc;
File appDir = new File(TicklerVars.appTickDir);
if (appDir.exists())
{
if (bkpLoc == null){
String timestamp = new SimpleDateFormat("dd-MM-yy_HH.mm.ss").format(new Date());
destLoc=new File(TicklerVars.ticklerDir+TicklerVars.pkgName+"_bkp_"+timestamp);
}
else
destLoc = new File(bkpLoc);
try{
// FileUtils.moveDirectory(appDir, destLoc);
Files.move(appDir.toPath(), destLoc.toPath(), StandardCopyOption.REPLACE_EXISTING);
// FileUtils.moveDirectoryToDirectory(destLoc, appDir, true);
}
catch(IOException e){
e.printStackTrace();
}
}
}
private boolean isReinstallQuestion(){
OutBut.printWarning("\nDo you want to uninstall the original app and install the modified one?");
OutBut.printNormal("If yes, the following steps are executed:");
OutBut.printNormal("\t1- Uninstall the original app");
OutBut.printNormal("\t2- Backup Tickler working directory, if it exists ");
OutBut.printNormal("\t3- Install the modified app");
OutBut.printNormal("\nIf agree, enter yes or y");
String choice = OtherUtil.pressAnyKeySilent();
if (choice.toLowerCase().equals("yes") || choice.toLowerCase().equals("y"))
return true;
return false;
}
/**
* After creation of debuggable or MitM, the user can uninstall the original APK and install the modified one
* @param apk
*/
public void reinstall(String apk){
if (this.isReinstallQuestion()){
this.uninstallPackage(TicklerVars.pkgName);
this.installApk(apk);
this.backupDataDir(null);
}
}
////////////// Getters and Setters
public String getPkgName() {
return pkgName;
}
public void setPkgName(String pkgName) {
this.pkgName = pkgName;
}
public String getOutputPath() {
return outputPath;
}
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
}
public String getSdCardPath() {
return sdCardPath;
}
}
================================================
FILE: src/main/java/apk/Decompiler.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import base.FileUtil;
import base.SearchUtil;
import cliGui.OutBut;
import commandExec.Commando;
import initialization.TicklerVars;
public class Decompiler {
private String jarLoc;
private boolean checkD2jExists() {
if (new File(TicklerVars.dex2jarPath).exists()){
return true;
}
System.out.println("!!!!!ERROR: The stand alone version does not support dex2jar");
return false;
}
private File getApkFromTicklerDir(){
File apkFile;
SearchUtil searcher = new SearchUtil();
String[] keys ={"base.apk"};
List<File> apkList = searcher.search4FileInDir(TicklerVars.appTickDir, keys);
apkFile = apkList.get(0);
if (apkFile.getName().equals("debuggable.apk"))
apkFile = apkList.get(1);
return apkFile;
}
public void decompile(){
this.dex2jar();
this.jdCore();
}
public void dex2jar()
{
//If dex2jar scripts exist and executable
if (this.checkD2jExists() && this.checkDex2JarExecutable()){
FileUtil ft = new FileUtil();
Commando command = new Commando();
ft.createDirOnHost(TicklerVars.dex2jarDir);
this.jarLoc = TicklerVars.dex2jarDir+"app.jar";
String cmd = TicklerVars.dex2jarPath + " "+ this.getApkFromTicklerDir() +" -o "+TicklerVars.jClassDir+".jar";
OutBut.printStep("Decompiling the app using Dex2Jar tool......");
command.executeProcessString(cmd);
}
}
private void jdCore(){
try{
OutBut.printStep("Obtaining Java code using JDCore tool. This might take some time ......");
// String cmd = "java -jar /home/a7mad/tools/Android/Decompile/JD-core/jd-core-1.1.3.jar "+TicklerVars.jClassDir+".jar "+TicklerVars.jClassDir;
// Commando command = new Commando();
// command.executeProcessListPrintOP(cmd,true);
//
// new jd.core.Decompiler().decompile(TicklerVars.jClassDir+".zip", TicklerVars.jClassDir);
new jd.core.Decompiler().decompile(TicklerVars.jClassDir+".jar", TicklerVars.jClassDir);
}
catch(Exception e){
//e.printStackTrace();
}
}
/**
* If required dex2jar files are executable
* @param path
*/
private boolean checkDex2JarExecutable(){
boolean isExec = true;
FileUtil ft = new FileUtil();
Commando command = new Commando();
String d2jInvokeFile = TicklerVars.dex2jarPath.replace("d2j-dex2jar.sh", "d2j_invoke.sh");
String[] execs = {TicklerVars.dex2jarPath, d2jInvokeFile};
for (String exec : execs){
if (!ft.isExecutable(exec)){
isExec = false;
OutBut.printError("Please change mode of "+exec+" to executable and rerun the command" );
}
}
return isExec;
}
/**
* return if dex2jar exists and executable
* @return
*/
public boolean isDex2Jar() {
return this.checkD2jExists() && this.checkDex2JarExecutable();
}
}
================================================
FILE: src/main/java/apk/newApks/CreateApk.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk.newApks;
import java.io.File;
import apk.ApkSigner;
import apk.ApkToolClass;
import apk.ApkToolDude;
import apk.AppBroker;
import base.FileUtil;
import cliGui.OutBut;
import exceptions.TNotFoundEx;
import initialization.TicklerVars;
import initialization.TicklerConst;
/**
* Creates new APK versions of the original APK
* MITM: a modification to network secrutiy configuration of the app in order to accept user added certificates to trust store
* @author aabolhadid
*
*/
public class CreateApk {
private ApkToolDude apktool;
private FileUtil ft;
private ApkSigner signer;
private String newAppDir,netSecConfFileName,netSecConfFilePath,apk;
private boolean isMitm;
private INewApk newApk;
public CreateApk(int apkID){
// Ahmad: replacing ApkToolClass
this.apktool = new ApkToolDude();
this.ft = new FileUtil();
this.signer = new ApkSigner();
this.newAppDir = TicklerVars.appTickDir+TicklerConst.newAppTempDir;
this.netSecConfFileName = TicklerConst.mitmXmlName;
this.netSecConfFilePath = newAppDir+"res/xml/"+netSecConfFileName;
this.initNewApp(apkID);
}
private void initNewApp(int apkID){
switch(apkID){
case TicklerConst.debuggable:
newApk = new Debuggable();
break;
case TicklerConst.mitm:
newApk = new NougatMitM();
break;
}
}
/**
* Create a new APK, debuggable or mitm compatible
* @param isInstall whether to install the apk after creation
*/
public void createNewApk(){
boolean successfulSign;
try {
OutBut.printWarning("Decompiling and Recompiling of the APK might have some errors, which might lead to incorrect behavior of the modified app");
this.apk = this.newApk.getNewApkName();
this.ft.copyOnHost(TicklerVars.extractedDir, TicklerVars.newApkTempDir, true);
this.newApk.changeManifest();
this.apktool.apkToolCompile(this.newAppDir,this.apk);
this.afterCompilation(false);
successfulSign =this.signer.signApk(this.apk);
if (successfulSign)
this.reinstallNewApk();
}
catch(TNotFoundEx e){
OutBut.printError(e.getMessage());
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void createAnyApk(String decompiledDir, String name) {
this.apk = TicklerVars.appTickDir+name;
OutBut.printStep("Creating a new APK at: "+this.apk);
this.apktool.apkToolCompile(decompiledDir,this.apk);
this.afterCompilation(true);
boolean successfulSign =this.signer.signApk(this.apk);
if (successfulSign)
this.reinstallNewApk();
}
/**
*
* @param isCustom boolean if it's creating a custom APK (not dbg nor mitm) then don't delete the source directory
*/
private void afterCompilation(boolean isCustom) {
if (!isCustom)
this.ft.deleteFromHost(TicklerVars.newApkTempDir);
if ( this.ft.isExist(this.apk)){
System.out.println("\n\n");
OutBut.printStep("App is created successfully at "+this.apk+" \n");
}
}
private void reinstallNewApk(){
AppBroker broker = new AppBroker(TicklerVars.pkgName);
broker.reinstall(this.apk);
}
}
================================================
FILE: src/main/java/apk/newApks/Debuggable.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk.newApks;
import java.io.IOException;
import base.FileUtil;
import initialization.TicklerConst;
import initialization.TicklerVars;
public class Debuggable implements INewApk {
private String newAppDir;
private FileUtil fU;
public Debuggable(){
this.newAppDir = TicklerVars.appTickDir+TicklerConst.newAppTempDir;
this.fU = new FileUtil();
}
@Override
public String getNewApkName() {
return TicklerVars.appTickDir+TicklerConst.debuggableName;
}
@Override
public void changeManifest() {
try {
String manString = this.fU.readFile(newAppDir+"AndroidManifest.xml");
//DEbuggable
if (manString.contains("android:debuggable"))
manString = manString.replaceAll("debuggable=\"false\"", "debuggable=\"true\"");
else
manString = manString.replaceAll("<application ", "<application android:debuggable=\"true\" ");
this.fU.writeFile(newAppDir+"AndroidManifest.xml", manString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
================================================
FILE: src/main/java/apk/newApks/INewApk.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk.newApks;
import exceptions.TNotFoundEx;
public interface INewApk {
public String getNewApkName();
public void changeManifest() throws TNotFoundEx ;
}
================================================
FILE: src/main/java/apk/newApks/NougatMitM.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package apk.newApks;
import java.io.IOException;
import base.FileUtil;
import exceptions.TNotFoundEx;
import initialization.TicklerConst;
import initialization.TicklerVars;
public class NougatMitM implements INewApk{
private String newAppDir,netSecConfFilePath;
private FileUtil fU;
public NougatMitM() {
this.newAppDir = TicklerVars.appTickDir+TicklerConst.newAppTempDir;
this.netSecConfFilePath = newAppDir+"res/xml/"+TicklerConst.mitmXmlName;
this.fU = new FileUtil();
}
@Override
public String getNewApkName() {
// TODO Auto-generated method stub
return TicklerVars.appTickDir+TicklerConst.mitmApkName;
}
@Override
public void changeManifest() throws TNotFoundEx {
try{
String manString = this.fU.readFile(newAppDir+"AndroidManifest.xml");
if (!manString.contains("android:networkSecurityConfig"))
manString = manString.replaceAll("<application ", "<application android:networkSecurityConfig=\"@xml/"+TicklerConst.mitmXmlName+"\" ");
else{
//throw new TNotFoundEx("Manifest file already has a networkSecurityConfig entry, please check the configuration manually");
//Just replace the original network security config with our file
manString = manString.replaceAll(".*android:networkSecurityConfig=\"@xml/(.*)\".* ", TicklerConst.mitmXmlName);
}
this.fU.writeFile(newAppDir+"AndroidManifest.xml", manString);
this.createNetSecConf();
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void createNetSecConf(){
String xmlFile="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+"<network-security-config>\n"
+"<base-config>\n"
+"<trust-anchors> \n"
+"<certificates src=\"system\" />\n"
+" <certificates src=\"user\" />\n"
+"</trust-anchors>\n"
+"</base-config>\n"
+"</network-security-config>";
this.fU.writeFile(netSecConfFilePath, xmlFile);
}
}
================================================
FILE: src/main/java/attacks/ActivityStarter.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package attacks;
import java.util.ArrayList;
import commandExec.Commando;
import components.Activity;
import components.IActivityService;
import components.Intent;
import manifest.handlers.IntentHandler;
/**
*
* @author aabolhadid
* Starts Activities
*/
public class ActivityStarter {
String pkgName;
String actStartCommand;
IActivityService activity;
ArrayList<String> commands;
Commando c;
public ActivityStarter(String pkgname) {
this.pkgName = pkgname;
this.commands = new ArrayList<String>();
}
public ArrayList<String> startActivityfully(IActivityService actSer) {
ArrayList<String> commands=new ArrayList<String>();
String startCommand = this.startActivity(actSer);
commands.add(startCommand);
IntentHandler iHandler;
if (actSer.getIntent()!= null) {
for (Intent i:actSer.getIntent())
{
iHandler= new IntentHandler(startCommand,i);
commands.addAll(iHandler.fullIntent());
}
}
return commands;
}
/**
* Starts activity without intents
* @return Command to start
*/
public String startActivity() {
String amCommand = this.createAmCommand(this.activity);
return amCommand+this.getPkgName()+"/" + this.getActivity().getName();
}
public String startActivity(IActivityService actSer){
this.setActivity(actSer);
return this.startActivity();
}
private String createAmCommand(IActivityService comp) {
if (comp.getClass().equals(Activity.class)){
return "am start -n ";
}
return "am startservice -n ";
}
public String getPkgName() {
return this.pkgName;
}
public void setPkgName(String pkgName) {
this.pkgName = pkgName;
}
public IActivityService getActivity() {
return activity;
}
public void setActivity(IActivityService a) {
this.activity = a;
}
public Commando getC() {
return c;
}
public void setC(Commando c) {
this.c = c;
}
}
================================================
FILE: src/main/java/attacks/Broadcaster.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package attacks;
import java.util.ArrayList;
import components.Intent;
import components.Receiver;
import manifest.handlers.IntentHandler;
public class Broadcaster {
String pkgName;
Receiver rec;
IntentHandler iHandler;
public Broadcaster(String pkgName) {
this.pkgName = pkgName;
}
public Broadcaster(String pkgName,Receiver rec) {
this.pkgName = pkgName;
this.setRec(rec);
}
public Receiver getRec() {
return rec;
}
public void setRec(Receiver rec) {
this.rec = rec;
}
public ArrayList<String> generateBroadcast(Receiver rec) {
ArrayList<String> commands = new ArrayList<String>();
String baseCommand = "am broadcast -n "+this.pkgName+"/"+rec.getName();
commands.add(baseCommand);
if (rec.getIntent() != null)
for (Intent i : rec.getIntent()){
iHandler = new IntentHandler(baseCommand,i);
commands.addAll(iHandler.fullIntent());
}
return commands;
}
}
================================================
FILE: src/main/java/attacks/ProviderAttacker.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package attacks;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.AbstractMap.SimpleEntry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import base.SearchUtil;
import components.Provider;
/**
* 1- Get content URIs from provider authorities
* 2- Get content URIs from DEX
* 3- Add content URIs from 2 if do not exist
* @author aabolhadid
*
*/
public class ProviderAttacker {
private ArrayList<String> contentURIs;
private Provider provider;
/////////////////// SMALI //////////////////////
public ArrayList<String> queryUrisFromSmali(String smaliPath){
ArrayList<String> commands = new ArrayList<String>();
this.getContentURIsFromSmali(smaliPath);
for (String uri:this.contentURIs)
commands.add(this.queryContent(uri));
return commands;
}
public void getContentURIsFromSmali(String smaliPath){
this.contentURIs = new ArrayList<String>();
ArrayList<String> contents = new ArrayList<String>();
ArrayList<SimpleEntry> contentsReturn =new ArrayList<SimpleEntry>();
SearchUtil searcher = new SearchUtil();
String contentUri;
contents = searcher.search4KeyInDir(smaliPath, "content://");
for (String c:contents){
if (!"".equals(contentUri = this.correctContentUri(c)))
this.contentURIs.add(contentUri);
}
this.contentURIs = this.removeDuplicates(this.contentURIs);
}
private String correctContentUri(String line) {
String contentUri="";
//Content URI = content://+any_number_of(non space char) until the first occurrence of " or ' or a space character (space or new line)
Matcher m = Pattern.compile("content://(\\S+?)[\"'\\s]").matcher(line);
if (m.find()) {
contentUri = line.substring(m.start(0),m.end(0)-1);
}
return contentUri;
}
private void checkAndAddUri(String uri) {
if (!uri.equals("content://")){
this.contentURIs.add(uri);
}
if (!uri.endsWith("/")){
this.contentURIs.add(uri+"/");
}
}
///////////////////////////// From manifest ///////////////////////////
public String prepareContentFromAuthority(Provider prov){
String uri= "content://"+prov.getAuthorities();
return uri;
}
////////////////////////// Query /////////////////////////////
public String queryContent(String contentURI) {
return "content query --uri "+contentURI;
}
public ArrayList<String> queryContents(){
ArrayList<String> queryCommands = new ArrayList<String>();
for (String cont:this.contentURIs){
queryCommands.add(this.queryContent(cont));
}
return queryCommands;
}
/**
* 1- get content URI from authorities
* 2- add related Content URIs
* 3- query content
* 4- sql injection
* @param prov
* @return
*/
public ArrayList<String> attackProvider(Provider prov){
ArrayList<String> relatedUris = new ArrayList<String>();
ArrayList<String> commands = new ArrayList<String>();
String uriFromAuth = this.prepareContentFromAuthority(prov);
relatedUris.add(uriFromAuth);
commands.add(this.queryContent(uriFromAuth));
for (String uri:this.contentURIs){
if (uri.contains(prov.getAuthorities()) && !uri.equals(uriFromAuth)){
relatedUris.add(uri);
commands.add(this.queryContent(uri));
}
}
return commands;
}
public ArrayList<String> getContentURIs() {
return contentURIs;
}
public void setContentURIs(ArrayList<String> contentURIs) {
this.contentURIs = contentURIs;
}
private ArrayList<String> removeDuplicates(ArrayList<String> orig){
return new ArrayList<String>(new LinkedHashSet<String>(orig));
}
}
================================================
FILE: src/main/java/attacks/StartAttack.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package attacks;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import actions.Snapshots;
import apk.AppBroker;
import base.OtherUtil;
import cliGui.OutBut;
import commandExec.Commando;
import initialization.TicklerVars;
import logs.LogReader;
import logs.LogReaderController;
/**
* Migrating the start components functionality from Tickler class without missing up with Starter class
* @author aabolhadid
*
*/
public class StartAttack extends Starter {
private AppBroker broker;
private Commando commando;
private ArrayList<String> commands;
private boolean isLogger;
private Runnable log;
private Thread th1;
private String logFileName;
private LogReaderController logController;
private Snapshots snaps;
public StartAttack(){
super();
this.broker = new AppBroker(TicklerVars.pkgName);
this.commando = new Commando();
this.snaps = new Snapshots();
}
/**
* Replaces executeAttackCommand.
* @param origCommands
* @param exported
* @param output
*/
public void executeTriggerCommands(ArrayList<String> origCommands, boolean exported){
String anyKey="";
ArrayList<String> commands = this.removeDuplicates(origCommands);
this.printCommandsToBeExecuted(commands);
//Executing commands
for (String command : commands)
{
OutBut.printH2("Attacking Component");
System.out.println(command);
if (this.isLogger()){
this.writeCommandInLogFile(command);
}
// Quick and dirty: don't start the app before bcast receiver and content provider attacks
if (command.contains("content") || command.contains("am broadcast")){
}
if (!exported)
this.commando.execRootPrintOP(command);
else
this.commando.execADBPrintOP(command);
anyKey=OtherUtil.pressAnykey();
if (anyKey.equals("snapshot")){
this.snaps.takeSnapshot();
}
// Do not terminate app between Tickles
//this.commando.execADB(this.broker.forceStopApp());
}
}
/**
* Print in the beginning the list of commands to be executed
*/
private void printCommandsToBeExecuted(ArrayList<String> origCommands){
if (this.isLogger){
OutBut.printH2("Logcat messages are saved in the following file: ");
OutBut.printNormal(this.logFileName);
}
OutBut.printH2("Commands to be executed");
ArrayList<String> commands = this.removeDuplicates(origCommands);
for (String c:commands)
System.out.println(c);
}
private ArrayList<String> removeDuplicates(ArrayList<String> orig){
return new ArrayList<String>(new LinkedHashSet<String>(orig));
}
public ArrayList<String> getCommands() {
return commands;
}
public void setCommands(ArrayList<String> commands) {
this.commands = commands;
}
public boolean isLogger() {
return isLogger;
}
public void setLogger(boolean isLogger) {
this.isLogger = isLogger;
if (isLogger){
this.prepareLoggerThread();
}
}
////////////////////// Logging ////////////////////////////////////
/**
* Set and start the logger thread
*/
private void prepareLoggerThread(){
this.makeLogFileName();
this.logController = new LogReaderController();
this.logController.setLogFileName(this.logFileName);
this.logController.setStop(false);
this.log = new LogReader(this.logController);
this.th1 = new Thread(this.log);
th1.start();
}
private void makeLogFileName(){
String timestamp = new SimpleDateFormat("dd.MM.yy_HH.mm.ss").format(new Date());
this.logFileName=TicklerVars.logDir+TicklerVars.pkgName+"_"+timestamp+".log";
}
private synchronized void writeCommandInLogFile(String command){
File logFile = new File(this.logFileName);
String line="\n\n************************************ Tickler: Executing Command ************************************************\n"
+command+"\n *******************************************************************************************************************\n\n";
try{
FileWriter w = new FileWriter(logFile,true);
w.append(line);
w.close();
}
catch (IOException e){
e.printStackTrace();
}
}
public void stopLogging(){
if (this.logController != null)
this.logController.setStop(true);
}
}
================================================
FILE: src/main/java/attacks/Starter.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package attacks;
import java.util.ArrayList;
import cliGui.OutBut;
import code.ExtrasUtil;
import components.IActivityService;
import components.IComponent;
import components.Provider;
import components.Receiver;
import initialization.TicklerVars;
/**
* I mean component attacker :) so it triggers attacks of Activities, services, content providers and B/C receivers
* @author aabolhadid
*
*/
public class Starter {
private ActivityStarter actStarter;
private Broadcaster broadcaster;
public ProviderAttacker provAtt;
public String manifestPath;
public Starter() {
String pkgName = TicklerVars.pkgName;
this.actStarter = new ActivityStarter(pkgName);
this.broadcaster = new Broadcaster(pkgName);
this.provAtt = new ProviderAttacker();
}
/**
* Collects commands of starting the selected components
* @param components
* @return
*/
public ArrayList<String> attackComponents(ArrayList<IComponent> components){
ArrayList<String> commands = new ArrayList<String>();
for (IComponent c:components){
commands.addAll(this.attackComponent(c));
}
return commands;
}
/**
* Collect the commands to start a specific component, based on its type
* @param comp
* @return
*/
public ArrayList<String> attackComponent(IComponent comp) {
ArrayList<String> commands = new ArrayList<String>();
if (comp instanceof IActivityService) {
commands.addAll(this.actStarter.startActivityfully((IActivityService)comp));
}
else if (comp instanceof Receiver) {
commands.addAll(broadcaster.generateBroadcast((Receiver) comp));
}
else if (comp instanceof Provider) {
//Query only the URI from Authority
String uri = this.provAtt.prepareContentFromAuthority((Provider)comp);
commands.add(this.provAtt.queryContent(uri));
}
ExtrasUtil cU = new ExtrasUtil();
if (cU.isJClassDir()){
ArrayList<String> commandsWithExtras = this.addExtrasOfComp(comp, commands);
return commandsWithExtras;
}
else {
OutBut.printWarning("Extras cannot be obtained. PLease make sure that the lib directory lies in the same directory as Tickler Jar file and contains dex2jar-2.0 folder");
return commands;
}
}
public ArrayList<String> queryUrisFromSmali(){
return this.provAtt.queryUrisFromSmali(TicklerVars.extractedDir);
}
public ArrayList<String> getContentUriFromDex(String dexPath) {
provAtt.getContentURIsFromSmali(dexPath);
return provAtt.queryContents();
}
public void prepareProviderAttacks(String dexPath) {
this.setManifestPath(dexPath);
this.provAtt.getContentURIsFromSmali(dexPath);
}
public String getManifestPath() {
return manifestPath;
}
public void setManifestPath(String manifestPath) {
this.manifestPath = manifestPath;
}
////// Get Extras //////
private String getExtrasOfComp(IComponent comp){
String extrasLine = " ";
ExtrasUtil cU = new ExtrasUtil();
extrasLine = cU.getExtras(comp.getName());
return extrasLine;
}
private ArrayList<String> addExtrasToCommands(String extrasLine, ArrayList<String> commands ) {
ArrayList<String> additionalCommands = new ArrayList<>();
for (String cmd : commands){
additionalCommands.add(cmd + extrasLine);
}
commands.addAll(additionalCommands);
return commands;
}
/**
* Adds extras commands if exist
* @param comp
* @param commands
* @return
*/
private ArrayList<String> addExtrasOfComp(IComponent comp,ArrayList<String> commands) {
String extrasLine = this.getExtrasOfComp(comp);
if (!extrasLine.equals(" "))
return this.addExtrasToCommands(extrasLine, commands);
return commands;
}
}
================================================
FILE: src/main/java/base/Base64Util.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package base;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import commandExec.Commando;
import initialization.TicklerVars;
/**
* Find Base64 values in a directory
* @author aabolhadid
*
*/
public class Base64Util {
private FileUtil fU;
private SearchUtil searcher;
public Base64Util(){
this.searcher = new SearchUtil();
this.fU = new FileUtil();
}
/**
* @param dir
* @param key
* @return
*/
public ArrayList<String> searchB64inDir(String dir, String key){
String keyLower = key.toLowerCase();
ArrayList<String> results = new ArrayList<>();
List<File> files = this.searcher.search4FileInDir(dir, null);
for (File f : files){
String decoded = this.fileToBase64(f.getAbsolutePath());
if (decoded.toLowerCase().contains(keyLower)){
results.add(f.getAbsolutePath());
}
}
return results;
}
/**
* Searches for a key in the DataDir of an app
* @param key
* @return Names of the files that contain the base64 value of the key
*/
public ArrayList<String> searchB64DataDir(String key){
return this.searchB64inDir(TicklerVars.dataDir, key);
}
/**
* Check first if the file is not empty!!!, then read the file and base64 Dec every line
* @param filePath
* @return
*/
public String fileToBase64(String filePath){
String theFile="", decLine, returnString="";
String ls = System.getProperty("line.separator");
try{
theFile=this.fU.readFile(filePath);
}
catch(IOException e){
e.printStackTrace();
}
if (!theFile.isEmpty()){
String[] fileArray= theFile.split(ls);
for (String s:fileArray){
decLine= this.breakLineBase64Dec(s);
if (!decLine.isEmpty()|| !decLine.matches("^\\s*$"))
returnString+= decLine+ls;
}
}
return returnString;
}
/**
* Break every line with delimiter of non-char or non-digit (except for = ??) then decode every part
* @param line
* @return
*/
private String breakLineBase64Dec(String line){
String[] broken = line.split("[^\\w\\d=]");
String dec="", returnString="", asciiDec="";
for (String s: broken){
dec = this.getBase64Dec(s);
asciiDec = this.getAsciiFromString(dec);
if (!asciiDec.isEmpty())
returnString+=asciiDec+" ";
}
return returnString;
}
public String getAsciiFromString(String complex){
String pure = complex.replaceAll("[^\\x20-\\x7F]", "");
return pure;
}
/**
* Base64 decodes a String
* @param orig
* @return
*/
public String getBase64Dec(String orig){
byte[] dec = org.apache.commons.codec.binary.Base64.decodeBase64(orig);
return new String(dec);
}
}
================================================
FILE: src/main/java/base/CopyUtil.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package base;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import cliGui.OutBut;
import commandExec.Commando;
import info.InfoGathering;
import initialization.TicklerConst;
import initialization.TicklerVars;
public class CopyUtil {
private FileUtil fileTrans;
public CopyUtil() {
this.fileTrans = new FileUtil();
}
/////////////////////////////////// Copy Data ////////////////////////////////////////////////
/**
* Updates local and external data directory
*/
public void copyStorage() {
this.copyDataDir();
this.copyExtDir(TicklerVars.extDataDir);
}
/**
* Copy local and external storage directories to their usual directories
* OR copy them to Transfers directory
* @param dest
*/
public void copyStorage(String dest) {
if (dest == null) {
this.copyStorage();
}
else {
String mainDest =TicklerVars.transferDir+dest+"/";
this.copyDataDir(mainDest+TicklerConst.DATA_DIR_NAME);
this.copyExtDir(mainDest+TicklerConst.EXTERNAL_STORAGE_Dir);
}
}
/**
* Copies DAta directory from the device, replaces any space in any file or dir name with __
*/
public void copyDataDir() {
this.copyDataDir(TicklerVars.dataDir);
}
/**
* Copy local Data Directory to a specific destination
* @param dest
*/
public void copyDataDir(String dest){
String src = "/data/data/"+TicklerVars.pkgName;
if (this.fileTrans.isExistOnDevice(src)) {
this.fileTrans.warnOverrideAndDelete(dest);
System.out.println("\n!!! NOTE: Space in Files' and Directories' names are replaced by two underscores __ !!!\n");
this.fileTrans.copyDirToHost(src, dest,false);
//Escape space in file names
this.fileTrans.escapeSpaceInDir(new File(dest));
}
else {
OutBut.printError("Data Directory does not exist on the device");
}
}
/**
* Copy local data storage directory to a specific destination
* I think it's duplicated and the code changed anyway to copy both local and ext storage
* @param name
*/
/*
public void copyDataDirName(String name){
String dest;
if (name==null){
dest = TicklerVars.dataDir;
}
else
{
dest =TicklerVars.transferDir+name;
// FileUtil fU = new FileUtil();
this.fileTrans.createDirOnHost(TicklerVars.transferDir);
}
this.copyDataDir(dest);
}
*/
// Copy any file or directory from the device to the host
//Create a new directory for each transfer
public void copyToHost(String src, String dest){
String timestamp = new SimpleDateFormat("dd-MM-yy_HH.mm.ss").format(new Date());
String srcName = fileTrans.getFileNameFromPath(src);
String dstDirName;
if (dest == null){
dstDirName = srcName+"_"+timestamp;
}
else {
dstDirName = dest;
}
String destDir = TicklerVars.transferDir+dstDirName;
this.fileTrans.copyDirToHost(src, destDir,false);
//Check
if (new File(destDir).exists())
System.out.println(src+" has been copied successfully to "+destDir);
}
/**
* Copy External storage directory to a certain destination
* @param destExtDir
*/
public void copyExtDir(String destExtDir) {
InfoGathering info = new InfoGathering();
// FileUtil fU = new FileUtil();
String extDir = info.getSdcardDirectory().replaceAll("\\n", "");
// String destExtDir=TicklerVars.transferDir+TicklerConst.COPIED_EXTERNAL_STORAGE_NAME;
if (!extDir.isEmpty()){
OutBut.printStep("Copying External Storage Directory: "+extDir+"\n");
this.fileTrans.copyDirToHost(extDir, destExtDir,false);
System.out.println("");
}
}
}
================================================
FILE: src/main/java/base/DOMXMLReader.java
================================================
package base;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.crypto.Data;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import cliGui.OutBut;
import components.Manifest;
import components.Permission;
import components.Provider;
import components.Receiver;
import components.Service;
import components.UsesPermission;
import components.Action;
import components.Activity;
import components.Application;
import components.Category;
import components.DataUri;
import components.IComponent;
import components.Intent;
// Following https://www.journaldev.com/898/read-xml-file-java-dom-parser
public class DOMXMLReader {
private String manifestPath;
private Manifest manifest;
public static void main(String[] args) {
DOMXMLReader r = new DOMXMLReader("/home/a7mad/Documents/Mobiles/Android/AndroTickler/eclipseTickler/insecManTest.xml");
r.parselManifest();
}
public DOMXMLReader(String manifestFile) {
this.manifestPath = manifestFile;
this.manifest = new Manifest();
}
/**
* Parse the Manifest File in general
*/
public Manifest parselManifest() {
File manifestFile= new File(this.manifestPath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(manifestFile);
doc.getDocumentElement().normalize();
this.parseManDoc(doc);
return this.manifest;
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
return null;
}
private void parseManDoc(Document doc) {
ArrayList<UsesPermission> usesPerm = new ArrayList<UsesPermission>();
ArrayList<Permission> perms = new ArrayList<Permission>();
Application app = new Application();
NodeList nl;
//Application, components and Intent filters
nl = doc.getElementsByTagName("application");
for (int i=0;i<nl.getLength();i++) {
app = this.parseApplication(nl.item(i));
}
nl = doc.getElementsByTagName("uses-permission");
for (int i=0;i<nl.getLength();i++) {
Element e = (Element) nl.item(i);
UsesPermission p = new UsesPermission();
p.setName( e.getAttribute("android:name"));
usesPerm.add(p);
}
nl = doc.getElementsByTagName("permission");
for (int i=0;i<nl.getLength();i++) {
Element e = (Element) nl.item(i);
Permission p = new Permission();
p.setName( e.getAttribute("android:name"));
p.setProtectionLevel(e.getAttribute("android:protectionLevel"));
perms.add(p);
}
this.manifest.setPkgName(doc.getDocumentElement().getAttribute("package"));
this.manifest.setApplication(app);
this.manifest.setUsesPermissions(usesPerm);
this.manifest.setPermissions(perms);
}
/////////////////////////////////////// Application /////////////////////////////////
private Application parseApplication(Node node) {
ArrayList<Activity> actList = new ArrayList<Activity>();
ArrayList<Service> serList = new ArrayList<>();
ArrayList<Provider> provList = new ArrayList<>();
ArrayList<Receiver> recList = new ArrayList<Receiver>();
Application app = new Application();
NodeList nl;
app.setAllowBackup(true);
app.setDebuggable(false);
if (node.getNodeType()==Node.ELEMENT_NODE) {
Element el = (Element) node;
if (el.getAttribute("android:allowBackup").toLowerCase().equals("false"))
app.setAllowBackup(false);
if (el.getAttribute("android:debuggable").toLowerCase().equals("true"))
app.setDebuggable(true);
app.setName(el.getAttribute("android:name"));
//Components
nl = el.getElementsByTagName("activity");
for (int i=0;i<nl.getLength();i++) {
actList.add(this.parseActivity(nl.item(i)) );
}
nl = el.getElementsByTagName("activity-alias");
for (int i=0;i<nl.getLength();i++) {
actList.add(this.parseActivity(nl.item(i)) );
}
nl = el.getElementsByTagName("service");
for (int i=0;i<nl.getLength();i++) {
serList.add(this.parseService(nl.item(i)) );
}
nl = el.getElementsByTagName("provider");
for (int i=0;i<nl.getLength();i++) {
provList.add( this.parseProvider(nl.item(i)) );
}
nl = el.getElementsByTagName("receiver");
for (int i=0;i<nl.getLength();i++) {
recList.add( this.parseReceiver(nl.item(i)) );
}
}
app.setActivites(actList);
app.setServices(serList);
app.setProviders(provList);
app.setReceivers(recList);
return app;
}
//////////////////////////////////////////// Components ///////////////////////////////////
// IComponent
private IComponent parseIComponent(Node node,IComponent compy) {
NodeList nl;
ArrayList<Intent> intFilList;
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
compy.setName(element.getAttribute("android:name"));
compy.setPermission(element.getAttribute("android:permission"));
//Intent Filters
nl = element.getElementsByTagName("intent-filter");
intFilList = new ArrayList();
for (int i=0;i<nl.getLength();i++) {
intFilList.add( this.parseIntentFilter(nl.item(i)) ) ;
}
compy.setIntent(intFilList);
//Exported
if((element.hasAttribute("android:exported") && element.getAttribute("android:exported").toLowerCase().equals("true")) || ! intFilList.isEmpty() ) {
compy.setExported(true);
}
else
compy.setExported(false);
}
return compy;
}
//Activity
private Activity parseActivity(Node node) {
Activity activity = new Activity();
activity = (Activity)this.parseIComponent(node, activity);
return activity;
}
private Service parseService(Node node) {
Service service = new Service();
service = (Service)this.parseIComponent(node, service);
return service;
}
private Provider parseProvider(Node node) {
Provider prov = new Provider();
prov = (Provider)this.parseIComponent(node, prov);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
prov.setAuthorities(element.getAttribute("android:authorities"));
}
return prov;
}
private Receiver parseReceiver(Node node) {
Receiver rec = new Receiver();
rec = (Receiver) this.parseIComponent(node, rec);
return rec;
}
///////////////////////////////////////////////////////// Intent Filters /////////////////////////////////////////
private Intent parseIntentFilter(Node node) {
Intent inFl = new Intent();
NodeList nl;
ArrayList<Action> actionList;
ArrayList<Category> catList;
ArrayList<DataUri> dataList;
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
//Actions
nl = element.getElementsByTagName("action");
actionList = new ArrayList();
for (int i=0;i<nl.getLength();i++) {
actionList.add(this.parseAction(nl.item(i)));
}
//Categories
nl = element.getElementsByTagName("category");
catList = new ArrayList<Category>();
for (int i=0;i<nl.getLength();i++) {
catList.add(this.parseCategory(nl.item(i)));
}
//Data
nl = element.getElementsByTagName("data");
dataList = new ArrayList<DataUri>();
for (int i=0;i<nl.getLength();i++) {
dataList.add(this.parseDataUri(nl.item(i)));
//
}
inFl.setAction(actionList);
inFl.setCategory(catList);
inFl.setData(dataList);
}
return inFl;
}
private Action parseAction(Node node) {
Action action = new Action();
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
action.setName(element.getAttribute("android:name"));
}
return action;
}
private Category parseCategory(Node node) {
Category cat = new Category();
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
cat.setName(element.getAttribute("android:name"));
}
return cat;
}
private DataUri parseDataUri(Node node) {
DataUri data = new DataUri();
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element e = (Element) node;
data.setHost(e.getAttribute("android:host"));
data.setScheme(e.getAttribute("android:scheme"));
data.setPort(e.getAttribute("android:port"));
data.setPath(e.getAttribute("android:path"));
data.setPathPrefix(e.getAttribute("android:pathPrefix"));
data.setPathPattern(e.getAttribute("android:pathPattern"));
data.setMimeType(e.getAttribute("android:mimeType"));
}
return data;
}
///////////////////////////////////// Util ////////////////////////////////////////
private String getTagValue(String tag, Element element) {
NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = (Node) nodeList.item(0);
return node.getNodeValue();
}
}
================================================
FILE: src/main/java/base/FileUtil.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package base;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.io.FileUtils;
import cliGui.OutBut;
import commandExec.Commando;
import exceptions.TNotFoundEx;
import initialization.TicklerVars;
/**
* All File operations (copy, delete ...) on host or device
* @author aabolhadid
*
*/
public class FileUtil {
private Commando commando;
public FileUtil(){
this.commando = new Commando();
}
///////// HOST commands ////////////////
/**
*
* @param src
* @param dest
* @param silent If true then it will not print the Copying message
*/
public void copyOnHost(String src, String dest,boolean silent){
if (!silent)
System.out.println("Copying "+src+" to "+dest+".....");
String command = "cp -fr "+src+" "+dest;
this.commando.executeCommand(command);
}
/**
* Checks subdirectories of each directory, escapes space in their files' names then change the subdirectories' names
* @param dir
*/
public void escapeSpaceInDir(File dir){
try {
for (File f : dir.listFiles())
{
if (f.isDirectory())
this.escapeSpaceInDir(f);
this.replaceSpace(f);
}
}
catch (java.lang.NullPointerException nullEx) {
OutBut.printNormal(".... Directory is empty");
}
}
/**
* Since Java cannot handle files names or directories containing a space, this is to replace the space with two underscores
* @param loc
*/
private void replaceSpace(File f){
String fName = f.getName();
if (fName.contains(" ")){
String newPath = f.getParentFile().getAbsolutePath()+"/"+fName.replace(" ", "__");
File newName = new File(newPath);
f.renameTo(newName);
}
}
public void deleteFromHost(String filename){
File file = new File(filename);
try{
if (file.isDirectory())
FileUtils.deleteDirectory(file);
else
FileUtils.forceDelete(file);
}
catch(IOException e){
System.out.println("!!!!!! ERROR: Cannot delete "+file.getAbsolutePath()+". Please delete the "
+ "file / directory manually and rerun the command");
}
}
// If a directory does not exist, it creates it.
public void createDirOnHost(String path) {
if (!this.isExist(path)) {
File dir = new File(path);
dir.mkdirs();
}
}
/**
* If Path exists on host, a warning message is printed and path is deleted
* @param path
*/
public void warnOverrideAndDelete(String path){
if (this.isExist(path)){
System.out.println("WARNING... "+path+" already exists with this same, !!OVERRIDING!! ");
this.deleteFromHost(path);
}
}
public boolean isExist(String path){
File file = new File(path);
return file.exists();
}
/**
* Returns whether a file is executable, used with dex2jar and other external tools
* @param path
* @return
*/
public boolean isExecutable(String path){
File file = new File(path);
return file.canExecute();
}
/**
* Checks the file type by executing the file command
* @param f: file
*/
public String fileType(File f){
String path = f.getAbsolutePath().replaceAll("\\s", "\\ ");
String command = "file "+ path;
String result = commando.executeCommand(command);
return result;
}
public String getFileNameFromPath(String path){
File absPath = new File(path);
String theName = absPath.getName();
if (absPath.isDirectory())
theName=theName+"/";
return theName;
}
/**
* Get files in Folder
* Replacing FileUtils.listFiles problem
* @param src
* @param dest
*/
public ArrayList<File> listFilesInDir(String dirLoc){
ArrayList<File> fileList = new ArrayList<File>();
try {
Path source = Paths.get(dirLoc);
Files.walk(source).filter(Files::isRegularFile).forEach(p -> fileList.add(this.pathToFile(p)));
}
catch (IOException e) {
e.printStackTrace();
}
return fileList;
}
private File pathToFile(Path p) {
File f=p.toFile();
if (f.exists()) {
return f;
}
return null;
}
/**
* Search for files with specific extensions or contain a specific string.
* Solving FileUtils issues
* @param dirLoc
* @param exts
* @return
*/
public ArrayList<File> listFilesInDirContain(String dirLoc,String[] exts) {
ArrayList<File> filez = this.listFilesInDir(dirLoc);
ArrayList<File> returnFilez = new ArrayList<File>();
for(File f : filez) {
for(String ext:exts)
if (f.getName().contains(ext)) {
returnFilez.add(f);
}
}
return returnFilez;
}
////////////// Android Device ////////////////
public void copyOnDevice(String src, String dest) {
String command = "cp -fr "+src+" "+dest;
this.commando.execRoot(command);
}
public void copyToDevice(String src, String dest) {
String fName = this.getFileNameFromPath(src);
// this.warnOverrideAndDelete(dest+fName);
String sdCardDestPath = TicklerVars.sdCardPath+fName;
String command = "adb push "+src+" "+sdCardDestPath;
int pullResult=this.commando.executeProcessForAdbPull(command);
this.copyOnDevice(sdCardDestPath, dest);
// this.deleteDirFromDevice(src);
}
public void pullFromSDcard(String src, String dest) {
String fName = this.getFileNameFromPath(src);
this.warnOverrideAndDelete(dest+fName);
String command = "adb pull "+src+" "+dest;
int pullResult=this.commando.executeProcessForAdbPull(command);
this.deleteDirFromDevice(src);
}
public String createDirOnDevice(String path) {
String command = "mkdir -p "+path;
return this.commando.execRoot(command);
}
public String deleteDirFromDevice(String path) {
String command = "rm -fr "+path;
return this.commando.execRoot(command);
}
//Checks if the file exists on the android device
public boolean isExistOnDevice(String path) {
String command = "ls "+path;
String op = this.commando.execRoot(command);
if (op.toLowerCase().contains("no such file or directory"))
return false;
return true;
}
private void b4CopyChecks(String path) throws TNotFoundEx{
if (!this.isExistOnDevice(path)){
throw new TNotFoundEx("!!!!!! ERROR: File / Directory does not exist on the device");
}
}
/////////////////////////////////////// Between Device and host //////////////////////////////////
/**
* Copies a file / directory from any location on the device to the host (linux) through SDcard
* @param silent if true then don't print a message
*/
public void copyDirToHost(String src,String dest,boolean silent) {
try{
if (!silent)
OutBut.printStep("Copying: "+src+" to ...\n"+dest+" ......");
this.b4CopyChecks(src);
String srcName = this.getFileNameFromPath(src);
this.deleteDirFromDevice(TicklerVars.sdCardPath+srcName);
this.copyOnDevice(src, TicklerVars.sdCardPath);
this.prepareDestination(dest);
this.pullFromSDcard(TicklerVars.sdCardPath+srcName, dest+"/");
File f = new File(TicklerVars.sdCardPath+srcName);
//Clean (uncommented)
this.deleteDirFromDevice(TicklerVars.sdCardPath+srcName);
}
catch(TNotFoundEx e)
{
System.out.println(e.getMessage());
}
}
/////////////// I/O ///////////////
public String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader (file));
String line;
StringBuilder fileString = new StringBuilder();
String ls = System.getProperty("line.separator");
try {
while((line = reader.readLine()) != null) {
fileString.append(line);
fileString.append(ls);
}
return fileString.toString();
} finally {
reader.close();
}
}
public void writeFile(String fileName, String content){
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
writer.write(content);
writer.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
/////// Preparation of Transfer directory
public String prepareTimestampTransfer(){
String timestamp = new SimpleDateFormat("dd-MM-yy_HH.mm.ss").format(new Date());
if (!this.isExist(TicklerVars.transferDir))
this.createDirOnHost(TicklerVars.transferDir);
return timestamp;
}
private void prepareDestination(String dst) {
File destFile = new File(dst);
this.createDirOnHost(dst);
}
}
================================================
FILE: src/main/java/base/JsonParser.java
================================================
package base;
import java.io.File;
import java.io.FileReader;
import java.text.ParseException;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import cliGui.OutBut;
public class JsonParser {
private JSONParser parser;
private String squeezeFileLoc;
public static void main(String[] args) {
JsonParser jp = new JsonParser();
// jp.parseJsonFile();
String objo = "{ \"squeeze\": [{\"Title\":\"World accessible files\",\"Values\":[ \"MODE_WORLD_READABLE\", \"MODE_WORLD_WRITABLE\"]},"
+ "{\"Title\":\"WebView\",\"Values\":[ \"addJavascriptInterface\", \"setAllowContentAccess\", \"setAllowFileAccess\", \"setAllowUniversalAccess\" ]}]}";
ArrayList<SimpleEntry<String,ArrayList<String>>> arr = jp.parseJsonString(objo);
// System.out.println("--"+title+"--");
// for (int j=0;j<valuesJA.size();j++) {
// System.out.println(valuesJA.get(j).toString());
// }
for (SimpleEntry<String,ArrayList<String>> e : arr) {
System.out.println(e.getKey());
OtherUtil.printStringArray(e.getValue());
}
}
public JsonParser() {
parser = new JSONParser();
//For now
squeezeFileLoc="/home/a7mad/eclipse-workspace/TicklerV2.1/bin/Squeeze.conf";
}
private void parseJsonFile() {
try {
// String objo = "\"squeeze\":[{\"a\":\"aa\",\"b\":\"bb\"}]}";
String objo = "{ \"squeeze\": [{\"Title\":\"World accessible files\",\"values\":[ \"MODE_WORLD_READABLE\", \"MODE_WORLD_WRITABLE\"]},"
+ "{\"Title\":\"WebView\",\"values\":[ \"addJavascriptInterface\", \"setAllowContentAccess\", \"setAllowFileAccess\", \"setAllowUniversalAccess\" ]}]}";
// Object objy = parser.parse(new FileReader(this.squeezeFileLoc));
Object objy = parser.parse(objo);
JSONObject jsonObj = (JSONObject) objy;
// JSONArray arr = (JSONArray) objy;
JSONArray arr = (JSONArray)jsonObj.get("squeeze");
System.out.println(arr.size());
Iterator itr1 = arr.iterator();
Iterator itr2 = arr.iterator();
// while (itr2.hasNext())
// {
// itr1 = ((Map) itr2.next()).entrySet().iterator();
// while (itr1.hasNext()) {
// Map.Entry pair = itr1.next();
// System.out.println(pair.getKey() + " : " + pair.getValue());
// }
// }
String test="";
for (int i=0;i<arr.size();i++) {
test= arr.get(i).toString();
System.out.println(test);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
public ArrayList<SimpleEntry<String,ArrayList<String>>> parseJsonString(String jsonString) {
// String jsonString = "{ \"squeeze\": [{\"Title\":\"World accessible files\",\"Values\":[ \"MODE_WORLD_READABLE\", \"MODE_WORLD_WRITABLE\"]},"
// + "{\"Title\":\"WebView\",\"Values\":[ \"addJavascriptInterface\", \"setAllowContentAccess\", \"setAllowFileAccess\", \"setAllowUniversalAccess\" ]}]}";
String jsonStr="",title="";
JSONObject jsObj2;
JSONArray valuesJA;
SimpleEntry<String,ArrayList<String>> sEnt;
// ArrayList<SimpleEntry<String,ArrayList<String>>> squeezeParams= new ArrayList<>();
ArrayList<SimpleEntry<String,ArrayList<String>>> squeezeParams= new ArrayList<>();
JSONObject rootJO = this.parseStringToObj(jsonString);
JSONArray squeezeJA = (JSONArray)rootJO.get("squeeze");
for (int i=0;i<squeezeJA.size();i++) {
jsonStr= squeezeJA.get(i).toString();
jsObj2 = this.parseStringToObj(jsonStr);
title = (String)jsObj2.get("Title");
valuesJA= (JSONArray) jsObj2.get("Values");
ArrayList<String> aL= (ArrayList<String>)valuesJA;
sEnt=new SimpleEntry<>(title,aL);
squeezeParams.add(sEnt);
}
return squeezeParams;
}
private JSONObject parseStringToObj(String jsonStr) {
try {
Object objy = parser.parse(jsonStr);
JSONObject jsonObj = (JSONObject) objy;
return jsonObj;
}
catch(Exception e) {
OutBut.printError("Error while Parsing Squeeze JSON Configuration");
e.printStackTrace();
return null;
}
// return jsonObj;
}
}
================================================
FILE: src/main/java/base/OtherUtil.java
================================================
/*******************************************************************************
* Copyright 2017 Ahmad Abolhadid
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package base;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.AbstractMap.SimpleEntry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cliGui.OutBut;
import initialization.TicklerVars;
/**
* Mainly regex operations now
* @author aabolhadid
*
*/
public class OtherUtil {
/**
* Gets all instances that match a regex in a string
* @param s
* @param regex
* @return
*/
public static ArrayList<String> getRegexFromString(String s, String regex){
ArrayList<String> result = new ArrayList<>();
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
try{
while(m.find())
result.add(m.group(1));
}
catch(IndexOutOfBoundsException ex)
{
}
return result;
}
/**
* Gets all instances that match a regex in a string
* @param s
* @param regex
* @return
*/
public static boolean isRegexInString(String s, String regex){
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
if
gitextract_nqfytlgy/
├── .gradle/
│ ├── 8.8/
│ │ └── dependencies-accessors/
│ │ └── gc.properties
│ ├── 8.9/
│ │ ├── dependencies-accessors/
│ │ │ └── gc.properties
│ │ └── gc.properties
│ ├── buildOutputCleanup/
│ │ └── cache.properties
│ └── vcs-1/
│ └── gc.properties
├── LICENSE
├── README.md
├── Tickler.conf
├── build.gradle
├── libs/
│ ├── jars/
│ │ ├── aacommons-cli-1.3.jar
│ │ ├── apktool.jar
│ │ ├── apktool_2.2.2.jar
│ │ ├── commons-cli-1.3.1.jar
│ │ ├── commons-cli-1.3.jar
│ │ ├── commons-codec-1.10.jar
│ │ ├── commons-io-2.4.jar
│ │ ├── commons-io-2.6.jar
│ │ ├── jd-core-java-1.2.jar
│ │ ├── json-simple-1.1.1.jar
│ │ └── procyon-decompiler-0.5.30.jar
│ └── notJars/
│ ├── Keystore/
│ │ └── Tickler.keystore
│ ├── dex2jar-2.1/
│ │ ├── LICENSE.txt
│ │ ├── NOTICE.txt
│ │ ├── bin/
│ │ │ ├── dex-tools
│ │ │ └── dex-tools.bat
│ │ ├── d2j-apk-sign.bat
│ │ ├── d2j-apk-sign.sh
│ │ ├── d2j-asm-verify.bat
│ │ ├── d2j-asm-verify.sh
│ │ ├── d2j-baksmali.bat
│ │ ├── d2j-baksmali.sh
│ │ ├── d2j-class-version-switch.bat
│ │ ├── d2j-class-version-switch.sh
│ │ ├── d2j-decrypt-string.bat
│ │ ├── d2j-decrypt-string.sh
│ │ ├── d2j-dex-recompute-checksum.bat
│ │ ├── d2j-dex-recompute-checksum.sh
│ │ ├── d2j-dex-weaver.bat
│ │ ├── d2j-dex-weaver.sh
│ │ ├── d2j-dex2jar.bat
│ │ ├── d2j-dex2jar.sh
│ │ ├── d2j-dex2smali.bat
│ │ ├── d2j-dex2smali.sh
│ │ ├── d2j-jar-access.bat
│ │ ├── d2j-jar-access.sh
│ │ ├── d2j-jar-weaver.bat
│ │ ├── d2j-jar-weaver.sh
│ │ ├── d2j-jar2dex.bat
│ │ ├── d2j-jar2dex.sh
│ │ ├── d2j-jar2jasmin.bat
│ │ ├── d2j-jar2jasmin.sh
│ │ ├── d2j-jasmin2jar.bat
│ │ ├── d2j-jasmin2jar.sh
│ │ ├── d2j-smali.bat
│ │ ├── d2j-smali.sh
│ │ ├── d2j-std-apk.bat
│ │ ├── d2j-std-apk.sh
│ │ ├── d2j_invoke.bat
│ │ ├── d2j_invoke.sh
│ │ └── lib/
│ │ ├── ST4-4.0.8.jar
│ │ ├── antlr-3.5.2.jar
│ │ ├── antlr-runtime-3.5.2.jar
│ │ ├── antlr4-4.5.jar
│ │ ├── antlr4-runtime-4.5.jar
│ │ ├── asm-debug-all-4.1.jar
│ │ ├── asm-debug-all-5.0.3.jar
│ │ ├── d2j-base-cmd-2.1-SNAPSHOT.jar
│ │ ├── d2j-jasmin-2.1-SNAPSHOT.jar
│ │ ├── d2j-smali-2.1-SNAPSHOT.jar
│ │ ├── dex-ir-2.1-SNAPSHOT.jar
│ │ ├── dex-reader-2.1-SNAPSHOT.jar
│ │ ├── dex-reader-api-2.1-SNAPSHOT.jar
│ │ ├── dex-tools-2.1-SNAPSHOT.jar
│ │ ├── dex-translator-2.1-SNAPSHOT.jar
│ │ ├── dex-writer-2.1-SNAPSHOT.jar
│ │ ├── dx-1.7.jar
│ │ ├── dx-23.0.0.jar
│ │ ├── open-source-license.txt
│ │ └── org.abego.treelayout.core-1.0.1.jar
│ └── fridaScripts/
│ ├── enumerate_classes.py
│ ├── get_attributes_output.js
│ └── unpin_sslContext.py
└── src/
└── main/
└── java/
├── .gradle/
│ └── 2.10/
│ └── taskArtifacts/
│ └── cache.properties
├── actions/
│ ├── Comparer.java
│ ├── Comparer_Old.java
│ ├── Searcher.java
│ └── Snapshots.java
├── apk/
│ ├── ApkSigner.java
│ ├── ApkToolClass.java
│ ├── ApkToolDude.java
│ ├── AppBroker.java
│ ├── Decompiler.java
│ └── newApks/
│ ├── CreateApk.java
│ ├── Debuggable.java
│ ├── INewApk.java
│ └── NougatMitM.java
├── attacks/
│ ├── ActivityStarter.java
│ ├── Broadcaster.java
│ ├── ProviderAttacker.java
│ ├── StartAttack.java
│ └── Starter.java
├── base/
│ ├── Base64Util.java
│ ├── CopyUtil.java
│ ├── DOMXMLReader.java
│ ├── FileUtil.java
│ ├── JsonParser.java
│ ├── OtherUtil.java
│ ├── SearchUtil.java
│ ├── Tickler.java
│ ├── TicklerGeneral.java
│ └── XMLReader.java
├── cliGui/
│ ├── OutBut.java
│ └── TicklerCLI.java
├── code/
│ ├── ClassExtras.java
│ ├── ExtrasUtil.java
│ └── JavaSqueezer.java
├── commandExec/
│ └── Commando.java
├── components/
│ ├── Action.java
│ ├── Activity.java
│ ├── Application.java
│ ├── Category.java
│ ├── DataUri.java
│ ├── IActivityService.java
│ ├── IComponent.java
│ ├── Intent.java
│ ├── Manifest.java
│ ├── Permission.java
│ ├── Provider.java
│ ├── Receiver.java
│ ├── Service.java
│ ├── UsesPermission.java
│ └── old/
│ ├── Action.java
│ ├── Activity.java
│ ├── Application.java
│ ├── Category.java
│ ├── DataUri.java
│ ├── IActivityService.java
│ ├── IComponent.java
│ ├── Intent.java
│ ├── Manifest.java
│ ├── Permission.java
│ ├── Provider.java
│ ├── Receiver.java
│ ├── Service.java
│ ├── UsesPermission.java
│ └── XMLReader.java
├── db/
│ └── DatabaseTester.java
├── device/
│ └── Packagez.java
├── docs/
│ └── helpMsg.txt
├── exceptions/
│ └── TNotFoundEx.java
├── frida/
│ ├── FridaBase.java
│ ├── FridaCli.java
│ ├── FridaEnumerateClasses.java
│ ├── FridaGetArgsAndReturn.java
│ ├── FridaInit.java
│ ├── FridaJsAction.java
│ ├── FridaJsScript.java
│ ├── FridaPythonScript.java
│ ├── FridaScript.java
│ ├── FridaSetValue.java
│ ├── FridaUnpinSslContext.java
│ └── FridaVars.java
├── info/
│ ├── InfoGathering.java
│ ├── InfoGatheringReporting.java
│ └── ListComponents.java
├── initialization/
│ ├── TicklerChecks.java
│ ├── TicklerConst.java
│ └── TicklerVars.java
├── logs/
│ ├── LogReader.java
│ └── LogReaderController.java
└── manifest/
├── ManifestAnalyzer.java
├── ManifestDealer.java
└── handlers/
├── DataUriHandler.java
└── IntentHandler.java
SYMBOL INDEX (854 symbols across 91 files)
FILE: libs/notJars/fridaScripts/unpin_sslContext.py
function on_message (line 6) | def on_message(message, data):
FILE: src/main/java/actions/Comparer.java
class Comparer (line 31) | public class Comparer {
method Comparer (line 38) | public Comparer() {
method diff (line 68) | public void diff(boolean detailed) {
method diffDetailed (line 113) | public void diffDetailed(String output){
method getDiffFileNames (line 125) | private ArrayList<String> getDiffFileNames(String output){
method checkFileTypeAndCompare (line 142) | private void checkFileTypeAndCompare(String fileName){
method compareTextfiles (line 157) | private void compareTextfiles(String fileName){
method compareDB (line 172) | private void compareDB(File f){
method clearDataDirs (line 191) | private void clearDataDirs(){
FILE: src/main/java/actions/Comparer_Old.java
class Comparer_Old (line 31) | public class Comparer_Old {
method Comparer_Old (line 38) | public Comparer_Old() {
method diffOld (line 48) | public void diffOld(boolean detailed) {
method diff (line 71) | public void diff(boolean detailed) {
method diffDetailed (line 92) | public void diffDetailed(String output){
method getDiffFileNames (line 104) | private ArrayList<String> getDiffFileNames(String output){
method checkFileTypeAndCompare (line 121) | private void checkFileTypeAndCompare(String fileName){
method compareTextfiles (line 136) | private void compareTextfiles(String fileName){
method compareDB (line 151) | private void compareDB(File f){
method clearDataDirs (line 170) | private void clearDataDirs(){
FILE: src/main/java/actions/Searcher.java
class Searcher (line 33) | public class Searcher {
method Searcher (line 40) | public Searcher() {
method sC (line 52) | public void sC(String key,boolean all){
method sCInFile (line 72) | private ArrayList<String> sCInFile(File file, String fileName, String ...
method searchInRes (line 86) | private void searchInRes(String key){
method searchInStringsArrays (line 102) | private void searchInStringsArrays(String key) {
method scCustomCodeLoc (line 121) | public void scCustomCodeLoc(String key, String codeRoot){
method searchInCodeWithOption (line 146) | private ArrayList<SimpleEntry> searchInCodeWithOption(String key, bool...
method searchForKeyInDataDir (line 169) | public void searchForKeyInDataDir(String key, boolean isCopy){
method base64Search (line 199) | private void base64Search(String key){
method searchExternalStorage (line 240) | private void searchExternalStorage(String key) {
FILE: src/main/java/actions/Snapshots.java
class Snapshots (line 27) | public class Snapshots {
method Snapshots (line 32) | public Snapshots() {
method takeSnapshot (line 38) | public void takeSnapshot(){
method executeSnapshot (line 57) | public void executeSnapshot(String path) {
method getBackGroundSnapshots (line 62) | public void getBackGroundSnapshots(){
FILE: src/main/java/apk/ApkSigner.java
class ApkSigner (line 30) | public class ApkSigner {
method checkJarsigner (line 32) | private boolean checkJarsigner(){
method isKeyStoreExist (line 43) | private boolean isKeyStoreExist(){
method signApk (line 49) | public boolean signApk(String apkPath){
FILE: src/main/java/apk/ApkToolClass.java
class ApkToolClass (line 40) | public class ApkToolClass {
method ApkToolClass (line 43) | public ApkToolClass(){
method apkToolDecode (line 52) | public void apkToolDecode(String apkPath) throws TNotFoundEx{
method apkToolCompile (line 87) | public void apkToolCompile(String dirPath, String apkPath){
method deleteExistingDecodedDir (line 102) | private void deleteExistingDecodedDir(){
FILE: src/main/java/apk/ApkToolDude.java
class ApkToolDude (line 16) | public class ApkToolDude {
method ApkToolDude (line 19) | public ApkToolDude(){
method apkToolDecode (line 28) | public void apkToolDecode(String apkPath) throws TNotFoundEx {
method apkToolDecodeGeneral (line 34) | private void apkToolDecodeGeneral(String apkPath, String args) throws ...
method apkToolCompile (line 63) | public void apkToolCompile(String dirPath, String apkPath){
method executeApktoolCommand (line 85) | private void executeApktoolCommand(String args) {
FILE: src/main/java/apk/AppBroker.java
class AppBroker (line 40) | public class AppBroker {
method AppBroker (line 50) | public AppBroker(Activity laucher,String pkgName) {
method AppBroker (line 58) | public AppBroker(String pkgName) {
method forceStopApp (line 67) | public String forceStopApp() {
method installApk (line 75) | public void installApk(String apk){
method uninstallPackage (line 80) | public void uninstallPackage(String pkgName){
method backupDataDir (line 87) | public void backupDataDir(String bkpLoc){
method isReinstallQuestion (line 115) | private boolean isReinstallQuestion(){
method reinstall (line 134) | public void reinstall(String apk){
method getPkgName (line 144) | public String getPkgName() {
method setPkgName (line 148) | public void setPkgName(String pkgName) {
method getOutputPath (line 152) | public String getOutputPath() {
method setOutputPath (line 156) | public void setOutputPath(String outputPath) {
method getSdCardPath (line 160) | public String getSdCardPath() {
FILE: src/main/java/apk/Decompiler.java
class Decompiler (line 31) | public class Decompiler {
method checkD2jExists (line 34) | private boolean checkD2jExists() {
method getApkFromTicklerDir (line 43) | private File getApkFromTicklerDir(){
method decompile (line 55) | public void decompile(){
method dex2jar (line 61) | public void dex2jar()
method jdCore (line 78) | private void jdCore(){
method checkDex2JarExecutable (line 99) | private boolean checkDex2JarExecutable(){
method isDex2Jar (line 118) | public boolean isDex2Jar() {
FILE: src/main/java/apk/newApks/CreateApk.java
class CreateApk (line 36) | public class CreateApk {
method CreateApk (line 44) | public CreateApk(int apkID){
method initNewApp (line 58) | private void initNewApp(int apkID){
method createNewApk (line 77) | public void createNewApk(){
method createAnyApk (line 101) | public void createAnyApk(String decompiledDir, String name) {
method afterCompilation (line 118) | private void afterCompilation(boolean isCustom) {
method reinstallNewApk (line 128) | private void reinstallNewApk(){
FILE: src/main/java/apk/newApks/Debuggable.java
class Debuggable (line 24) | public class Debuggable implements INewApk {
method Debuggable (line 29) | public Debuggable(){
method getNewApkName (line 34) | @Override
method changeManifest (line 40) | @Override
FILE: src/main/java/apk/newApks/INewApk.java
type INewApk (line 20) | public interface INewApk {
method getNewApkName (line 22) | public String getNewApkName();
method changeManifest (line 23) | public void changeManifest() throws TNotFoundEx ;
FILE: src/main/java/apk/newApks/NougatMitM.java
class NougatMitM (line 25) | public class NougatMitM implements INewApk{
method NougatMitM (line 30) | public NougatMitM() {
method getNewApkName (line 36) | @Override
method changeManifest (line 41) | @Override
method createNetSecConf (line 65) | private void createNetSecConf(){
FILE: src/main/java/attacks/ActivityStarter.java
class ActivityStarter (line 31) | public class ActivityStarter {
method ActivityStarter (line 39) | public ActivityStarter(String pkgname) {
method startActivityfully (line 44) | public ArrayList<String> startActivityfully(IActivityService actSer) {
method startActivity (line 67) | public String startActivity() {
method startActivity (line 73) | public String startActivity(IActivityService actSer){
method createAmCommand (line 80) | private String createAmCommand(IActivityService comp) {
method getPkgName (line 89) | public String getPkgName() {
method setPkgName (line 93) | public void setPkgName(String pkgName) {
method getActivity (line 97) | public IActivityService getActivity() {
method setActivity (line 101) | public void setActivity(IActivityService a) {
method getC (line 105) | public Commando getC() {
method setC (line 109) | public void setC(Commando c) {
FILE: src/main/java/attacks/Broadcaster.java
class Broadcaster (line 24) | public class Broadcaster {
method Broadcaster (line 30) | public Broadcaster(String pkgName) {
method Broadcaster (line 34) | public Broadcaster(String pkgName,Receiver rec) {
method getRec (line 39) | public Receiver getRec() {
method setRec (line 43) | public void setRec(Receiver rec) {
method generateBroadcast (line 47) | public ArrayList<String> generateBroadcast(Receiver rec) {
FILE: src/main/java/attacks/ProviderAttacker.java
class ProviderAttacker (line 34) | public class ProviderAttacker {
method queryUrisFromSmali (line 41) | public ArrayList<String> queryUrisFromSmali(String smaliPath){
method getContentURIsFromSmali (line 50) | public void getContentURIsFromSmali(String smaliPath){
method correctContentUri (line 67) | private String correctContentUri(String line) {
method checkAndAddUri (line 78) | private void checkAndAddUri(String uri) {
method prepareContentFromAuthority (line 89) | public String prepareContentFromAuthority(Provider prov){
method queryContent (line 95) | public String queryContent(String contentURI) {
method queryContents (line 99) | public ArrayList<String> queryContents(){
method attackProvider (line 117) | public ArrayList<String> attackProvider(Provider prov){
method getContentURIs (line 135) | public ArrayList<String> getContentURIs() {
method setContentURIs (line 139) | public void setContentURIs(ArrayList<String> contentURIs) {
method removeDuplicates (line 143) | private ArrayList<String> removeDuplicates(ArrayList<String> orig){
FILE: src/main/java/attacks/StartAttack.java
class StartAttack (line 39) | public class StartAttack extends Starter {
method StartAttack (line 51) | public StartAttack(){
method executeTriggerCommands (line 65) | public void executeTriggerCommands(ArrayList<String> origCommands, boo...
method printCommandsToBeExecuted (line 109) | private void printCommandsToBeExecuted(ArrayList<String> origCommands){
method removeDuplicates (line 120) | private ArrayList<String> removeDuplicates(ArrayList<String> orig){
method getCommands (line 126) | public ArrayList<String> getCommands() {
method setCommands (line 131) | public void setCommands(ArrayList<String> commands) {
method isLogger (line 137) | public boolean isLogger() {
method setLogger (line 143) | public void setLogger(boolean isLogger) {
method prepareLoggerThread (line 157) | private void prepareLoggerThread(){
method makeLogFileName (line 168) | private void makeLogFileName(){
method writeCommandInLogFile (line 173) | private synchronized void writeCommandInLogFile(String command){
method stopLogging (line 189) | public void stopLogging(){
FILE: src/main/java/attacks/Starter.java
class Starter (line 32) | public class Starter {
method Starter (line 39) | public Starter() {
method attackComponents (line 52) | public ArrayList<String> attackComponents(ArrayList<IComponent> compon...
method attackComponent (line 66) | public ArrayList<String> attackComponent(IComponent comp) {
method queryUrisFromSmali (line 95) | public ArrayList<String> queryUrisFromSmali(){
method getContentUriFromDex (line 99) | public ArrayList<String> getContentUriFromDex(String dexPath) {
method prepareProviderAttacks (line 104) | public void prepareProviderAttacks(String dexPath) {
method getManifestPath (line 110) | public String getManifestPath() {
method setManifestPath (line 114) | public void setManifestPath(String manifestPath) {
method getExtrasOfComp (line 121) | private String getExtrasOfComp(IComponent comp){
method addExtrasToCommands (line 129) | private ArrayList<String> addExtrasToCommands(String extrasLine, Array...
method addExtrasOfComp (line 145) | private ArrayList<String> addExtrasOfComp(IComponent comp,ArrayList<St...
FILE: src/main/java/base/Base64Util.java
class Base64Util (line 31) | public class Base64Util {
method Base64Util (line 35) | public Base64Util(){
method searchB64inDir (line 45) | public ArrayList<String> searchB64inDir(String dir, String key){
method searchB64DataDir (line 65) | public ArrayList<String> searchB64DataDir(String key){
method fileToBase64 (line 77) | public String fileToBase64(String filePath){
method breakLineBase64Dec (line 106) | private String breakLineBase64Dec(String line){
method getAsciiFromString (line 120) | public String getAsciiFromString(String complex){
method getBase64Dec (line 131) | public String getBase64Dec(String orig){
FILE: src/main/java/base/CopyUtil.java
class CopyUtil (line 28) | public class CopyUtil {
method CopyUtil (line 32) | public CopyUtil() {
method copyStorage (line 41) | public void copyStorage() {
method copyStorage (line 50) | public void copyStorage(String dest) {
method copyDataDir (line 64) | public void copyDataDir() {
method copyDataDir (line 72) | public void copyDataDir(String dest){
method copyToHost (line 114) | public void copyToHost(String src, String dest){
method copyExtDir (line 140) | public void copyExtDir(String destExtDir) {
FILE: src/main/java/base/DOMXMLReader.java
class DOMXMLReader (line 35) | public class DOMXMLReader {
method main (line 40) | public static void main(String[] args) {
method DOMXMLReader (line 45) | public DOMXMLReader(String manifestFile) {
method parselManifest (line 54) | public Manifest parselManifest() {
method parseManDoc (line 75) | private void parseManDoc(Document doc) {
method parseApplication (line 119) | private Application parseApplication(Node node) {
method parseIComponent (line 182) | private IComponent parseIComponent(Node node,IComponent compy) {
method parseActivity (line 221) | private Activity parseActivity(Node node) {
method parseService (line 229) | private Service parseService(Node node) {
method parseProvider (line 236) | private Provider parseProvider(Node node) {
method parseReceiver (line 248) | private Receiver parseReceiver(Node node) {
method parseIntentFilter (line 258) | private Intent parseIntentFilter(Node node) {
method parseAction (line 300) | private Action parseAction(Node node) {
method parseCategory (line 312) | private Category parseCategory(Node node) {
method parseDataUri (line 325) | private DataUri parseDataUri(Node node) {
method getTagValue (line 348) | private String getTagValue(String tag, Element element) {
FILE: src/main/java/base/FileUtil.java
class FileUtil (line 45) | public class FileUtil {
method FileUtil (line 49) | public FileUtil(){
method copyOnHost (line 61) | public void copyOnHost(String src, String dest,boolean silent){
method escapeSpaceInDir (line 73) | public void escapeSpaceInDir(File dir){
method replaceSpace (line 93) | private void replaceSpace(File f){
method deleteFromHost (line 103) | public void deleteFromHost(String filename){
method createDirOnHost (line 118) | public void createDirOnHost(String path) {
method warnOverrideAndDelete (line 129) | public void warnOverrideAndDelete(String path){
method isExist (line 137) | public boolean isExist(String path){
method isExecutable (line 147) | public boolean isExecutable(String path){
method fileType (line 156) | public String fileType(File f){
method getFileNameFromPath (line 164) | public String getFileNameFromPath(String path){
method listFilesInDir (line 180) | public ArrayList<File> listFilesInDir(String dirLoc){
method pathToFile (line 194) | private File pathToFile(Path p) {
method listFilesInDirContain (line 209) | public ArrayList<File> listFilesInDirContain(String dirLoc,String[] ex...
method copyOnDevice (line 225) | public void copyOnDevice(String src, String dest) {
method copyToDevice (line 231) | public void copyToDevice(String src, String dest) {
method pullFromSDcard (line 242) | public void pullFromSDcard(String src, String dest) {
method createDirOnDevice (line 252) | public String createDirOnDevice(String path) {
method deleteDirFromDevice (line 257) | public String deleteDirFromDevice(String path) {
method isExistOnDevice (line 263) | public boolean isExistOnDevice(String path) {
method b4CopyChecks (line 272) | private void b4CopyChecks(String path) throws TNotFoundEx{
method copyDirToHost (line 283) | public void copyDirToHost(String src,String dest,boolean silent) {
method readFile (line 306) | public String readFile(String file) throws IOException {
method writeFile (line 324) | public void writeFile(String fileName, String content){
method prepareTimestampTransfer (line 337) | public String prepareTimestampTransfer(){
method prepareDestination (line 345) | private void prepareDestination(String dst) {
FILE: src/main/java/base/JsonParser.java
class JsonParser (line 17) | public class JsonParser {
method main (line 24) | public static void main(String[] args) {
method JsonParser (line 45) | public JsonParser() {
method parseJsonFile (line 52) | private void parseJsonFile() {
method parseJsonString (line 91) | public ArrayList<SimpleEntry<String,ArrayList<String>>> parseJsonStrin...
method parseStringToObj (line 127) | private JSONObject parseStringToObj(String jsonStr) {
FILE: src/main/java/base/OtherUtil.java
class OtherUtil (line 36) | public class OtherUtil {
method getRegexFromString (line 43) | public static ArrayList<String> getRegexFromString(String s, String re...
method isRegexInString (line 67) | public static boolean isRegexInString(String s, String regex){
method removeDuplicates (line 77) | public static ArrayList<String> removeDuplicates(ArrayList<String> orig){
method pressAnykey (line 82) | public static String pressAnykey(){
method pressAnyKeySilent (line 89) | public static String pressAnyKeySilent(){
method readInput (line 94) | private static String readInput(){
method printSimpleEntryArray (line 113) | public static void printSimpleEntryArray(ArrayList<SimpleEntry> hits, ...
method getAbsolutePath (line 131) | public static String getAbsolutePath(String path){
method printStringArray (line 141) | public static void printStringArray(ArrayList<String> aL){
FILE: src/main/java/base/SearchUtil.java
class SearchUtil (line 33) | public class SearchUtil {
method search4KeyInDir (line 41) | public ArrayList<String> search4KeyInDir(String path, String key){
method search4KeyInDirFName (line 61) | public ArrayList<SimpleEntry> search4KeyInDirFName(String path,String ...
method searchForKeyInJava (line 83) | public ArrayList<SimpleEntry> searchForKeyInJava(String key, String co...
method searchForKeyInJava (line 101) | public ArrayList<SimpleEntry> searchForKeyInJava(String key){
method refineSearch (line 111) | public ArrayList<SimpleEntry> refineSearch(ArrayList<SimpleEntry> eArr...
method refineSearchMatch (line 130) | public ArrayList<SimpleEntry> refineSearchMatch(ArrayList<SimpleEntry>...
method search4FileInDir (line 148) | public List<File> search4FileInDir(String path, String[] extensions){
method searchOnDevice (line 171) | public String searchOnDevice(String path, String key){
method findInFile (line 186) | public ArrayList<String> findInFile(File f, String key){
method findRegexInFile (line 196) | public ArrayList<String> findRegexInFile(File f, String regex){
method searchInFile (line 210) | private ArrayList<String> searchInFile(File f, String key,boolean regex){
method checkLineAndRegex (line 241) | private boolean checkLineAndRegex(String line, String key, boolean reg...
FILE: src/main/java/base/Tickler.java
class Tickler (line 50) | public class Tickler {
method Tickler (line 75) | public Tickler(String mode, String pkgName) {
method inits (line 106) | private void inits() {
method ticklerPackageInit (line 119) | private void ticklerPackageInit(String pkgName,boolean isDev){
method runTicklerChecks (line 137) | private void runTicklerChecks(String pkgName, boolean isDev) throws TN...
method start (line 154) | public void start(int compType, boolean exported){
method triggerGroup (line 165) | private void triggerGroup(int compType, boolean exported) {
method attackComponent (line 188) | public void attackComponent(String compName){
method prepareComponentAttack (line 210) | public void prepareComponentAttack() {
method copyDataDir (line 233) | public void copyDataDir(String name){
method copyToHost (line 243) | public void copyToHost(String src, String dest){
method databases (line 255) | public void databases(String param,boolean isCopy){
method snapshot (line 270) | public void snapshot(){
method createDebuggable (line 280) | public void createDebuggable(){
method createNougatMitM (line 288) | public void createNougatMitM(){
method createCustomAPK (line 293) | public void createCustomAPK(String dir, String name){
method decompileApk (line 298) | public void decompileApk(){
method backgroundSnapshots (line 306) | public void backgroundSnapshots(){
method diffDataDir (line 313) | public void diffDataDir(String detailed){
method version (line 330) | public void version(){
method list (line 336) | public void list(int compType, boolean exported,boolean details){
method listComponent (line 342) | public void listComponent(String compName){
method informationGathering (line 348) | public void informationGathering() {
method printPackages (line 353) | public void printPackages(){
method squeezeCode (line 358) | public void squeezeCode(String codeLoc){
method squeezeJSON (line 370) | public void squeezeJSON(String jsonLoc) {
method searchPackage (line 376) | public void searchPackage(String key){
method searchInCode (line 383) | public void searchInCode(String key,String codeLoc){
method searchInCodeAll (line 389) | public void searchInCodeAll(String key){
method searchInDataDir (line 394) | public void searchInDataDir(String key, boolean isCopy){
method b64Search (line 399) | public void b64Search(String key)
method isLog (line 409) | public boolean isLog() {
method setLog (line 413) | public void setLog(boolean log) {
method frida (line 421) | public void frida(String[] args, boolean reuse){
FILE: src/main/java/base/TicklerGeneral.java
class TicklerGeneral (line 5) | public class TicklerGeneral {
FILE: src/main/java/base/XMLReader.java
class XMLReader (line 35) | public class XMLReader{
method XMLReader (line 39) | public XMLReader(String manifestFile) {
method unmarshalManifest (line 44) | public void unmarshalManifest() {
method getManifest (line 63) | public Manifest getManifest() {
FILE: src/main/java/cliGui/OutBut.java
class OutBut (line 18) | public class OutBut {
method printH1 (line 27) | public static void printH1(String line){
method printH2 (line 35) | public static void printH2(String line){
method printH3 (line 39) | public static void printH3(String line){
method printStep (line 49) | public static void printStep(String line){
method printWarning (line 53) | public static void printWarning(String line){
method printError (line 57) | public static void printError(String line){
method printNormal (line 65) | public static void printNormal(String line){
method printH1Blue (line 69) | public static void printH1Blue(String line){
FILE: src/main/java/cliGui/TicklerCLI.java
class TicklerCLI (line 49) | public class TicklerCLI {
method main (line 53) | public static void main(String[] args) {
method startTickler (line 191) | public void startTickler(CommandLine cl) throws TNotFoundEx{
method executeLogcat (line 436) | public void executeLogcat(String command, File logFile){
method checkOfflineFeasibility (line 459) | public void checkOfflineFeasibility(CommandLine cli) throws TNotFoundEx {
FILE: src/main/java/code/ClassExtras.java
class ClassExtras (line 38) | public class ClassExtras {
method ClassExtras (line 44) | public ClassExtras(String className){
method process (line 52) | public void process(){
method getClassFiles (line 63) | private void getClassFiles(){
method getExtrasOfClass (line 79) | public void getExtrasOfClass(File file){
method getExtraLines (line 95) | private ArrayList<String> getExtraLines(File file, String className){
method getExtrasCommands (line 107) | public ArrayList<String> getExtrasCommands(){
method isValidExtraType (line 124) | private boolean isValidExtraType(int i){
method getExtraCommand (line 139) | private String getExtraCommand(int i){
method getExtrasInfo (line 154) | public ArrayList<String> getExtrasInfo(){
method getE (line 174) | public String getE(String type){
method getExtraValue (line 212) | public String getExtraValue(String type){
method getTypes (line 240) | public ArrayList<String> getTypes() {
method setTypes (line 244) | public void setTypes(ArrayList<String> types) {
method getNames (line 248) | public ArrayList<String> getNames() {
method setNames (line 252) | public void setNames(ArrayList<String> names) {
method getDefaults (line 256) | public ArrayList<String> getDefaults() {
method setDefaults (line 260) | public void setDefaults(ArrayList<String> defaults) {
FILE: src/main/java/code/ExtrasUtil.java
class ExtrasUtil (line 28) | public class ExtrasUtil {
method ExtrasUtil (line 31) | public ExtrasUtil(){
method isJClassDir (line 40) | public boolean isJClassDir() {
method getExtras (line 52) | public String getExtras(String className){
method getExtrasIfCodeExists (line 62) | private String getExtrasIfCodeExists(String className){
method getClassNameFromCompName (line 70) | private String getClassNameFromCompName(String className){
method getExtrasCommandLine (line 86) | private String getExtrasCommandLine(ArrayList<String> extrasCommands) {
method prepareExtrasCommands (line 104) | private ArrayList<String> prepareExtrasCommands(String cName){
method getExtrasInfo (line 117) | public ArrayList<String> getExtrasInfo(String className){
FILE: src/main/java/code/JavaSqueezer.java
class JavaSqueezer (line 50) | public class JavaSqueezer {
method JavaSqueezer (line 59) | public JavaSqueezer(){
method report (line 64) | public void report(String codeRoot){
method report (line 84) | public void report(){
method externalStorageInCode (line 127) | public void externalStorageInCode(){
method storage (line 135) | private void storage(){
method libsAndComponents (line 145) | private void libsAndComponents(){
method soLibFiles (line 190) | public void soLibFiles(){
method dllFiles (line 199) | public void dllFiles(){
method certsInAPK (line 208) | private void certsInAPK() {
method frameworks (line 213) | private void frameworks() {
method weakCyphers (line 239) | private void weakCyphers() {
method crypto (line 255) | private void crypto(){
method getStringsInCode (line 269) | private void getStringsInCode(){
method getHashes (line 280) | private void getHashes(){
method httpUrls (line 293) | private void httpUrls(){
method getHttpUris (line 301) | public void getHttpUris(){
method getPathes (line 321) | private void getPathes() {
method getIPAddresses (line 331) | private void getIPAddresses() {
method findSchemes (line 342) | private void findSchemes() {
method pinning (line 348) | private void pinning(){
method correctUrl (line 355) | private String correctUrl(String line) {
method logInCode (line 371) | public void logInCode(){
method testDisclosure (line 381) | private void testDisclosure(){
method commentsInCode (line 393) | public void commentsInCode(){
method credentialsInCode (line 422) | public void credentialsInCode(){
method printE (line 438) | private void printE(ArrayList<SimpleEntry> eArray){
method removeDuplicatedSimpleEntries (line 446) | private ArrayList<SimpleEntry> removeDuplicatedSimpleEntries(ArrayList...
method returnFileNames (line 455) | private ArrayList<String> returnFileNames(ArrayList<SimpleEntry> hits){
method returnValues (line 464) | private ArrayList<String> returnValues(ArrayList<SimpleEntry> hits){
method returnFNameLineGroup (line 480) | private ArrayList<SimpleEntry> returnFNameLineGroup(String[] keys, boo...
method searchForFilesInAPK (line 499) | private void searchForFilesInAPK(String[] extension){
method isExternalStorage (line 514) | public boolean isExternalStorage(){
method squeezeJson (line 522) | public void squeezeJson(String filePath) {
method readSqueezeJson (line 572) | private String readSqueezeJson(String filePath) throws IOException {
method writeSqueezeInFile (line 582) | private void writeSqueezeInFile() {
method printSqueezeFile (line 597) | private void printSqueezeFile() {
method backToSystemOut (line 611) | private void backToSystemOut() {
FILE: src/main/java/commandExec/Commando.java
class Commando (line 32) | public class Commando {
method executeProcessString (line 45) | public ArrayList<String> executeProcessString(String command){
method executeProcessListPrintOP (line 70) | public int executeProcessListPrintOP(String command,boolean output){
method executeProcessListPrintOPError (line 74) | public int executeProcessListPrintOPError(String command){
method executeProcessForAdbPull (line 78) | public int executeProcessForAdbPull(String command){
method executeProcessListMain (line 90) | private int executeProcessListMain(String command,boolean output,boole...
method printProcessOp (line 134) | private void printProcessOp(Process process) {
method saveProcessOp (line 155) | private void saveProcessOp(Process process, String fileName){
method getProcessOp (line 178) | private String getProcessOp(Process process){
method executeCommand (line 196) | public String executeCommand(String command)
method executeCommand (line 207) | public String executeCommand(String command, boolean wait)
method executePythonScript (line 240) | public String executePythonScript(String command)
method execADB (line 275) | public String execADB(String command, boolean wait) {
method execADB (line 279) | public String execADB(String command) {
method execRoot (line 283) | public String execRoot(String command) {
method execADBPrintOP (line 300) | public int execADBPrintOP(String command){
method execRootPrintOP (line 310) | public int execRootPrintOP(String command){
FILE: src/main/java/components/Action.java
class Action (line 20) | public class Action {
method getName (line 23) | public String getName() {
method setName (line 27) | public void setName(String name) {
method toString (line 31) | public String toString() {
FILE: src/main/java/components/Activity.java
class Activity (line 20) | public class Activity implements IComponent,IActivityService{
method getName (line 26) | public String getName() {
method setName (line 29) | public void setName(String name) {
method isExported (line 40) | public boolean isExported() {
method setExported (line 43) | public void setExported(boolean exported) {
method getIntent (line 47) | public ArrayList<Intent> getIntent() {
method setIntent (line 50) | public void setIntent(ArrayList<Intent> intents) {
method getPermission (line 53) | public String getPermission() {
method setPermission (line 56) | public void setPermission(String permission) {
FILE: src/main/java/components/Application.java
class Application (line 21) | public class Application {
method Application (line 30) | public Application() {
method isAllowBackup (line 34) | public boolean isAllowBackup() {
method setAllowBackup (line 37) | public void setAllowBackup(boolean isAllowBackup) {
method getActivites (line 41) | public List<Activity> getActivites() {
method setActivites (line 45) | public void setActivites(List<Activity> activites) {
method getServices (line 48) | public List<Service> getServices() {
method setServices (line 52) | public void setServices(List<Service> services) {
method getReceivers (line 56) | public List<Receiver> getReceivers() {
method setReceivers (line 60) | public void setReceivers(List<Receiver> receivers) {
method getProviders (line 64) | public List<Provider> getProviders() {
method setProviders (line 68) | public void setProviders(List<Provider> providers) {
method isDebuggable (line 72) | public boolean isDebuggable() {
method setDebuggable (line 76) | public void setDebuggable(boolean isDebuggable) {
method getName (line 80) | public String getName() {
method setName (line 84) | public void setName(String name) {
FILE: src/main/java/components/Category.java
class Category (line 20) | public class Category {
method getName (line 23) | public String getName() {
method setName (line 26) | public void setName(String name) {
method toString (line 30) | public String toString() {
FILE: src/main/java/components/DataUri.java
class DataUri (line 26) | public class DataUri {
method getScheme (line 30) | public String getScheme() {
method setScheme (line 34) | public void setScheme(String scheme) {
method getHost (line 38) | public String getHost() {
method setHost (line 41) | public void setHost(String host) {
method getPort (line 45) | public String getPort() {
method setPort (line 48) | public void setPort(String port) {
method getPath (line 52) | public String getPath() {
method setPath (line 55) | public void setPath(String path) {
method getPathPrefix (line 59) | public String getPathPrefix() {
method setPathPrefix (line 62) | public void setPathPrefix(String pathPrefix) {
method getPathPattern (line 66) | public String getPathPattern() {
method setPathPattern (line 69) | public void setPathPattern(String pathPattern) {
method getMimeType (line 73) | public String getMimeType() {
method setMimeType (line 76) | public void setMimeType(String mimeType) {
method getDataMap (line 80) | public Map<String,String> getDataMap(){
method fillScheme (line 98) | private void fillScheme(){
method fillRest (line 103) | private void fillRest(String key, String value){
FILE: src/main/java/components/IActivityService.java
type IActivityService (line 20) | public interface IActivityService {
method getIntent (line 22) | public List<Intent> getIntent();
method getName (line 23) | public String getName();
FILE: src/main/java/components/IComponent.java
type IComponent (line 20) | public interface IComponent {
method isExported (line 22) | public boolean isExported();
method setExported (line 23) | public void setExported(boolean isExported);
method getIntent (line 24) | public ArrayList<Intent> getIntent();
method getName (line 25) | public String getName();
method getPermission (line 26) | public String getPermission();
method setName (line 28) | public void setName(String name);
method setPermission (line 29) | public void setPermission(String permission);
method setIntent (line 30) | public void setIntent(ArrayList<Intent> intentFilters);
FILE: src/main/java/components/Intent.java
class Intent (line 21) | public class Intent {
method getAction (line 28) | public List<Action> getAction() {
method setAction (line 32) | public void setAction(List<Action> action) {
method getCategory (line 35) | public List<Category> getCategory() {
method setCategory (line 39) | public void setCategory(List<Category> category) {
method getData (line 42) | public List<DataUri> getData() {
method setData (line 46) | public void setData(List<DataUri> data) {
method getPriority (line 49) | public int getPriority() {
method setPriority (line 53) | public void setPriority(int priority) {
method toString (line 57) | public String toString() {
FILE: src/main/java/components/Manifest.java
class Manifest (line 22) | public class Manifest {
method getIntents (line 30) | public ArrayList<Intent> getIntents() {
method setIntents (line 34) | public void setIntents(ArrayList<Intent> intents) {
method getUsesPermissions (line 38) | public ArrayList<UsesPermission> getUsesPermissions() {
method setUsesPermissions (line 42) | public void setUsesPermissions(ArrayList<UsesPermission> usesPermissio...
method getPermissions (line 46) | public ArrayList<Permission> getPermissions() {
method setPermissions (line 50) | public void setPermissions(ArrayList<Permission> permissions) {
method getApplication (line 54) | public Application getApplication() {
method setApplication (line 58) | public void setApplication(Application application) {
method getPkgName (line 62) | public String getPkgName() {
method setPkgName (line 66) | public void setPkgName(String pkgName) {
FILE: src/main/java/components/Permission.java
class Permission (line 19) | public class Permission {
method getName (line 23) | public String getName() {
method setName (line 27) | public void setName(String name) {
method getProtectionLevel (line 31) | public String getProtectionLevel() {
method setProtectionLevel (line 35) | public void setProtectionLevel(String protectionLevel) {
FILE: src/main/java/components/Provider.java
class Provider (line 20) | public class Provider implements IComponent{
method getName (line 26) | public String getName() {
method setName (line 29) | public void setName(String name) {
method getPermission (line 33) | public String getPermission() {
method setPermission (line 36) | public void setPermission(String permission) {
method getAuthorities (line 40) | public String getAuthorities() {
method setAuthorities (line 43) | public void setAuthorities(String authorities) {
method isExported (line 46) | public boolean isExported() {
method setExported (line 50) | public void setExported(boolean isExported) {
method getIntent (line 53) | public ArrayList<Intent> getIntent() {
method setIntent (line 56) | public void setIntent(ArrayList<Intent> intent) {
method getExp (line 60) | public String getExp() {
FILE: src/main/java/components/Receiver.java
class Receiver (line 21) | public class Receiver implements IComponent{
method isExported (line 27) | public boolean isExported() {
method setExported (line 30) | public void setExported(boolean isExported) {
method getExp (line 34) | public String getExp() {
method setExp (line 37) | public void setExp(String exp) {
method getName (line 41) | public String getName() {
method setName (line 44) | public void setName(String name) {
method getPermission (line 47) | public String getPermission() {
method setPermission (line 50) | public void setPermission(String permission) {
method getIntent (line 54) | public ArrayList<Intent> getIntent() {
method setIntent (line 57) | public void setIntent(ArrayList<Intent> intents) {
FILE: src/main/java/components/Service.java
class Service (line 22) | public class Service implements IComponent,IActivityService{
method Service (line 27) | public Service() {
method getName (line 31) | public String getName() {
method setName (line 34) | public void setName(String name) {
method getExp (line 38) | public String getExp() {
method setExp (line 41) | public void setExp(String exp) {
method isExported (line 45) | public boolean isExported() {
method setExported (line 49) | public void setExported(boolean isExported) {
method getIntent (line 53) | public ArrayList<Intent> getIntent() {
method setIntent (line 56) | public void setIntent(ArrayList<Intent> intent) {
method getPermission (line 60) | public String getPermission() {
method setPermission (line 63) | public void setPermission(String permission) {
FILE: src/main/java/components/UsesPermission.java
class UsesPermission (line 19) | public class UsesPermission {
method getName (line 23) | public String getName() {
method setName (line 27) | public void setName(String name) {
FILE: src/main/java/components/old/Action.java
class Action (line 20) | public class Action {
method getName (line 23) | public String getName() {
method setName (line 27) | public void setName(String name) {
method toString (line 31) | public String toString() {
FILE: src/main/java/components/old/Activity.java
class Activity (line 20) | public class Activity implements IComponent,IActivityService{
method getName (line 26) | public String getName() {
method setName (line 29) | public void setName(String name) {
method isExported (line 40) | public boolean isExported() {
method setExported (line 43) | public void setExported(boolean exported) {
method getIntent (line 47) | public ArrayList<Intent> getIntent() {
method setIntent (line 50) | public void setIntent(ArrayList<Intent> intents) {
method getPermission (line 53) | public String getPermission() {
method setPermission (line 56) | public void setPermission(String permission) {
FILE: src/main/java/components/old/Application.java
class Application (line 24) | public class Application {
method Application (line 33) | public Application() {
method isAllowBackup (line 37) | public boolean isAllowBackup() {
method setAllowBackup (line 40) | public void setAllowBackup(boolean isAllowBackup) {
method getActivites (line 44) | public List<Activity> getActivites() {
method setActivites (line 47) | @XmlElements({
method getServices (line 54) | public List<Service> getServices() {
method setServices (line 57) | @XmlElement(name="service")
method getReceivers (line 62) | public List<Receiver> getReceivers() {
method setReceivers (line 65) | @XmlElement(name="receiver")
method getProviders (line 70) | public List<Provider> getProviders() {
method setProviders (line 73) | @XmlElement(name="provider")
method isDebuggable (line 78) | public boolean isDebuggable() {
method setDebuggable (line 81) | @XmlAttribute(name="debuggable",namespace="http://schemas.android.com/...
method getName (line 86) | public String getName() {
method setName (line 90) | public void setName(String name) {
FILE: src/main/java/components/old/Category.java
class Category (line 20) | public class Category {
method getName (line 23) | public String getName() {
method setName (line 26) | public void setName(String name) {
method toString (line 30) | public String toString() {
FILE: src/main/java/components/old/DataUri.java
class DataUri (line 27) | public class DataUri {
method getScheme (line 31) | public String getScheme() {
method setScheme (line 34) | @XmlAttribute(name="scheme",namespace="http://schemas.android.com/apk/...
method getHost (line 38) | @XmlAttribute(name="host",namespace="http://schemas.android.com/apk/re...
method setHost (line 42) | public void setHost(String host) {
method getPort (line 45) | @XmlAttribute(name="port",namespace="http://schemas.android.com/apk/re...
method setPort (line 49) | public void setPort(String port) {
method getPath (line 52) | @XmlAttribute(name="path",namespace="http://schemas.android.com/apk/re...
method setPath (line 56) | public void setPath(String path) {
method getPathPrefix (line 59) | @XmlAttribute(name="pathPrefix",namespace="http://schemas.android.com/...
method setPathPrefix (line 63) | public void setPathPrefix(String pathPrefix) {
method getPathPattern (line 66) | @XmlAttribute(name="pathPattern",namespace="http://schemas.android.com...
method setPathPattern (line 70) | public void setPathPattern(String pathPattern) {
method getMimeType (line 73) | @XmlAttribute(name="mimeType",namespace="http://schemas.android.com/ap...
method setMimeType (line 77) | public void setMimeType(String mimeType) {
method getDataMap (line 81) | public Map<String,String> getDataMap(){
method fillScheme (line 99) | private void fillScheme(){
method fillRest (line 104) | private void fillRest(String key, String value){
FILE: src/main/java/components/old/IActivityService.java
type IActivityService (line 20) | public interface IActivityService {
method getIntent (line 22) | public List<Intent> getIntent();
method getName (line 23) | public String getName();
FILE: src/main/java/components/old/IComponent.java
type IComponent (line 20) | public interface IComponent {
method isExported (line 22) | public boolean isExported();
method setExported (line 23) | public void setExported(boolean isExported);
method getIntent (line 24) | public ArrayList<Intent> getIntent();
method getName (line 25) | public String getName();
method getPermission (line 26) | public String getPermission();
method setName (line 28) | public void setName(String name);
method setPermission (line 29) | public void setPermission(String permission);
method setIntent (line 30) | public void setIntent(ArrayList<Intent> intentFilters);
FILE: src/main/java/components/old/Intent.java
class Intent (line 25) | public class Intent {
method getAction (line 32) | public List<Action> getAction() {
method setAction (line 35) | @XmlElement
method getCategory (line 39) | public List<Category> getCategory() {
method setCategory (line 42) | @XmlElement
method getData (line 46) | public List<DataUri> getData() {
method setData (line 49) | @XmlElement
method getPriority (line 53) | public int getPriority() {
method setPriority (line 56) | @XmlAttribute
method toString (line 61) | public String toString() {
FILE: src/main/java/components/old/Manifest.java
class Manifest (line 25) | public class Manifest {
method getIntents (line 33) | public ArrayList<Intent> getIntents() {
method setIntents (line 37) | public void setIntents(ArrayList<Intent> intents) {
method getUsesPermissions (line 41) | public ArrayList<UsesPermission> getUsesPermissions() {
method setUsesPermissions (line 45) | public void setUsesPermissions(ArrayList<UsesPermission> usesPermissio...
method getPermissions (line 49) | public ArrayList<Permission> getPermissions() {
method setPermissions (line 53) | public void setPermissions(ArrayList<Permission> permissions) {
method getApplication (line 57) | public Application getApplication() {
method setApplication (line 61) | public void setApplication(Application application) {
method getPkgName (line 65) | public String getPkgName() {
method setPkgName (line 69) | public void setPkgName(String pkgName) {
FILE: src/main/java/components/old/Permission.java
class Permission (line 20) | public class Permission {
method getName (line 24) | public String getName() {
method setName (line 27) | @XmlAttribute(name="name",namespace="http://schemas.android.com/apk/re...
method getProtectionLevel (line 32) | public String getProtectionLevel() {
method setProtectionLevel (line 35) | @XmlAttribute(name="protectionLevel",namespace="http://schemas.android...
FILE: src/main/java/components/old/Provider.java
class Provider (line 22) | public class Provider implements IComponent{
method getName (line 28) | public String getName() {
method setName (line 31) | public void setName(String name) {
method getPermission (line 35) | public String getPermission() {
method setPermission (line 38) | public void setPermission(String permission) {
method getAuthorities (line 42) | public String getAuthorities() {
method setAuthorities (line 45) | public void setAuthorities(String authorities) {
method isExported (line 48) | public boolean isExported() {
method setExported (line 52) | public void setExported(boolean isExported) {
method getIntent (line 55) | public ArrayList<Intent> getIntent() {
method setIntent (line 58) | public void setIntent(ArrayList<Intent> intent) {
method getExp (line 62) | public String getExp() {
FILE: src/main/java/components/old/Receiver.java
class Receiver (line 23) | public class Receiver implements IComponent{
method isExported (line 29) | public boolean isExported() {
method setExported (line 32) | public void setExported(boolean isExported) {
method getExp (line 36) | public String getExp() {
method setExp (line 39) | public void setExp(String exp) {
method getName (line 43) | public String getName() {
method setName (line 46) | public void setName(String name) {
method getPermission (line 49) | public String getPermission() {
method setPermission (line 52) | public void setPermission(String permission) {
method getIntent (line 56) | public ArrayList<Intent> getIntent() {
method setIntent (line 59) | public void setIntent(ArrayList<Intent> intents) {
FILE: src/main/java/components/old/Service.java
class Service (line 24) | public class Service implements IComponent,IActivityService{
method Service (line 29) | public Service() {
method getName (line 33) | public String getName() {
method setName (line 36) | public void setName(String name) {
method getExp (line 40) | public String getExp() {
method setExp (line 43) | public void setExp(String exp) {
method isExported (line 47) | public boolean isExported() {
method setExported (line 51) | public void setExported(boolean isExported) {
method getIntent (line 55) | public ArrayList<Intent> getIntent() {
method setIntent (line 58) | public void setIntent(ArrayList<Intent> intent) {
method getPermission (line 62) | public String getPermission() {
method setPermission (line 65) | public void setPermission(String permission) {
FILE: src/main/java/components/old/UsesPermission.java
class UsesPermission (line 20) | public class UsesPermission {
method getName (line 24) | public String getName() {
method setName (line 28) | @XmlAttribute(name="name",namespace="http://schemas.android.com/apk/re...
FILE: src/main/java/components/old/XMLReader.java
class XMLReader (line 35) | public class XMLReader{
method XMLReader (line 39) | public XMLReader(String manifestFile) {
method unmarshalManifest (line 44) | public void unmarshalManifest() {
method getManifest (line 63) | public Manifest getManifest() {
FILE: src/main/java/db/DatabaseTester.java
class DatabaseTester (line 29) | public class DatabaseTester {
method DatabaseTester (line 33) | public DatabaseTester() {
method fetchAllDBs (line 38) | public ArrayList<File> fetchAllDBs(String dir){
method dbOption (line 51) | public void dbOption(String param){
method isFileDB (line 73) | public boolean isFileDB(File f){
method listDatabases (line 87) | public ArrayList<File> listDatabases(String dir){
method testDBAllFiles (line 109) | public void testDBAllFiles(String dir) {
method testDBEncryption (line 123) | public void testDBEncryption(File f){
method isDBEncrypted (line 138) | public boolean isDBEncrypted(String dbName) {
method chooseDBToDump (line 153) | public void chooseDBToDump(String dir){
method dumpDB (line 187) | public String dumpDB(String dbName){
method dumpDBToFile (line 199) | public String dumpDBToFile(String dbName,String dumpFile){
method searchForKeyInDb (line 217) | public void searchForKeyInDb(String key){
method searchForKeyInSingleDB (line 238) | private boolean searchForKeyInSingleDB(String key, File db){
method getKeyInfoFromDBDump (line 267) | private ArrayList<String> getKeyInfoFromDBDump(String key, String dump){
FILE: src/main/java/device/Packagez.java
class Packagez (line 24) | public class Packagez {
method searchPackage (line 27) | public boolean searchPackage(String key,boolean syso){
method isPackageExist (line 57) | public boolean isPackageExist(String pkgName){
method fetchInstalledPkgs (line 69) | public String fetchInstalledPkgs(){
method printInstalledPkgs (line 77) | public void printInstalledPkgs() {
method dumpInfo (line 87) | public ArrayList<String> dumpInfo(){
method getParameterFromDump (line 108) | public String getParameterFromDump(String par, String dump) {
FILE: src/main/java/exceptions/TNotFoundEx.java
class TNotFoundEx (line 18) | public class TNotFoundEx extends Exception {
method TNotFoundEx (line 19) | public TNotFoundEx(String message){
FILE: src/main/java/frida/FridaBase.java
class FridaBase (line 25) | public class FridaBase {
method FridaBase (line 27) | public FridaBase() {
method fridaEnumerateClasses (line 31) | public void fridaEnumerateClasses(boolean reuse){
method fridaScript (line 36) | public void fridaScript(ArrayList<String> args){
method fridaGetInputAndOutput (line 46) | public void fridaGetInputAndOutput(ArrayList<String> args, boolean reu...
method fridaSetValue (line 51) | public void fridaSetValue(ArrayList<String> args, boolean reuse){
method fridaUnpin (line 56) | public void fridaUnpin(ArrayList<String> args, boolean reuse) {
FILE: src/main/java/frida/FridaCli.java
class FridaCli (line 24) | public class FridaCli {
method FridaCli (line 29) | public FridaCli(){
method fridaThis (line 41) | public void fridaThis(String [] args, boolean reuse){
FILE: src/main/java/frida/FridaEnumerateClasses.java
class FridaEnumerateClasses (line 23) | public class FridaEnumerateClasses extends FridaJsAction{
method FridaEnumerateClasses (line 26) | public FridaEnumerateClasses(boolean reuseScript) {
method run (line 34) | public void run(){
FILE: src/main/java/frida/FridaGetArgsAndReturn.java
class FridaGetArgsAndReturn (line 32) | public class FridaGetArgsAndReturn extends FridaJsAction{
method FridaGetArgsAndReturn (line 35) | public FridaGetArgsAndReturn(boolean reuseScript) {
method run (line 43) | public void run(ArrayList<String> args){
method prepareCode (line 50) | private String prepareCode(ArrayList<String> args){
FILE: src/main/java/frida/FridaInit.java
class FridaInit (line 23) | public class FridaInit {
method FridaInit (line 28) | public FridaInit()
method initFrida (line 35) | public void initFrida(){
method isFrida (line 49) | private boolean isFrida(){
method isFridaServer (line 63) | private boolean isFridaServer(){
method isPython (line 72) | private boolean isPython(){
method startFridaServer (line 82) | public void startFridaServer(){
method stopFridaServer (line 87) | public void stopFridaServer(){
method restartFridaServer (line 103) | private void restartFridaServer() {
FILE: src/main/java/frida/FridaJsAction.java
class FridaJsAction (line 24) | public class FridaJsAction {
method execute (line 28) | public void execute(String finalCode) {
method executeSpawn (line 37) | public void executeSpawn(String finalCode){
method executeNoSpawn (line 46) | public void executeNoSpawn(String finalCode){
method getMethodArguments (line 55) | protected ArrayList<String> getMethodArguments(int num){
method isAppRunning (line 63) | public boolean isAppRunning() {
FILE: src/main/java/frida/FridaJsScript.java
class FridaJsScript (line 34) | public class FridaJsScript {
method FridaJsScript (line 40) | public FridaJsScript(String path) {
method run (line 46) | public void run(){
method prepareCommand (line 56) | public void prepareCommand(){
method prepareCommandSpawn (line 65) | public void prepareCommandSpawn(){
method prepareCommandNoSpawning (line 70) | public void prepareCommandNoSpawning(){
method writeCodeInScript (line 76) | public void writeCodeInScript(String code){
method getCodeFromScript (line 81) | public String getCodeFromScript(){
method getMethodArguments (line 93) | public ArrayList<String> getMethodArguments(int num){
method isAppRunning (line 101) | public boolean isAppRunning() {
FILE: src/main/java/frida/FridaPythonScript.java
class FridaPythonScript (line 25) | public class FridaPythonScript {
method FridaPythonScript (line 31) | public FridaPythonScript(){
method FridaPythonScript (line 35) | public FridaPythonScript(ArrayList<String>args){
method prepareArgs (line 41) | private void prepareArgs(ArrayList<String>args){
method execute (line 57) | public void execute(){
method execute (line 67) | public void execute(ArrayList<String> args){
method executeReturnOutput (line 72) | public ArrayList<String> executeReturnOutput(ArrayList<String> args){
method getOutput (line 83) | public String getOutput(ArrayList<String> args){
method setPath (line 87) | public void setPath(String path){
FILE: src/main/java/frida/FridaScript.java
class FridaScript (line 22) | public class FridaScript {
method FridaScript (line 27) | public FridaScript(){
method executeScript (line 31) | public ArrayList<String> executeScript(ArrayList<String> args){
method getOutput (line 42) | public String getOutput(ArrayList<String> args){
FILE: src/main/java/frida/FridaSetValue.java
class FridaSetValue (line 33) | public class FridaSetValue {
method FridaSetValue (line 38) | public FridaSetValue(boolean reuseScript) {
method run (line 47) | public void run(ArrayList<String> args){
method prepareCode (line 58) | private String prepareCode(ArrayList<String> args){
method getMethodArguments (line 101) | private ArrayList<String> getMethodArguments(int num){
method correctStringsInArgs (line 109) | private String correctStringsInArgs(String arg){
method getNewArgs (line 119) | private String getNewArgs(int totalNumOfArgs, int argNum, String value){
method isSetReturnValue (line 136) | private boolean isSetReturnValue(String arg4) {
FILE: src/main/java/frida/FridaUnpinSslContext.java
class FridaUnpinSslContext (line 23) | public class FridaUnpinSslContext extends FridaJsAction{
method FridaUnpinSslContext (line 26) | public FridaUnpinSslContext(boolean reuseScript) {
method run (line 36) | public void run(ArrayList<String> args){
method prepareCode (line 41) | private String prepareCode(ArrayList<String> args) {
FILE: src/main/java/frida/FridaVars.java
class FridaVars (line 20) | public abstract class FridaVars {
FILE: src/main/java/info/InfoGathering.java
class InfoGathering (line 38) | public class InfoGathering {
method InfoGathering (line 43) | public InfoGathering(){
method getSdcardDirectory (line 51) | public String getSdcardDirectory(){
method isExternalStorage (line 60) | public boolean isExternalStorage(){
method isExternalStorageDirectory (line 72) | private boolean isExternalStorageDirectory(String loc){
method getCertificatesInApkDirectory (line 92) | public void getCertificatesInApkDirectory(){
method checkTicklerMitmModification (line 114) | public boolean checkTicklerMitmModification(){
FILE: src/main/java/info/InfoGatheringReporting.java
class InfoGatheringReporting (line 32) | public class InfoGatheringReporting {
method InfoGatheringReporting (line 39) | public InfoGatheringReporting(){
method report (line 47) | public void report() {
method sdcardChecks (line 71) | private void sdcardChecks(){
method manifestAnalysis (line 95) | private void manifestAnalysis(){
method printDebuggableBackable (line 122) | private void printDebuggableBackable(){
method fetchContentUris (line 130) | public ArrayList<String> fetchContentUris(){
method printSchemes (line 135) | private void printSchemes(){
method isTicklerMitM (line 144) | private void isTicklerMitM(){
method getMetaData (line 154) | private void getMetaData(){
method findLibs (line 166) | private void findLibs() {
method printArrayList (line 176) | private void printArrayList(ArrayList<String> list){
FILE: src/main/java/info/ListComponents.java
class ListComponents (line 33) | public class ListComponents {
method ListComponents (line 36) | public ListComponents() {
method listThis (line 47) | public void listThis(int compType, boolean exported,boolean details){
method listType (line 65) | public void listType(int compType, boolean exported,boolean details){
method listComponent (line 93) | public void listComponent(String compName){
method listProvidersInCode (line 118) | private void listProvidersInCode(){
method printComponent (line 133) | private void printComponent(IComponent comp){
method printIntent (line 146) | private void printIntent(IComponent comp){
method printActions (line 166) | private void printActions(Intent i){
method printCategories (line 175) | private void printCategories(Intent i){
method printData (line 185) | private void printData(Intent i){
method printExtrasInfo (line 198) | private void printExtrasInfo(IComponent c){
method getCompClassName (line 213) | private String getCompClassName(IComponent c){
method getNamesOfCompTypes (line 229) | private ArrayList<String> getNamesOfCompTypes(int type, boolean export...
FILE: src/main/java/initialization/TicklerChecks.java
class TicklerChecks (line 38) | public class TicklerChecks {
method TicklerChecks (line 43) | public TicklerChecks(){
method initiaizeTickler (line 61) | public void initiaizeTickler(String pkgName) throws TNotFoundEx{
method initalizeTicklerNoDevice (line 85) | public void initalizeTicklerNoDevice(String pkgName) throws TNotFoundEx{
method checkDevices (line 102) | public void checkDevices() throws TNotFoundEx{
method isEmulator (line 120) | public boolean isEmulator() {
method checkRequirements (line 135) | public void checkRequirements() throws TNotFoundEx{
method checkToolOnHost (line 158) | private boolean checkToolOnHost(ArrayList<SimpleEntry> toolCheck) thro...
method isDex2Jar (line 174) | private void isDex2Jar() throws TNotFoundEx {
method loadConfiguration (line 183) | public void loadConfiguration(){
method getJarLocation (line 241) | public String getJarLocation(){
method getLibName (line 257) | public void getLibName(){
method checkExternalLibDir (line 270) | private void checkExternalLibDir() throws TNotFoundEx{
method correctJarLoc (line 286) | public String correctJarLoc(String jarLoc){
method createEssentialDirs (line 311) | private void createEssentialDirs() throws TNotFoundEx{
method isPkgNameExist (line 322) | private boolean isPkgNameExist(String pkgName){
method isPkgFoundOffline (line 338) | private boolean isPkgFoundOffline(String pkgName) {
FILE: src/main/java/initialization/TicklerConst.java
class TicklerConst (line 18) | public class TicklerConst {
FILE: src/main/java/initialization/TicklerVars.java
class TicklerVars (line 18) | public abstract class TicklerVars {
method setPkgName (line 29) | public static void setPkgName(String pName){
method updateVars (line 36) | public static void updateVars(String pName){
method setTicklerDir (line 70) | public static void setTicklerDir(String dir){
method replaceSpace (line 74) | public static String replaceSpace(String s){
FILE: src/main/java/logs/LogReader.java
class LogReader (line 31) | public class LogReader implements Runnable {
method LogReader (line 37) | public LogReader(LogReaderController controller){
method run (line 43) | @Override
method readWriteLogCat (line 48) | public void readWriteLogCat(){
method executeLogcat (line 55) | public void executeLogcat(String command, File logFile){
method closeWriter (line 80) | public void closeWriter(){
method getLogFileName (line 88) | public String getLogFileName() {
method setLogFileName (line 92) | public void setLogFileName(String logFileName) {
FILE: src/main/java/logs/LogReaderController.java
class LogReaderController (line 18) | public class LogReaderController {
method getLogFileName (line 22) | public String getLogFileName() {
method setLogFileName (line 25) | public void setLogFileName(String logFileName) {
method isStop (line 28) | public boolean isStop() {
method setStop (line 31) | public void setStop(boolean stop) {
FILE: src/main/java/manifest/ManifestAnalyzer.java
class ManifestAnalyzer (line 40) | public class ManifestAnalyzer {
method ManifestAnalyzer (line 45) | public ManifestAnalyzer(Manifest manifest) {
method collectAllComponents (line 52) | public void collectAllComponents() {
method collectExportedComponents (line 65) | public void collectExportedComponents() {
method getComponentByName (line 98) | public IComponent getComponentByName(String compName){
method getComponentsOfType (line 109) | public ArrayList<IComponent> getComponentsOfType(int i, boolean exp) {
method getUsesPermissions (line 127) | public ArrayList<String> getUsesPermissions(){
method getComponentPermissions (line 142) | public ArrayList<SimpleEntry> getComponentPermissions(){
method getSchemes (line 156) | public ArrayList<String> getSchemes(){
method getManifest (line 181) | public Manifest getManifest() {
method setManifest (line 185) | public void setManifest(Manifest manifest) {
method getComponents (line 189) | public ArrayList<IComponent> getComponents() {
method setComponents (line 194) | public void setComponents(ArrayList<IComponent> components) {
method getExported (line 198) | public ArrayList<IComponent> getExported() {
method setExported (line 202) | public void setExported(ArrayList<IComponent> exported) {
method getComponents (line 206) | public ArrayList<IComponent> getComponents(boolean exp) {
method getHidden (line 213) | public ArrayList<IComponent> getHidden() {
method setHidden (line 217) | public void setHidden(ArrayList<IComponent> hidden) {
FILE: src/main/java/manifest/ManifestDealer.java
class ManifestDealer (line 40) | public class ManifestDealer {
method meetThePackage (line 49) | public void meetThePackage(String pkgName){
method dex2Jar (line 86) | private void dex2Jar(){
method copyApkFromDevice (line 98) | private void copyApkFromDevice() {
method isApkExist (line 107) | private boolean isApkExist(){
method apkToolDecode (line 120) | private void apkToolDecode(String apkPath) throws TNotFoundEx{
method getPackageApkPath (line 126) | private String getPackageApkPath(){
method getApkName (line 133) | public String getApkName(){
method analyzeManifest (line 150) | public void analyzeManifest(String manifestPath){
method generateManifestFromXML (line 157) | public Manifest generateManifestFromXML(String path){
method getFileNameFromPath (line 165) | private String getFileNameFromPath(String path){
method getComponentsOfType (line 177) | public ArrayList<IComponent> getComponentsOfType(int i, boolean exp) {
method isComponentExist (line 189) | public boolean isComponentExist(String compName){
method getComponentByName (line 201) | public IComponent getComponentByName(String compName){
method getPkgName (line 208) | public String getPkgName() {
method setPkgName (line 212) | public void setPkgName(String pkgName) {
method getManifestPath (line 219) | public String getManifestPath() {
method setManifestPath (line 223) | public void setManifestPath(String path) {
method wasApkExist (line 227) | public boolean wasApkExist() {
FILE: src/main/java/manifest/handlers/DataUriHandler.java
class DataUriHandler (line 26) | public class DataUriHandler {
method DataUriHandler (line 31) | public DataUriHandler(Intent intent){
method doIt (line 38) | public void doIt(){
method collectMap (line 53) | private ArrayList<Map<String,String>> collectMap(){
method createDUsForSchemes (line 68) | private ArrayList<DataUri> createDUsForSchemes(){
method isMapComplete (line 90) | private boolean isMapComplete(Map<String,String> map){
method addCompleteToMishmash (line 98) | private void addCompleteToMishmash(){
method addMimeTypeOnly (line 102) | private void addMimeTypeOnly(){
method isMimeTypeOnly (line 110) | private boolean isMimeTypeOnly(){
method addDataUriComp (line 118) | private void addDataUriComp(String compName){
method updateTotalDU (line 127) | private void updateTotalDU(String compName, Map<String,String> h){
method clearPathValuesCuzConflict (line 154) | private void clearPathValuesCuzConflict(DataUri d){
method addCompByType (line 167) | private DataUri addCompByType(String name,String value,DataUri d){
method isDataUriCompEmpty (line 208) | private boolean isDataUriCompEmpty(String name, DataUri d) {
method isPathConflict (line 220) | private boolean isPathConflict(String compName,DataUri d){
method getDataUriFromMap (line 226) | private DataUri getDataUriFromMap(Map<String,String> h){
method copyDataUri (line 237) | private DataUri copyDataUri(DataUri d){
method printData (line 254) | public void printData(DataUri d) {
method getStartCommand (line 282) | public String getStartCommand(DataUri d) {
method replaceAstrexInPathValues (line 346) | private String replaceAstrexInPathValues(String path){
method getTotalDU (line 357) | public ArrayList<DataUri> getTotalDU() {
method setTotalDU (line 361) | public void setTotalDU(ArrayList<DataUri> totalDU) {
FILE: src/main/java/manifest/handlers/IntentHandler.java
class IntentHandler (line 26) | public class IntentHandler {
method IntentHandler (line 31) | public IntentHandler(String origCommand,Intent intent) {
method fullIntent (line 43) | public ArrayList<String> fullIntent() {
method addActions (line 52) | private void addActions() {
method addData (line 62) | private void addData(){
method updateCommandsList (line 80) | private void updateCommandsList(String s) {
Condensed preview — 174 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (467K chars).
[
{
"path": ".gradle/8.8/dependencies-accessors/gc.properties",
"chars": 0,
"preview": ""
},
{
"path": ".gradle/8.9/dependencies-accessors/gc.properties",
"chars": 0,
"preview": ""
},
{
"path": ".gradle/8.9/gc.properties",
"chars": 0,
"preview": ""
},
{
"path": ".gradle/buildOutputCleanup/cache.properties",
"chars": 49,
"preview": "#Fri Mar 07 17:06:23 CET 2025\ngradle.version=8.8\n"
},
{
"path": ".gradle/vcs-1/gc.properties",
"chars": 0,
"preview": ""
},
{
"path": "LICENSE",
"chars": 11359,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 13595,
"preview": "**AndroTickler**\n=================\n\nA java tool that helps to pentest Android apps faster, more easily and more efficien"
},
{
"path": "Tickler.conf",
"chars": 120,
"preview": "Tickler_local_directory = \nTickler_sdcard_directory = /sdcard/Tickler/\nFrida_server_path = /data/local/tmp/frida-server\n"
},
{
"path": "build.gradle",
"chars": 868,
"preview": "apply plugin: 'java'\napply plugin: 'eclipse'\n\nrepositories {\n jcenter()\n mavenCentral()\n}\n\n\ndependencies {\n\n compi"
},
{
"path": "libs/notJars/dex2jar-2.1/LICENSE.txt",
"chars": 11562,
"preview": "\r\n Apache License\r\n Version 2.0, January 2004\r\n "
},
{
"path": "libs/notJars/dex2jar-2.1/NOTICE.txt",
"chars": 341,
"preview": "dex2jar - Tools to work with android .dex and java .class files\r\nCopyright (c) 2009-2014 Panxiaobo\r\n\r\ncontributors\r\n - "
},
{
"path": "libs/notJars/dex2jar-2.1/bin/dex-tools",
"chars": 5884,
"preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n## dex-tools start"
},
{
"path": "libs/notJars/dex2jar-2.1/bin/dex-tools.bat",
"chars": 2874,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-apk-sign.bat",
"chars": 834,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-apk-sign.sh",
"chars": 1360,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-asm-verify.bat",
"chars": 836,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-asm-verify.sh",
"chars": 1362,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-baksmali.bat",
"chars": 834,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-baksmali.sh",
"chars": 1360,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-class-version-switch.bat",
"chars": 845,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-class-version-switch.sh",
"chars": 1371,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-decrypt-string.bat",
"chars": 843,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-decrypt-string.sh",
"chars": 1369,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex-recompute-checksum.bat",
"chars": 847,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex-recompute-checksum.sh",
"chars": 1373,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex-weaver.bat",
"chars": 839,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex-weaver.sh",
"chars": 1365,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex2jar.bat",
"chars": 837,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex2jar.sh",
"chars": 1363,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex2smali.bat",
"chars": 834,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-dex2smali.sh",
"chars": 1360,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar-access.bat",
"chars": 839,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar-access.sh",
"chars": 1365,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar-weaver.bat",
"chars": 839,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar-weaver.sh",
"chars": 1365,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar2dex.bat",
"chars": 834,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar2dex.sh",
"chars": 1360,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar2jasmin.bat",
"chars": 837,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jar2jasmin.sh",
"chars": 1363,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jasmin2jar.bat",
"chars": 837,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-jasmin2jar.sh",
"chars": 1363,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-smali.bat",
"chars": 831,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-smali.sh",
"chars": 1357,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-std-apk.bat",
"chars": 836,
"preview": "@echo off\r\n\r\nREM\r\nREM dex2jar - Tools to work with android .dex and java .class files\r\nREM Copyright (c) 2009-2013 Panxi"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j-std-apk.sh",
"chars": 1362,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/d2j_invoke.bat",
"chars": 326,
"preview": "@echo off\r\nREM better invocation scripts for windows from lanchon, release in public domain. thanks!\r\nREM https://code.g"
},
{
"path": "libs/notJars/dex2jar-2.1/d2j_invoke.sh",
"chars": 1321,
"preview": "#!/bin/sh\n\n#\n# dex2jar - Tools to work with android .dex and java .class files\n# Copyright (c) 2009-2013 Panxiaobo\n# \n# "
},
{
"path": "libs/notJars/dex2jar-2.1/lib/open-source-license.txt",
"chars": 3210,
"preview": "==== dx-*.jar\nApache 2.0 http://www.apache.org/licenses/LICENSE-2.0.html\n\n\n==== antlr-*.jar\n[The BSD License]\nCopyright "
},
{
"path": "libs/notJars/fridaScripts/enumerate_classes.py",
"chars": 659,
"preview": "#!/usr/bin/python\nimport frida\nimport sys\nappName= sys.argv[1]\nprint(appName)\n# put your javascript-code here\njscode= \"\""
},
{
"path": "libs/notJars/fridaScripts/get_attributes_output.js",
"chars": 440,
"preview": "\t setTimeout(function(){\t\n\t Java.perform(function () {\t\n\t var className = Java.use(\"java.lang.S"
},
{
"path": "libs/notJars/fridaScripts/unpin_sslContext.py",
"chars": 2951,
"preview": "#!/usr/bin/python\nimport frida\nimport sys\nappName= sys.argv[1]\n\ndef on_message(message, data):\n if message['type'] =="
},
{
"path": "src/main/java/.gradle/2.10/taskArtifacts/cache.properties",
"chars": 30,
"preview": "#Fri Mar 06 02:03:30 CET 2020\n"
},
{
"path": "src/main/java/actions/Comparer.java",
"chars": 6473,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/actions/Comparer_Old.java",
"chars": 5648,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/actions/Searcher.java",
"chars": 7484,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/actions/Snapshots.java",
"chars": 2645,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/ApkSigner.java",
"chars": 2276,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/ApkToolClass.java",
"chars": 3440,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/ApkToolDude.java",
"chars": 2334,
"preview": "package apk;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.PrintStream;\n\nimport base.FileUtil;\ni"
},
{
"path": "src/main/java/apk/AppBroker.java",
"chars": 4196,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/Decompiler.java",
"chars": 3621,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/newApks/CreateApk.java",
"chars": 3807,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/newApks/Debuggable.java",
"chars": 1761,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/newApks/INewApk.java",
"chars": 926,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/apk/newApks/NougatMitM.java",
"chars": 2650,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/attacks/ActivityStarter.java",
"chars": 2637,
"preview": "/*******************************************************************************\n\n * Copyright 2017 Ahmad Abolhadid\n * \n"
},
{
"path": "src/main/java/attacks/Broadcaster.java",
"chars": 1675,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/attacks/ProviderAttacker.java",
"chars": 4305,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/attacks/StartAttack.java",
"chars": 5081,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/attacks/Starter.java",
"chars": 4370,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/Base64Util.java",
"chars": 3408,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/CopyUtil.java",
"chars": 4300,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/DOMXMLReader.java",
"chars": 9495,
"preview": "package base;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\n\nimport javax.xml.crypto.Dat"
},
{
"path": "src/main/java/base/FileUtil.java",
"chars": 9324,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/JsonParser.java",
"chars": 4210,
"preview": "package base;\n\nimport java.io.File;\nimport java.io.FileReader;\nimport java.text.ParseException;\nimport java.util.Abstrac"
},
{
"path": "src/main/java/base/OtherUtil.java",
"chars": 3958,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/SearchUtil.java",
"chars": 6711,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/Tickler.java",
"chars": 11152,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/base/TicklerGeneral.java",
"chars": 209,
"preview": "package base;\n\nimport java.util.ArrayList;\n\npublic class TicklerGeneral {\n\t\n\t//Static Arraylist containing all Data URI "
},
{
"path": "src/main/java/base/XMLReader.java",
"chars": 1910,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/cliGui/OutBut.java",
"chars": 2365,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/cliGui/TicklerCLI.java",
"chars": 13463,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/code/ClassExtras.java",
"chars": 6336,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/code/ExtrasUtil.java",
"chars": 3296,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/code/JavaSqueezer.java",
"chars": 18368,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/commandExec/Commando.java",
"chars": 8673,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Action.java",
"chars": 1006,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Activity.java",
"chars": 1584,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Application.java",
"chars": 2072,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Category.java",
"chars": 1018,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/DataUri.java",
"chars": 2526,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/IActivityService.java",
"chars": 901,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/IComponent.java",
"chars": 1155,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Intent.java",
"chars": 1741,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Manifest.java",
"chars": 1849,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Permission.java",
"chars": 1120,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Provider.java",
"chars": 1666,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Receiver.java",
"chars": 1569,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/Service.java",
"chars": 1653,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/UsesPermission.java",
"chars": 944,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Action.java",
"chars": 1010,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Activity.java",
"chars": 1588,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Application.java",
"chars": 2475,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Category.java",
"chars": 1070,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/DataUri.java",
"chars": 3170,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/IActivityService.java",
"chars": 905,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/IComponent.java",
"chars": 1159,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Intent.java",
"chars": 1937,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Manifest.java",
"chars": 1994,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Permission.java",
"chars": 1346,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Provider.java",
"chars": 1718,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Receiver.java",
"chars": 1665,
"preview": "/*******************************************************************************\n * Copyright 2019 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/Service.java",
"chars": 1749,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/UsesPermission.java",
"chars": 1079,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/components/old/XMLReader.java",
"chars": 1910,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/db/DatabaseTester.java",
"chars": 7545,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/device/Packagez.java",
"chars": 3282,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/docs/helpMsg.txt",
"chars": 4163,
"preview": "\tusage: Tickler\t\n ==============\n\tPlease make sure that the configuration file: Tickler.conf is at the same direc"
},
{
"path": "src/main/java/exceptions/TNotFoundEx.java",
"chars": 883,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaBase.java",
"chars": 1916,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaCli.java",
"chars": 1802,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaEnumerateClasses.java",
"chars": 1284,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaGetArgsAndReturn.java",
"chars": 2270,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaInit.java",
"chars": 2604,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaJsAction.java",
"chars": 1968,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaJsScript.java",
"chars": 2830,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaPythonScript.java",
"chars": 2596,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaScript.java",
"chars": 1335,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaSetValue.java",
"chars": 4142,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaUnpinSslContext.java",
"chars": 1755,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/frida/FridaVars.java",
"chars": 5954,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/info/InfoGathering.java",
"chars": 3581,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/info/InfoGatheringReporting.java",
"chars": 5343,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/info/ListComponents.java",
"chars": 5922,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/initialization/TicklerChecks.java",
"chars": 11068,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/initialization/TicklerConst.java",
"chars": 7819,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/initialization/TicklerVars.java",
"chars": 3130,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/logs/LogReader.java",
"chars": 2480,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/logs/LogReaderController.java",
"chars": 1118,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/manifest/ManifestAnalyzer.java",
"chars": 5952,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/manifest/ManifestDealer.java",
"chars": 6483,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/manifest/handlers/DataUriHandler.java",
"chars": 9338,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
},
{
"path": "src/main/java/manifest/handlers/IntentHandler.java",
"chars": 2371,
"preview": "/*******************************************************************************\n * Copyright 2017 Ahmad Abolhadid\n * \n "
}
]
// ... and 31 more files (download for full content)
About this extraction
This page contains the full source code of the ernw/AndroTickler GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 174 files (16.0 MB), approximately 109.2k tokens, and a symbol index with 854 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.