• [ ] span

既然
一周年快到了,那肯定得搞点事情吧(小窝~

image.png

于是,就有了 情侣款 可更新 NFC 校园卡 (这里@一下 稚晖君)

请输入图片描述

本项目本来到这里就要结束了,可是谁让我这么好奇呢!


到这里一切都很正常,接下来就要开始搞事了。

注意!这里仅做好奇研究演示,禁止违法使用,几块钱热水钱相信各位还是付得起的!!!

不知道各位有没有想过,为什么食堂的饭卡钱可以直接在微信上充值,而洗澡用的热水钱却要在充值后再去激活才能使用呢?观察 激活装置的 外形,其实就是一个读卡器,那么 原因 就显而易见了,洗澡的金额 被保存在了卡片本体之中,当充值后,后台会记录你充值的金额,然后当你去刷卡时,卡号匹配就会把相应的金额写入你的卡中,理论上来说,整个洗澡放水的过程中应该是全本地的,无数据记录。所有的核账 只有 后台的充值记录 和 水表的流量,如果只有单个人使用这个BUG 的话 一年的用水量相比整个学校,可以认为是水表误差。当然,使用这种方式的水卡 精确到是谁修改了金额 也是非常困难的。

查找金额位置

IC卡共有16个扇区,如何知道金额存在那个地方呢?简单,大家小时候都玩过找不同的游戏,插上卡 记录两次卡内数据 做差异比较这不就来了么。

image.png

image.png最终发现 我校水卡金额存于12扇区,107.76元 十进制10776 转化为 十六进制 2A19,上下相差1, 后四位 48FA 4C06 一脸懵逼,当你直接修改 2A18 2A19 时,水卡 会直接报错,无法使用。

STEP02 查文档

查阅资料后发现,工业数据通信中,为了防止数据出错,及时发现错误,常常会根据前面的数字来生成校验码,CRC校验是数据通信领域中最常用的一种查错校验码,这里引用百度百科:循环冗余校验码](https://baike.baidu.com/item/%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C%E7%A0%81/10168758?fromtitle=CRC%E6%A0%A1%E9%AA%8C&fromid=3439037&fr=aladdin))

CRC 也分好多种,用python 一种一种计算后,发现 使用的是 crc16-modbus,下面贴出代码,记得安装 crcmod

from binascii import unhexlify
from crcmod import mkCrcFun
# CRC16/MODBUS
def crc16_modbus(s):
    crc16 = mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
    return get_crc_value(s, crc16)
# common func
def get_crc_value(s, crc16):
    data = s.replace(' ', '')
    crc_out = hex(crc16(unhexlify(data))).upper()
    str_list = list(crc_out)
    if len(str_list) == 5:
        str_list.insert(2, '0')  # 位数不足补0
    crc_data = ''.join(str_list[2:])
    return crc_data[:2] + ' ' + crc_data[2:]
if __name__ == '__main__':
    jym = crc16_modbus("2A1B")
    print('crc16_modbus: ' + jym)

到这里 所有都准备到位了,让我们一起 乌拉!

image.png

111.jpg

image.png

警告:为了几块钱没必要,禁止用于违法用途,否则后果自负,此文章中卡已改回原有金额,仅供学习交流使用。

<!--TePass end-->

<!--no-cache-->

最后修改:2022 年 10 月 14 日
如果觉得我的文章对你有用,请随意赞赏