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

[复制链接]
14474|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 编辑

貌似压力不大:

  1. uint16_t stlink_process(uint8_t *cmd, uint16_t len)
  2. {
  3.         switch (cmd[0])
  4.         {
  5.         case STLINK_CMD_GET_VERSION:
  6.         {
  7.                 uint16_t version =
  8.                         ((uint16_t)(stlink.version.stlink & 0x0F) << 12) |
  9.                         ((uint16_t)(stlink.version.adi & 0x3F) << 6) |
  10.                         ((uint16_t)(stlink.version.swim & 0x3F) << 0);
  11.                 SET_BE_U16(&cmd[0], version);
  12.                 SET_LE_U16(&cmd[2], stlink.version.vid);
  13.                 SET_LE_U16(&cmd[4], stlink.version.pid);
  14.                 return 6;
  15.         }
  16.         case STLINK_CMD_GET_MODE:
  17.         {
  18.                 cmd[0] = 0;
  19.                 cmd[1] = (uint8_t)stlink.mode;
  20.                 return 2;
  21.         }
  22.         case STLINK_CMD_GET_VOLTAGE:
  23.         {
  24.                 uint16_t voltage;
  25.                 interfaces->target_voltage.get(0, &voltage);
  26.                
  27.                 SET_LE_U32(&cmd[0], (voltage / 2) * 4096 / 3300);
  28.                 SET_LE_U32(&cmd[4], 1200 * 4096 / 3300);
  29.                 return 8;
  30.         }
  31.         case STLINK_CMD_ADI:
  32.                 switch (cmd[1])
  33.                 {
  34.                 case STLINK_ADI_SUBCMD_READ_MEM32:
  35.                 {
  36.                         uint32_t addr = GET_LE_U32(&cmd[2]);
  37.                         uint16_t len = GET_LE_U16(&cmd[6]);
  38.                         
  39.                         if (adi_memap_read_buf32(addr, &cmd[0], len))
  40.                         {
  41.                                 stlink.port.adi.rw_status = STLINK_ADI_REP_FAIL;
  42.                         }
  43.                         else
  44.                         {
  45.                                 stlink.port.adi.rw_status = STLINK_ADI_REP_OK;
  46.                         }
  47.                         return len;
  48.                 }
  49.                 case STLINK_ADI_SUBCMD_WRITE_MEM32:
  50.                 {
  51.                         uint32_t addr = GET_LE_U32(&cmd[2]);
  52.                         uint16_t len = GET_LE_U16(&cmd[6]);
  53.                         
  54.                         if (adi_memap_write_buf32(addr, &cmd[16], len))
  55.                         {
  56.                                 stlink.port.adi.rw_status = STLINK_ADI_REP_FAIL;
  57.                         }
  58.                         else
  59.                         {
  60.                                 stlink.port.adi.rw_status = STLINK_ADI_REP_OK;
  61.                         }
  62.                         return 0;
  63.                 }
不过,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

粉丝
快速回复 在线客服 返回列表 返回顶部