channel_action.py 3.9 KB
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import os.path
from xml.etree import ElementTree as ET
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import ElementTree
import os
import os.path
import zipfile
import re
import subprocess
import platform
from xml.dom import minidom
import codecs
import sys

namespace = 'http://schemas.android.com/apk/res/android'
androidNS = 'http://schemas.android.com/apk/res/android'


def execute(channel, decompileDir, packageName):
    modify_main_activity_smali(decompileDir)
    return 0

def modify_main_activity_smali(decompileDir):
    
    manifestFile = decompileDir + "/AndroidManifest.xml"
    # manifestFile = file_utils.getFullPath(manifestFile)
    ET.register_namespace('android', androidNS)
    key = '{' + androidNS + '}name'

    tree = ET.parse(manifestFile)
    root = tree.getroot()

    applicationNode = root.find('application')
    if applicationNode is None:
        return

    applicationNode.set('name', 'com.stss.sdk.ChangYouApplication')
    activityNodeLst = applicationNode.findall('activity')
    if activityNodeLst is None:
        return

    mainActivityName = ''
    for activityNode in activityNodeLst:
        bMain = False
        intentNodeLst = activityNode.findall('intent-filter')
        if intentNodeLst is None:
            break
        for intentNode in intentNodeLst:
            bFindAction = False
            bFindCategory = False

            actionNodeLst = intentNode.findall('action')
            if actionNodeLst is None:
                break
            for actionNode in actionNodeLst:
                if actionNode.attrib[key] == 'android.intent.action.MAIN':
                    bFindAction = True
                    break

            categoryNodeLst = intentNode.findall('category')
            if categoryNodeLst is None:
                break
            for categoryNode in categoryNodeLst:
                if categoryNode.attrib[key] == 'android.intent.category.LAUNCHER':
                    bFindCategory = True
                    break

            if bFindAction and bFindCategory:
                bMain = True
                break

        if bMain:
            mainActivityName = activityNode.attrib[key]
            break

    if len(mainActivityName) == 0:
        return

    mainActivityPath = mainActivityName.replace(".", "/")
    mainActivityPath = decompileDir + '/smali/' + mainActivityPath + '.smali'

    f = open(mainActivityPath, 'r+', encoding='Utf-8')
    mainActivityContent = str(f.read())
    f.close()

    fl = open(mainActivityPath, 'r+')
    lines = fl.readlines()
    fl.close()

    superClassLine = lines[1]
    superClassLine.strip()
    superClassName = 'Landroid/app/Activity;'
    if superClassLine.startswith(".super"):
        blocks = superClassLine.split()
        superClassName = blocks[len(blocks)-1]

    replaceTxt = 'invoke-super {p0, p1, p2, p3}, ' + superClassName + '->onRequestPermissionsResult(I[Ljava/lang/String;[I)V'

    idx = mainActivityContent.find(replaceTxt)
    if idx == -1:
        targetTxt = "\n.method public onRequestPermissionsResult(I[Ljava/lang/String;[I)V\n    .locals 2\n\n    invoke-super {p0, p1, p2, p3}, " + superClassName + "->onRequestPermissionsResult(I[Ljava/lang/String;[I)V\n\n    invoke-static {p1, p2, p3}, Lcom/stss/sdk/STSSAggGame;->onRequestPermissionsResult(I[Ljava/lang/String;[I)V\n\n    return-void\n.end method"
        mainActivityContent = mainActivityContent + targetTxt
    else:
        targetTxt = "    invoke-super {p0, p1, p2, p3}, " + superClassName + "->onRequestPermissionsResult(I[Ljava/lang/String;[I)V\n\n    invoke-static {p1, p2, p3}, Lcom/stss/sdk/STSSAggGame;->onRequestPermissionsResult(I[Ljava/lang/String;[I)V"
        mainActivityContent = mainActivityContent[:idx] + targetTxt + mainActivityContent[(idx + len(replaceTxt)):]

    f2 = open(mainActivityPath, 'w', encoding='Utf-8')
    f2.write(mainActivityContent)
    f2.close()

    return 0