dimanche 22 août 2010

Lightning-hunter #004

Un bel orage que j'ai vu arriver de très loin en Vendée avec un vent au sol contraire à son déplacement, les premières images prises au sec, les suivantes sous la pluie battante.

Mode d'emploi en "français"

On vient de me montrer ce mode d'emploi, bien plus impressionnant que l'objet qui l'accompagne.

dimanche 15 août 2010

Clef USB password: communication

 Ce weekend, création de l'interface de communication des codes. 

J'utilise la recopie d’état des LED "num" et "cap" du clavier, comme cela je suis sûr que les codes ne seront pas divulgués par une application du PC, et beaucoup plus dur à un keylogger à pirater. 
Je recrée une sorte de liaison SPI au travers des 2 LED. 
Cotée PC j'ai fait une application en Visual C++ qui envoi des codes de touche virtuel Cotée pic une fonction décodage et sauvegarde de la chaîne de caractères à la réception du caractère null a l'emplacement 0x010000 et 0x010070 de la flashrom une petite correction de la fonction écriture qui doit écrire par mots de 16 bits au lieu par octet, le fonctionnement était aléatoire hors simulateur.

lundi 9 août 2010

Clef USB password: correctif sauvegarde

Petit correctif au niveau de la sauvegarde en flash : 

void flash_mem_clear( unsigned short long adresse) 

void flash_mem_text_to_rom(unsigned char *ramptr, unsigned short long adresse) 

void flash_mem_flash_to_text(unsigned char *ramptr, unsigned short long adresse) 

Au lieu de : 

void flash_mem_clear( int adresse) 

void flash_mem_text_to_rom(unsigned char *ramptr, int adresse) 

void flash_mem_flash_to_text(unsigned char *ramptr, int adresse) 

Les "int" sont codé sur 16 bits donc la mémoire flash supérieure à 0x00FFFF n'était pas utilisable, pire une écriture en 0x010000 donnait une écriture en 0x000000 et là le firmware devient inutilisable. 

dimanche 8 août 2010

Clef USB password: traduction ASCII>>touches

 

Je vais donc utiliser une chaîne de caractères, de l'ASCII. 
Je traduis les caractères ASCII vers code clavier : 
  unsigned char touche_clavier_traduit(unsigned char caractere){ 
switch(caractere){
 case 'a': case 'A': 
return touche_A;
 case 'b': case 'B':
 return touche_B;
 ..................ainsi de suite Avec les constantes :
  #define touche_Q 4
 #define touche_B 5 
#define touche_C 6 
#define touche_D 7 
#define touche_E 8 
#define touche_F 9 
..................ainsi de suite

samedi 7 août 2010

Clef USB password : sauvegarde en flash

 

Maintenant, je veux pouvoir sauvegarder les codes, ces PIC ne possèdes pas d'EEPROM donc sauvegarde en mémoire programme. 
Je pourrai utiliser la déclaration "rom unsigned char chaine1[]="bonjour";". 
Mais le problème c'est que pour réécrire une chaîne il faut effacer la zone avec le programme qui y est contenu. 
J'ai donc fait des fonctions d'écriture en flash. 
 Je suis parti des procédures en assembleur du datasheet pic18f87J50 section "6-flash program memory" Soit les fonctions :
  void flash_mem_clear( int adresse){ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; //efface un secteur de 1024 byte (0x400) EECON1bits.WREN=1; EECON1bits.FREE=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; } void flash_mem_text_to_rom(unsigned char *ramptr, int adresse){//unsigned char *ramptr do{ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; TABLAT=*ramptr++; _asm TBLWT _endasm EECON1bits.WPROG=1; EECON1bits.WREN=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; EECON1bits.WPROG=0; EECON1bits.WREN=0; adresse++; }while(*ramptr); TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; TABLAT=*ramptr++; _asm TBLWT _endasm EECON1bits.WPROG=1; EECON1bits.WREN=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; EECON1bits.WPROG=0; EECON1bits.WREN=0; } void flash_mem_flash_to_text(unsigned char *ramptr, int adresse){ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; while(*ramptr){ _asm TBLRDPOSTINC _endasm *ramptr++=TABLAT; } _asm TBLRDPOSTINC _endasm *ramptr++=TABLAT; } 
Programme de test : 
#include #include "string.h" #include "stdio.h" #include "sauvegarde_flash_mem.h" unsigned char txt_ram[100] = "abcdefghijklmnopqrstuvwxyzxxxxxxxxxxxxxxxxxxxxxxxx"; unsigned char txt_ram2[100] = "texte en ram222222222222222222222222222222222222222222222222222"; void main (void) { fprintf(_H_USER,"\nstart\n"); printf("\nstart\n"); printf("txt_ram=%s\n",txt_ram); printf("txt_ram2=%s\n",txt_ram2); flash_mem_clear( 0x002000); flash_mem_text_to_rom(&txt_ram,0x002000 ); flash_mem_text_to_rom(&txt_ram2,0x0023F0 ); flash_mem_flash_to_text(&txt_ram, 0x0023F0); printf("\n"); printf("txt_ram=%s\n",txt_ram); printf("txt_ram2=%s\n",txt_ram2); while (1) ; }

Sauvegarde txt_ram à l'adresse 0x002000, txt_ram2 a l'adresse 0x0023F0, txt_ram est chargé par la valeur à l'adresse 0x0023F0 soit la valeur de txt_ram2.

mercredi 4 août 2010

Clef USB password: code fonctionnel

 

J'ai changé à l'arrache le début de la fonction : 

void Keyboard(void) { static unsigned char key = 4;//4 static unsigned char position = 0; static unsigned char texte[100]; texte[0]=4; texte[1]=5; texte[2]=6; texte[3]=7; texte[4]=8; texte[5]=43;//tab texte[6]=9; texte[7]=10; texte[8]=11; texte[9]=88;//enter texte[10]=0;//fin //Check if the IN endpoint is not busy, and if it isn't check if we want to send //keystroke data to the host. if(!HIDTxHandleBusy(lastINTransmission)) { if(sw2==0)//sw2//Switch3IsPressed() { //Load the HID buffer hid_report_in[0] = 0; hid_report_in[1] = 0; hid_report_in[2] = texte[position];//key++ hid_report_in[3] = 0;//0 hid_report_in[4] = 0; hid_report_in[5] = 0; hid_report_in[6] = 0; hid_report_in[7] = 0; if(texte[position]==0) { // while(sw2==0);; key = 40; hid_report_in[2] = 0;//key++ }else{ position++; } //Send the 8 byte packet over USB to the host. lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x08); } else { //Load the HID buffer hid_report_in[0] = 0; hid_report_in[1] = 0; hid_report_in[2] = 0; //Indicate no character pressed hid_report_in[3] = 0; hid_report_in[4] = 0; hid_report_in[5] = 0; hid_report_in[6] = 0; hid_report_in[7] = 0; //Send the 8 byte packet over USB to the host. lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x08); position = 0; key = 4; } } 

Ce qui a pour effet de tapé : abcde[tabulation]fgh[enter] 
Il y a plus qu'à traduire des touches pour que ça marche.

lundi 2 août 2010

THT expérience #013 : Fil néon

Fait avec une chute de câble twisté isolé au téflon et kapton, le fil s'échauffe très vite
Sur un melon.
Et la video.

dimanche 1 août 2010

Clef USB password: clavier en qwerty

En mettant Windows en clavier EN (alt + maj) j'obtiens la série dans l'ordre :

 abcdefghijklmnopqrstuvwxyz1234567890 -=[]\\;'`,./ 

Au lieu de : 

qbcdefghijkl,noparstuvzxyw&é"'(-è_çà )=^$**mù²;:! 

Alors que j'ai changé le descripteur 0x0409(US) par 0x040C(FR). 

Windows attribut les touches suivant leurs emplacements physiques théorique le code envoyé au pc correspond à l'appui et relâchement de chaque touche alors que sur cet autre projet un code d'appui et un code de relâchement est généré : adaptateur manettes Playstation vers mini DIN de PC-AT.
Le PC envoi un état vers le pic, en rajoutant ce code, j'ai une recopie d’état des num lock et cap lock du clavier du PC sur les LED de la platine : 
if(hid_report_out[0] & 0x01) {mLED_1_On();}else{mLED_1_Off();} 
if(hid_report_out[0] & 0x02) {mLED_2_On();}else{mLED_2_Off();}