前几天,这个论坛有一个帖子,说出1万找个对一个MCU反汇编破解,这个case你接了? 虽然不是很懂 还是学习下 这个片子单纯监视I2C的数据是不能破解的,访问这个片子要经过双向认证和加密,我们用了好几年了,不过听我们做硬件的同事说现在这个片子也能被破解了。 【105楼】 zhang_mike2000
在哪?有人接没? to:LS
你既然是汇编高手,希望下面的事能成,并与大家分享经验。
大家好,10000元寻ATMEGA128反汇编高手,急,联系电话:13711522312,陈先生
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3595849&bbs_page_no=1&search_mode=4&search_text=zhang_mike2000&bbs_id=9999 【104楼】 zhxzhx 一丁
积分:493
派别:
等级:------
来自:辽宁,沈阳
【94楼】 qianhng
看来你是不会汇编的
===================================================
你真是健忘啊,建议你看看
《关于开发产品的一些个人看法,我现在使用51和AVR单片机 》
http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=533488
看看【172楼】到【217楼】我们争论汇编和C效率高低的帖子 我用C语言,并不意味着我不会汇编
那你应该知道,看汇编,也不是很难得,至少不能用汇编的难读来作为加密的手段 我在【94楼】提到““反汇编不难,和看汇编的源程序一样”这个不认同,基本上差别很大,不然那些老板谁会反对用汇编?!”
反汇编出来的汇编是很难读的,特别是用汇编写的为加密绕了几个弯的程序(可不像C写的那样有规律),请看【81楼】,你认为不难是因为你没这么做过或碰到的是不防小人的加密,有的加密是连小人都要阴一把的。^_^ 【112楼】 qianhng
那个一万的我看了,不应该是加密,基本就是一个通讯 我倒没去看程序,那是【109楼】 zhang_mike2000 让你看的。 我同意“反汇编出来的汇编是很难读的,特别是用汇编写的为加密绕了几个弯的程序(可不像C写的那样有规律),”
如果zhxzhx 一丁你认为不是这样的话,请用实际案例说明这个过程是如何的“简单”! 本人喜欢反向工程,曾多次调试修改破解x86程序
望寻有51/AVR环境下的爱好者共同交流
^_^ 这个其实就是智能卡SAM安全模块了 【115楼】 zhang_mike2000
你看病毒,都是看反汇编分析出来的,而且PC的程序在RAM里运行,可以一边解密,一边运行,相对于在ROM里运行的静态程序,这个复杂多了,而且在DOS时代,MSDOS,的资料全是靠反汇编分析出来的,有一本书,叫PC中断调用大全就是在反汇编的基础上写的
AVR的反汇编,简单的可以用reAVR,复杂的可以利用IDA,我现在就使用IDA5.0 to:【118楼】 zhxzhx 一丁
反汇编原理很简单,这是地球人都知道的,现在的问题是,客户愿意为这个工作花多少钱?
愿意花的多,说明这件事难度大,愿意花的少,说明这事难度小。我们只能以货币的多少来量化此工作的难度。否则没办法量化呀。 问题是,这个的代价没有你想象的高,难度也没有你想象的大
比如IDA,可以把C的数据结构分析出来,同时,还能区分出功能模块,形成流程图,加上对功能的了解,很快就能了解大致的处理思路,然后针对特定的部分修改,因为你是在ROM里的静态代码,是不能隐藏程序的分支的,而在pC上,你可以把程序代码伪装成数据,也可以动态调整段,即便是这样还有softICE可用,他可以设定条件断点,比如修改某个数据,就产生断点.这样和你说吧,解一个PC机上的加密狗,和你的原理是一样的东西,几乎就是0 DAY.其实我们身边有很多解密的东西,比如盗版,我们用的破解软件,都是这样来的,你可以感觉一下从新版本出来到有破解补丁,需要多长时间.
我认为.单片机的加密,要从防止破解的人得到BIN代码入手,我遇到过一个软件,只要你把她从设备上取下来,一通电,它就自己把自己的代码清除,你解出来也是不完整的代码,即便是这样,我认识的一帮人也能得到BIN文件,他们可以不给芯片加电而得到二进制代码 搜索了一下,网站上就有介绍IDA反汇编的
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=842197&bbs_page_no=1&search_mode=1&search_text=反汇编&bbs_id=9999 【120楼】“比如IDA,可以把C的数据结构分析出来,同时,还能区分出功能模块”
=====================================================================
问题是:有的整个程序都不是用C而是用汇编写的呀!“很快就能了解大致的处理思路”这一点不成立。 mark 保护知识产权,与国于民是有利的,从长远来说也是必须的,看过CCTV大国崛起中"英国"这一篇,就有这个感觉。
该芯片用于AVR加密:
CryptoMemory Development Library for AVR core (WinAVR-20090313) (2 MB)
For AVR core (WinAVR-20090313).
下载
http://www.atmel.com/dyn/resources/prod_documents/lib_CM-WinAVR20090313-090513.exe
安装后的文件列表
C:\Atmel\EmbeddedCrypto\DevLib\AVR\WinAVR-20090313 的目录
2009-12-0816:39 <DIR> .
2009-12-0816:39 <DIR> ..
2007-12-0410:33 300,318 Cmem.ico
2009-05-1210:07 3,406 Example.c
2009-12-0816:39 <DIR> libref
2009-05-1309:40 25,050 lib_CM.a
2009-05-1209:02 56,791 lib_Crypto.h
2009-05-1209:02 19,397 lib_Support.c
2008-12-1915:50 8,821 ll_port.c
2008-12-1915:49 2,826 ll_port.h
2009-05-1311:22 1,263 README-AVR.txt
8 个文件 417,872 字节
这是其中的Example.c
#include <stdio.h>
#include "ll_port.h"
#include <lib_Crypto.h>
#define DEFAULT_ADDRESS 0xb ///< Default address for CryptoMemory devices
void main(void){
unsigned char ucData, ucG;
unsigned char i;
RETURN_CODE ucReturn;
ll_PowerOn();
if( cm_Init() == SUCCESS) // Initialize the CM
printf("CM Init Success...\n");
else
printf("CM Init Failed !!!\n");
printf("Library Version is:%s\n", getLibVersNum());
printf("\n");
// Test write config zone
ucData = 0x5A;
ucData = 0xA5;
printf("Write MTZ\n");
ucReturn = cm_WriteConfigZone(DEFAULT_ADDRESS, 0x0A, ucData, 2, FALSE);
if (ucReturn != SUCCESS) printf("fail\n");
// Test Read config zone
ucData = 0x00;
ucData = 0x00;
printf("Read MTZ\n");
ucReturn = cm_ReadConfigZone(DEFAULT_ADDRESS, 0x0A, ucData, 2);
if (ucReturn != SUCCESS) printf("fail\n");
// Test write config zone w/a-t
ucData = 0x5A;
ucData = 0xA5;
printf("Write MTZ w/a-t\n");
ucReturn = cm_WriteConfigZone(DEFAULT_ADDRESS, 0x0A, ucData, 2, TRUE);
if (ucReturn != SUCCESS) printf("fail\n");
// Verify Read password 0
for (i = 0; i < 3; ++i) ucData = 0xFF;
ucReturn = cm_VerifyPassword(DEFAULT_ADDRESS, ucData,0, 1);
if (ucReturn != SUCCESS) printf("fail\n");
// Verify Write password 0
ucData = 0xFF;
ucData = 0xFF;
ucData = 0xFF;
ucReturn = cm_VerifyPassword(DEFAULT_ADDRESS, ucData,0, 0);
if (ucReturn != SUCCESS) printf("fail\n");
// Set User Zone
ucReturn = cm_SetUserZone(DEFAULT_ADDRESS, 3, FALSE);
if (ucReturn != SUCCESS) printf("fail\n");
// Write data to user zone
for (i = 0; i < 16; ++i) ucData = 0xEE;
ucReturn = cm_WriteUserZone(DEFAULT_ADDRESS, 0, ucData, 16);
if (ucReturn != SUCCESS) printf("fail\n");
// Read user zone
for (i = 0; i < 16; ++i) ucData = 0x00;
ucReturn = cm_ReadUserZone(DEFAULT_ADDRESS, 0, ucData, 16);
if (ucReturn != SUCCESS) printf("fail\n");
// Read Device Fuse Register
ucReturn = cm_ReadFuse(DEFAULT_ADDRESS, ucData);
if (ucReturn != SUCCESS) printf("fail\n");
// Verify authentication
for (i = 0; i < 8; ++i) ucG = 0xFF;
ucReturn = cm_VerifyCrypto(DEFAULT_ADDRESS, 1, ucG, NULL, FALSE);
if (ucReturn != SUCCESS) printf("fail\n");
// Verify encryption
for (i = 0; i < 8; ++i) ucG = 0xFF;
ucReturn = cm_VerifyCrypto(DEFAULT_ADDRESS, 1, ucG, NULL, TRUE);
if (ucReturn != SUCCESS) printf("fail\n");
// Test ReadChecksum
ucReturn = cm_ReadChecksum(DEFAULT_ADDRESS, ucData);
if (ucReturn != SUCCESS) printf("fail\n");
// Set User Zone w/a-t
ucReturn = cm_SetUserZone(DEFAULT_ADDRESS, 3, TRUE);
if (ucReturn != SUCCESS) printf("fail\n");
// Try to deactivate security
ucReturn = cm_ResetCrypto(DEFAULT_ADDRESS);
if (ucReturn != SUCCESS) printf("fail\n");
while(1);
} mark mark """"我遇到过一个软件,只要你把她从设备上取下来,一通电,它就自己把自己的代码清除,你解出来也是不完整的代码,""'
这个思路好,靠检测原电路中的信号来自动清除代码,再作成SMD的。那还是不错的好方法哟 mark 参考参考。。。 谁有at88sc104Linux下的驱动 mark mark mark EEPROM加密码 学习学习 AT88SC系列的API是要跟ATMEL签协议的,开发也比较难。现在新产品设计的话,可以考虑用AT88SA系列,源码和算法都是公开的。 mark学习了 记号了迟些再看 MARK 最好的加密就是让解密者觉得已解密,实际随机的出点问题,找不到头. mark! jh 我也介绍一个方法,凑凑热闹。
找人把IC打磨掉,然后重新打字。题外话,这个方法汉芯用过,不过教授不懂,走了不少弯路,最后还是要请民工才搞定。实际一颗IC打磨重新刻字只需不到一毛钱即可。
这个方法其实也不保险,但是可以迷惑敌人,重新打的字要打一个似是而非的型号,封装要相同(电源、晶振等管脚排列相同就更妙),要很冷门的,却又真实存在的型号。 我觉得11楼的办法不错。
能不能这样,让MCU每次根据时间计算出一个索引号,这样的索引号每秒变化一次,要跟踪IIC就很难了。如果是用在电力上,利用过零检测,10ms就能变化一次,这个破_解难度就更大了。 HCS301简单便宜 mark flow chart
MCU read ---> EEPROM code
MCU <----returnEEPROM code
if match than pass
if not match than do something else
我有一种想改成
if not match then pass 的感脚。 mark 学习! MCU部分要加自宫程序,检测不到就自宫了事,保密性还是有保证。抗干扰不够的话,怕误伤。 nark 现在Atmel有新的ATSHA204加密芯片来替代AT88SC0104了..加密强度更高 ATSHA204
http://www.dzsc.com/news/html/2011-3-8/125438.html 原来AT88SC还是这么受关注。。。。
曾经有个时间段研究过这个,写过其烧写器。
此种方法防止在线监听破_解关键数据是非常不错的选择。
但是如果只是存储密钥之类,读到单片机内比对的话,还是会存在以下的问题:如果别人把你的单片机程序完全反汇编过来,那么程序内容,密钥内容也就都一目了然了。 不错 加密和破_解都是可以实现的,关键是他用不着破_解,他直接破_解编程的那个人就行了! mark 我用AD的 mark 顶! 加密方法,mark 呵呵 厉害 plank 发表于 2009-6-8 13:55 static/image/common/back.gif
我觉得用处不大,mcu中的代码都读出来了,程序改一下就可以跳过eeprom中的密码,这样连eeprom的成本都省了 ...
这兄弟说的深刻,希望国人好好思考,为什么你用着破解的win系统,而微软并没有死掉。 不错不错 学习啦! mark
zhang_mike2000 发表于 2009-6-13 17:00 static/image/common/back.gif
又找到一种东东,ISL9206 & ISL9206A SOT-23 封装, 1-wire通讯
国内成交价在4RMB左右。
哪里有购买的? 关注有时间学下。
最好的加密就是让解密者觉得已解密,实际随机的出点问题,找不到头. mark 学习学习 plank 发表于 2009-6-8 13:55 static/image/common/back.gif
我觉得用处不大,mcu中的代码都读出来了,程序改一下就可以跳过eeprom中的密码,这样连eeprom的成本都省了 ...
别人都能研究你的反汇编码了,绝大多数情况下也没必要去破解你的了。大部分的破解是取出HEX然后烧写,不做修改。 通过CPU的ID号经过某种算法算出来的密钥,拿这个密钥加密通信协议
还是感觉这样的加密最可靠 如果是低档产品,对成本敏感的,这些都不适合,我有个方法,应该还行的,但是不能说。 {:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 长见识了,谢谢楼主 没有接触过 MARK,值得研究! 直接拿cpld模拟一个一模一样的时序就好了。。。 ATSC88用密文传输?这种密文 你都识别不了 让单片机如何识别? 想怎么玩就怎么玩 mark,好资料,顶,学习中 这个值得研究下,最近在搞atsha204 这个可以有,觉得前面一位网友好,发送索引数据,而不是明码不错 如果芯片具备非对称加密的话,基本上破解是无望的,但是这个非对称加密很贵 谢谢分享! 以前还真没关注过这一块,不知道楼主方法到底怎么样 有机会试试!mark 外接EEPROm加密,时序破解不难 加密的最高境界--不加密 我只是一个便宜的STC芯片,跟FPGA通讯,FPGA主动发起对话,发送一串随机生成的数,MCU收到后返回运算结果,FPGA收不到数或者数据错误就罢工。
一直在使用这个思路保护FPGA板子被抄。这个方法简单,但是破解难度肯定不如LZ提到的器件。
如果FPGA里面有DNA号的话,只要外接一个EEPROM就行,DNA和EEPROM 存在换算关系,这个关系难一些,别人只要琢磨不出这个关系,就抄不了板子。因为DNA号唯一。 单片机加密一直是一个值得探讨的问题! 谢谢分享 !! 加密很重要。 楼主的想法,值得研究 见过以前以为是EEPROM 思路也挺好的……………… zhang_mike2000 发表于 2009-6-8 14:06
我会试着写一下程序,如果成功了。会放到这里与大家分享。
AT88SC功能很多,对MCU加密只是其功能的一部分。 ...
5K USD可以不?如果可以吗,你加密有意义? 值得关注{:smile:}{:smile:} cicnx 发表于 2009-6-8 17:29
在两边放一张密码表. 读取的时候只发送索引号, 每次的索引号不一样..这样分析I2C的难度加大... ...
这个想法不错,不知道有没有用在实际产品中呢?
页:
1
[2]