首页 > 其他分享 >完美世界逆向分析案例

完美世界逆向分析案例

时间:2023-06-28 12:57:36浏览次数:71  
标签:逆向 函数 完美 代码 js 改写 案例 断点 JSEncrypt

​ 案例url:https://passport.wanmei.com/login?location=L3NhZmUv

image-20220425140537741

逆向分析思路:

1)寻找加密参数

​ 输入用户名和密码后,点击登录按钮,通过抓包工具捕获点击登录按钮后发起请求对应的相关数据包。

image-20220425140946614

2)全局搜索加密参数

​ 打开全局搜索框:点击右上角的三个点,打开search表示的全局搜索框即可,在其内部搜索password。在这些数据包中重点关注js文件对应的代码,在其内部找寻加密解密的相关操作。

image-20220425141424320

3)定位到正确的加密断点位置

​ 定位一个js数据包,点击左下角的大括号进行js文件代码的格式化显示。在该数据包内部代码中点击一下,按下Ctrl+F进行局部搜索,搜索password即可,在可疑加密的位置打下断点即可。在可疑之处打上断点后,需要基于抓包工具进行请求的重新发送,查看是否会停留在断点的位置,寻找到正确的加密断点位置

image-20220425152033305

4)改写JS加密函数

​ 通过上面的断点位置分析,断点代码的关键字:setPublicKey,encrpt,通过这两个关键字确定该算法为非对称秘钥加密算法。e.setPublicKey($('#e').val()); 该行代码是在设置公钥,因此函数的参数应该是公钥表示的字符串。

image-20220426145052623

//改写之前
var e = new JSEncrypt();
e.setPublicKey($('#e').val()); 
if (!isUsbkey) {
   $("#logintype").val("normal");
   var p = e.encrypt(passwd);
   $("#password").val(p);
   return true;
}

//$('#e').val()就是公钥表示的字符串。$('#e').val()的意思是,获取id为e的标签中存储的数据值,将该数据值作为公钥使用。
//经过多次断点测试对比,公钥是写死的,不需要去动态获取,此处的公钥为:
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjfeE0MIYsZes/HwV06/kvRw34Hmhn9WPt0feLPp1PVqdqZz1/xFvPPEAJ/lAvfqt5kyn+A06bvYXIhizTjlOzPgLE4897ihuSYXgfwcUshPZvydRLbftU6Exj5SLbv5tw4GInbgQv7RWLWOKyQA81q6lWae2Kcgd1XpDRsQNXVwIDAQAB"


//改写之后,公钥可以写死放进去,这里只是没有放而已
function getPwd(password, pubkey) {
var e = new JSEncrypt();
e.setPublicKey(pubkey);
var p = e.encrypt(password);
return p;
};

5)构建函数上下文

​ 改写完JS加密函数之后,缺少函数执行所需要的上下文,我们需要定位到setPublicKey函数和encrypt函数的实现代码(鼠标可以放在函数名上,出现的提示框中点击就可以进入到函数的实现中,就可以查看函数的实现代码)

image-20220426141346953

​ 这里经过分析发现该两个函数的代码实现都在jsencrypt.min.js:formatted文件中,并且通过该文件的命名和首行注释判断整个文件都是加密算法所需要的上下文代码。

image-20220426143224082

​ 这里直接copy全部代码到js改写工具中加载代码进行检查是否存在语法错误,发现出现报错,经过对比分析发现是编码错误。直接将js代码粘贴到发条改写工具中,可能会出现编码问题,则可以将js代码先粘贴到pycharm中,再将pycharm中的代码复制粘贴到发条改写工具中,不要点击格式化按钮,然后直接点击加载代码按钮,会出现一个错,定位在了s = "…",可以将该行代码删除,自己重新写一遍即可!至此编码问题就解决了!

image-20220426142434294

image-20220426142710567

​ 解决完上面的编码问题之后再次加载代码,发现出现'navigator' 未定义的错误,直接在首行navigator = this;,出现'window' 未定义也同样操作

image-20220426144141132

image-20220426144537992

​ 至此,加载代码成功,全部问题已解决,可以在改写工具上去调用getPwd函数

image-20220426145448551

6)python运行

import execjs
node = execjs.get()
fp = open('wanmeishijie.js','r',encoding='utf-8')   # 编码,不行就gbk
ctx = node.compile(fp.read())
pwd = "123456"
key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjfeE0MIYsZes/HwV06/kvRw34Hmhn9WPt0feLPp1PVqdqZz1/xFvPPEAJ/lAvfqt5kyn+A06bvYXIhizTjlOzPgLE4897ihuSYXgfwcUshPZvydRLbftU6Exj5SLbv5tw4GInbgQv7RWLWOKyQA81q6lWae2Kcgd1XpDRsQNXVwIDAQAB"
jsFunc = 'getPwd("%s","%s")'%(pwd,key)
result = ctx.eval(jsFunc)
print(result)

​ 写好上面的代码,报错JSEncrypt is not defined,这里隐藏了一个坑

image-20220426160256175

​ 经过分析,报错原因是因为代码中var t 都是局部变量,后面的 t.JSEncrypt 在pycharm中产生了歧义,由于发条改写工具是js环境,所以上面在改写工具中没有报错,但是pycharm是兼容js和python的,其中产生了某种错误,导致调用失败

image-20220426160529734

image-20220426160744208

​ 解决办法就是将 t.JSEncrypt 改为 JSEncrypt 就行了,这样重新定义的 JSEncrypt 就是一个全局变量,再次运行就不会报错了

image-20220426161151806

标签:逆向,函数,完美,代码,js,改写,案例,断点,JSEncrypt
From: https://www.cnblogs.com/charonlight/p/17511097.html

相关文章

  • 微信公众平台逆向分析案例
    ​ 请忽视具体网站,重点专注逆向的分析思路!重点是分析思路!案例url:https://mp.weixin.qq.com分析思路:1)随便输入账号密码进行登录(admin,123456),打开F12进行抓包2)通过抓包工具发现,密码是经过加密,并且发现密码的加密后的数据是32位,(猜测)大概率是md5加密的!3)发现加密后的数据是被pwd这......
  • 强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定
    强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战1、定义算法1.1定义模型!pipuninstall-yparl!pipinstallparlimportparlimportpaddleimportpaddle.nnasnnimportpaddle.nn.functionalasFcl......
  • 强化学习从基础到进阶–案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定
    强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战1、定义算法1.1定义模型!pipuninstall-yparl!pipinstallparlimportparlimportpaddleimportpaddle.nnasnnimportpaddle.nn.functionalasFcla......
  • 互联网 + :小米案例版
    目录上:感知正在生成的未来中:做适者生存的“达尔文雀”“互联网+”价值观“互联网+”流程“互联网+”资源下:进化的未来:两种路线并行路线一:以“互联网+”实现跨界,大举建设生态系路线二:借助“互联网+”,做全球化小而美的企业 这本”访谈录“我还是接触的有点晚,这是2015年出版的书,小米......
  • PHP语言对接抖音快手小红书视频/图片去水印API接口的案例
    这篇文章主要介绍了PHP语言对接抖音快手小红书视频/图片去水印API接口的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。以下为PHP语言调用去水印接口的示例,展示GET请求方式的调用方式。示例代码中用到的Uid和Toke......
  • re | 逆向算法笔记
    凯撒算法加密for(i=0;i<strlen(passwd);i++){if(passwd[i]>='A'&&passwd[i]<='Z'){passwd[i]=((passwd[i]-'A')+move)%26+'A';}elseif(passwd[i]>='a'&&......
  • re | 逆向刷题笔记
    IDAdump内存脚本importidcdefmain():begin=0xCD956000;#需对应修改size=0x2FB000##需对应修改list=[]foriinrange(size):byte_tmp=ida_bytes.get_byte(begin+i)list.append(byte_tmp)if(i+1)%0x10......
  • 实际案例分析 - 根据应用程序日志的记录,反查出哪一行 ABAP 代码产生的这条日志试读版
    本文的写作动机来自笔者知识星球一个朋友的提问:调用bapi创建主数据的时候报错,没有未物料组分配特性参数文件,这个是什么原因?实际查看,特性文件已经生成了这个朋友提供的是应用程序日志(即ApplicationLog)里的截图。关于应用程序日志的详细用法,笔者之前的文章已经做过介绍。......
  • 案例6-YApi Python SDK开发
    需求描述什么是SDKSDK(Softwaredevelopmentkit)软件开发包,是软件或平台面向开发者的一种快速开发工具或套件,使开发者可以更方便、灵活的使用软件或平台功能。一般(比较注重生态的)软件或平台会提供不同语言或平台或框架的包,来适用不同的开发者。例如Selenium就提供了Python、......
  • re | buuctf逆向刷题之crackMe
    写在前头本题来自安洵杯2019crackMe,涉及到的知识点较多,Mark一下分析从main开始反编译main函数,9行这里触发了一个内存写异常,有点奇怪哈发现SEH查看汇编,哦这里注册了一个SEH函数,sub4100F跟进去看一下,很简单的算法,input划分为4个4字节的值,赋给v5,v5数组按照往后递推的方式,由......