stlink**分析,以及搞定别人搞不定的可能性--初步结果可行

[复制链接]
12146|27
手机看帖
扫描二维码
随时随地手机跟帖
Simon21ic|  楼主 | 2013-3-11 00:26 | 显示全部楼层 |阅读模式
本帖最后由 Simon21ic 于 2013-3-13 11:51 编辑

最近等PCB,无聊,看到有人破解stlink,得到了固件,这里做一些简单的分析。

1. 只是通过破解stlink更新程序就得到了固件。
    至少说明stlink的bootloader加密有一些问题,如果加密做得好,PC端程序的运行过程中,是不会得到原binary代码的(stlink的程序加密了,但是在内存中会有binary)。另外,标准AES也是用烂的加密算法,一般甚至不会反汇编太多,看到一推载入sbox的代码,再看一下sbox数据,之后会看到疑似Encrypt_prepare的函数,那基本就知道是什么算法了。当然,其他的加密算法,也会有一定的特征,这些算法是难不住专业破解的人的。还有,密钥貌似是明文传输的,只是经过了AES?好歹也弄个戴妃霍尔曼做密钥交换吧,不过只是增加了一点破解难度而已。
PS: 突然想到一个问题,竟然破解的人没有提到程序有加壳,好吧,ST其实并不在意这个被破解。否则,弄个多跳转点的壳,再混点花指令什么的。
2. 破解目的是为了让stlink更好,增加串口CDC的功能
    不过既然那个人对ARM的反汇编不熟悉,估计他是搞不定的,并且修改binary会灰常麻烦
3. 目的是好的,方法有错误
    既然目的是为了给stlink增加一个VCOM串口,通过反汇编stlink固件的方法简直是太“愚蠢”了。原因是有更好的实现方法。那就是,直接开发一个stlink,很早前就看过stlink的USB通信数据流,简直是简单的一塌糊涂。记得当时就做过一个stlink调试STM8的固件(V1,虚拟U盘的方式)。stlink v2貌似,又对JTAG/SWD接口做了一些简化,开发起来就更加浮云了。V2好像没有模拟U盘,但是,大部分命令还是一样的,操作方式也和模拟U盘的类似,只是没有CBW和CSW头部而已(貌似是为了更好的兼容性)。
4. 增加一个串口CDC的可能性
    目前评估是可能的,使用IAD的方式,增加一个CDC应该就可以了。当然,能够集成的功能还可以更多,让stlink更强,不过估计这个就不一定是st的意愿了。
5. 总结
    一般产品的破解是在正向开发难度非常大的时候,才会使用的,stlink的正向开发难度应该不是很大,所以,使用破解的方法得到想要的东西,并不是成本最优的方法。另外,虽然我做过最赚钱的东西,是靠破解,但是,本人也是比较反对破解的,只是由于生活所迫,有没有足够盈利能力的正向开发的项目,所以才做一些破解的。

初步验证了一下,CDC也可以加上去了,不过stlink的驱动需要修改一下。初步评估结果没有问题,其他等有空再玩玩了。
_编程浪子| | 2013-3-11 12:25 | 显示全部楼层
这个固件是俄罗斯人弄出来的。不是反向得到的。
是通过update那个东西弄出来的。bootloader没问题。

使用特权

评论回复
_编程浪子| | 2013-3-11 12:27 | 显示全部楼层
这个东西,与正向开发难度关系不大。你正向出来了,后期的升级还会做吗?谁会不停地免费弄这东西

使用特权

评论回复
Simon21ic|  楼主 | 2013-3-11 14:32 | 显示全部楼层
本帖最后由 Simon21ic 于 2013-3-11 14:35 编辑
_编程浪子 发表于 2013-3-11 12:27
这个东西,与正向开发难度关系不大。你正向出来了,后期的升级还会做吗?谁会不停地免费弄这东西 ...

不是反向那个PC上的update程序得到的吗?
呵呵,没什么价值的东西,肯定不会去开发,只是看到有人**出来了,有些好奇,评估了一下技术难度而已。
即使做开发,也肯定不是为clone这个硬件,可以玩的还多着呢,比如,stlink支持其他的Cotex芯片。
当然,要玩这个的话,肯定不会免费。

另外,如果加密做好的话,update程序里是不会包含可以解密出来的固件binary的。

使用特权

评论回复
来与君| | 2013-3-11 17:18 | 显示全部楼层
解包的过程可以放在芯片的升级验证程序里,PC端程序只管送加密后的包。

不流行的芯片,破壳的价格应该会飙高一截。

使用特权

评论回复
cjhk| | 2013-3-11 20:44 | 显示全部楼层
呵呵   真正的高手  没有遇到过  顶礼膜拜中  呵呵  希望有真正的高手能够指点一下我等凡人  好让我们的技术能够大幅提升  呵呵

使用特权

评论回复
平常人| | 2013-3-11 21:04 | 显示全部楼层
路过。。。。。。

使用特权

评论回复
Simon21ic|  楼主 | 2013-3-11 22:00 | 显示全部楼层
cjhk 发表于 2013-3-11 20:44
呵呵   真正的高手  没有遇到过  顶礼膜拜中  呵呵  希望有真正的高手能够指点一下我等凡人  好让我们的技 ...

技术大幅提升,基本是靠时间和钱堆起来的。

使用特权

评论回复
Simon21ic|  楼主 | 2013-3-11 23:08 | 显示全部楼层
今天入了一个stlink v2,过两天就会送到。如果最近有时间的话,就试着也开发一个STLinkPro,当然,还有很多东西没有评估和测试,并不一定搞的定。之所以叫Pro,目前是想为STLink增加一些功能,包括CDC串口,USB转SPI/IIC/PWM/Microwire/GPIO等等接口,增加ST的ARM7和ARM9的支持。希望不是我异想天开,呵呵。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gaupen1186 + 1 很给力!
Simon21ic|  楼主 | 2013-3-13 00:40 | 显示全部楼层
本帖最后由 Simon21ic 于 2013-3-13 00:46 编辑

貌似压力不大:

uint16_t stlink_process(uint8_t *cmd, uint16_t len)
{
        switch (cmd[0])
        {
        case STLINK_CMD_GET_VERSION:
        {
                uint16_t version =
                        ((uint16_t)(stlink.version.stlink & 0x0F) << 12) |
                        ((uint16_t)(stlink.version.adi & 0x3F) << 6) |
                        ((uint16_t)(stlink.version.swim & 0x3F) << 0);
                SET_BE_U16(&cmd[0], version);
                SET_LE_U16(&cmd[2], stlink.version.vid);
                SET_LE_U16(&cmd[4], stlink.version.pid);
                return 6;
        }
        case STLINK_CMD_GET_MODE:
        {
                cmd[0] = 0;
                cmd[1] = (uint8_t)stlink.mode;
                return 2;
        }
        case STLINK_CMD_GET_VOLTAGE:
        {
                uint16_t voltage;
                interfaces->target_voltage.get(0, &voltage);
               
                SET_LE_U32(&cmd[0], (voltage / 2) * 4096 / 3300);
                SET_LE_U32(&cmd[4], 1200 * 4096 / 3300);
                return 8;
        }
        case STLINK_CMD_ADI:
                switch (cmd[1])
                {
                case STLINK_ADI_SUBCMD_READ_MEM32:
                {
                        uint32_t addr = GET_LE_U32(&cmd[2]);
                        uint16_t len = GET_LE_U16(&cmd[6]);
                        
                        if (adi_memap_read_buf32(addr, &cmd[0], len))
                        {
                                stlink.port.adi.rw_status = STLINK_ADI_REP_FAIL;
                        }
                        else
                        {
                                stlink.port.adi.rw_status = STLINK_ADI_REP_OK;
                        }
                        return len;
                }
                case STLINK_ADI_SUBCMD_WRITE_MEM32:
                {
                        uint32_t addr = GET_LE_U32(&cmd[2]);
                        uint16_t len = GET_LE_U16(&cmd[6]);
                        
                        if (adi_memap_write_buf32(addr, &cmd[16], len))
                        {
                                stlink.port.adi.rw_status = STLINK_ADI_REP_FAIL;
                        }
                        else
                        {
                                stlink.port.adi.rw_status = STLINK_ADI_REP_OK;
                        }
                        return 0;
                }
不过,USB转SPI,IIC,PWM功能需要换个PC驱动才能使用,stlink的PC驱动不知道怎么通信,要换成libusb的驱动。
额外的CDC还没有增加。

换驱动界面:

VersaloonOnSTLink.jpg

使用特权

评论回复
mgf006| | 2013-3-13 10:05 | 显示全部楼层
占位 学习

使用特权

评论回复
Simon21ic|  楼主 | 2013-3-13 11:43 | 显示全部楼层
本帖最后由 Simon21ic 于 2013-3-13 11:44 编辑

增加了CDC串口,修改了stlink的驱动,设备都成功装上去了
这么说来,stlink还可以用串口下载stm32程序

还有部分代码需要调试一下,可惜现在的硬件没有留出调试接口,这个东西就先玩成这样吧。
实际也基本证明的我的说法,stlink不需要**,正向开发更简单。

使用特权

评论回复
mcu5i51| | 2013-3-17 08:43 | 显示全部楼层
玩玩可以

使用特权

评论回复
hawksabre| | 2013-3-17 11:03 | 显示全部楼层
学习学习  呵呵    楼主的钻研精神值得我们学习  呵呵

使用特权

评论回复
小涛工作室| | 2013-3-18 22:40 | 显示全部楼层
楼主来个USB SWIM或SWD的制作说明  详细介绍一下SWIM、SWD协议 让我们菜鸟们DIY玩玩那该多好啊

使用特权

评论回复
Simon21ic|  楼主 | 2013-3-20 10:56 | 显示全部楼层
介绍协议还是算了,SWD是用ADIv5以及ADIv5p1协议,SWIM也是有ST的官方协议的。
有兴趣可以自己看,我没时间做翻译。

DIY的话,如果想玩的人多的话,这个可以准备一个。

使用特权

评论回复
IJK| | 2013-3-20 13:09 | 显示全部楼层
SWD是用ADIv5以及ADIv5p1协议。  请问ADI是由谁定义的?在哪里可以下载?

使用特权

评论回复
Simon21ic|  楼主 | 2013-3-20 18:44 | 显示全部楼层
IJK 发表于 2013-3-20 13:09
SWD是用ADIv5以及ADIv5p1协议。  请问ADI是由谁定义的?在哪里可以下载?

当然是ARM公司定义的,他们的网站上应该可以下载,google里也应该能够搜索到

使用特权

评论回复
青风002| | 2013-12-23 10:13 | 显示全部楼层
Simon21ic 发表于 2013-3-13 11:43
增加了CDC串口,修改了stlink的驱动,设备都成功装上去了
这么说来,stlink还可以用串口下载stm32程序

能不能介绍下这个CDC串口如何加入?

使用特权

评论回复
戈卫东| | 2013-12-23 11:18 | 显示全部楼层
可能ST不太在乎这个工具会不会被别人克隆。。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝