矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: yjmwxwx

胡乱改改孔雀石SDR固件

[复制链接]
     
 楼主| 发表于 2021-1-27 10:38:00 | 显示全部楼层
分立元件 发表于 2021-1-27 10:24
我花的都记不清楚了,几万了至少了,十几年了

你花的可真多,玩电子真是无底洞啊,我花了3000多一分钱也没在电子和程序方面挣过,反而游戏代练挣过300元。
回复 支持 反对

使用道具 举报

     
发表于 2021-1-27 10:44:06 | 显示全部楼层
yjmwxwx 发表于 2021-1-27 09:57
这个就是FW_1_10a改的,和刷这个新固件应该一样,变砖头好像清空FM25W256的固件,清空外部FRAM就能刷回原 ...

铁电存储器?比较少见啊
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-27 10:45:58 | 显示全部楼层
iffi123 发表于 2021-1-27 10:37
问题是你懂的怎么清空,不见得别人也懂啊,,,, 这脑子,,,,

所以刚才我才说最好自己已经验 ...

作者好像有清空FRAM的固件


NOT USE SPECIAL.zip (604.32 KB, 下载次数: 275)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-27 10:48:46 | 显示全部楼层
JuncoJet 发表于 2021-1-27 10:44
铁电存储器?比较少见啊

电路我不懂,电路图作者资料里面有

https://yadi.sk/d/4ZgsrswxYClG1Q
回复 支持 0 反对 1

使用道具 举报

     
 楼主| 发表于 2021-1-27 15:19:54 | 显示全部楼层
回复 支持 反对

使用道具 举报

     
发表于 2021-1-27 22:58:01 来自手机 | 显示全部楼层
要是有钱肯定要支援一些设备给你!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-28 00:26:26 | 显示全部楼层
分立元件 发表于 2021-1-27 22:58
要是有钱肯定要支援一些设备给你!

虽然你帮不上我,但是还是谢谢了。

我这人性格很怪的,让我帮别人可以,别人想帮我就不用想了我肯定不会接受。

我现在主要种地是主业,业余有钱就玩玩没钱就算了,感觉我和钱没缘,只要能挣钱的东西让我干都不行,也就种地还凑合。
回复 支持 0 反对 1

使用道具 举报

     
发表于 2021-1-28 08:53:30 | 显示全部楼层
本帖最后由 iffi123 于 2021-1-28 08:59 编辑

从你的分析上, 作者应该是遵循了标准的C开发习惯,即在显示字库里,字母/数字/符号是按照ascii的顺序排列的,比如为了显示这一串提示,可以用
unsigned char  aa[]="THE DEVICE SOFTWARE..."来定义; 实际存储的是该字母的ascii码(在字库里的索引号), 反编译软件能识别bin的程序区和数据区(只读), 如果数据区存在连续的数据按ascii码的内容不是控制符,就可以当字母数字显示出来(这就像在电脑用记事本打开exe文件,仍然可以看到程序里的提示文本信息), 所以你能直接搜索到屏幕提示的字符串。

如果按照很多人的习惯,字库只包含A-Z, a-z, 0-9再加上少量的符号的话, 那么字母在字库的索引号不再按照ascii顺序,比如字母A的索引号可能用00代替,B用01,  反编译软件就无法识别这些数据是字母, 你也就难以找到注册画面所在的程序位置, 我觉的这是作者的疏忽。

咸鱼有专门的收钱注册的,本身不卖机,我觉的这种很可能是破解了(不是向作者购买),找到算号的方法或者其它途径
未标题-1.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-28 09:33:48 | 显示全部楼层
本帖最后由 yjmwxwx 于 2021-1-28 09:45 编辑
iffi123 发表于 2021-1-28 08:53
从你的分析上, 作者应该是遵循了标准的C开发习惯,即在显示字库里,字母/数字/符号是按照ascii的顺序排列 ...


要写算号器也不难,就是我C语言不怎么会用

看懂下面这两个函数就能写算号器了

这个是显示ID号的,只是把ID号码简单移位来显示

  1. seg000:080198B0                 LDR             R0, =unk_2001AFC8 ; 96位ID储存地址
  2. seg000:080198B2                 LDR             R1, =a04x04x04x04x04 ; "%04X-%04X-%04X-%04X-%04X-%04X"
  3. seg000:080198B4                 PUSH.W          {R4-R10,LR}
  4. seg000:080198B8                 LDRB            R2, [R0,#1]
  5. seg000:080198BA                 SUB             SP, SP, #0x10
  6. seg000:080198BC                 LDRB            R5, [R0]
  7. seg000:080198BE                 LDRB            R3, [R0,#3]
  8. seg000:080198C0                 LDRB            R4, [R0,#2]
  9. seg000:080198C2                 ADD.W           R2, R2, R5,LSL#8
  10. seg000:080198C6                 LDRB            R7, [R0,#5]
  11. seg000:080198C8                 ADD.W           R3, R3, R4,LSL#8
  12. seg000:080198CC                 LDRB            R5, [R0,#4]
  13. seg000:080198CE                 LDRB            R6, [R0,#7]
  14. seg000:080198D0                 SXTH            R2, R2
  15. seg000:080198D2                 LDRB            R4, [R0,#6]
  16. seg000:080198D4                 ADD.W           R7, R7, R5,LSL#8
  17. seg000:080198D8                 LDRB            R5, [R0,#9]
  18. seg000:080198DA                 SXTH            R3, R3
  19. seg000:080198DC                 LDRB.W          LR, [R0,#8]
  20. seg000:080198E0                 ADD.W           R6, R6, R4,LSL#8
  21. seg000:080198E4                 LDRB            R4, [R0,#0xB]
  22. seg000:080198E6                 SXTH            R7, R7
  23. seg000:080198E8                 LDRB            R0, [R0,#0xA]
  24. seg000:080198EA                 ADD.W           R5, R5, LR,LSL#8
  25. seg000:080198EE                 SXTH            R6, R6
  26. seg000:080198F0                 STR             R7, [SP]
  27. seg000:080198F2                 ADD.W           R4, R4, R0,LSL#8
  28. seg000:080198F6                 LDR             R0, =unk_20006190
  29. seg000:080198F8                 SXTH            R5, R5
  30. seg000:080198FA                 STR             R6, [SP,#4]
  31. seg000:080198FC                 SXTH            R4, R4
  32. seg000:080198FE                 STR             R5, [SP,#8]
  33. seg000:08019900                 STR             R4, [SP,#0xC]
复制代码



下面这个是从ID号计算密码的,这个注释写的有点差劲。。


  1. seg000:0800D748 ; ID
  2. seg000:0800D748 ; r0=ID地址0x2001AFC8
  3. seg000:0800D748
  4. seg000:0800D748 sub_800D748                             ; CODE XREF: sub_8019AF8+2E↓p
  5. seg000:0800D748                 PUSH            {R4-R6}
  6. seg000:0800D74A                 MOVS            R2, #0  ; R2=0
  7. seg000:0800D74C                 SUBS            R3, R0, #1 ; R3=R0-1
  8. seg000:0800D74E                 ADD.W           R5, R0, #0xB ; R5=R0+0X0B
  9. seg000:0800D752
  10. seg000:0800D752 loc_800D752                             ; CODE XREF: sub_800D748+12↓j
  11. seg000:0800D752                 LDRSB.W         R4, [R3,#1]! ; 读8位ID
  12. seg000:0800D756                 CMP             R5, R3
  13. seg000:0800D758                 ADD             R2, R4  ; ID累加
  14. seg000:0800D75A                 BNE             loc_800D752 ; 读8位ID
  15. seg000:0800D75C                 LDRSB.W         R3, [R0] ; 读ID 最低8位
  16. seg000:0800D760                 UBFX.W          R2, R2, #0, #0xA ; 提取10位
  17. seg000:0800D764                 LDRSB.W         R4, [R0,#0xB] ; 读ID最高8位
  18. seg000:0800D768                 SUBS            R0, R1, #1 ; R0=0X2001AF54-1
  19. seg000:0800D76A                 LDR             R6, =unk_2001AE88
  20. seg000:0800D76C                 ADDS            R1, #7  ; R1=0X200001AF54 + 7
  21. seg000:0800D76E                 ADD             R3, R4  ; ID最高8位+ID最低8位
  22. seg000:0800D770                 LDR             R5, =0x20001AC8
  23. seg000:0800D772                 LDR             R4, =unk_2001AE8C
  24. seg000:0800D774                 ADD             R3, R2  ; 最高8位+最低8位结果+ID累加提取的10位
  25. seg000:0800D776                 STR             R2, [R6] ; ID累加提取的10位
  26. seg000:0800D776                                         ; 保存到
  27. seg000:0800D776                                         ; 0x2001AE88
  28. seg000:0800D778                 UBFX.W          R3, R3, #0, #0xA ; ID最高8位
  29. seg000:0800D778                                         ; 加
  30. seg000:0800D778                                         ; ID最低8位
  31. seg000:0800D778                                         ; 加
  32. seg000:0800D778                                         ; ID累加结果提取的10位
  33. seg000:0800D778                                         ; 的结果
  34. seg000:0800D778                                         ; 提取10位
  35. seg000:0800D77C                 STR             R3, [R4] ; 保存到
  36. seg000:0800D77C                                         ; 0x2001AE8C
  37. seg000:0800D77E
  38. seg000:0800D77E loc_800D77E                             ; CODE XREF: sub_800D748+46↓j
  39. seg000:0800D77E                 LDR.W           R4, [R5,R3,LSL#2] ;
  40. seg000:0800D77E                                         ; r5=0x20001AC8
  41. seg000:0800D77E                                         ; 加
  42. seg000:0800D77E                                         ; r3
  43. seg000:0800D77E                                         ; 地址的数据放到
  44. seg000:0800D77E                                         ; R4
  45. seg000:0800D782                 ADD             R3, R2  ; r3
  46. seg000:0800D782                                         ; +
  47. seg000:0800D782                                         ; ID蕾姐结果提取10位
  48. seg000:0800D784                 STRB.W          R4, [R0,#1]! ;
  49. seg000:0800D784                                         ; r4=0x20001ac8里面的数据
  50. seg000:0800D784                                         ; 写到
  51. seg000:0800D784                                         ; R0=0x2001AF54
  52. seg000:0800D788                 CMP             R1, R0  ;
  53. seg000:0800D788                                         ; R0=0x2001af54
  54. seg000:0800D788                                         ; r1=0X20001AF5C
  55. seg000:0800D788                                         ; 复制16位
  56. seg000:0800D78A                 UBFX.W          R3, R3, #0, #0xA ; R3提取10位
  57. seg000:0800D78E                 BNE             loc_800D77E
  58. seg000:0800D790                 POP             {R4-R6}
  59. seg000:0800D792                 BX              LR
复制代码



上面这个0X20001AC8和2001AE88肯定有关联的,可能通过读0X20001ACU+指针指向了0X2001AE88


我C语言不熟悉,不知道怎么写,下面这个不成功,前面从序列号移位的对,后面这个不知道用C语言怎么写,贴出来帮忙看看要怎么改

  1. #include <stdio.h>

  2. void main() {
  3.   unsigned int di_32, zhong_32, gao_32; //序列号
  4.   unsigned int wei8_0, wei8_1, wei8_2, wei8_3;
  5.   unsigned int wei8_4, wei8_5, wei8_6, wei8_7;
  6.   unsigned int wei8_8, wei8_9, wei8_a, wei8_b;
  7.   unsigned char mima[8];
  8.   unsigned int ID[30000];
  9.     di_32 = 0x44332211;
  10.     zhong_32 = 0x77665544;
  11.     gao_32 = 0xbbaa9988;
  12.     wei8_0 = (di_32 & 0xff00) >> 8;
  13.     wei8_1 = (di_32 & 0xff) << 8;
  14.     wei8_2 = (di_32 & 0xff000000) >> 8;
  15.     wei8_3 = (di_32 & 0xff0000) << 8;
  16.     wei8_4 = (zhong_32 & 0xff00) >> 8;
  17.     wei8_5 = (zhong_32 & 0xff) << 8;
  18.     wei8_6 = (zhong_32 & 0xff000000) >> 8;
  19.     wei8_7 = (zhong_32 & 0xff0000) << 8;
  20.     wei8_8 = (gao_32 & 0xff00) >> 8;
  21.     wei8_9 = (gao_32 & 0xff) << 8;
  22.     wei8_a = (gao_32 & 0xff000000) >> 8;
  23.     wei8_b = (gao_32 & 0xff0000) << 8;
  24.     ID[0] = wei8_0 | wei8_1 | wei8_2 | wei8_3;
  25.     ID[1] = wei8_4 | wei8_5 | wei8_6 | wei8_7;
  26.     ID[2] = wei8_8 | wei8_9 | wei8_a | wei8_b;
  27.     wei8_1 = wei8_1 >> 8;
  28.     wei8_2 = wei8_2 >> 16;
  29.     wei8_3 = wei8_3 >> 24;
  30.     wei8_5 = wei8_5 >> 8;
  31.     wei8_6 = wei8_6 >> 16;
  32.     wei8_7 = wei8_7 >> 24;
  33.     wei8_9 = wei8_9 >> 8;
  34.     wei8_a = wei8_a >> 16;
  35.     wei8_b = wei8_b >> 24;
  36.     di_32 = wei8_0 + wei8_1 + wei8_2 + wei8_3 + wei8_4 + wei8_5 + wei8_6 + wei8_7 + wei8_8 + wei8_9 + wei8_a + wei8_b;//每次读一个8位ID号累加
  37.     zhong_32 = di_32 & 0x3ff; //提取低10位
  38.     gao_32 = wei8_0 + wei8_b; //ID最低低8位+ID最高高8位
  39.     di_32 = gao_32 + zhong_32; //ID最高位8位+ID最低8位+累加结果提取的10位
  40.     ID[25840] = zhong_32;
  41.     ID[25844] = di_32;
  42.     for (int i = 0; i < 8; i = i + 1){
  43.       mima[i] = ID[di_32 << 2];
  44.       di_32 = (zhong_32 + di_32) & 0x3ff;
  45.     }
  46.     printf("0x%02X  0x%02X  0x%02X  0x%02X  0x%02X  0x%02X  0x%02X  0x%02X \n",mima[0],mima[1],mima[2],mima[3],mima[4],mima[5],mima[6],mima[7]);
  47.    
  48.    
  49.    

  50.    

  51.    
  52.    
  53. }
  54.        
复制代码



作者这个验证密码的漏洞比较大,静态分析都能看出来,要是有硬件插上JLINK一条命令就能定位,我前几年前研究过一段时间逆向,这种简单序列号保护价格可能100就有人做,他们就是把反汇编的代码放到KEIL里面重新编译然后软件仿真,估计某鱼上的就是花钱雇别人破解了卖钱而不放出来共享。

总之越用库函数和操作系统越容易被别人分析,只要做个签名文件反汇编后就直接出来函数名字了,就是不出来函数名字函数的排列也都和开发的时候一样,要是会用库开发STM32再去看别人用库写的程序反汇编后的就非常容易了,写程序的时候多费点力气别人看的时候一样也多费力气。
回复 支持 反对

使用道具 举报

     
发表于 2021-1-28 09:45:28 | 显示全部楼层
yjmwxwx 发表于 2021-1-28 09:33
要写算号器也不难,就是我C语言不怎么会用

看懂下面这两个函数就能写算号器了

越是用标准件写,越有规律,不论是标准库函数还是cube库,都如此,我现在喜欢用寄存器写(当然不是为了保密), 只是觉的代码少,直观,不象库函数的名称。参数一大串
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-28 09:55:16 | 显示全部楼层
iffi123 发表于 2021-1-28 09:45
越是用标准件写,越有规律,不论是标准库函数还是cube库,都如此,我现在喜欢用寄存器写(当然不是为了保 ...

肯定自己写好,库函数和操作系统就是把直接操作的东西层层封装,执行效率很低,库函数那么乱看一眼都头大,根本没兴趣学怎么用。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-28 13:11:44 | 显示全部楼层
截图_2021-01-28_12-44-49.png


作者在0x20001AC8申请了4K的RAM,然后通过计算STM32唯一ID得到一个指针指向这片区域来生成密码,这片区域没有使用,不知道STM32的C语言申请一片区域后不使用里面是什么数据。

改了改差不多就是下面这样子了,现在就缺知道这4K里面是什么,再就是要有个正确的密码做比对好知道顺序。


  1. #include <stdio.h>

  2. void main() {
  3.   unsigned int di_32, zhong_32, gao_32; //序列号
  4.   unsigned int wei8_0, wei8_1, wei8_2, wei8_3;
  5.   unsigned int wei8_4, wei8_5, wei8_6, wei8_7;
  6.   unsigned int wei8_8, wei8_9, wei8_a, wei8_b;
  7.   unsigned char mima[8];
  8.   unsigned int ID[1024];
  9.   unsigned int a, b;
  10.     di_32 = 0x38333439;
  11.     zhong_32 = 0x16513030;
  12.     gao_32 = 0x22004d00;
  13.     wei8_0 = (di_32 & 0xff00) >> 8;
  14.     wei8_1 = (di_32 & 0xff) << 8;
  15.     wei8_2 = (di_32 & 0xff000000) >> 8;
  16.     wei8_3 = (di_32 & 0xff0000) << 8;
  17.     wei8_4 = (zhong_32 & 0xff00) >> 8;
  18.     wei8_5 = (zhong_32 & 0xff) << 8;
  19.     wei8_6 = (zhong_32 & 0xff000000) >> 8;
  20.     wei8_7 = (zhong_32 & 0xff0000) << 8;
  21.     wei8_8 = (gao_32 & 0xff00) >> 8;
  22.     wei8_9 = (gao_32 & 0xff) << 8;
  23.     wei8_a = (gao_32 & 0xff000000) >> 8;
  24.     wei8_b = (gao_32 & 0xff0000) << 8;
  25.     ID[0] = wei8_0 | wei8_1 | wei8_2 | wei8_3;
  26.     ID[1] = wei8_4 | wei8_5 | wei8_6 | wei8_7;
  27.     ID[2] = wei8_8 | wei8_9 | wei8_a | wei8_b;
  28.     wei8_1 = wei8_1 >> 8;
  29.     wei8_2 = wei8_2 >> 16;
  30.     wei8_3 = wei8_3 >> 24;
  31.     wei8_5 = wei8_5 >> 8;
  32.     wei8_6 = wei8_6 >> 16;
  33.     wei8_7 = wei8_7 >> 24;
  34.     wei8_9 = wei8_9 >> 8;
  35.     wei8_a = wei8_a >> 16;
  36.     wei8_b = wei8_b >> 24;
  37.     di_32 = wei8_0 + wei8_1 + wei8_2 + wei8_3 + wei8_4 + wei8_5 + wei8_6 + wei8_7 + wei8_8 + wei8_9 + wei8_a + wei8_b;//每次读一个8位ID号累加
  38.     zhong_32 = di_32 & 0x3ff; //提取低10位
  39.     gao_32 = wei8_0 + wei8_b; //ID最低低8位+ID最高高8位
  40.     di_32 = gao_32 + zhong_32; //ID最高位8位+ID最低8位+累加结果提取的10位
  41.     a = zhong_32;
  42.     b = di_32;
  43.     for (int i = 0; i < 8; i = i + 1){
  44.       mima[i] = ID[di_32];
  45.       di_32 = (zhong_32 + di_32) & 0x3ff;
  46.     }
  47.     printf("0x%02X  0x%02X  0x%02X  0x%02X  0x%02X  0x%02X  0x%02X  0x%02X \n",mima[7],mima[6],mima[5],mima[4],mima[3],mima[3],mima[1],mima[0]);
  48.    
  49.    
  50.    

  51.    

  52.    
  53.    
  54. }
  55.        
复制代码




执行结果肯定不对,关键就是不知道4K的RAM里面是什么

截图_2021-01-28_13-10-24.png
回复 支持 反对

使用道具 举报

     
发表于 2021-1-28 13:27:46 | 显示全部楼层
感谢,测试过了。方法一好像不行,方法二可以
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-28 13:37:14 | 显示全部楼层
本帖最后由 yjmwxwx 于 2021-1-28 14:02 编辑
雨中狐狸 发表于 2021-1-28 13:27
感谢,测试过了。方法一好像不行,方法二可以




方法1的LCD有显示序列号吗? 有的话要照着输入16位有效


方法1要是有显示序列号的话,我把显示的顺序搞错了,下面这个固件改过来了。

3.zip (439.71 KB, 下载次数: 141)
回复 支持 反对

使用道具 举报

     
发表于 2021-1-28 14:31:42 | 显示全部楼层
yjmwxwx 发表于 2021-1-28 13:37
方法1的LCD有显示序列号吗? 有的话要照着输入16位有效

嗯,中间有一组0
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表