1:通过逆向分析提取antiy 的 scanner的SDK
2:创建android工程,由于是命令行,所以无需带activity;
package com.antiy.sdk;
import android.content.res.AssetManager;
public class AVLA
{
public AVLA()
{
}
public native String GetEngVersion();
public native String GetLibVersion();
public native int Init(String s);
public native int Release();
public native String[] Scan(String s);
public native int SetMode(int i);
public native int UnzipFromAssets(AssetManager assetmanager, String s);
public native int Update(String s, String s1);
static
{
//System.loadLibrary("avla");
System.load("/data/data/org.crazyit.toast/lib/libavla.so");
}
}
使用antiy的SDK:
antiycmd.java
package org.crazyit.toast;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.antiy.sdk.AVLA;
public class antiycmd {
static List<String> fl = new ArrayList<String>();
//取出文件
private static List<String> getMyFile(AVLA avla,String pathString)
{
//局部变量 记录文件路径
List<String> it=new ArrayList<String>();
//指定文件目录
File f=new File(pathString);
//递归
getFileList(avla,f);
//递归完毕,提出全局量fl里面的内容
for(int i = 0; i < fl.size(); i++)
{
it.add(fl.get(i));
}
return it;
}
//递归函数
public static void getFileList(AVLA avla,File file)
{
//列出指定路径下所有文件
System.out.println("1\n");
File[] files = file.listFiles();
System.out.println("2\n");
//遍历当前各个文件
for(int i = 0; i < files.length; i++)
{
System.out.println("3\n");
File f = files[i];
System.out.println("4\n");
if(f.isFile())
{
System.out.println(f.getPath());
String[] strarry=avla.Scan(f.getPath());
if(strarry!=null)
{
System.out.println(f.getPath()+"->"+strarry[0].toString());
}else {
System.out.println(f.getPath()+"->clean");
}
}else if(f.isDirectory())
{
//不是文件,而是文件夹,进一步检查这个文件夹下面文件
getFileList(avla,f);
}
}
}
public static void main(String[] argc){
AVLA avla = new AVLA();
File file = new File("/data/data/org.crazyit.toast/files/avl/");
if(file.exists())
{
avla.Init("/data/data/org.crazyit.toast/files/avl/");
avla.SetMode(127);
//getMyFile(avla,"/data/data/org.crazyit.toast/files/avl/");
if(argc.length==1)
{
System.out.println(argc[0].toString());
getMyFile(avla,argc[0].toString());
}else {
System.out.println("pls input the path of samples..\n");
}
}else{
System.out.println("seems the malware db not yet inited..\n");
}
avla.Release();
}
}
ToastTest.java
package org.crazyit.toast;
import com.antiy.sdk.*;
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/**
* Description:
* <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
* <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class ToastTest extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button simple = (Button)findViewById(R.id.simple);
//为按钮的单击事件绑定事件监听器
simple.setOnClickListener(new OnClickListener()
{
//@Override
public void onClick(View source)
{
//创建一个Toast提示信息
File file = new File((new StringBuilder(String.valueOf(getFilesDir().getAbsolutePath()))).append("/avl/conf/liscense.conf").toString());
if(!file.exists())
{
android.content.res.AssetManager assetmanager = getAssets();
String s = getFilesDir().getAbsolutePath();
File file1 = new File(s);
if(!file1.exists())
file1.mkdir();
(new AVLA()).UnzipFromAssets(assetmanager, (new StringBuilder(String.valueOf(s))).append("/").toString());
}
AVLA avla = new AVLA();
avla.Init((new StringBuilder(String.valueOf(getFilesDir().getAbsolutePath()))).append("/avl").toString());
//int i= avla.Update(null, null);
String s1 = avla.GetEngVersion();
String s2 = avla.GetLibVersion();
avla.Release();
Toast toast = Toast.makeText(ToastTest.this
, "Antiy SDK installed:"+"\nEngVer"+s1+"\nLibVer:"+s2
// 设置该Toast提示信息的持续时间
, Toast.LENGTH_SHORT);
toast.show();
}
});
}
}
3:build之后,
通过dalvikvm执行 apk
比如):
adb shell dalvikvm -cp /data/app/org.crazyit.toast-1.apk org.crazyit.toast.antiycmd /mnt/sdcard/antiy/
这里的org.crazyit.toast-1.apk,这里的名字后缀不是-1就是-2,目前我还没发现有-3的。第一次安装是-1,第二次是-2,再次又回到-1。
备注:该程序后续的一些思考,这个程序可以用来做竞品的crossscan系统,思路是这样的,可以插入一个包含main函数的包,然后通过命令行来调用apk中的这个包的main函数就如上面的例子一样,剩下的你只需要找到扫描引擎中的目录扫描函数(什么没有?那扫描文件的函数总有吧)这样可以实现命令行下调用,命令行下获取结果,如果你写过类似的程序,应该很容易想到使用一些脚本程序来控制模拟器来实现了。应该很多安全厂商都有类似的竞品系统吧,呵呵。不知道这么说是否明白了。