Xbogus生成
首先拿到插桩日志进行搜索查看,发现这个值是一个一个进行获取出来的,那我们找到最上面(索引O 58 索引M 27 T值: [])大概是这个地方,其中他的乱文也是生成出来的

然后我们继续看看到这里的时候我们发现这里出现了长的数字,这个是怎么来的呢?这个我们继续往下看(索引O 324 索引M 51 T值),当我们看到这个值的时候,其实是由上面的乱文进行CharcodeAt(0)<<16得到的

我们继续往下面看,又出现了一个新的数字,这个数组是我们的乱文进行charcodeAt(1)<<8得到的


接下来又出现了一个新的数字,这个数字是前面两个数字进行异或得来的,下一个数据也是经过异或运算得来的,最终会拿这个最后的那个值进行运算,接下来我们往后面看




我们这里可以看到,这两数字他俩是进行AND运算得到的这个0的,然后这个0作为索引去获取到我们的第一个字母D,这里的16515072是固定的值,接下来我们继续分析,这里我们要特别注意下一个会出现什么数字,然后去往下面看他是怎么去进行运算的可以看到出现的是18然后我们发现这个值0>>18还是等于0的



接着我们继续来进行分析下面的一个字符,这里出现了一个新的数字,其实这个数字是固定的,然后我们继续往下面看,可以看到这两值进行一个AND的操作得到下面的数字,接着看,又出现了12,这个12是固定的,然后拿我们512结尾的值进行>>12得到下面的47,然后就获得了我们第二个字符的索引47得到第二个字符F






接着我们继续往下面继续分析一下,分析完看他们有没有什么规律。
这里又有了新的数字这个4032其实也是一个固定值,下面的值是根据乱文生成的值进行AND操作得到的3840,最后一行我们也可以看到出现了一个6,然后3840>>6就是我们的第三个字符的索引啦,然后我们进行charAt获得到我们的第三个字符S




接着继续分析第四个,我们可以看到这里出现了一个新的值,是经过AND运算后得到45的,这个就是我们第四个的索引,


总结一个,我们可以帮xbogus当成四个四个进行计算得到,每一次计算的时候都有196397这个值的,类似这样的值一共有七个都是乱文生成的,所以接下来我们就要对乱文生成这个数字来进行分析
乱文生成数字,乱文生成
接着我们来看那干长的数字是怎么从乱文中来生成,包括那干乱文又是怎么进行生成的呢
上面的那干196397那个数字怎么来的呢,其实在最开始我们也是有分析的,现在就让我们重新去看一下,然后进行总结一下
这个就是获得一共七个长的数字的代码,都是由乱文生成的,sss就是所传的乱文
``
function get_LongNum(sss) {
let arr=[];
let count =1;
for (let i = 0; i < 21; i=i+3) {
let a= sss.charCodeAt(i);
let b=sss.charCodeAt(i+1);
if(b==91){b=124;}
let c= sss.charCodeAt(i+2);
//arr[count-1]=a<<16|b<<8|c;
arr[count-1]=a<<16^b<<8^c;
count++;
}
下面的是获取xbogus字符的代码,这里可以看到生成乱文是需要一个arr数组的,这个arr是特别的麻烦,接下来才分析arr这个数组是怎么来的吧
``
function get_code(arr){
let ss="";
let s="Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=";
let Lnum=get_LongNum('\u0002ÿ'+_0x238632("ÿ",_0x22a2b6(arr)));//_0x238632,_0x22a2b6这两个函数就是生成乱文的
for(let i =0;i<7;i++){
let Lnum1=Lnum[i];
let one =s.charAt((Lnum1&16515072)>>18)
let two =s.charAt((Lnum1&258048)>>12)
let three = s.charAt((Lnum1&4032)>>6)
let four=s.charAt(Lnum1&63)
ss=ss+one+two+three+four;
}
return ss;
}
这两个函数是怎么找到的呢,”是不是乱猜的啊“,当然不是啦,这里我们先找到一开始这个乱文出现的地方,在上面的代码中我们也可以看到这个乱文前面是固定的,所以我们只需要找到后面的在哪就行,这个有点难找,所以我把这个日志的索引给大家,可以尝试搜索一下(索引O 1718 索引M 16),然后我们就去相应的位置去下条件断点进行调试

断下了,我们单步调试,可以看到进入了这个参数,带了这个两个参数来的


这里我们只知道在这里生成但是,这个d是怎么来的呢,我们还是要继续去找的,我们重新再来一遍下断点调试继续来,然后我我们去看下日志,哎就是这个啊,那就有思路了,我们找这个乱文是在哪第一次出现我下断点单步调试不就行了吗,太聪明了,大致的索引是(索引O 1664 索引M 16 T值,然后我们下断点进行调试把
重新来的:


断下来了,单步调试,其实个就是数组哈,只是里面传来很多我给他改变了一下


这里是我更改过后的函数,希望有小伙伴简化一下啊,接着这个值我们找到了然后传入_0x238632的函数当中就可以了,这样我们的乱文就生成了,接下来就是我们的这个数组又是怎么生成的呢
``
function _0x22a2b6(arr) {
let arr1=[];
let p = new Uint8Array(19);
arr1[0] = arr[0]; arr1[1] = arr[10]; arr1[2] = arr[1]; arr1[3] = arr[11]; arr1[4] = arr[2]; arr1[5] = arr[12]; arr1[6] = arr[3]; arr1[7] = arr[13];
arr1[8] = arr[5]; arr1[9] = arr[14]; arr1[10] = arr[5]; arr1[11] = arr[15]; arr1[12] = arr[6]; arr1[13] = arr[16]; arr1[14] = arr[7]; arr1[15] = arr[17];
arr1[16] = arr[8]; arr1[17] = arr[18]; arr1[18] = arr[9]
return p[0] = arr[0], p[1] = arr[10], p[2] = arr[1], p[3] = arr[11], p[4] = arr[2], p[5] = arr[12], p[6] = arr[3], p[7] = arr[13],
p[8] = arr[5], p[9] = arr[14], p[10] = arr[5], p[11] = arr[15], p[12] = arr[6], p[13] = arr[16], p[14] = arr[7], p[15] = arr[17],
p[16] = arr[8], p[17] = arr[18], p[18] = arr[9],
String.fromCharCode.apply(null, p);
}

生成乱文所需要的数组
因为这个数组生成需要进行md5加密(索引O 368 索引M 34 T值第一个),这里我就直接把md5下断的地方,发现这这里然后断下来了。然后我们看传的b值,这个是链接后的经过md5加密过来的,我们再一次运行让他停下来,这个b呢其实是Uint8Array生成的,这个unit8Array其实是第一次我们url进行md5生成的,这里我就不演示了,拿到代码自己看一下就行




接下来我他都会一些值都传进去b的,我们看下插桩日志大概明文是什么也就很明白了,这里不做过多解释了,可以下断点直接看下吧,重点在于后面的数组生成

继续我们的分析,他是怎么把md5的值变成这种数组的呢,我们找到他生成之前的上一个,拿到索引(索引O 418 索引M 16 T值),这里我直接给大家一个大概,然后下条件断点进行调试查看

可以看到还是我们的那个查看md5的地方,这个地方返回的e就是Unit8Array,所以我们可以直接把这个函数拿下来,再结合我们看日志生成md5继续生成这些Unit8Array,这些都需要生成因为最后的那干数组需要在这些Unit8Array中进行取值的,这里md5的长字符大家可以自己研究一下
``
let b=md5(url);
let arr0 =_0x237a87(b);
// console.log(b,"url加密")
let arr=_0x237a87(md5(arr0));
let arr1 =_0x237a87(md5(params))
console.log(md5(params))
let arr2=_0x237a87(md5(arr1));
//arr3=_0x237a87(md5("d4+pTKoNjJFb5tMtAC3XB9XrDDxlig1kjbh32u+x5YcwWb/me2pvLTh6ZdBVN5skEeIaOYNixbnFK6wyJdl/Lcy9CDAcpXLLQc3QFKIDQ3KkQYie3n258eLS04FUqFLDjn7dqCRp1jjoORamU2SV"));//长字符
let arr3=_0x237a87(md5(get_long_String()));//长字符生成
let arr4=[];
不墨迹,后面是真的太多了,都是通过位运算等得到的,直接上代码,这里cvs固定就行,也可以直接创建,其实第11个不是0就是8,也是个变化的,有兴趣的小伙伴可以继续研究哟,到这里的话,arr生成就ok了,然后整合一下
``
let cvs=536919696;//可以固定
//let cvss=(canvas(3735928559) >> 8) & 255
let cvss=190;//可以固定,getarr中使用
arr4[0]=arr[14];
arr4[1]=arr[15];
arr4[2]=arr2[14];
arr4[3]=arr2[15];
arr4[4]=arr3[14];
arr4[5]=arr3[15];
arr4[6]=time>>>24;
arr4[7]=(time>>>16)&255;
arr4[8]=(time>>>8)&255;
arr4[9]=(time >>> 0) & 255;
arr4[10]=cvs>> 24;
arr4[11]=(cvs>> 16)&255;
arr4[12]=(cvs>> 8)&255;
arr4[13]=(cvs)&255;
//let cc=65^8;
let cc=65^8;
for(let i =0;i<arr4.length;i++){
cc=cc^arr4[i];
}
let r=[64,1,149,69,69,98,49,74,150,77,0.00390625,8,124,63,164,171,65,226,241];
r[2]=arr[14];
r[3]=arr2[14]
r[4]=arr3[14];
r[7]=cvs>>24;
r[6]=(time>>8)&255;
r[8]=cvss;
r[9]=cc;
r[12]=arr[15];
r[13]=arr2[15]
r[14]=arr3[15]
r[15]=(time>>16)&255;
//r[16]=(time>>0)&255;
r[16]=(time>>0)&255;
r[17]=(cvs>>16)&255
r[18]=cvs&255;
return r;
最终生成的代码
``
function get_code(arr){
//let sss='\u0002ÿ'+_0x238632(_0x22a2b6(arr));
let ss="";
let s="Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=";
let Lnum=get_LongNum('\u0002ÿ'+_0x238632("ÿ",_0x22a2b6(arr)));
for(let i =0;i<7;i++){
let Lnum1=Lnum[i];
let one =s.charAt((Lnum1&16515072)>>18)
let two =s.charAt((Lnum1&258048)>>12)
let three = s.charAt((Lnum1&4032)>>6)
let four=s.charAt(Lnum1&63)
ss=ss+one+two+three+four;
}
return ss;
}
好啦就到这里啦,xbogus的算法就结束了。