【问题标题】:Get results from web service using Android Volley使用 Android Volley 从 Web 服务获取结果
【发布时间】:2019-06-01 13:37:29
【问题描述】:

我想制作一个 Android 应用程序: 1. 使用 Volley HTTP Post 将 apk 文件发送到 Web 服务 2. Web 服务将文件发送到另一个服务(TheHive Cortex),该服务开始对其进行安全分析 3. Cortex 对 Web 服务的回答 4. Android 应用从 web 服务中获取结果

问题是,即使 Web 服务接收到数据并且 Cortex 运行良好,我也无法在 Android 应用程序上接收结果。

Web服务和分析器没有问题:接收文件时它们工作良好。但是,应用程序崩溃并且无法接收结果。 结果采用 JSON 格式。

Android 应用 MainActivity:

public class MainActivity extends AppCompatActivity {

Button button1;

Intent intent;
TextView text;

private static final int READ_REQUEST_CODE = 42;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button1 = findViewById(R.id.button1);
    text = findViewById(R.id.text);

    button1.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {

            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.setType("application/vnd.android.package-archive");
            startActivityForResult(intent, READ_REQUEST_CODE);
        }

    });


}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {

        Uri uri = null;
        uri = data.getData();

        try
        {
            final String conv = readTextFromUri(uri); //encoding function
            //text.setText(conv);
            String url = "http://192.168.1.10:5000";

            StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>()
                    {
                        @Override
                        public void onResponse(String response) {
                            // response
                            //text.setText("Response is: "+ response.substring(0,500));
                            Log.v("Martina", "Risposta = " + response);
                        }
                    },
                    new Response.ErrorListener()
                    {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // error
                            //text.setText(error.toString());
                            Log.v("Martina", error.getMessage());
                        }
                    }
            ) {

                @Override
                protected Map<String, String> getParams()
                {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("conv", conv);

                    return params;
                }
            };
            Volley.newRequestQueue(this).add(postRequest);
        }
        catch (IOException e)
        {
            Log.v("Martina", e.getMessage());
        }
    }
}}

Python 网络服务(我使用了 Flask):

UPLOAD_FOLDER = './apk'
ALLOWED_EXTENSIONS = set(['txt', 'apk'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/', methods=['GET','POST'])
def call_cortex():
if request.method == 'POST':
    fileb64 = request.form.get('conv')

    #converti fileb64 in file e invia questo file a cortex      
    filename = 'test.apk'
    with open(os.path.join(app.config['UPLOAD_FOLDER'], filename), 'wb') as f:
        f.write(base64.b64decode(fileb64))  

    ###FUNZIONA###
    fileapk = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    results = analyze(fileapk)

    os.remove(fileapk)      
    return results              

else:
    return 'Errore!'






def analyze(apk):
api = Api('http://127.0.0.1:9001', 'RjjWFkldGkRyw7lTV5px9Qe7gKlU4V1i')

analyzers = api.analyzers.find_all({}, range='all')

job1 = api.analyzers.run_by_name('Virusshare_2_0', {
    'data': apk,
    'dataType': 'file',     
    'tlp': 1
}, force=1)

res1 = json.dumps(job1.json(), indent=2)

job2 = api.analyzers.run_by_name('HybridAnalysis_GetReport_1_0', {
'data': apk,
'dataType': 'file',
'tlp': 1
}, force=1)

res2 = json.dumps(job2.json(), indent=2)

###Aspetta la fine del job VirusShare###
time.sleep(60)

query = Eq('status', 'Success')

jobs = api.jobs.find_all(query, range='0-2', sort='-updatedAt')

hybrid = None
virus = None
for job in jobs:
    report = api.jobs.get_report(job.id).report
    if report['summary']['taxonomies'][0]['namespace'] == 'HybridAnalysis':
        hybrid = report['summary']['taxonomies'][0]
    if report['summary']['taxonomies'][0]['namespace'] == 'Virusshare':
        virus = report['summary']['taxonomies'][0]

return {
    'virus': {
        'value': virus['value'],
        'level': virus['level']
    },
    'hybrid': {
        'value': hybrid['value'],
        'level': hybrid['level']
    }
}

我知道 Cortex 需要几秒钟才能完成分析,所以我想知道问题是否正在等待结果,如果是,我该如何解决。

谢谢

【问题讨论】:

    标签: android python android-volley


    【解决方案1】:

    您可以使用TheHiveHooks 来执行此操作。
    TheHiveHooks 使用 webhook 从 TheHive 接收事件。
    有一个名为 CaseArtifactJobUpdate 的事件用于监控分析器的作业。
    这样您就可以确定作业已完成。

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2021-12-17
      • 2018-08-25
      • 2013-07-29
      相关资源
      最近更新 更多