【发布时间】: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