dimanche 22 août 2010
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)
;
}
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
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.
Inscription à :
Articles (Atom)