Java源码示例:soot.jimple.infoflow.android.axml.AXmlAttribute
示例1
@SuppressWarnings("unchecked")
private static void addMaxPrioForSMSReceiver(ProcessManifest manifest) {
for(AXmlNode receiver : manifest.getReceivers()) {
for(AXmlNode receiverChild : receiver.getChildren()) {
if(receiverChild.getTag().equals("intent-filter")) {
//search for SMS receiver
for(AXmlNode childChild : receiverChild.getChildren()) {
if(childChild.getTag().equals("action")) {
if(childChild.hasAttribute("name") && ((String)childChild.getAttribute("name").getValue()).equalsIgnoreCase("android.provider.Telephony.SMS_RECEIVED")){
//prepare the priority filter
if(receiverChild.hasAttribute("priority"))
((AXmlAttribute<Integer>)receiverChild.getAttribute("priority")).setValue(Integer.MAX_VALUE);
else {
AXmlAttribute<Integer> attr = new AXmlAttribute<Integer>("priority", Integer.MAX_VALUE, ANDROID_NAMESPACE);
receiverChild.addAttribute(attr);
}
}
}
}
}
}
}
}
示例2
private boolean isComponentExported(AXmlNode node)
{
boolean accessible = false;
AXmlAttribute<?> attrEnabled = node.getAttribute("enabled");
if (attrEnabled == null || !attrEnabled.getValue().equals(Boolean.FALSE)) {
AXmlAttribute<?> attrExported = node.getAttribute("exported");
if (attrExported != null){
if(attrExported.getValue().equals(Boolean.TRUE)) {
accessible = true;
}
else if(attrExported.getValue().equals(Boolean.FALSE))
{
accessible = false;
}
}
else
{
if(node.getChildrenWithTag("intent-filter").size() != 0) {
accessible = true;
}
}
}
return accessible;
}
示例3
private void checkAndAddComponent(Set<String> entryPoints, AXmlNode node) {
AXmlAttribute<?> attrEnabled = node.getAttribute("enabled");
if (attrEnabled == null || !attrEnabled.getValue().equals(Boolean.FALSE)) {
AXmlAttribute<?> attr = node.getAttribute("name");
if (attr != null)
entryPoints.add(expandClassName((String) attr.getValue()));
else {
// This component does not have a name, so this might be obfuscated
// malware. We apply a heuristic.
for (Entry<String, AXmlAttribute<?>> a : node.getAttributes().entrySet())
if (a.getValue().getName().isEmpty()
&& a.getValue().getType() == AxmlVisitor.TYPE_STRING) {
String name = (String) a.getValue().getValue();
if (isValidComponentName(name))
entryPoints.add(expandClassName(name));
}
}
}
}
示例4
/**
* Gets the permissions this application requests
* @return The permissions requested by this application
* @return
*/
public Set<String> getPermissions() {
List<AXmlNode> usesPerms = this.manifest.getChildrenWithTag("uses-permission");
Set<String> permissions = new HashSet<String>();
for (AXmlNode perm : usesPerms) {
AXmlAttribute<?> attr = perm.getAttribute("name");
if (attr != null)
permissions.add((String) attr.getValue());
else {
// The required "name" attribute is missing, so we collect all empty
// attributes as a best-effort solution for broken malware apps
for (AXmlAttribute<?> a : perm.getAttributes().values())
if (a.getType() == AxmlVisitor.TYPE_STRING && a.getName().isEmpty())
permissions.add((String) a.getValue());
}
}
return permissions;
}
示例5
private void checkAndAddComponent(Set<String> entryPoints, AXmlNode node) {
AXmlAttribute<?> attrEnabled = node.getAttribute("enabled");
if (attrEnabled == null || !attrEnabled.getValue().equals(Boolean.FALSE)) {
AXmlAttribute<?> attr = node.getAttribute("name");
if (attr != null)
entryPoints.add(expandClassName((String) attr.getValue()));
else {
// This component does not have a name, so this might be obfuscated
// malware. We apply a heuristic.
for (Entry<String, AXmlAttribute<?>> a : node.getAttributes().entrySet())
if (a.getValue().getName().isEmpty()
&& a.getValue().getType() == AxmlVisitor.TYPE_STRING) {
String name = (String) a.getValue().getValue();
if (isValidComponentName(name))
entryPoints.add(expandClassName(name));
}
}
}
}
示例6
/**
* Gets the permissions this application requests
* @return The permissions requested by this application
* @return
*/
public Set<String> getPermissions() {
List<AXmlNode> usesPerms = this.manifest.getChildrenWithTag("uses-permission");
Set<String> permissions = new HashSet<String>();
for (AXmlNode perm : usesPerms) {
AXmlAttribute<?> attr = perm.getAttribute("name");
if (attr != null)
permissions.add((String) attr.getValue());
else {
// The required "name" attribute is missing, so we collect all empty
// attributes as a best-effort solution for broken malware apps
for (AXmlAttribute<?> a : perm.getAttributes().values())
if (a.getType() == AxmlVisitor.TYPE_STRING && a.getName().isEmpty())
permissions.add((String) a.getValue());
}
}
return permissions;
}
示例7
private static void addComponentCallerService(ProcessManifest androidManifest) {
AXmlNode componentCallerService = new AXmlNode("service", null, androidManifest.getApplication());
AXmlAttribute<String> nameAttribute = new AXmlAttribute<String>("name", UtilInstrumenter.COMPONENT_CALLER_SERVICE_HELPER, ANDROID_NAMESPACE);
AXmlAttribute<String> exportedAttribute = new AXmlAttribute<String>("exported", "false", ANDROID_NAMESPACE);
componentCallerService.addAttribute(nameAttribute);
componentCallerService.addAttribute(exportedAttribute);
androidManifest.addService(componentCallerService);
}
示例8
private static void addHookinHelperAsApplicationIfNecessary(ProcessManifest androidManifest){
AXmlNode application = androidManifest.getApplication();
if(!application.hasAttribute("name")) {
AXmlAttribute<String> nameAttribute = new AXmlAttribute<String>("name", UtilInstrumenter.HELPER_APPLICATION_FOR_HOOKING, ANDROID_NAMESPACE);
application.addAttribute(nameAttribute);
}
}
示例9
private static void addTracingService(ProcessManifest androidManifest) {
AXmlNode tracingService = new AXmlNode("service", null, androidManifest.getApplication());
AXmlAttribute<String> nameAttribute = new AXmlAttribute<String>("name", UtilInstrumenter.HELPER_SERVICE_FOR_PATH_TRACKING, ANDROID_NAMESPACE);
AXmlAttribute<String> exportedAttribute = new AXmlAttribute<String>("exported", "false", ANDROID_NAMESPACE);
tracingService.addAttribute(nameAttribute);
tracingService.addAttribute(exportedAttribute);
androidManifest.addService(tracingService);
}
示例10
/**
* Parses the attributes required for a layout file inclusion
* @param layoutFile The full path and file name of the file being parsed
* @param rootNode The AXml node containing the attributes
*/
private void parseIncludeAttributes(String layoutFile, AXmlNode rootNode) {
for (Entry<String, AXmlAttribute<?>> entry : rootNode.getAttributes().entrySet()) {
String attrName = entry.getKey().trim();
AXmlAttribute<?> attr = entry.getValue();
if (attrName.equals("layout")) {
if ((attr.getType() == AxmlVisitor.TYPE_REFERENCE || attr.getType() == AxmlVisitor.TYPE_INT_HEX)
&& attr.getValue() instanceof Integer) {
// We need to get the target XML file from the binary manifest
AbstractResource targetRes = resParser.findResource((Integer) attr.getValue());
if (targetRes == null) {
System.err.println("Target resource " + attr.getValue() + " for layout include not found");
return;
}
if (!(targetRes instanceof StringResource)) {
System.err.println("Invalid target node for include tag in layout XML, was "
+ targetRes.getClass().getName());
return;
}
String targetFile = ((StringResource) targetRes).getValue();
// If we have already processed the target file, we can
// simply copy the callbacks we have found there
if (callbackMethods.containsKey(targetFile))
for (String callback : callbackMethods.get(targetFile))
addCallbackMethod(layoutFile, callback);
else {
// We need to record a dependency to resolve later
addToMapSet(includeDependencies, targetFile, layoutFile);
}
}
}
}
}
示例11
private void checkPublicAccessibleCompoenent(Set<String> entryPoints, AXmlNode node)
{
if (isComponentExported(node)) {
AXmlAttribute<?> attr = node.getAttribute("name");
if (attr != null)
entryPoints.add(expandClassName((String) attr.getValue()));
}
}
示例12
public String getPackageName() {
if (cache_PackageName == null) {
AXmlAttribute<?> attr = this.manifest.getAttribute("package");
if (attr != null)
cache_PackageName = (String) attr.getValue();
}
return cache_PackageName;
}
示例13
/**
* Gets the minimum SDK version on which this application is supposed to run
* @return The minimum SDK version on which this application is supposed to run
*/
public int getMinSdkVersion() {
List<AXmlNode> usesSdk = this.manifest.getChildrenWithTag("uses-sdk");
if (usesSdk == null || usesSdk.isEmpty())
return -1;
AXmlAttribute<?> attr = usesSdk.get(0).getAttribute("minSdkVersion");
if (attr == null)
return -1;
if (attr.getValue() instanceof Integer)
return (Integer) attr.getValue();
return Integer.getInteger((String) attr.getValue());
}
示例14
/**
* Gets the target SDK version for which this application was developed
* @return The target SDK version for which this application was developed
*/
public int targetSdkVersion() {
List<AXmlNode> usesSdk = this.manifest.getChildrenWithTag("uses-sdk");
if (usesSdk == null || usesSdk.isEmpty())
return -1;
AXmlAttribute<?> attr = usesSdk.get(0).getAttribute("targetSdkVersion");
if (attr == null)
return -1;
if (attr.getValue() instanceof Integer)
return (Integer) attr.getValue();
return Integer.getInteger((String) attr.getValue());
}
示例15
public String getPackageName() {
if (cache_PackageName == null) {
AXmlAttribute<?> attr = this.manifest.getAttribute("package");
if (attr != null)
cache_PackageName = (String) attr.getValue();
}
return cache_PackageName;
}
示例16
/**
* Gets the minimum SDK version on which this application is supposed to run
* @return The minimum SDK version on which this application is supposed to run
*/
public int getMinSdkVersion() {
List<AXmlNode> usesSdk = this.manifest.getChildrenWithTag("uses-sdk");
if (usesSdk == null || usesSdk.isEmpty())
return -1;
AXmlAttribute<?> attr = usesSdk.get(0).getAttribute("minSdkVersion");
if (attr == null)
return -1;
if (attr.getValue() instanceof Integer)
return (Integer) attr.getValue();
return Integer.parseInt("" + attr.getValue());
}
示例17
/**
* Gets the target SDK version for which this application was developed
* @return The target SDK version for which this application was developed
*/
public int targetSdkVersion() {
List<AXmlNode> usesSdk = this.manifest.getChildrenWithTag("uses-sdk");
if (usesSdk == null || usesSdk.isEmpty())
return -1;
AXmlAttribute<?> attr = usesSdk.get(0).getAttribute("targetSdkVersion");
if (attr == null)
return -1;
if (attr.getValue() instanceof Integer)
return (Integer) attr.getValue();
return Integer.parseInt("" + attr.getValue());
}
示例18
/**
* Get the package name of the application
* @param apkFileLocation
* @return
*/
public static String getApplicationPackageName(String apkFileLocation) {
String packageName = null;
try {
ProcessManifest pm = new ProcessManifest(apkFileLocation);
AXmlHandler axmlh = pm.getAXml();
// Find main activity and remove main intent-filter
List<AXmlNode> anodes = axmlh.getNodesWithTag("manifest");
for (AXmlNode an: anodes) {
boolean hasMain = false;
boolean hasLauncher = false;
AXmlNode filter = null;
AXmlAttribute aname = an.getAttribute("package");
String aval = (String)aname.getValue();
packageName = aval;
System.out.println("package: "+ packageName);
break;
}
} catch (IOException | XmlPullParserException ex) {
System.err.println("Could not read Android manifest file: " + ex.getMessage());
throw new RuntimeException(ex);
}
return packageName;
}
示例19
/**
* Parses the layout file with the given root node
* @param layoutFile The full path and file name of the file being parsed
* @param rootNode The root node from where to start parsing
*/
private void parseLayoutNode(String layoutFile, AXmlNode rootNode) {
if (rootNode.getTag() == null || rootNode.getTag().isEmpty()) {
System.err.println("Encountered a null or empty node name "
+ "in file " + layoutFile + ", skipping node...");
return;
}
String tname = rootNode.getTag().trim();
if (tname.equals("dummy")) {
// dummy root node, ignore it
}
// Check for inclusions
else if (tname.equals("include")) {
parseIncludeAttributes(layoutFile, rootNode);
}
// The "merge" tag merges the next hierarchy level into the current
// one for flattening hierarchies.
else if (tname.equals("merge")) {
// do not consider any attributes of this elements, just
// continue with the children
}
else if (tname.equals("fragment")) {
final AXmlAttribute<?> attr = rootNode.getAttribute("name");
if (attr == null)
System.err.println("Fragment without class name detected");
else {
if (attr.getType() != AxmlVisitor.TYPE_STRING)
System.err.println("Invalid targer resource "+attr.getValue()+"for fragment class value");
getLayoutClass(attr.getValue().toString());
}
}
else {
final SootClass childClass = getLayoutClass(tname);
if (childClass != null && (isLayoutClass(childClass) || isViewClass(childClass)))
parseLayoutAttributes(layoutFile, childClass, rootNode);
}
// Parse the child nodes
for (AXmlNode childNode : rootNode.getChildren())
parseLayoutNode(layoutFile, childNode);
}
示例20
/**
* Parses the layout attributes in the given AXml node
* @param layoutFile The full path and file name of the file being parsed
* @param layoutClass The class for the attributes are parsed
* @param rootNode The AXml node containing the attributes
*/
private void parseLayoutAttributes(String layoutFile, SootClass layoutClass, AXmlNode rootNode) {
boolean isSensitive = false;
int id = -1;
for (Entry<String, AXmlAttribute<?>> entry : rootNode.getAttributes().entrySet()) {
String attrName = entry.getKey().trim();
AXmlAttribute<?> attr = entry.getValue();
// On obfuscated Android malware, the attribute name may be empty
if (attrName.isEmpty())
continue;
// Check that we're actually working on an android attribute
if (!isAndroidNamespace(attr.getNamespace()))
continue;
// Read out the field data
if (attrName.equals("id")
&& (attr.getType() == AxmlVisitor.TYPE_REFERENCE || attr.getType() == AxmlVisitor.TYPE_INT_HEX))
id = (Integer) attr.getValue();
else if (attrName.equals("password")) {
if (attr.getType() == AxmlVisitor.TYPE_INT_HEX)
isSensitive = ((Integer) attr.getValue()) != 0; // -1 for true, 0 for false
else if (attr.getType() == AxmlVisitor.TYPE_INT_BOOLEAN)
isSensitive = (Boolean) attr.getValue();
else
throw new RuntimeException("Unknown representation of boolean data type");
}
else if (!isSensitive && attrName.equals("inputType") && attr.getType() == AxmlVisitor.TYPE_INT_HEX) {
int tp = (Integer) attr.getValue();
isSensitive = ((tp & TYPE_NUMBER_VARIATION_PASSWORD) == TYPE_NUMBER_VARIATION_PASSWORD)
|| ((tp & TYPE_TEXT_VARIATION_PASSWORD) == TYPE_TEXT_VARIATION_PASSWORD)
|| ((tp & TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) == TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
|| ((tp & TYPE_TEXT_VARIATION_WEB_PASSWORD) == TYPE_TEXT_VARIATION_WEB_PASSWORD);
}
else if (isActionListener(attrName)
&& attr.getType() == AxmlVisitor.TYPE_STRING
&& attr.getValue() instanceof String) {
String strData = ((String) attr.getValue()).trim();
addCallbackMethod(layoutFile, strData);
}
else if (attr.getType() == AxmlVisitor.TYPE_STRING && attrName.equals("text")) {
// To avoid unrecognized attribute for "text" field
}
else if (DEBUG && attr.getType() == AxmlVisitor.TYPE_STRING) {
System.out.println("Found unrecognized XML attribute: " + attrName);
}
}
// Register the new user control
addToMapSet(this.userControls, layoutFile, new LayoutControl(id, layoutClass, isSensitive));
}
示例21
/**
* Gets the application's version name as it is displayed to the user
* @return The application#s version name as in pretty print
*/
public String getVersionName() {
AXmlAttribute<?> attr = this.manifest.getAttribute("versionName");
return attr == null ? null : (String) attr.getValue();
}
示例22
/**
* Gets the name of the Android application class
* @return The name of the Android application class
*/
public String getApplicationName() {
AXmlAttribute<?> attr = this.application.getAttribute("name");
return attr == null ? null : expandClassName((String) attr.getValue());
}
示例23
/**
* Gets whether this Android application is enabled
* @return True if this application is enabled, otherwise false
*/
public boolean isApplicationEnabled() {
AXmlAttribute<?> attr = this.application.getAttribute("enabled");
return attr == null || !attr.getValue().equals(Boolean.FALSE);
}
示例24
public boolean isApplicationDebuggable(){
AXmlAttribute<?> attr = this.application.getAttribute("debuggable");
return attr != null && attr.getValue().equals(Boolean.TRUE);
}
示例25
public boolean isApplicationDisallowBackup(){
AXmlAttribute<?> attr = this.application.getAttribute("allowBackup");
return attr != null && attr.getValue().equals(Boolean.FALSE);
}
示例26
/**
* Adds a new permission to the manifest.
* @param complete permission name e.g. "android.permission.INTERNET"
*/
public void addPermission(String permissionName) {
AXmlNode permission = new AXmlNode("uses-permission", null, manifest);
AXmlAttribute<String> permissionNameAttr = new AXmlAttribute<String>("name", permissionName, AXmlHandler.ANDROID_NAMESPACE);
permission.addAttribute(permissionNameAttr);
}
示例27
/**
* Gets the application's version name as it is displayed to the user
* @return The application#s version name as in pretty print
*/
public String getVersionName() {
AXmlAttribute<?> attr = this.manifest.getAttribute("versionName");
return attr == null ? null : (String) attr.getValue();
}
示例28
/**
* Gets the name of the Android application class
* @return The name of the Android application class
*/
public String getApplicationName() {
AXmlAttribute<?> attr = this.application.getAttribute("name");
return attr == null ? null : expandClassName((String) attr.getValue());
}
示例29
/**
* Gets whether this Android application is enabled
* @return True if this application is enabled, otherwise false
*/
public boolean isApplicationEnabled() {
AXmlAttribute<?> attr = this.application.getAttribute("enabled");
return attr == null || !attr.getValue().equals(Boolean.FALSE);
}
示例30
/**
* Adds a new permission to the manifest.
* @param complete permission name e.g. "android.permission.INTERNET"
*/
public void addPermission(String permissionName) {
AXmlNode permission = new AXmlNode("uses-permission", null, manifest);
AXmlAttribute<String> permissionNameAttr = new AXmlAttribute<String>("name", permissionName, AXmlHandler.ANDROID_NAMESPACE);
permission.addAttribute(permissionNameAttr);
}