|
[HS] Pb techniques Hardware/Softwares/Internet... (pg. 122)
|
View this Thread in Original format
| PyrofraG |
| quote: | Originally posted by Eddy
Il y a des personnes qui s'y connaissent en kernel linux , appel systemes ?
J'ai un morceau de code que je comprend pas, je le met au cas ou.
code: void *get_system_call(void)
{
unsigned char idtr[6];
unsigned long base;
struct idt_descriptor desc;
asm ("sidt %0" : "=m" (idtr));
base = *((unsigned long *) &idtr[2]);
memcpy(&desc, (void *) (base + (0x80*8)), sizeof(desc));
return((void *) ((desc.off_high << 16) + desc.off_low));
}
Si quelqu'un peut m'expliquer la fonction ce serait cool!:toocool: |
Si j'ai bien compris :
asm ("sidt %0" : "=m" (idtr))
Tu appelles une fonction assembleur en utilisant la variable idtr pour te simplifier la vie (tu évites de stocker ta variable dans des registres.
http://www.ibiblio.org/gferg/ldp/GC...mbly-HOWTO.html
Ensuite le coup du (unsigned long *) &idtr[2] j'avoue ne pas comprendre la subtilité de faire un pointeur sur un pointé pour moi l' * et le & s'annulent...., je dirais donc que base récupère la valeur de l'adresse du tableau itdr sur le 3ème élément.
Ensuite il copie dans la structure desc le contenu de base à l'adresse base+0x80*8 jusqu'à la taille de desc.
Enfin il retourne un pointeur sur ta structure desc pour lequel il récupère la valeur haute en faisant un décallage de 16 bits et en ajoutant la valeur basse.
En gros ton desc est composé de deux entier de 16bits et ta fonction retourne un 32bits.
Je suppose que ça rend la valeur de l'appel système qui a eu lieu avec la fonction assembleur sidt %0 (%0 c'est le programme que tu exécutes si je ne me trompes pas sous Linux).
Bien sûr je ne garantie pas à 100%, j'suis pas un as en prog ici et quand je vois ça je me dis que j'ai bien fait de ne pas trop chercher à faire de la dev finalement :clown: :clown: |
|
|
| Insigma |
Qd je vois ça, plus ça va, moins j'ai envie de faire de l'info...
J'ai envie de me lancer ds ma propre entreprise... J'ai une idée, pourvu qu'elle soit bonne.. Et encore faudrait-il franchir le pas, vu les risques. Tiens v ouvrir un thread. |
|
|
| Kartman |
| quote: | Originally posted by Insigma
Qd je vois ça, plus ça va, moins j'ai envie de faire de l'info...
|
Pas de l'info ca ! Le C est la programmation ce que le minitel est a internet.
Un ancetre respectable qui sert d'exemple. |
|
|
| birante |
'tin jveux emuler un .iso avec deamon tools et comprend po, j'ai suivi les étapes indiquées sur un site et il se passe nada.:conf:
Quand je vais dans le poste de travail sur ce qui est censé être le lecteur virtuel, me sort que cette daube de windows ne le détecte po... si y'en a qui ont déjà eu ce genre de problème, faites moi signe ;) |
|
|
| Kartman |
| quote: | Originally posted by birante
'tin jveux emuler un .iso avec deamon tools et comprend po, j'ai suivi les étapes indiquées sur un site et il se passe nada.:conf:
Quand je vais dans le poste de travail sur ce qui est censé être le lecteur virtuel, me sort que cette daube de windows ne le détecte po... si y'en a qui ont déjà eu ce genre de problème, faites moi signe ;) |
- Essaies de redémarrer
- Vérifies que t'as bien mis au moins 1 Virtual Drive actif
Ca a toujours marché impec chez moi. |
|
|
| JoeHell |
| quote: | Originally posted by Kartman
Pas de l'info ca ! Le C est la programmation ce que le minitel est a internet.
|
Ah, on voit les winners qui jurent que par VB ou Delphy :whip:
Depuis que j'ai mon nouveau taf, je rêverais de maintenir l'appli du boulot en C++ au lieu de ce VBA de merde dont le fonctionnement interne tient plus de l'aléatoire que de la logique !
En C++ au moins on peut coder proprement... et proprement, ça veut pas dire utiliser toutes les options du compilateur obligatoirement. |
|
|
| dansal62 |
| quote: | Originally posted by _greggy_
déjà le C c'est imbouffable, mais avec du code assembleur au milieu ça fout la gerbe direct :toothless |
+1 :toothless
In Java We Trust :p |
|
|
| Eddy |
| Pour faire un rootkit le C c'est mieux :p |
|
|
| chasis.fan |
| quote: | Originally posted by dansal62
+1 :toothless
In Java We Trust :p |
Tu m'étonnes :o
C'est clair que c'est pas le meme monde les langages de haut niveau style Java / DotNet et ce genre de bout de code en C avec appel de portion en ASM :nervous: |
|
|
| Eddy |
Merci pyro pour ton début d'explication, en faite le problème c'est cette table des interruptions, j'arrive pas a voir comment elle est? Et ce qu'il fabrique avec et ensuite il s'en sert pour trouves les sys call , c'est puissant :p
Allez je vous met le code qui suit je sais que vous aimez!
code: /* averiguar sys_call_table */
s_call = get_system_call();
sys_call_table = get_sys_call_table(s_call);
code: void *get_system_call(void)
{
unsigned char idtr[6];
unsigned long base;
struct idt_descriptor desc;
//Enregistre le sidt a l'adresse de idtr =m = indique une sortie de type mémoire (ce n'est pas un registre
asm ("sidt %0" : "=m" (idtr));
//idt est la table de description des interruption
base = *((unsigned long *) &idtr[2]);
memcpy(&desc, (void *) (base + (0x80*8)), sizeof(desc));
return((void *) ((desc.off_high << 16) + desc.off_low));
} /*********** fin get_sys_call_table() ***********/
void *get_sys_call_table(void *system_call)
{
unsigned char *p;
unsigned long s_c_t;
p = (unsigned char *) system_call;
while (!((*p == 0xff) && (*(p+1) == 0x14) && (*(p+2) == 0x85)))
p++;
dire_call = (unsigned long) p;
p += 3;
s_c_t = *((unsigned long *) p);
p += 4;
after_call = (unsigned long) p;
/* cli */
while (*p != 0xfa)
p++;
dire_exit = (unsigned long) p;
return((void *) s_c_t);
} /********** fin get_sys_call_table() *************/
|
|
|
| _greggy_ |
| un truc génial a été inventé : les commentaires dans le code :rolleyes: :rolleyes: |
|
|
|
|