作者:刘宏亮1.场景
1)一天A君在某个Android软件下载站中下载了腾讯QQ,并安装在了自己新购买的Android手机上。
2)怀着异常激动的心情打开QQ,输入了自己的QQ号码和密码进行登陆。
3)登陆成功以后在好友列表里找到“小美”说着甜言蜜语。
4)第二天登陆QQ后,却发现“小美”不见了。……
5)同一天B君正在QQ和“小美”聊得不亦乐乎。……
到底发生了什么?2.在QQ for Android上动手脚
1)工欲善其事,必先利其器
手机QQ
http://mobile.qq.com/android/download.html
APK反编译工具apktool
http://code.google.com/p/android-apktool/downloads/list
APK签名工具auto-sign
http://www.droidforums.net/forum/droid-development/61633-mass-apk-signer.html本人所用操作系统为Linux,下载apktool-install-linux-r04-brut1.tar.bz2。Windows系统请选择apktool-install-windows-r04-brut1.tar.bz2。同时还要下载apktool1.4.1tar.bz2。然后解压之。2)反编译
pirate@searover:~/Downloads/qq$ ./apktool d MobileQQ2011_Android_Beta3Build0115.apk
执行上述命令会生成MobileQQ2011_Android_Beta3Build0115目录,进入此目录。3)在登陆过程中注入自己的代码
打开AndroidManifest.xml,在其中找到登陆界面对应的Activity。
图片
现在已经知道了登录界面是由com.tencent.qq.LoginActivity控制。接下来需要确定LoginActivity所使用的是哪一个Layout。然后找到登陆按钮的ID,最后在LoginActivity中找到登陆按钮对应的onClick方法。在onClick方法中查找到获取文本框字符串的代码,在其后可以加入你想加入的任何代码(本实例是将其发送到指定的邮箱中)。下面将一步一步演示这个过程。
确定LoginActivity所使用的是哪一个Layout
首先进入MobileQQ2011_Android_Beta3Build0115/smali/com/tencent/qq,打开其中的LoginActivity.smali(google[smali]),在onCreate方法中找到setContentView即可知道Layout对应的ID(const v1,0x7f030054)。
图片
接下来通过Layout的ID 0x7f030054找到对应的layout.xml文件,找遍了com.tencent.qq中的R*.smali文件没有ID的值。只好在linux系统下使用grep命令全文件全文搜索
pirate@searover:~/Downloads/qq/MobileQQ2011_Android_Beta3Build0115$ grep -R "0x7f030054" *
结果如下所示
res/values/public.xml:    <public type="layout" name="loginpage" id="0x7f030054" />
smali/com/tencent/qq/LoginActivity.smali:    const v1, 0x7f030054
由此可知LoginActivity所使用的Layout是loginpage,接下来到MobileQQ2011_Android_Beta3Build0115/res/layout目录中打开loginpage.xml文件。在loginpage.xml中找到登陆按钮
图片
通过android:id属性(login_btn_login)找到其对应的ID(0x7f0d015b)。接下来在LoginActivity.smali文件中找到对此按钮添加单击事件监听器的代码。
图片
此时v0为Button对象,p0为当前的LoginActivity对象也就是说登陆按钮的单击事件监听器就是当前的LoginActivity,再回到LoginActivity.smali顶部可知其实现了OnClickListener接口。接下来只需要在LoginActivity中查找onClick方法即可。
图片
在此方法中可以看到如下所示代码,标记中代码将ID为0x7f0d0158这个EditText的值保存到了v0寄存器中。接下来就可以在标记的最后一行代码下面加入Log.i;来进行测试。当然要将Log.i转换成smali:
invoke-static {v0, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
其中{v0, v0}分别代表tag,msg。
图片
最后将修改完的smali保存。在执行apktool d...的目录中执行下述代码重新打包成apk文件,生成的文件在MobileQQ2011_Android_Beta3Build0115/dist/中
pirate@searover:~/Downloads/qq$ sudo apktool b MobileQQ2011_Android_Beta3Build0115
最后重新签名上述目录中的apk文件。
pirate@searover:~/Downloads/qq$ java -jar signapk.jar testkey.x509.pem testkey.pk8 MobileQQ2011_Android_Beta3Build0115/dist/MobileQQ2011_Android_Beta3Build0115.apk new.apk
大功告成。
怎样才能悄悄的将获取的账号信息发送到指定的邮箱中呢?当然是直接使用Socket实现邮件发送。此过程略,可自行google
3.怎样才能更安全的使用Android设备嗯……待续