首页
统计
邻居
留言
关于
Search
1
彩虹商城系统开发API文档
4,329 阅读
2
IntelliJ IDEA 报错TextMate bundle load error: Bundle kotlin can't be registered
3,747 阅读
3
使用RaiDrive将网盘映射为本地磁盘
2,175 阅读
4
谷歌浏览器 Google Chrome 69.0.3497.100 正式稳定版、测试版及开发版本大全
2,133 阅读
5
抖音、小红书、快手 免费三网解析去水印小工具
2,051 阅读
精选推荐
源码分享
软件下载
影视资源
经验教程
模板插件
Emlogo
Wordpress
浮夸小生。
情感杂文
趣味生活
影视后期
Java学习笔记
登录
Search
标签搜索
个人分享
Wordpress
浮夸小生。
Wordpress教程
Java
PHP
Wordpress优化
Java笔记
网络技巧
网站
CDN
Windows
又拍云
教程
浏览器
IntelliJ IDEA
html
建站教程
微信
情感杂文
浮夸小生。
累计撰写
83
篇文章
累计收到
220
条评论
首页
栏目
精选推荐
源码分享
软件下载
影视资源
经验教程
模板插件
Emlogo
Wordpress
浮夸小生。
情感杂文
趣味生活
影视后期
Java学习笔记
页面
统计
邻居
留言
关于
搜索到
41
篇与
源码分享
的结果
2021-12-08
仿新浪导航样式
效果代码如下<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>新浪导航</title> <style> * { margin: 0; padding: 0; } .nav { height: 41px; background-color: #FCFCFC; border-top: 4px solid #FF8500; border-bottom: 1px solid #EDEEF0; } .nav a { display: inline-block;/* 块,行内元素转为行内块 */ height: 41px; /*background-color: green;*/ line-height: 41px; padding: 0px 20px; text-decoration: none; color: #4C4C4C; font-size: 12px; } .nav a:hover { /* style */ background-color: #CCC; } </style> </head> <body> <div class="nav"> <a href="#">设为首页</a> <a href="#">手机新浪网</a> <a href="#">移动客户端</a> <a href="#">博客</a> <a href="#">微博</a> <a href="#">关注我</a> </div> </body> </html>
2021年12月08日
358 阅读
0 评论
0 点赞
2021-11-30
[逆向]某校园跑软件签名算法分析
前言同学在群中分享某虚拟定位轻松跑步法。作为旁观者,萌生出模拟请求进行数据伪造来完成任务(老操作了,像骨灰盒自动参加赠楼这种)某校园跑软件其实要求还算可以,极限情况:50天、每天1公里5分钟;就是不太好坚持分析思路{x} 抓包,看请求是否有签名,没有就去第4步 {x} 检测安装包是否有壳,无壳就去第4步 {x} 脱壳 {x} 分析代码 {x} 伪造请求 {x} 等待正义的审判 ::(惊哭)一、先抓包(非重点,不过多赘述)token 理论上是用户标识appkey 肯定大部分时间为定值sign MD5签名二、查壳360加固,一般 #(cos滑稽)三、脱壳这里使用这个工具:CodingGay/BlackDex: BlackDex is an Android unpack(dexdump) tool, it supports Android 5.0~12 and need not rely to any environment. BlackDex can run on any Android mobile phone or emulator, you can unpack APK File in several seconds. (github.com) 下载32位版本安装包(因为,目标APP是32位的){message type="warning" content="顺便记下包名com.tanma.unirun"/}单击目标应用,开始脱壳四、分析目标“源码”位置打开脱壳后的dex文件所在目录,使用MT管理器 的 dex编辑器++ 打开搜索字符串 sign只看目标应用的包看包名:{x} entities 实体包,排除 {x} enums 枚举包,排除 {x} network.settings 网络设置包 且类名”MyInterceptor”与拦截相关, 大概率符合条件初步查看源码,在请求头中添加sign,肯定是这里了接下来,使用电脑进行具体签名流程分析了五、分析代码逻辑分析请看注释public final class MyInterceptor implements Interceptor { private static final String APPKEY = "389885588s0648fa"; private static final String APPSECRET = "56E39A1658455588885690425C0FD16055A21676"; private static final Charset ChartSet_UTF8 = Charset.forName("UTF-8"); public static final Companion Companion = new Companion((DefaultConstructorMarker) null); public MyInterceptor() { } static { } public Response intercept(Interceptor.Chain chain) { boolean z; String str; Request.Builder newBuilder; Request.Builder addHeader; Request.Builder addHeader2; Request.Builder newBuilder2; Request.Builder addHeader3; Request.Builder addHeader4; Request.Builder addHeader5; String str2; String str3; boolean z2; String str4; String str5; String str6; String str7; Set queryParameterNames; Interceptor.Chain chain2 = chain; Intrinsics.checkParameterIsNotNull(chain2, "chain"); Request request = chain.request(); // 注意,TreeSet是有序集合,且默认为正序排列,即{a, b, c, d [,...]} TreeSet treeSet = new TreeSet(); Request request2 = null; HttpUrl url = request != null ? request.url() : null; if (!(url == null || (queryParameterNames = url.queryParameterNames()) == null)) { treeSet.addAll(queryParameterNames); } // 待签名字符串 StringBuilder sb = new StringBuilder(); Iterator it = treeSet.iterator(); // 开始迭代所有请求参数 while (true) { z = false; if (!it.hasNext()) { break; } // str8 为参数名 String str8 = (String) it.next(); // 获取参数名对应的值 List queryParameterValues = url != null ? url.queryParameterValues(str8) : null; if (queryParameterValues != null && (true ^ queryParameterValues.isEmpty())) { // 参数值非空 // 取参数值列表第一个 String str9 = (String) (url != null ? url.queryParameterValues(str8) : null).get(0); if (!TextUtils.isEmpty(str9)) { // str8 参数名, str9 参数值 // str9非空,追加str8 str9在sb之后 sb.append(str8); sb.append(str9); } } } // 追加APPKEY sb.append("389885588s0648fa"); // 追加APPSECRET sb.append("56E39A1658455588885690425C0FD16055A21676"); if (request.body() != null) { BufferedSink buffer = new Buffer(); RequestBody body = request.body(); if (body != null) { body.writeTo(buffer); } Charset charset = ChartSet_UTF8; RequestBody body2 = request.body(); MediaType contentType = body2 != null ? body2.contentType() : null; if (contentType != null) { // 追加请求体 sb.append(buffer.readString(contentType.charset(charset))); } } // 同sb String sb2 = sb.toString(); Intrinsics.checkExpressionValueIsNotNull(sb2, "signStr.toString()"); CharSequence charSequence = sb2; if (!(charSequence == null || charSequence.length() == 0)) { // 本级语句块替换一些字符为空字符,即删除部分字符,这将导致参与MD5运算的字符串有所差异 // z2 为是否发生过替换操作 // 删除空格 if (StringsKt.contains$default(charSequence, " ", false, 2, (Object) null)) { str3 = StringsKt.replace$default(sb2, " ", "", false, 4, (Object) null); z2 = true; } else { str3 = sb2; z2 = false; } // 删除~ if (StringsKt.contains$default(str3, "~", false, 2, (Object) null)) { str4 = StringsKt.replace$default(str3, "~", "", false, 4, (Object) null); z2 = true; } else { str4 = str3; } // 删除! if (StringsKt.contains$default(str4, "!", false, 2, (Object) null)) { str5 = StringsKt.replace$default(str4, "!", "", false, 4, (Object) null); z2 = true; } else { str5 = str4; } // 删除( if (StringsKt.contains$default(str5, "(", false, 2, (Object) null)) { str6 = StringsKt.replace$default(str5, "(", "", false, 4, (Object) null); z2 = true; } else { str6 = str5; } // 删除) if (StringsKt.contains$default(str6, ")", false, 2, (Object) null)) { str7 = StringsKt.replace$default(str6, ")", "", false, 4, (Object) null); z2 = true; } else { str7 = str6; } // 删除' if (StringsKt.contains$default(str7, "'", false, 2, (Object) null)) { sb2 = StringsKt.replace$default(str7, "'", "", false, 4, (Object) null); z = true; } else { z = z2; sb2 = str7; } if (z) { sb2 = URLEncoder.encode(sb2, "utf-8"); Intrinsics.checkExpressionValueIsNotNull(sb2, "URLEncoder.encode(dealStr,\"utf-8\")"); } } if (z) { StringBuilder sb3 = new StringBuilder(); // 使用替换结果 sb2 计算MD5 String encodeByMD5 = MD5Digest.Companion.encodeByMD5(sb2); if (encodeByMD5 == null) { str2 = null; } else if (encodeByMD5 != null) { // 转换为大写 str2 = encodeByMD5.toUpperCase(); Intrinsics.checkExpressionValueIsNotNull(str2, "(this as java.lang.String).toUpperCase()"); } else { throw new TypeCastException("null cannot be cast to non-null type java.lang.String"); } sb3.append(str2); // MD5追加编码 sb3.append("encodeutf8"); str = sb3.toString(); } else { MD5Digest.Companion companion = MD5Digest.Companion; // 没有发生替换,使用sb String sb4 = sb.toString(); Intrinsics.checkExpressionValueIsNotNull(sb4, "signStr.toString()"); // 使用sb计算MD5 String encodeByMD52 = companion.encodeByMD5(sb4); if (encodeByMD52 == null) { str = null; } else if (encodeByMD52 != null) { // 转换为大写 str = encodeByMD52.toUpperCase(); Intrinsics.checkExpressionValueIsNotNull(str, "(this as java.lang.String).toUpperCase()"); } else { throw new TypeCastException("null cannot be cast to non-null type java.lang.String"); } } try { User user = (User) new PreUtil("sp_name_user").getValue("sp_user", Reflection.getOrCreateKotlinClass(User.class), (Object) null); if (user != null) { OauthTokenBean oauthToken = user.getOauthToken(); String token = oauthToken != null ? oauthToken.getToken() : null; Request request3 = chain.request(); if (!(request3 == null || (newBuilder2 = request3.newBuilder()) == null || (addHeader3 = newBuilder2.addHeader("token", token)) == null || (addHeader4 = addHeader3.addHeader("appKey", "389885588s0648fa")) == null || (addHeader5 = addHeader4.addHeader("sign", str)) == null) // 添加签名至头部 ) { request2 = addHeader5.build(); } } else { Request request4 = chain.request(); if (!(request4 == null || (newBuilder = request4.newBuilder()) == null || (addHeader = newBuilder.addHeader("appKey", "389885588s0648fa")) == null || (addHeader2 = addHeader.addHeader("sign", str)) == null)) { request2 = addHeader2.build(); } } Response proceed = chain2.proceed(request2); if (proceed == null) { Intrinsics.throwNpe(); } return proceed; } catch (Exception e) { e.printStackTrace(); Response proceed2 = chain2.proceed(request); if (proceed2 == null) { Intrinsics.throwNpe(); } return proceed2; } } }六、逻辑总结(经过验证){x} 将请求参数正序排序 {x} 将请求参数按 参数名1参数值1参数名2参数值2.... 拼接 {x} 追加appkey, 追加appsecret {x} 追加请求体 {x} 删除部分字符 {x} 计算MD5
2021年11月30日
489 阅读
0 评论
0 点赞
2021-09-17
Sublime text3编辑器 HTML快速生成代码 Tab无效快速解决方法
##安装Emmet
2021年09月17日
448 阅读
0 评论
0 点赞
2021-09-03
抖音结尾关注我圆形落版制作素材 抖音圆形视频教程 抖音怎样制作圆形视频(干货)
{dplayer src="https://pan.uourl.com/directlink/1/%E5%8D%9A%E5%AE%A2/%E7%BB%93%E5%B0%BE.mp4"/}素材如下来拿吧~隐藏内容,请前往内页查看详情
2021年09月03日
517 阅读
2 评论
0 点赞
2021-04-04
IntelliJ IDEA 报错TextMate bundle load error: Bundle kotlin can't be registered
TextMate bundle load error: Bundle kotlin can't be registered网上搜了一下,有些文章的解决方法用一句话来说就是:啥也不是。解决方法跟这个报错毫无相关。还是要多去官网相关的文章寻找一下解决方法。Idea 解决如下:Preferences->TextMate Bundles 下取消勾选就可以了,然后restart idea
2021年04月04日
3,747 阅读
0 评论
4 点赞
2021-03-12
Layui 监听复选框勾选input输入框获取指定内容
数据表格获取列表成功 //复选框监听事件 table.on('checkbox(test)', function(obj){ var data = obj.data.courseName; //获取数据表格单元id值 if($(this).prop("checked")==true){ //监听表格勾选 如果为ture var cs3 = $("#class_name").val(); // 变量 cs3 赋值为输入框的值 $("#class_name").val(cs3+data+""); //input获取复选框勾选内容 if($('input:checked').length == 1 ){ //多数据 空格隔开显示 }else{ } } else{ console.log("未勾选"); var cs3 = $("#class_name").val(); var data = cs3.replace(data+" ",""); $("#class_name").val(data); $("#num_min").trigger("click"); } console.log(data) });
2021年03月12日
1,201 阅读
0 评论
1 点赞
2021-03-12
记Layui 数据表格提示成功但不能加载出数据 神坑!
关于layui表格数据渲染,实际上是非常好用以及方便的。但是坑来了。parseData官方文档默认文档默认规定的数据格式 { "code": 0, "msg": "", "count": 1000, "data": [{}, {}] } 很多时候,您接口返回的数据格式并不一定都符合 table 默认规定的格式,比如: { "status": 0, "message": "", "total": 180, "data": { "item": [{}, {}] } } 那么你需要借助 parseData 回调函数将其解析成 table 组件所规定的数据格式 table.render({ elem: '#demp' ,url: '' ,parseData: function(res){ //res 即为原始返回的数据 return { "code": res.status, //解析接口状态 "msg": res.message, //解析提示文本 "count": res.total, //解析数据长度 "data": res.data.item //解析数据列表 }; } //,…… //其他参数 }); 切记切记 一定不要忘记重新规定成功的状态码要不然确实接口提示成功,不能渲染出数据。,response: { statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0 }
2021年03月12日
1,358 阅读
0 评论
2 点赞
2021-01-17
github图床 typecho --- 记一次踩坑
我抛弃了 又拍云存储我终究是用了 Github免费图床,体验还是不错自从去年12月份开始,博客、等我折腾的小网站流量日益增多,不少刷流量的,也怪自己测试东西的时候没有开防火墙,又拍云一个多月用去了100RMB,没有收入的我,域名+服务器双双到期催租。至此抛弃了又拍云。Typecho将图片上传到github并使用jsdelivr加速从网上找到一个插件 UploadGithubForTypecho在附件插入,直接上传到Github,自动使用jsdelivr对图片加速自我感觉棒棒的。设置踩坑在这里所说的用户名 是仓库的用户名 切记 不是登录账户的用户名~需要的各位可以体验一下,总体说还是不错的~插件地址:https://github.com/AyagawaSeirin/UploadGithubForTypecho
2021年01月17日
802 阅读
3 评论
1 点赞
2020-12-20
关于vue告警:More than 1 blank line not allowed
vscode环境开发vue-cli脚手架工程,eslint规范检查工具告警笔记警告警告内容✘ http://eslint.org/docs/rules/no-multiple-empty-lines More than 1 blank line not allowed src\components\question.vue:138:1 ^这行警告的关键信息:More than 1 blank line not allowed 百度翻译如下:空行不允许超过1个用代码来说明,即:将 console.log('first line') console.log('second line')修改为 console.log('first line') console.log('second line')即可。(vscode邮件自动格式化很方便)官网指南eslint官网关于此问题的链接:http://eslint.org/docs/rules/no-multiple-empty-lines关于此问题,官网信息唯一值得一提的是 最大空行数可以配置 :{ "max": 2 }
2020年12月20日
1,485 阅读
0 评论
2 点赞
2020-12-19
typecho启用插件提示 Server Error
typecho有时在启用插件会提示Server Error由于从wodpress新转Typecho有一些地方总是出现小问题。解决办法很简单,大家不要想复杂化出现这个问题的原因很有可能是因为插件的名字与插件文件的名字不符所导致的。首先在 typecho 的后台插件中查看插件的名字然后修为[tag type="default"]/usr/plugins/[/tag]中插件的文件夹名与后台看到的插件名称一致即可。
2020年12月19日
675 阅读
0 评论
0 点赞
1
2
3
...
5