1.AppCracking.apk界面生成:
在界面设置里点击生成界面
页面形式
2.在AppCracking.java里编译代码:
加入注册按钮相应代码29-41行,在此之前加入22-24行代码进行定义。
加入注册比较代码:
在此代码中用到toHexString()方法,功能是将字节数组转化为16进制字符串,代码如下:
在之后在目录中的values 下的string文件中加入所用到的flag:
3.然后编译运行,显示
然后在目录中找到目标AppCracking.apk文件
至此准备工作完成。 接下来用apktool进行分析。
final Button btn =(Button)findViewById(R.id.btnRegister);
final EditText user = (EditText)findViewById(R.id.etUserName);
final EditText code = (EditText)findViewById(R.id.etRegisterCode);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(!checkRegisterCode(user.getText().toString().trim(), code.getText().toString().trim()))
{
Toast.makeText(AppCracking.this, R.string.fail, Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(AppCracking.this, R.string.succeed, Toast.LENGTH_SHORT).show();
btn.setEnabled(false);
setTitle(R.string.registered);
}
}
});
private boolean checkRegisterCode(String userName, String rs){
try{
if(userName==null||userName.length()==0||rs==null||rs.length()!=16)
return false;
MessageDigest digest=MessageDigest.getInstance("MD5"); //创建报文摘要实例,实现指定的摘要算法
digest.reset(); //重置摘要
digest.update(userName.getBytes()); //将String类型的字符串转化为byte类型并存入一个byte数组中
byte[] bytes=digest.digest(); //对用户名进行哈希
String hexstr = toHexString(bytes,""); //将散列值转换成十六进制的字符串
StringBuilder sb=new StringBuilder(); //取字符串前半部分所有奇数位与后半部分所有偶数位重新组合生成注册码
for(int i=0;i<hexstr.length()/2;i+=2){
sb.append(hexstr.charAt(i));
}
for(int i=(hexstr.length()/2+1);i<hexstr.length();i+=2){
sb.append(hexstr.charAt(i));
}
String userRegisterCode=sb.toString();
if(!userRegisterCode.equalsIgnoreCase(rs))
return false;
}catch(NoSuchAlgorithmException e){
e.printStackTrace();
return false;
}
return true;
}
private String toHexString(byte[] bytes, String string) {
StringBuilder hexString=new StringBuilder();//对字符数组遍历
for(byte b:bytes){ /*将字节转换为16进制的字符串,不可直接对字节进行转换,字节8位,int 32位,采用补码,直接转换出错*/
String hex=Integer.toHexString(0xFF&b);
if(hex.length()==1){
hexString.append('0');
}
hexString.append(hex).append(string);
}
return hexString.toString();
}