逆向注意事项


1.python调用execjs执行js代码
解决execjs执行js时产生的乱码报错,需要在导入该模块之前,让Popen的encoding参数锁定为utf-8. 具体做法,如下 切记,不要去改源码,要不然其他程序会炸
from functools import partial  # 这玩意儿能锁定一个函数的参数
import subprocess
 
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")  # 固定写法
# 解决execjs执行js时产生的乱码报错,需要在导入该模块之前,让Popen的encoding参数锁定为utf-8

 

 

2.base64变种

Base64 有几个常见的变种,包括 URL-safe Base64、Base64URL、以及Base64编码时所使用的填充字符。这些变种通常在标准 Base64 编码的基础上做出一些调整,使得编码结果更适合特定的应用场景。其中,URL-safe Base64 将标准 Base64 中的加号 “+” 和斜杠 “/” 替换为 “-” 和 “_”,以便在 URL 中安全传输数据而不需要进行额外的转义处理。Base64URL 在 URL-safe Base64 基础上移除了填充字符"="。填充字符通常用来确保原始数据能够按照固定块大小处理,但在某些情况下可能会被省略

# base64标准化 方式一
# data = data.replace("-","+").replace("_","/")

# base64标准化 方式二
encrpty_data = base64.b64decode(data.encode(),altchars="-_")

 

3.url编码

from urllib import parse

# 值编码
# a=1
s= "a"
s= "a=1&b=2"
s= " "
s= ""

s = "a=1&b=2"
ret = parse.quote(s)
print(ret) # a%3D1%26b%3D2
print(parse.unquote("a%3D1%26b%3D2"))  # a=1&b=2



# 整体数据编码
data = {
    "a": "&apple",
    "b": ""
}

ret = parse.urlencode(data)
print(ret) # "a=%26apple&b=%E8%8B%91"

ret = parse.parse_qs("a=%26apple&b=%E8%8B%91")
print(ret) # {'a': ['&apple'], 'b': ['苑']}

 4.eval加密

有的代码会通过eval加密,将js代码复杂化,一般这种加密代码,就是要找的发送请求的代码

    eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('5 q(){3 s=[];3 a="H";6(3 i=0;i<I;i++){s[i]=a.r(t.J(t.K()*L),1)}s[14]="4";s[19]=a.r((s[19]&M)|N,1);s[8]=s[13]=s[18]=s[O];3 b=s.u("");7 b}5 v(a){3 b=k P();3 c=0;6(3 i l a){b[c]=i;c++}3 d=b.Q();3 e={};6(3 i l d){e[d[i]]=a[d[i]]}7 e}5 R(a){3 b=/^[^\\?]+\\?([\\w\\W]+)$/,x=/([^&=]+)=([\\w\\W]*?)(&|$|#)/g,9=b.y(a),m={};h(9&&9[1]){3 c=9[1],j;S((j=x.y(c))!=T){m[j[1]]=j[2]}}7 m}5 z(a){3 b=[];3 c={};b=a.A(\'&\');6(3 i=0;i<b.B;i++){h(b[i].U(\'=\')!=-1){3 d=b[i].A(\'=\');h(d.B==2){c[d[0]]=d[1]}C{c[d[0]]=""}}C{c[b[i]]=\'\'}}7 c}V X=5(a){3 b=[];6(3 p l a)h(a.Y(p)&&a[p]){b.Z(D(p)+\'=\'+D(a[p]))}7 b.u(\'&\')};3 E="10+11/12/1/15";3 n=k 16();n.17(E);$.1a({1b:5(a,b){3 c=F.1c(k F());3 d=q();3 e=1d.1e(v(z(b.G||\'{}\')));b.G=n.1f(e);3 f=1g(e+d+c);a.o("1h",c);a.o(\'1i\',d);a.o(\'1j\',f)}});',62,82,'|||var||function|for|return||arr_url||||||||if||result|new|in|ret|encrypt|setRequestHeader||getUuid|substr||Math|join|sort_ASCII||reg_para|exec|dataTojson|split|length|else|encodeURIComponent|paramPublicKey|Date|data|0123456789abcdef|32|floor|random|0x10|0x3|0x8|23|Array|sort|url2json|while|null|indexOf|const||serialize|hasOwnProperty|push|MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvxXa98E1uWXnBzXkS2yHUfnBM6n3PCwLdfIox03T91joBvjtoDqiQ5x3tTOfpHs3LtiqMMEafls6b0YWtgB1dse1W5m|FpeusVkCOkQxB4SZDH6tuerIknnmB|Hsq5wgEkIvO5Pff9biig6AyoAkdWpSek|||B7zYIepYY0lxKQIDAQAB|JSEncrypt|setPublicKey|||ajaxSetup|beforeSend|parse|JSON|stringify|encryptUnicodeLong|MD5|timestamp|requestId|sign'.split('|'),0,{}))

可以通过将eval中的代码复制,使用解密工具解密

也可以在控制台输入   (代码)  ,来获取原格式的代码

 再将获得的代码的格式做调整,就能获得未加密的代码

 

5.document和window

在js逆向的执行过程中,遇到与document对象和window对象相关的报错,一般都可以删除,或者通过某种方式跳过

posted @ 2024-06-26 10:14  Mrterrific  阅读(3)  评论(0编辑  收藏  举报