python thread ctrl c和c thread有什么区别

推荐这篇日记的豆列 ······一、背景去年为了分析方程式组织那个入侵硬盘固件的组件,在分析西部数据硬盘固件时遇到点问题,偶尔在hddguru上发现的一次讨论文,对我的分析起到很大帮助。就将此次讨论整理翻译成文,同时也当作为我个人的学习笔记。现分享出来,感兴趣者共学之。&&&&&& 基本思路总结:&&&&&& 1.分析PCB,找到JTAG接口&&&&&& 2.使用调试器连接JTAG调试分析&&&&&& 3.dump Flash,这里作者的FLASH似乎没有设置保护,可以直接就dump了。&&&&&& 4.分析FLASHdump文件.有一些意外的东西发现就是flash中提供有可以通过串口进行访问可以任意读写任意地址,这也算是一个硬盘后门啊,邪恶的可以做多少事儿,但是前提是你必须拿到硬盘,修硬盘的可以方便给你植入病毒了。5.分析bootloader格式和kernel格式。&&&&&& 6.修复flash。&文章是作者一次求助引起的,作者的西数硬盘损坏而引起一次分析探索.求助的问题如下:Is there anyone who have pinouts of 88i6745n JTAG?or PASS for RAR file:&/ftp/WD/88I6745.rar&?or a way to rewrite broken ROM in 88i6745n ?or a way to boot from external U12 EEPROM24p10, 24p20 ?&二、硬件分析看来没有人愿意帮助我,so,我自己找到JTAG引脚。希望有人会感兴趣。JTAG引脚是在PCB的CON1上,看起来好像所有板上都是一样的?!!我测试了-c00 Marvell 88i6545 和 -e00 Marvell 88i6745n,两款芯片ID都是0x&下图连接到-e00链接到JTAG的测试点如下:&链接到JTAG CON1如下:&三、使用调试器&OK,我感兴趣的是重写Marvell 88i6745n内部损坏的EEPROM(ROM)。看起来很多人都解决了这个问题,但是他们都不愿意分享?难道我进错论坛了吗,信息不是应该自由共享吗?(实际上论坛没有人解决过此类问题)Anyway,我不得不自己来解决问题,如果有人愿意帮助我会更好。首先我选择用OPENOCD(http://openocd.berlios.de/)来调试,然后我必须找到JTAG接口。首先看看OPENOCD支持什么样的JTAG接口。我使用Xilinx III cable JTAG在家做了一个。&首先链接Marvell 88i6745n PCB如你之前所看到的,必须使用的引脚如下GNDTDITMSCLK inTDO&以下引脚可用可不用,依赖于你自己的JTAG接口而定Vcc 3.3v &&&&& -for powering JTAG interface or for reference.CLK out &&&&& -for VERY FAST JTAG interface that support CLK outRST &&&&&&&&&&&& -for JTAG interface that support RST&对于我的Xilinx IIIJTAG接口来说只需要使用到GND,TDI, TMS, CLK in, TDO, Vcc 3.3开始:1. 将"feroceon.cfg"文件从openocd\target拷贝到openocd\bin下2. 拷贝文件jtag.cfg到openocd\bin下。对于Xilinx IIIJTAG的接口文件如下:#*******************************#daemon configurationtelnet_port 4444gdb_port 3333#interfaceinterface parportparport_cable dlc5parport_port 0x378#*******************************&3. 把putty.exe拷贝到openocd\bin下,或者使用telnet.4. 我使用的PCB板(从HDD盘上卸下来的)的EEPROM(ROM)是已经不可用的。我并不确定是否有必要将PCB设置为测试模式(前3个引脚接到GND)将JTAG接口连接到PCB。将SATA电源连接PCB。5. 进入到openocd\bin目录下输入:openocd.exe -f jtag.cfg.txt -f feroceon.cfg如果没啥问题,你会看到如下:&&你可以看到设备ID为0x,由于OPENOCD没有匹配的loader,我就使用feroceon.cfg配置loader来加载。如果你那里发生错误,可以去读OPENOCD的文档。6. 现在运行telnet。进入到openocd\bin目录输入:putty.exe打开putty后,输入localhost,端口输入4444链接。如果没什么问题的话会出现如下一个窗口:7.然后输入halt,你会看到:到这一步就表示你可以完全控制Marvell 88i6745n了。然后,开始从Marvell chip中dump bootstrap:dump_image ffff0000.bin 0xffff00没有意外的话我们可以看到:&四、dump文件分析&在目录openocd\bin可以看到dump文件ffff0000.bin。目前我的文件SHA1为5ab6baaac0abc186ae8,现在你可以用一个ARM反汇编器来分析代码了。&一些地址推测:&0xffff0000 &&&&&&&&&&&&&&&&&& HWRESET vector(复位向量, 处理器复位时执行)0xx04007fff & internal SRAM for STACK.(栈区)0x&&&&&&&&&&&&&&&&&& SDRAM8-32Mb ???0x1c00xxxx&&&&&&&&&&&&&&&&&& ports?(端口映射区?)0x1c00a6xx &&&&&&&&&&&&&&&&& serialport(串口映射区)0x1c00a8xx &&&&&&&&&& &&&&&& I/O port ?(IO映射区?)&通过对dump文件的分析得到了如下函数:&FFFF1A70:start_tiny_console_thumbFFFF01B4: start_tiny_console_armFFFF1944: send_asciiz_strinFFFF1A16:receive_and_resend_CMDFFFF18E2: send_byteFFFF1A06:receive_byte等等&1.函数start_tiny_console_thumb/start_tiny_console_arm分析在硬件复位后,CPU测试端口0x1C00A84E(注:这是测试端口的映射地址),如果第13位被设置的话,运行start_tiny_console。这个函数有3个命令功能 (read,write,jump):r &32bit address& ;&&&&&&&&&&&&&&&&&&&&& readone half word(16 bit) from addressw &32bit address& &16bit data& ;&& write one half word(16 bit) to addressj &32bit address& ;&&&&&&&&&&&&&&&&&&&&&& jump or call code onaddress&通过这几个命令功能我们可以在底层对CPU做任何事情,但问题是怎样设置0x1C00A84E的第13位。端口0x1C00A84E是连接到4个引脚(3.5寸盘是8个引脚)的跳线插上,因此第13位必须连接到某个引脚或者某个跳线插的组合。我先使用JTAG调用它来测试了tinyconsole函数,先用3.3v的电压加到板上,然后将COM或USB连接到COM端口。&使用超级终端(Hyper Terminal)将你PC上COM端口设置到N 1并运行。现在,运行openocd(将栈指向0x4005000,设置PC为0xffff1a70-start_tiny_console_thumb,然后运行):Haltreg sp_usr 0x4005000reg pc 0xffff1a70resume&如果不出问题,我们会看到:&超级终端(Hyper Terminal)将会弹出,现在你可以切换到超级终端并输入测试:(哈哈,现在几乎可以无所不能了^_^,当然事情并没有完,作者不想每次都进行上面的复杂操作)&五、"kernel loader "分析&如果我能找到一种方式运行tiny console(start_tiny_console_thumb/ start_tiny_console_arm)函数,那么我就可以不通过JTAG来访问CPU(硬盘的主控制器)。内部FLASH(EEPROM)镜像地址为0xfff00000, 大小为0x30000。bootstrap查找flash的首块,我称之为“内核加载器(kernel loader)”(应该就是bootloader)。 "kernel loader"的头是在FLASH的地址0x(物理地址为0xfff00000)处,大小为0x20个字节,头是带有校验和的。&0x5a;&&&&&&&&&&& Header ID04,0,0 ;&&&&&&&&& ?0xd,0xc,0,0 ;&& =0x00000c0d size of "kernel loader" +CHK0xc,0xc,0,0 ;&& =0x00000c0c size of "kernel loader"0x20,1,0,0 ;&&&& =0xstart of "kernel loader" data in FLASH (physical addr 0xfff00120)0x80,0xa,1,0 ; =0x00010a80 physical addr where "kernelloader" have to be loaded

我要回帖

更多关于 python3 thread 的文章

 

随机推荐