Android由于其代码是放在dalvik虚拟机上的托管代码,所以能够很容易的将其反编译为我们可以识别的代码。 之前我写过一篇文章反编译Android的apk包到smali文件 然后再重新编译签名后打包实现篡改apk的功能。 最近又有一种新的方法来实现直接从Android apk包里的classes.dex文件,把dex码反编译到java的.class二进制码,然后从.class二进制码反编译到java源码想必就不用我来多说了吧。 首先我们需要的工具是dex2jar和jd-gui 其中第一个工具dex2jar是用来把classex.dex文件也就是dex二进制码转化为java的标准.class二进制码,然后jd-gui是把标准的.class二进制码再反编译为java源码。 首先从apk包里面提取出classes.dex 放到dex2jar目录下 然后在命令行下执行 dex2jar.bat classes.dex这时执行成功后会生成一个classes.dex.dex2jar.jar文件 这个文件再用jd-gui打开,如下图几乎跟我自己写的这个程序的源码一样 提供这个反编译方法主要用于大家学习与研究,有问题可以与我邮件讨论。 希望大家不要用这个方法从事恶意的活动,毕竟,别人辛辛苦苦写程序也不容易,用这个方法可以大致的学习到别人写的程序的逻辑,架构,希望对大家有所帮助。 Android 逆向apk程序的心得 本文主要介绍如何逆向一个Android的APK应用程序,本文提供的方法仅供研究学习之用。 本文需要用到的工具有 jdk 这个用于搭建java运行环境 AXMLPrinter2.jar 这个用于逆向.xml文件 baksmali.jar 这个用于逆向classex.dex文件 由于Android的.apk文件实际上就是一个zip文件 可以直接用winrar打开
成都创新互联公司专注于企业全网营销推广、网站重做改版、富顺网站定制设计、自适应品牌网站建设、HTML5、成都商城网站开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为富顺等各大城市提供网站开发制作服务。
通过dx工具将jar包中所有的类打包编译为一个名为classes.dex的文件。
该工具在
sdk的build-tools里面比如build-tools\19.1.0
cmd切换目录到该文件夹下,执行
注意 待统计.jar 也应该在该目录下,或者其它目录,如:
输入完命令,点击回车,等执行完后,在改目录已经生成了我们需要的dex文件。
如果有兴趣的话可以继续看下一篇
java统计apk或者jar、dex方法数
可使用android自带的httpclient框架实现向服务器发起get或post请求,以下为完整的示例代码:
1. GET 方式传递参数
//先将参数放入List,再对参数进行URL编码
ListBasicNameValuePair params = new LinkedListBasicNameValuePair();
params.add(new BasicNameValuePair("param1", "数据")); //增加参数1
params.add(new BasicNameValuePair("param2", "value2"));//增加参数2
String param = URLEncodedUtils.format(params, "UTF-8");//对参数编码
String baseUrl = "服务器接口完整URL";
HttpGet getMethod = new HttpGet(baseUrl + "?" + param);//将URL与参数拼接
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse response = httpClient.execute(getMethod); //发起GET请求
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//获取服务器响应内容
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2. POST方式 方式传递参数
//和GET方式一样,先将参数放入List
params = new LinkedListBasicNameValuePair();
params.add(new BasicNameValuePair("param1", "Post方法"));//增加参数1
params.add(new BasicNameValuePair("param2", "第二个参数"));//增加参数2
try {
HttpPost postMethod = new HttpPost(baseUrl);//创建一个post请求
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中
HttpResponse response = httpClient.execute(postMethod); //执行POST方法
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //获取响应内容
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
首先需要说明的是,在Android中用于输入的控件是EditText;
对EditText使用getText()方法,返回一个Editable对象,对这个对象使用toString()方法,获得一个String对象;
使用Integer.parseInt(String str);方法可以将String对象转换成Int型数据;
最后对TextView对象使用setText()方法,需要注意的是这个方法接受String对象,或者int型资源ID;
private EditText etvalue2;
private EditText etvalue1;
private TextView textView;
private int value1;
private int value2;
private int result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.textView);
etvalue1 = (EditText) findViewById(R.id.editText);
etvalue2=(EditText)findViewById(R.id.editText2);
findViewById(R.id.btn_run).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
value1 =Integer.parseInt(etvalue1.getText().toString()) ;
value2 = Integer.parseInt(etvalue2.getText().toString());
result =value1+value2;
textView.setText(""+result+"");
}
});
}
分享
String s=Integer.toBinaryString(363); //二进制串
String a=s.charAt(bs.length()-index); //取第index位
java.lang.Integer这个API包中有进制转换的函数
public static String toBinaryString(int i)
public static String toHexString(int i)
public static String toOctalString(int i)
这3个函数都可以将十进制的整数转换成二、一六、八进制数