- 博客(117)
- 收藏
- 关注
原创 手写TCP/IP协议——IP层输出处理
由于需要返回mac_addr的值,而在ethernet_out中mac_addr是uint8*所以这里mac_addr需要使用二级指针,才能返回解析后的值。由于以太网层面无法直接识别IP地址,还需要实现一下IP地址到MAC地址的转换函数ethernet_out。将IP地址转为MAC地址之后,再调用以太网底层发送函数ethernet_out_to来完成发包。okok,今天的你就到此为止吧,明天还要接着🐺啊!最后实现arp解析函数:xarp_resolve。在无人问津的渡口,总是开满鲜花。
2025-12-10 11:41:45
289
1
原创 手写TCP/IP协议——IP层输入处理
③IP包发送的时候,填写包头的字段时将checksum填0 ,然后对整个IP包头计算一遍之后再写到checksum中去,接收的时候同样的是先把checksum置零,然后在本地协议栈再计算一遍校验和,观察是否和发送时的计算结果一致,如果一致的话,就说明通过校验;④还有判断一下这个包是不是发给本地协议栈的,因为在网络中发给别人的包也有可能发到我这里,比如我们的ICMP的广播包,我们可以收到但是经检查不是发给我的,就直接丢弃掉就好了,这种处理机制本身也可以认作是一种无回报的处理方式。
2025-12-10 11:28:38
596
原创 手写TCP/IP协议栈——ARP超时重新请求
除此之外,还需要设置另外一个超时值,因为我们重新发送ARP请求之后,还需要判断一下在指定的时间内有没有收到响应,从而避免的等待时间过长的情况的出现。arp_entry记录的是网络当中主机IP地址与MAC地址的映射关系,但是由于网卡绑定的IP地址是动态的。如果对方的机器下线,此时DHCP服务器可能会回收这个IP地址进而分配给别的网卡,这时候我们本机保存的arp表项当中维护的映射关系就出错了,需要重新进行修正。由于网络是不可靠的,所以我们需要在自己的协议栈当中添加ARP的超时重传机制。
2025-12-07 23:15:59
896
原创 手写TCP/IP协议栈——ARP输入处理
对方ARP包过来之后,我们需要先检查包的合法性,然后在switch...case里面处理ARP包。在ethernet_in以太网输入部分,添加对XNET_PROTOCOL_ARP的处理。此时我们通过arp_make_response已经可以给对方回复并更新arp缓存表了。ARP输入主要处理两种情况:①别人的ARP请求处理 ②别人的ARP回复处理。在虚拟机当中ping一下我们的协议栈,发现可以进入arp请求处理。arp -d:清除本机arp缓存表(需要管理员权限)arp -a:查看本机arp缓存表。
2025-12-07 15:16:35
676
原创 手写TCP/IP协议栈——无回报ARP包生成
结合wireshark抓包软件/RFC文档可以看到arp包的具体结构字段,注意这部分内容需要夹在#pragma pack()中间,因为需要解析具体字段。不妨设定:主机启用网卡的时候,自动在网络上广播自己的IP地址&&MAC地址,表示我已经上线了,方便网络当中的其他主机能感知到你的存在。以太网的dst mac填写的是广播包,protocol为ARP,表示交给ARP协议处理。在ARP协议中,发送方和接收方的IP地址都填写的自己的。网卡上线的广播包设置为无回报的ARP包。这里通过一个比较巧妙的手法。
2025-12-05 18:59:35
536
原创 手写TCP/IP协议栈——ARP初始化
ok,今天的你就到此为止吧,明天还要接着🐺啊!至此我们就完成了ARP协议的初始化。重新生成解决方案,没有问题即可。
2025-12-05 09:51:37
116
原创 手写TCP/IP协议栈——以太网数据包处理
不包含前导码(最前面)和CRC(在payload的最后),这部分内容由驱动自动填充,使用硬件电路可以自动校验CRC。为了预防编译器自动内存对齐的优化,我们使用#pragma pack(1)和#pragma pack()把该格式夹住。则是按照0x22 0x11进入内存,所以大小端完全不同。并且hdr->protocol转换前是0x0608,转换后是0x0806就没问题了。在以太网输入处理部分下断,能正常断下。
2025-12-04 19:49:14
412
原创 手写TCP/IP协议栈——数据包结构定义
使用while(1)轮询网卡上有没有数据,一旦硬件(例如以太网网卡)检测到有数据到来,就会交给以太网协议并继续向上交付处理。以太网底层所有数据+包头最大1514B,可以再添加2B的CRC,一共1516B。ok,今天的你就到此为止吧,明天还要接着🐺啊!轮询处理数据包,并在协议栈中处理。
2025-12-03 11:31:13
236
原创 手写TCP/IP协议栈——环境配置
这样虚拟机(192.168.254.3)和真机(192.168.254.1)就都能ping通了。使用wireshark也可以正常抓取两张虚拟网卡的通信了。貌似是程序兼容性问题,修改成x86就好了(暂时)实现可能不一样但是遵循同样的协议就可以正常通信。ok,今天的你就到此为止吧,明天还要接着🐺啊!1)将虚拟机的网卡1设置为仅主机。
2025-12-03 11:30:18
174
原创 中科大计算机网络——网络安全
使用checksum作为H不合适,因为很容易反向计算出m'与m有同样的报文摘要。为何不能让你逆向推导出报文m?防止你用不合法的协议m'在法庭上要挟签名人。使用公开密钥加密体系作认证的缺陷:中间人攻击。本质原因:Bob没有拿到真正Alice的公钥。解决方案:让Bob可靠地拿到Alice的公钥。只要根是可靠的,后面大概率也是可靠的。求幂次方和求模运算代价非常大。
2025-12-01 22:19:04
421
原创 EasyX开发——绘制跟随鼠标移动的小球
peekmessage函数:如果成功拉取到了消息,函数就会返回true,反之就会返回false。使用另外一个循环来不断地从消息队列当中拉取已有的消息,并进行处理,直到消息队列当中没有消息为止。在主循环前后分别添加BeginBatchDraw()和EndBatchDraw()okok,今天的你就到此为止吧,明天还要接着🐺啊!但是在绘制新的位置的圆的时候,没有对之前位置的圆进行擦除。在msg变量当中保存有鼠标的x和y坐标。每次鼠标移动,我们就立刻绘制出圆的图案。运行之后,发现绘制出来的圆一直在闪烁。
2025-05-13 17:31:07
528
原创 js逆向——webpack实战案例(一)
首先通过跟栈的方法找到加密位置我们跟进u函数,发现是通过webpack加载的向上寻找u的加载位置,然后打上断点,刷新网页,让程序断在加载函数的位置u = r.n(a)
2024-09-28 20:10:26
2040
5
原创 js逆向——异步栈分析(上)
这里的异步是一个while循环,不断取出一些回调函数来执行,对于then前面的e.shift表示执行成功的情况,而后面的e.shift表示执行失败的情况,而e是一个数组,用于存放很多异步的回调函数,shift相当于栈里面的pop,用于从异步栈当中取出,执行,并删除栈顶的回调函数。的位置在文件chunk-vendors.a1bfb9a0.js:formatted的第668行,然后先取消断点,等时机到了再打上!前三个函数很有可能是封装的发包函数,直接跟异步的栈。将所有断点移除,然后在异步栈里面下断。
2024-08-29 22:40:26
934
1
原创 js逆向——2024最新金山词霸(练习二)
注:当看到加密函数传入字符串的时候,一定要先用123456测试一下,不要上来就扎入细节当中。然后就是解密数据了,过程相对简单,就是应该普通的AES-ECB解密。就是跟栈的时候注意看一下url对不对,别跟错接口了😂😂。经过分析sign的生成,是先经过md5然后AES加密生成。整个加密参数的生成流程我们都清除了,下面就是扣代码环节了。ok,今天的你就到此为止吧,明天还要接着狼🐺啊!简单看一下加密参数,就sign是比较可疑的。经过测试,也拿到正确的响应数据,并成功解密。对于XHR请求的包,直接跟栈就对了!
2024-08-12 17:41:01
632
原创 js逆向——2024最新有道翻译(练习一)
注意:这种一般是请求参数出现错误,先检查get/post是否正确,然后就是post的请求参数一定是缺一不可!这个和请求头略有不同!往上跟栈到这里看不到表单数据了,就在附近找参数e,t如何被加工的即可,于是找到了k(t)函数,或者上下翻翻看也会有意外之喜哦~首先看请求头,重放测试有没有cookie反爬(重放的时候注意松开断点,不然可能返回数据为0B)很明显返回的数据被加密了,根据之前的经验,返回的大概率是json格式的数据。我们搜索sign值,发现并没有匹配到接口,说明是动态生成的加密参数。
2024-08-12 13:13:24
1364
原创 js逆向——返回加密数据的处理
这样数据解密的步骤我们已经分析完了,现在还有一个问题就是我怎么知道返回的7个XHR数据包哪一个是列表页展示的、我们希望得到的目标数据呢?这说明我们收到的响应数据是加密后的结果,返回客户端之后由客户端解密拿到明文字符串展示在前端当中,所以我们才能在网页看到有效的信息。现在我们还需要确认一件事,就是这个网站使用的AES-CBC是不是标准的AES算法,这将决定我们需不需要扣代码。而且通过观察,js代码没有特别需要扣的地方,都是使用的库当中自带函数。ok,今天的你就到此为止吧,我们下期再见~
2024-07-28 22:35:38
2569
原创 js逆向——origin/refer请求头反爬
但是如果将origin和refer同时注释就会报错403,说明这里是一个检测点,服务端需要判断客户端是不是点击链接进来的,如果直接请求会失败。我们注释掉x-api-key返回了403,这个参数是必不可少的,而且有可能是动态生成用于检测爬虫的。使用正则表达式提取出来静态参数x-api-key的值,为二次请求真正的摘要做准备。保留有用的参数(当然都保留也行,我们主要是想看一下哪些参数会对爬虫进行检查)排除掉在请求头当中的目标之后,我们顺利找到静态参数在文件当中的位置。
2024-07-25 10:33:11
1043
原创 js逆向——url重定向处理
结果报错$未定义,这是因为我们本地缺少浏览器的环境,我们去浏览器找$(this).attr('target');发现是写死的一个字符串:var ee = $(this).attr('target');ee=‘_blank’因此我们需要监听点击a标签之后发生了什么(执行了哪些动作),以此来判断究竟访问的是哪个网页。反正扣js代码就是缺啥补啥即可,不知道是什么情况就去浏览器调试观察一下就ok了。ok,下面是最后一步,使用pycharm调用js代码即可大功告成了。结果返回的是403,访问出错,被禁止了。
2024-07-19 14:00:50
932
原创 X科网js逆向分析
所以我们可以直接对pwd使用md5加密(省事)/ 把网页中的md5函数代码抠出来。显然这是函数内实现的函数,也就是闭包,所以我们只需要把闭包的整个函数拿下来即可。然后我们可以测试一下md5(1)发现得到的是正确的结果c4ca4.......我们将闭包代码复制到js调试工具当中,发现调试工具已经自动识别出来md5了。通过$.md5(pwd)之后得到的加密结果就是我们的pwd参数。得到c4ca4,说明就是$.md5(),md5加密。1)测试使用$.md5(1)加密数字1。2)测试$.md5(pwd)
2024-06-30 23:40:29
503
原创 某山词霸翻译js逆向分析
当发起一次Post请求,若未指定Content-type,则默认content-type为application/x-www-form-urlencoded,即参数会以FormData的形式进行传递,不会显示出现在请求URL中。当发起一次post请求,若Content-Type为application/json,则参数会以Request Payload的形式进行传递(数据格式为json),不会显示出现在请求url中。我们发现只有参数sign是动态生成的,需要特殊处理,根据经验sign是通过加密生成。
2024-06-28 17:50:47
1137
原创 token、session、cookie、sign分析
接口在网络传输过程中如果被黑客挟持,并修改其中的参数值,然后再继续调用接口,虽然参数的值被修改了,但是因为黑客不知道sign是如何计算出来的,不知道sign都有哪些值构成,不知道以怎样的顺序拼接在一起的,最重要的是不知道签名字符串中的key是什么,所以黑客可以篡改参数的值,但没法修改sign的值,当服务器调用接口前会按照sign的规则重新计算出sign的值然后和接口传递的sign参数的值做比较,如果相等表示参数值没有被篡改,如果不等,表示参数被非法篡改了,就不执行接口了。
2024-06-28 16:45:47
629
原创 微x公众平台js逆向分析
这一行调用的一个函数,返回pwd有点可疑哦,我怀疑你这个函数就是加密函数,不妨打个断点(多打几个断点也没关系,只要能断下来就是胜利)可以排除.css,去.js文件里面查找加密函数的位置,因为相关的加密算法一般都是由.js完成的。一般情况下,调试的时候遇到自定义变量缺失,直接在前面补充:var g = {}即可(空字典)加密后的密码为32位,怀疑是MD5(16/32位)g不是js中内置的对象/变量而是一个自定义的变量。但是如何函数是匿名的,如何执行呢?先点击格式化,然后点击加载代码。
2024-06-26 09:27:32
479
原创 常见加密方式:MD5、DES/AES、RSA、Base64
3、公钥和密文对于黑客来说都没有意义,密文到达服务端,服务器使用私钥解密密文,拿到对称密钥。2、客户端向服务端请求公钥,并使用公钥对明文加密,明文当中放置有客户端生成的对称密钥。二者的结合既利用了对称加密代价小的优点,又使用非对称加密避免了密钥分发的问题。使用RSA建立一个安全的连接,然后接收方拿到对称密钥之后用于实际的加密解密。16/32位的数据,最有可能就是使用md5加密的。4、双方使用开销较小的对称密钥进行加密解密操作。使用对称加密的时候,双方使用相同的私钥。三、Base64伪加密。
2024-06-24 14:56:13
584
原创 C++开源项目研究——gh0st远控(一)
上一节我们讲过肉机最关键的一步就是通过connect来连接指定的主控端其实在次之前应当是主控端先监听相应的端口,然后肉机再来连接这个端口的在主控端的OnInitDialog当中调用:listenPort();//开始监听端口比较关键的就是m_iocpServer->Initialize(NotifyProc, NULL, 100000, nPort)其中第一个参数NotifyProc是一个回调函数,原型为:回调函数其实就是函数指针的一种特殊形式(二者是共性与个性,一般与个别的关系😋)
2024-03-29 18:03:53
1339
原创 C++开源项目研究——gh0st远控(一)
接下来我们来看看这个导出函数具体长啥样显然TestRun函数的主任务就是创建了main线程,也就是主线程//添加导出函数//保存上线地址//保存上线端口//这里等待线程结束那么主线程main又做了哪些事情呢?1)这里面比较重要的就是声明了CClientSocket socketClient;类可以大致瞅一眼这个类的定义:里面包含了m_Socket这种关键信息,之所以封装成一个类是为了方便以后的管理,使得里面的变量和接口不会太散乱。
2024-03-26 12:25:26
732
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅