JS逆向入门教程p1 浏览器设置 常用工具_城南post助手

语句  是由  表达式构成的
程序  是由  语句构成的

混淆的字面量
 {a:1}.a 不是一个语句,想把它变成语句,用括号括起来

({a:1})['a']

({a:1}).a

var b=['a']
;({a:1})[b[0]]

var b=['YQ==']
function c(index){
    return atob(b[index])
}    
;({a:1})[c(0)]
let day = new Date().getDay();
let dayName;

switch (day) {
  case 0:
    dayName = "Sunday";
    break;
  case 1:
    dayName = "Monday";
    break;
  case 2:
    dayName = "Tuesday";
    break;
  case 3:
    dayName = "Wednesday";
    break;
  case 4:
    dayName = "Thursday";
    break;
  case 5:
    dayName = "Friday";
    break;
  case 6:
    dayName = "Saturday";
    break;
  default:
    dayName = "Unknown";
}

console.log("Today is " + dayName);

typeof 并不能准确的返回类型
继承 (实现的功能)—原型链(原理)

实例  实体(最终做出的东西)       原型(设计稿)(constructor方法)对象
new 类 constructor()                   类

prototype                                      __proto__

__proto__

a.__proto__
Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}
创建对象:
function a() {
    console.log(1)
}
new a();

this谁调用的就是谁  如果是在构造函数中this是实例

https://www.91q.com/song/T10063924403

网易云音乐

网站例子

4.工具使用(编程喵插件、vscode)

F12其余功能

Web 开发技术 Web 开发技术 | MDN

hook  替换功能
FD本地替换js
funetion xx() {console.log(1)}
xx = function() {}
v8提供的API进行hook
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects
字节数组[25,45,23,65,58] uint8 0-255
[uint8,uint8,uint8,uint8] => [int32]

TextDecoder(字节数组和文本的转换)、TextEncoder、DataView(字节数组的增删改查)、wss(谷歌)

Data 时间 时区+8

Date - JavaScript | MDN

TextDecoder是一个用于将二解码受一个字符编码参数,并提供了decode()方法来将二进制数据解码字符串。

以下是一个使用TextDecoder的例子:

// 创建一个Uint8Array数组,包含UTF-8编码的二进制数据
const uint8Array = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);
​
// 创建一个TextDecoder对象,指定字符编码为UTF-8
const decoder = new TextDecoder('utf-8');
​
// 使用TextDecoder解码二进制数据为字符串
const decodedString = decoder.decode(uint8Array);
​
console.log(decodedString); // 输出: "Hello World"

在上面的例子中,我们首先创建了一个Uint8Array数组,其中包了UTF-8编码的二进制数据。然后,我们创建了一个TextDecoder对象,并指定字符编码为UTF-8。最后,我们使用TextDecoder的decode方法将二进制数据解码为字符串。

TextEncoder是TextDecoder的反向操作,它用于将字符串编码为二进制数据。它提供了一个encode()方法来将字符串编码为Uint8Array数组。

以下是一个使用TextEncoder的例子:

// 创建一个TextEncoder对象
const encoder = new TextEncoder();
​
// 使用TextEncoder将字符串为二进制数据
const encodedData = encoder.encode('Hello World');
​
console.log(encodedData); // 输出: Uint8Array [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100 ]

在上面的例子中,我们首先创建了一个TextEncoder对象。然后,我们使用TextEncoder的encode方法将字符串编码为二进制数据。最后,我们通过打印encodedData数组来查看编码后的二进制数据。

DataView是一个用于读取和写入二进制数据的API。它提供了一种灵活的方式来操作二进制数据,可以读取和写入不同类型的数据,如整数、浮点数等。

以下是一个使用DataView的例子:

// 创建一个ArrayBuffer对象,长度为8字节
const buffer = ArrayBuffer
// 创建一个DataView对象,关联到上面的ArrayBuffer 
const view = new DataView(buffer);

//DataView写入一个32位整数ArrayBuffer的第0字节位置 
view.setInt32(0, 42);

// 使用DataView读取ArrayBuffer的第0字节位置的32位整数 
const value = view.getInt32(0console.log(value); 
// 输出: 42

在上面的例子中,我们首先创建了一个长度为8字节的ArrayBuffer对象。然后,我们创建了一个关联到该ArrayBuffer的DataView对象。接下来,我们使用DataView的setInt32方法将一个32位整数写入ArrayBuffer的第0字节位置。最后,我们使用DataView的方法读取ArrayBuffer的第0字节位置的32位整数,并将其打印出来。
​
总结来说,TextDecoder制解码为字符串TextEncoder用于将字符串编码为二进制数据,而DataView用于取和写入二进制数据。这些API在处理二进制数据和文本数据之间的转换时非常有用。

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

eval('debugger')
解决:
1.hook,替换js
eval=function(){}
2.在eval('debugger')语句前下断点,在控制台输入eval=function(){}
脚本
脚本的第一个语句,选上这个
脚本因内容安全政策而被屏蔽

子类  继承了  父类  吃饭
子类.吃饭
zhivuan方法  继承  Function      调用
                                                  hook 调用
zhiyuan方法.调用()

globalThis
Window {0: Window, window: Window, self: Window, document: document, name: '', location: Location, …}0: 
window
Window {0: Window, window: Window, self: Window, document: document, name: '', location: Location, …}
this
Window {0: Window, window: Window, self: Window, document: document, name: '', location: Location, …}
self
Window {0: Window, window: Window, self: Window, document: document, name: '', location: Location, …}

json  序列化 反序列化

JSON.parse()
JSON.stringify()

const jsonString = '{"name":"John", "age":30, "city":"New York"}';
const obj = JSON.parse(jsonString);
console.log(obj);

const obj1 = { name: "John", age: 30, city: "New York"};
const jsonString1 =JSON.stringify(obj1);
console.log(jsonString1); 

{name: 'John', age: 30, city: 'New York'} 对象
{"name":"John","age":30,"city":"New York"} 文本

JSON
var a; 变量
undefined  未定义
null  引用类型值为空
NaN  非数字的值

Promdse 异步 同一个线程合理的分配运行时间到不同的任务一种技术

Proxy  做hook用  加代理  无法被检测
Reflect   解代理(配套使用)
Proxy 不能被检测

a={name:123}

var a = new Proxy(a, {
  get: function(target, property, receiver) {
      return 'abc'
  }
    
});
console.log(a.name)
abc

var a = {name: 123};
var a = new Proxy(a, {
    set(target, property, value, receiver) {
        Reflect.set(target, property, "xhiyuam", receiver);
    }
});
a.name = 1;
console.log(a.name);
xhiyuam

重要:

Proxy - JavaScript | MDN

Reflect - JavaScript | MDN

symbol

Object.freeze()

Object.freeze() 静态方法可以使一个对象被冻结。冻结对象可以防止扩展,并使现有的属性不可写入和不可配置。被冻结的对象不能再被更改:不能添加新的属性,不能移除现有的属性,不能更改它们的可枚举性、可配置性、可写性或值,对象的原型也不能被重新指定。freeze() 返回与传入的对象相同的对象。

var a = {name: 123};
Object.freeze(a);
a.name=1
console.log(a.name)

var a = {name: 123};
delete(a)
false
delete(a.name)
true

document.getElementById

在浏览器代替js

视频知识点
NP4 AVI  数据长度讲行分割
断点续传 范围   运行的时候干分割的事情
N3U8   hls协议 还可以用时间分割  直播 点播
ts ts ts  提前分割文件
5s 5s 5s
加密
拿到日录  bd
.ts 地址(相对  绝对)tx
sha1:40位

知道加密算法后,找加密方法的js实现,直接在网页搜索关键词,然后下断点

hook完整过程

//保存原函数
//替换原雨数
//调用原丽数
doqument.createElement2= doeument.createElement;

document.createrlement = function(tagName) {
let e=doeument.createElement2 (tagName);
if ((tagName.toLowerCase) == 'script'){
return  new Proxy(e, {
    set(target, property, value, receiver) {
    	if(value.indexof('getVideoinfo' != -1)){
    	debugger;
    	}
        Reflect.set(target, property, "xhiyuam", receiver);
    }
});
}
	return e
}
doeument.createElement('script')

本地替换js

怎么hook:在浏览器第一次加载js的位置,在js第一行下断点,在控制台输入上面的代码

Node.prototype.insertBefore2= Node.prototype.insertBefore;
Node.prototype.insertBefore=function(t,tt){
if(t.src!=undefined)
{
if(t.src.indexof("getvideoinfo")!=-l){
debugger;
}}
return this.insertBefore2(t,tt)
}
document.createElement("script")

5.工具使用(F12  FD  城南工具)

wss协议分析websocket

直播间  IM  即时通讯
比较占服务器的资源
http  慢  不够即时  短连接  TCP
  握手
  发请求
  返回数据
  服务器主动断开链接
websockets  长连接  TCP
    http握手  升级为websockets
    升级协议
    连接服务器wss ip:端口
    等待
socket
    数据接收
    处理粘包
    并不看数据是否全部接收完成
服务器发送  网线  电脑网卡(驱动)系统端口

1.数据缺失

2.数据多了
    一个包完整+不完整包
    多个包完整+不完整
3.数据正好

软件处理
1.固定长度100 YY
缓冲区  先存到缓冲区
2.头尾标识符 QQ
01   05
3.TLV  QQ
标识符
数据长度
数据

protobuf  谷歌数据序列化格式  字节数组 游戏
    省空间
JSON
XML

protobuf格式  代码转换
                        序列化   二进制

python  类  用户类    js  用户类
json                           json
                                 C++格式

MQTT  消息分发  消息队列 socket

订阅消息   斗地主

升级websockets  协议:

https://www.miguvideo.com/p/live/120000456669
101 Switching Protocols

Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: aHdCFL8tBIh1Pi7s1sq9gg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

FD替换js,浏览器f12打开禁止缓存

e.ws.send =function(){debugger;} 找到发送位置
或者
e.ws.send2= e.ws.send;
e.ws.send = function(a) {
console.log(a)
e.ws.send2 (a)
}

e.ws.onmessage2=e.ws.onmessage;
e.ws.onmessage=function(r){
console.log(r);
e.ws.onmessage2(r);
}
需要再new WebSocket,再输入

代码中的问题是,e.ws.send2(a)应该改为e.ws.send2.call(e.ws, a),以确保在调用原始的send方法时,正确地绑定this关键字。
e.ws.send2 = e.ws.send;
e.ws.send = function(a) {
  console.log(a);
  e.ws.send2.call(e.ws, a);
}

e.ws.onmessage2 = e.ws.onmessage;
e.ws.onmessage = function(r) {
  console.log(typeof(r.data), r.data);
  if (r.data.indexOf("compressType") !== -1) {
    debugger;
  }
  e.ws.onmessage2(r);
}

全局找函数在哪里定义:

protoData:

protoData=、protoData =

或者在控制台输入e,找方法在哪里定义

6.工具使用(WT-JS) 常见算法

常见算法
OB混淆 看结构

常见算法
对称   key   明文   相同   得出的密文也相同
TEA  32轮  KEY  IV  CBC

AES    KEY(16字节、32字节 [15]) 【确定算法内部秘钥数组的长度】IV(16字节)  mode(CBC[]key、iv]、ecb[key])

des   和AES一致

sm4(国密)node自带
非对称   key   明文   相同   得出的密文是变动的
rsa   魔值(010001)秘钥里面可能会带换行(新版谷歌打印会把换行打印为\r\n 某些浏览器会打印\n)

椭圆曲线算法 (TX PCqq密码加密)TX:TEA、椭圆曲线算法(pcqq密码)

取摘要算法   不可逆      hmac带秘钥
md5   16 32 ,少见40用于后端存数据库

sha1  40

hmac-md5  多个key

hmac-shal  多个key

rc4
编码算法
base64  a-z A-Z 0-9 + = -

自写算法

qq音乐sign

例子

e.exports = function(e) (
return new Promise(function(t, c) (
var u = e.data
, h = e.headers;

Promise.then(成功回调,失败回调)
n=n.then(t.shift(),t.shift());不能直接下断    我要跟栈直到找到一个可以确定的地方先下断
断到能确定的位置    再在此处下断    断住之后找第一个参数数组的第一个方法    此方法大概率    解密或加密方法
可以跳过异步    参与加解密
www.baidu.com/1
www.baidu.com/2
www.baidu.com/3 
www.baidu.com/4 不能确定返回的包是不是自己要的

调试异步
能跳过就跳过  异步调试很麻烦
遇见跳不过的   Promise.then
第一种情况:n=n.then(t.shift(),t.shift());

setMaxDigits
接口    返回了json    (JsoN.parse))->对象->[“publicExponent”] ·publicExponent

//OB常量存到大数组
//有一个方法    处理大数组    得到要的值    这个方法后面跟着的就是明文代码    明文方法后面    就是反调试
//替换其他需要常量的地方    替换成函数调用
//OB平坦流 流程平坦化

//局部变量函数化
//垃圾指令

最后

小编综合了阿里的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

虽只说了一个公司的面试,但我们可以知道大厂关注的东西并举一反三,通过一个知识点延伸到另一个知识点,这是我们要掌握的学习方法,小伙伴们在这篇有学到的请评论点赞转发告诉小编哦,谢谢大家的支持!

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于iapp逆向教程工具的打包,我们可以采取以下步骤: 1. 确定所需工具:首先,我们需要根据具体的逆向需求确定所需的工具。例如,逆向iOS应用程序时,我们通常会使用Xcode、Hopper、Cycript等工具。 2. 安装依赖:根据所需工具的要求,我们需要安装和配置相应的依赖库和环境。例如,如果使用Xcode进行逆向分析,我们需要安装最新版本的Xcode,并安装对应的Simulator模拟器。 3. 下载工具:从可信赖的源下载所需的工具。确保下载的工具是最新版本,并且来自官方或可信任的第三方提供商。 4. 解压和安装:将下载的工具文件解压到合适的文件夹中。根据工具的安装说明,执行安装步骤。例如,安装Xcode只需将其拖到Applications文件夹即可。 5. 配置环境:根据工具的要求,进行必要的环境配置。例如,配置Xcode的开发者账号和证书,以便进行应用程序的逆向分析。 6. 测试工具:在合适的环境下,尝试运行工具,确保其正常工作。例如,使用Hopper对应用程序进行反汇编和分析,验证其是否能正确解析二进制代码。 7. 打包工具:一旦所有工具都配置完毕并通过测试,可以将其打包为一个整体。可以将工具文件夹打包为一个压缩文件,便于其他人在需要时方便地使用和部署。 总结来说,打包iapp逆向教程工具的过程包括确定所需工具、安装依赖、下载工具、解压和安装、配置环境、测试工具和最终打包工具。打包后的工具可以方便地分享给其他人,帮助他们进行iapp逆向分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值