在最近的业务项目中,有一些app样本需要抓取数据包进行重放,但是因为有sign的存在,使得这一过程进行的话并不是很顺利。因此要对该sign进行解密。刚开始观察一下sign的格式,发现跟md5很相似,当然了不能说相似,只能说是一模一样。可以口算md5的303不在,所以需要一个可以验证我这一想法的frida脚本。
首先我们知道md5算法是消息摘要算法,Android中是java.security.MessageDigest这一个类为应用程序提供消息摘要算法的功能。如果开发人员是使用md5进行加密,并且没有进行魔改,那么理论上抓取的数据包中的sign值就是一个数据直接md5进行加密得到的结果,这个数据可以是时间戳跟用户名进行拼接,也可以是时间戳与一个固定的Key值进行拼接。拼接完成后,调用该类,然后md5加密完成。接下来就开始验证想法。
// MD5
Java.perform(function(){
var MessageDigest= Java.use('java.security.MessageDigest');
MessageDigest.getInstance.overload('java.lang.String').implementation=function(arg1){
// console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
console.log(arg1);
var ret = this.getInstance(arg1);
return ret;
}
MessageDigest.update.overload('[B').implementation=function(arg1){
console.log("use update.overload('[B') ");
parseIn(arg1);
var ret = this.update(arg1);
return ret;
}
MessageDigest.digest.overload().implementation=function(){
console.log('use digest.overload()');
var ret = this.digest();
parseOut(ret);
return ret;
}
MessageDigest.digest.overload("[B","int","int").implementation=function(buf,offset,len){
console.log('use digest.overload("[B","int","int")');
parseIn(buf);
var ret = this.digest(buf,offset,len);
parseOut(ret);
return ret;
}
MessageDigest.digest.overload("[B").implementation=function(buf){
console.log('use digest.overload("[B")');
parseIn(buf);
var ret = this.digest(buf);
parseOut(ret);
return ret;
}
});
function parseIn(input){
var Integer= Java.use('java.lang.Integer');
var String= Java.use('java.lang.String');
try{
console.log("original:"+String.$new(input));
}
catch(e){
console.log(parseHex(input));
}
}
function parseOut(ret){
var Integer= Java.use('java.lang.Integer');
var String= Java.use('java.lang.String');
var result = "";
for(var i = 0;i<ret.length;i++){
var val = ret[i];
if(val < 0){
val += 256;
}
var str = Integer.toHexString(val);
if(String.$new(str).length()==1){
str = "0" + str;
}
result += str;
}
console.log( "(32)字母小写输出:" + result);
console.log( "(32)字母大写输出:" + result.toUpperCase());
console.log( "(16)字母小写输出:" + result.substring(8,24));
console.log( "(16)字母大写输出:" + result.substring(8,24).toUpperCase());
console.log("");
}
function parseHex(input){
var Integer= Java.use('java.lang.Integer');
var byte_array = "";
for(var j = 0;j<input.length;j++){
var hex = Integer.toHexString(input[j]);
if(hex.length == 1){
hex = "0" + hex;
}
byte_array += hex;
}
console.log("original(hex):");
var pair = "";
var hex_table = "";
for(var k = 0;k<byte_array.length;k++){
pair += byte_array.charAt(k);
if((k+1)%2 == 0){
pair += " "
hex_table += pair;
pair = ""
}
if((k+1)%32 == 0){
hex_table += "\n"
}
}
return hex_table;
}
frida -UF -l Hookmd5.js -o xxx.txt(数据必然会很多,所以需要存储一下)
与抓包得到的数据进行比对,是一模一样。sign值是标准md5值。所以可以直接根据这一结果,再加上数据的堆栈直接定位到加密算法进行分析就可以了。
文字来源于- 火线 Zone-云安全社区,安全小天地只做文章分享,如有侵权,请联系站长删除
© 版权声明
安全小天地的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。
安全小天地拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经允许,禁止转载!
本文所提供的工具仅用于学习,禁止用于其他,请在24小时内删除工具文件!!!访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。详情见本站的“免责声明”如果有侵权之处请第一时间联系我们删除。敬请谅解!E-mail:anquanclub@foxmail.com
THE END
请登录后查看评论内容