class GoodFET:
"""GoodFET Client Library"""
+
+ GLITCHAPP=0x71;
+
def __init__(self, *args, **kargs):
self.data=[0];
def timeout(self):
else:
self.data=self.serialport.read(self.count);
return self.data;
+ #Glitching stuff.
+ def glitchAPP(self,app):
+ """Glitch into a device by its application."""
+ self.data=[app&0xff];
+ self.writecmd(self.GLITCHAPP,0x80,1,self.data);
+ #return ord(self.data[0]);
+ def glitchVERB(self,app,verb, data):
+ """Glitch during a transaction.."""
+ self.data=[app&0xff, verb&0xFF]+data;
+ self.writecmd(self.GLITCHAPP,0x81,len(self.data),self.data);
+ #return ord(self.data[0]);
+ def glitchVoltages(self,low=0x0880, high=0x0fff):
+ """Set glitching voltages. (0x0fff is max.)"""
+ self.data=[low&0xff, (low>>8)&0xff,
+ high&0xff, (high>>8)&0xff];
+ self.writecmd(self.GLITCHAPP,0x90,4,self.data);
+ #return ord(self.data[0]);
+ def glitchRate(self,count=0x0800):
+ """Set glitching count period."""
+ self.data=[count&0xff, (count>>8)&0xff];
+ self.writecmd(self.GLITCHAPP,0x91,2,
+ self.data);
+ #return ord(self.data[0]);
+
#Monitor stuff
def silent(self,s=0):
if(sys.argv[1]=="glitch"):
print "Identifies as %s" % client.identstr();
+ client.glitchVoltages(0x880, 0xfff);
for i in range(1,20):
client.start();
print "Identifies as %s, fused 0x%02x" % (
client.identstr(),
client.lockbits());
-
+if(sys.argv[1]=="glitchgraph"):
+ print "Identifies as %s" % client.identstr();
+ for voltage in range(0x860,0x890,5):
+ str="";
+ count=0;
+ #five minutes for 1,80
+ #thirty minutes for 1,500
+
+ for i in range(1,40):
+ client.glitchVoltages(voltage, voltage);
+ client.start();
+ if(client.lockbits()==0xFF):
+ str="%s." % str;
+ count+=1;
+ print "%04x %s" % (voltage,str);
+ #print "%f, %i" % (voltage*(3.3/4096.0),count);
if(sys.argv[1]=="info"):
print "Identifies as %s" % client.identstr();
if(sys.argv[1]=="erase"):