-
声明
-
本文以学习交流为目的、不得用于任何商业用途和违法违规场景。
一 , 正片开始
网址:aHR0cHM6Ly9ob3RlbHMuY3RyaXAuY29tL2hvdGVscy8xNTAxODQ5Mi5odG1s
需要分析的参数:testab
然后直接搜索会发现 testab 会发现这两个地方
在这个地方打断点你会惊奇的发现打不上
所以只能第一个搜索出来的地方上了断点 准备的差不多 然后刷新一下界面 然后等待一会 会发现成功的断住了
这里生成了一个随机数 返回把它加载到window的全局方里面
点击下一步
然后让他跳进去 我们这是已经知道了一个方法加载到window全局方法里面
所以在在里面打了一个断点 然后执行到了这里 看一下e()执行了什么
发现这个e()生成的就是我们需要的testab参数
通过浏览器发包会发现 这个生成的随机数会去请求一个js文件 这里大概就是可以猜测这是个动态js加密参数
解决这个有几种办法 :
- rpc
- 补环境
- 还原算法
这里交流2和3
1. 补环境:
先整体看一下
因为js是动态的 所以要保存一份作为替换以便调试 SekishikiMeikaiHa会传入一个window和一个打对象 是先调用的方法 然后返回了一个方法 然后再传入的 _bot_1417为window。 _bot_3bd0a这个是传入的对象 看下在哪使用到了这个对象 (可以了解一下vmp的执行过程 这里就不多说了)
会发现他把对象的b值传入到了decode解码。尝试把代码扣下来放在本地执行 查看decode返回的结果 发现是一个二维数组(vmp里面是指令集 不过多的介绍了)
然后看一下把返回的数组 然后入到这个里面使用 所有这个就是开始执行这些指令的循环
在这个地方打印调试输出。 看一下结果 呢么有人会说为什么在这个地方下个打印呢 因为我也不知道 哈哈哈哈哈 开下玩笑 字符的拼接无非就是join + 这是这几种 最多的就是运算符+
一顿打印会发现拼接了下面这些值(简化了的 全部输出有几万行)
通过日志分析 需要补充的环境还是还是挺多的 可以考虑使用jvtool插件之类的进。补环境 发现里面还检测了node一些api 使用node来执行得先解决一些node的api以防止检测。推荐在vm或v8里面执行 具体不说了 可以尝试学习补环境
{
'0': 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890$_[]',
'1': '__pluginBodyChildren',
'4': 'default',
'6': '__pluginElementAppend',
'9': 'default',
'11': '__pluginElementCreate',
'14': 'default',
'16': '__pluginElementRender',
'19': 'default',
'21': '__pluginElementTagname',
'24': 'default',
'26': '__pluginErrorStack',
'29': 'default',
'31': '__pluginImageCreate',
'34': 'default',
'36': '__pluginNavigatorPlatform',
'39': 'default',
'41': '__pluginNodeJs',
'44': 'default',
'46': '__pluginPlatform',
'49': 'default',
'51': '__pluginReadOnlyPlatform',
'54': 'default',
'56': '__pluginReadOnlyAppCodeName',
'59': 'default',
'61': '__pluginReadOnlyUserAgent',
'64': 'default',
'66': '__pluginWindowPrototype',
'69': 'default',
'71': '__pluginWebdriver',
'74': 'default',
'76': 'root',
'78': '__pluginBodyChildren',
'79': 'default',
'81': '__pluginElementAppend',
'82': 'default',
'84': '__pluginElementCreate',
'85': 'default',
'87': '__pluginElementRender',
'88': 'default',
'90': '__pluginElementTagname',
'91': 'default',
'93': '__pluginErrorStack',
'94': 'default',
'96': '__pluginImageCreate',
'97': 'default',
'99': '__pluginNavigatorPlatform',
'100': 'default',
'102': '__pluginNodeJs',
'103': 'default',
'105': '__pluginPlatform',
'106': 'default',
'108': '__pluginReadOnlyPlatform',
'109': 'default',
'111': '__pluginReadOnlyAppCodeName',
'112': 'default',
'114': '__pluginReadOnlyUserAgent',
'115': 'default',
'117': '__pluginWindowPrototype',
'118': 'default',
'120': '__pluginWebdriver',
'121': 'default',
'132': 'Math',
'133': 'require',
'134': 'document',
'135': 'navigator',
'136': 'location',
'137': 'Object',
'138': 'Window',
'139': 'window',
'140': 'String',
'141': 'escape',
'142': 'Array',
'143': 'Boolean',
'144': 'Date',
'145': 'RegExp',
'146': 'JSON',
'147': 'Function',
'148': 'Location',
'149': 'Navigator',
'150': 'encodeURIComponent',
'151': 'bind',
'154': 'j9dJSRWGMezHLqyCu1pPQfs2XN0Ilhma7-UicAK6btroVxgZw5_nYOvE3TF48BDk',
'155': 'call',
'156': 'bind',
'158': 'bind',
'159': 'call',
'161': 'toString',
'164': 'map',
'168': 'forEach',
'172': 'push',
'176': 'join',
'180': 'indexOf',
'184': 'charCodeAt',
'188': 'replace',
'192': 'toLowerCase',
'196': 'indexOf',
'199': 'fromCharCode',
'202': 'toGMTString',
'204': 'setMinutes',
'206': 'getMinutes',
'208': 'undefined',
'209': 'OwAFMfVbLF',
'212': '\\s+|\\s*\\/\\*.*?\\*\\/\\s*|\\s*\\/\\/.*\\s*',
'215': 'hotelhst',
'219': 'OwAFMfVbLF',
'310': 'length',
'330': 'div',
'333': 'h1',
'334': 'h2',
'335': 'h3',
'336': 'h4',
'337': 'span',
'339': 'ul',
'340': 'li',
'357': 'jsdom',
'358': 'async_hooks',
'359': 'cluster',
'360': 'os',
'361': 'repl',
'389': 'floor',
'395': 'floor',
'396': 'WQ',
'400': 'floor',
'401': 'WQ',
'404': 'floor',
'405': 'WQ',
'406': 'WQ',
'418': 'length',
'420': 'floor',
'426': 'forEach',
'429': 'call',
'432': 'floor',
'433': 'random',
'438': 'setMinutes',
'439': 'getMinutes',
'443': 'cookie',
'446': 'WQ',
'447': ';expires=',
'448': 'WQ',
'449': 'toGMTString',
'451': 'WQ',
'452': ';path=/',
'453': 'WQ',
'455': 'push',
'458': 'length',
'463': 'Q1',
'464': 'length',
'470': 'charAt',
'471': 'length',
'474': 'length',
'477': 'WQ',
'479': 'Q4345',
'481': 'charCodeAt',
'496': 'window',
'497': 'document',
'499': 'body',
'500': 'children',
'502': 'length',
'504': 'window',
'505': 'parseInt',
'519': 'window',
'520': 'document',
'522': 'createElement',
'523': 'div',
'525': 'createElement',
'526': 'div',
'528': 'appendChild',
'530': 'appendChild',
'541': 'window',
'542': 'document',
'544': 'createElement',
'545': 'div',
'547': 'div',
'550': 'createElement',
'564': 'window',
'565': 'document',
'567': 'createElement',
'568': 'div',
'570': 'style',
'571': 'height',
'573': '20px',
'575': 'offsetHeight',
'576': 'body',
'577': 'appendChild',
'580': 'offsetHeight',
'582': 'remove',
'593': 'window',
'594': 'document',
'596': 'div',
'599': 'h1',
'600': 'h2',
'601': 'h3',
'602': 'h4',
'603': 'span',
'605': 'ul',
'606': 'li',
'608': 'length',
'610': 'createElement',
'612': 'tagName',
'633': 'fbejkbakrbadskfe',
'635': 'stack',
'637': 'vm|repl|bootstrapNodeJSCore|tryModuleLoad|evalmachine|runInContext',
'640': 'test',
'641': 'stack',
'645': 'number',
'656': 'window',
'657': 'Image',
'659': 'window',
'660': 'Image',
'663': 'keys',
'664': '__proto__',
'667': 'length',
'669': 'indexOf',
'682': 'window',
'683': 'navigator',
'685': 'platform',
'688': 'length',
'699': 'length',
'707': 'constructor',
'708': 'constructor',
'710': 'return process.mainModule.constructor._load',
'725': 'window',
'726': 'navigator',
'728': 'platform',
'731': 'length',
'746': 'ctrip.com',
'747': 'window',
'748': 'navigator',
'750': 'platform',
'751': 'platform',
'753': 'platform',
'756': 'platform',
'767': 'ctrip.com',
'768': 'window',
'769': 'navigator',
'771': 'appCodeName',
'772': 'appCodeName',
'774': 'appCodeName',
'777': 'appCodeName',
'788': 'ctrip.com',
'789': 'window',
'790': 'navigator',
'792': 'userAgent',
'793': 'userAgent',
'795': 'userAgent',
'798': 'userAgent',
'809': 'window',
'810': 'function',
'815': 'native code',
'820': 'stringify',
'822': '{}',
'833': 'window',
'834': 'navigator',
'836': 'window',
'837': 'document',
'839': 'window',
'840': 'webdriver',
'843': 'getOwnPropertyNames',
'845': 'getOwnPropertyNames',
'847': 'join',
'851': 'indexOf',
'852': 'webdriver',
'854': '_phantom',
'856': 'undefined',
'859': '__nightmare',
'861': 'undefined',
'864': '_selenium',
'866': 'undefined',
'869': 'callPhantom',
'871': 'undefined',
'874': 'callSelenium',
'876': 'undefined',
'879': '_Selenium_IDE_Recorder',
'881': 'undefined',
'884': '__webdriver_evaluate',
'886': 'undefined',
'889': '__selenium_evaluate',
'891': 'undefined',
'894': '__webdriver_script_function',
'896': 'undefined',
'899': '__webdriver_script_func',
'901': 'undefined',
'904': '__webdriver_script_fn',
'906': 'undefined',
'909': '__fxdriver_evaluate',
'911': 'undefined',
'914': '__driver_unwrapped',
'916': 'undefined',
'919': '__webdriver_unwrapped',
'921': 'undefined',
'924': '__driver_evaluate',
'926': 'undefined',
'929': '__selenium_unwrapped',
'931': 'undefined',
'934': '__fxdriver_unwrapped',
'936': 'undefined',
'939': 'external',
'940': 'external',
'941': 'toString',
'942': 'external',
'943': 'toString',
'945': 'external',
'946': 'toString',
'949': 'indexOf',
'951': 'Sequentum',
'956': 'documentElement',
'957': 'getAttribute',
'959': 'selenium',
'962': 'documentElement',
'963': 'getAttribute',
'965': 'webdriver',
'968': 'documentElement',
'969': 'getAttribute',
'971': 'driver',
'974': '\\$[a-z]dc_',
'980': 'concat',
'981': 'keys',
'984': '__proto__',
'986': 'length',
'988': 'match',
'990': 'cache_',
'994': 'userAgent',
'997': 'userAgent',
'998': 'toLowerCase',
'1001': 'indexOf',
'1002': 'headless',
'1007': 'getOwnPropertyDescriptor',
'1008': 'webdriver',
'1009': 'getOwnPropertyDescriptor',
'1010': 'webdriver',
'1012': 'get'
}
下面是补环境运行的结果发现运行结果一直 环境补出来大概几千行 加油慢慢补
2. 接下来分析算法还原。
然后我们在这些运算符号的位置打印输出日志
发现最后的结果是由这个64位数组拼接过来结果
看一下这个数组怎么来的
对应的是 发现这个f是转码过来 在vmp里面大部分都是由String.fromCharCode转码过来
初始化完会生成这个64位数组 然后对该数组进行运算
最后生成下面这个数组
最后补一张纯算的运行结果
纯算分析就到这里 多观察打印日志 里面都在里面 主要还是靠自己
如有侵权 请联系我删除 有需要的断点调试信息的需备注