|
quequero.org UIC
Forum
|
View
previous topic :: View
next topic |
Author |
Message |
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Sat Aug
20, 2005 11:13 am
Post subject: prima crack |
|
|
|
ho scoperto da un mesetto
l'UIC e mi è subito piaciuta, sporattutto per le numerose
guide molto chiare. come molti nuovi utenti ho tentato di
installare softice senza successo, quindi ho ripiegato su
ollydbg (che ha funzionato SUBITO!!) e mi sono letto la guida
su questo sito. come primo programma da crakkare ho scelto
G*M*F*C* pro (http://g*m.c*n*c.free.fr/en/download.php), e' un
software x macchine cnc e dura 30 giorni dopodichè bisogna
registrarsi. il mio problema è che l'ho installato prima di
finire la macchina cnc x vedere se l'elettronica funzionava, e
ora che è tutto finito non posso più provarla (e quindi
decidere se acquistare il software o meno)... PEiD dice
che il software e' stato scritto in Microsoft Visual C++ 6.0
[Debug] con W32Dasm ho disassemblato l'exe e cercato di
capire il funzionamento delle parti "interessanti" poi ho
provato a usare olly (l'avevo già usato con successo nei
tuttorial) ma all'avvio mi appare una finestra che dice:
"Module 'cnc1' has entry point outside the code (as
specified in the PE header). Maybe this file is
self-extracting or self-modifyng. please keep it in mind when
setting breakpoints"
significa che quando il programma
viene caricato in memoria si modifica? c'e' qualche
soluzione?
attendo randellate | |
Back to
top |
|
|
pelledoca Newbie
Joined: 15 May
2004 Posts: 27
|
Posted: Sat Aug
20, 2005 5:12 pm Post
subject: |
|
|
|
Vuol dire che cnc1.dll
(sotto %SystemRoot%\system32) è packed: PECompact 1.68 - 1.84
-> Jeremy Collake.
Da notare il seguente
interessante blocchetto di codice:
Code: |
00415C0A PUSH
GMFC.004E5468 ;
ASCII "GMFC V2.2" 00415C0F PUSH
GMFC.004E545C ;
ASCII "GM SoftwarE" 00415C14 CALL DWORD
PTR DS:[4F3EE0] ; cnc1.SharewareReg
00415C1A PUSH GMFC.004E5468
; ASCII "GMFC V2.2"
00415C1F PUSH GMFC.004E545C
; ASCII "GM SoftwarE"
00415C24 CALL DWORD PTR
DS:[4F3F4C] ; cnc1.AppIsRegistered
00415C2A AND EAX,0FF 00415C2F
TEST EAX,EAX 00415C31 JE SHORT
GMFC.00415C4D
|
Bello quando i programmatori sono
cosi amichevoli da dare nomi come "SharewareReg" o
"AppIsRegistered" alle funzioni.
pelledoca | |
Back to
top |
|
|
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Sat Aug
20, 2005 7:39 pm Post
subject: |
|
|
|
quella parte di codice è
contenuta nel file cnc1.dll? ho guardato la descrizione su
un sito di PEcompact, ma non è specificato se fa anche il
procedimento inverso.. come faccio a decomprimerlo? dal
codice che hai postato sembra che mi basterebbe far saltare il
programma all'istruzione 00415c24 quando inserisco il codice
sbagliato... | |
Back to
top |
|
|
peppeviruz Intermediate
Joined: 27 Oct 2002 Posts:
70
|
Posted: Sun Aug
21, 2005 1:55 am Post
subject: |
|
|
|
no, il codicee lo trovi nel
disassemblato dell'exe!!! Ciao!! | |
Back to
top |
|
|
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Sun Aug
21, 2005 8:55 am Post
subject: |
|
|
|
ma... che disassemblatore
usate?? ad esempio a me alla riga 00415C31 c'e' l'istruzione
mov ecx, dword ptr [esp +3C] anziche il salto condizionato
O_O | |
Back to
top |
|
|
pelledoca Newbie
Joined: 15 May
2004 Posts: 27
|
Posted: Sun Aug
21, 2005 10:31 am
Post subject: |
|
|
|
illo,
il fatto che
tu abbia istruzioni diverse nelle posizioni da me riportate è
esclusivamente dovuto al fatto che tu hai un diverso sistema
operativo. Io uso windows 2000 ... tu con ogni probabilità XP.
Come ha detto peppeviruz, la sezione di codice che ho
riportato si trova nell'exe non nella dll. Metti un bpx sulle
2 funzioni esportate dalla DLL (SharewareReg e
AppIsRegistered) ed attendi che Olly breaki sulle stesse ...
dovresti cosi giungere al blocco di codice in questione.
pelledoca | |
Back to
top |
|
|
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Mon Aug
22, 2005 9:17 am Post
subject: |
|
|
|
scusa non sapevo che le
istruzioni cambiassero valore a seconda del sistema
operativo.. è per questo che HIEV premendo F3 passa dal
modo Address a quello Offset (distanza dall'inizio del file)?
altrimenti le modifiche sarebbero valide solo sulla macchina
in cui vengono fatte? suppongo sia qui che si decide tutto
vero? se mi
dicessi la distanza dall'inizio del file dovrei trovarlo a
botta sicura no?
ho provato a brekkare sulle funzioni
con olly, ma non ho capito cosa vuol dire "funzioni esportate
dalla dll" comunque ho provato a scrivere bp
AppIsRegistered e bpx AppIsRegistered nel primo caso
finisco qui
mentre nel secondo appare una finestra (intermodular
calls) piena di chiamate a funzioni (credo). comunque non
c'e' traccia del codice che hai postato
come ultima
speranza mi sono pasato tutto il codice del programma da
W32dasm, l'unica cosa che ho trovato è questa (a me sembra
interessante ma sono niubbo quindi...)
sei sicuro di
aver scaricato la versione PRO e non la PE? | |
Back to
top |
|
|
pelledoca Newbie
Joined: 15 May
2004 Posts: 27
|
Posted: Mon Aug
22, 2005 9:49 am Post
subject: |
|
|
|
illo,
onestamente
non ricordo la versione scaricata ... ci ho dato un occhio
veloce e non trovando l'applicazione di alcun interesse l'ho
subito cancellata. Le istruzioni *non* cambiano da sistema
operativo a sistema operativo. Quello che *puo* cambiare è la
posizione in memoria in cui viene caricato il binario. In
altre parole, le istruzioni che ho mostrato si trovano in una
posizione in memoria diversa quando l'applicazione viene
eseguita su XP.
Le DLL *esportano* funzioni nel senso
che mettono a disposizione una serie di funzioni ai programmi
che possono essere interessati ad invocarle. In Olly puoi
semplicemente richiedere l'elenco delle funzioni
importate/esportate dall'exe e mettere un breakpoint sulle 2
funzioni gia discusse. Questo ti dovrebbe consentire di
individuare la locazione del blocco di codice che ho postato.
pelledoca | |
Back to
top |
|
|
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Mon Aug
22, 2005 11:32 am
Post subject: |
|
|
|
pelledoca
wrote: |
illo, Le istruzioni *non* cambiano
da sistema operativo a sistema operativo. Quello che
*puo* cambiare è la posizione in memoria in cui viene
caricato il binario. In altre parole, le istruzioni che
ho mostrato si trovano in una posizione in memoria
diversa quando l'applicazione viene eseguita su XP.
pelledoca |
scusa mi sono espresso male, intendevo
dire quello che hai scritto tu ^_^
ora devo solo
scoprire come fare a richiedere l'elenco delle funzioni :p
grazie per l'aiuto | |
Back to
top |
|
|
pelledoca Newbie
Joined: 15 May
2004 Posts: 27
|
Posted: Mon Aug
22, 2005 9:27 pm Post
subject: |
|
|
|
CTRL+N in OllyDbg
pelledoca | |
Back to
top |
|
|
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Tue Aug
23, 2005 11:10 am
Post subject: |
|
|
|
ho provato a cercarla con
ctrl - N (comando molto interessante) ma non c'e' neanche
l'ombra della funzione appisregistered e neanche di
riferimenti alla dll cnc1 mi sto rileggendo
la guida di assembly perchè ancora ho difficoltà a
interpretare alcune istruzioni e vorrei capire cosa combina il
programma in questa parte di codice. soprattutto Shareware
limit e DateIsSetBack
mi sono letto il tutorial sui processori intel, penso
di aver capito la parte di segmento e offset, ma se uno passa
da un processore a 16 bit ad uno a 32 o 64 bit dovrebbe
infischiarsene del problema di arrivare a 1 Mbyte di
indirizzamento con vari trucchetti, tanto già con 32 bit si
riesce a indirizzare 2^32 ~ 4Gbyte.. no? | |
Back to
top |
|
|
Zero_G Moderator
Joined: 20 May
2004 Posts: 960 Location: The Dark Side of the
Moon
|
Posted: Tue Aug
23, 2005 5:09 pm Post
subject: |
|
|
|
illo, innanzitutto ti
consiglio di buttare W32Dasm perché è pieno di bachi; è meglio
se guardi il disassemblato direttamente dentro Olly oppure usi
IDA, che è ancora meglio, ma più complicata/o.
cmq il
programma l'ho scaricato anch'io, se ho un pochino di tempo ci
dò un'occhiata stasera...
-=[Zero_G]=- _________________ "To see a World
in a grain of Sand, Hold Infinity in palm of your
Hand." | |
Back to
top |
|
|
pelledoca Newbie
Joined: 15 May
2004 Posts: 27
|
Posted: Tue Aug
23, 2005 9:01 pm Post
subject: |
|
|
|
illo,
non ci vuole
un genio per capire che DateIsSetBack controlla se hai
modificato la data del sistema riportandola indietro rispetto
all'ultima rilevata, che AppIsExpired controlla che
l'applicazione non abbia terminato il periodo di trial e che
AppIsRegistered controlla se i dati di registrazione sono
corretti. Tutti restituiscono un valore booleano. Basta
una piccola patch .... ed è fatta!!
pelledoca | |
Back to
top |
|
|
Zero_G Moderator
Joined: 20 May
2004 Posts: 960 Location: The Dark Side of the
Moon
|
Posted: Tue Aug
23, 2005 9:44 pm Post
subject: Zero_G - GMFC = 1 - 0 |
|
|
|
siccome i breakpoint su
GetDlgItemTextA o
GetWindowTextA
sembrano non funzionare su questo programma, devi
passare ad un altro tipo di attacco che in questo caso
potrebbe essere quello di sfruttare un altro punto debole: hai
notato che quando sbagli il seriale viene mostrato un
MessageBox di errore...
**MINI-TUTORIAL "POST
ESTIVO"**
PARTE 1: Troviamo il punto
debole
1.1) carica GMFC.exe in OllyDbg e
lancialo così com'è, ignorando la segnalazione del driver
mancante, altrimenti avresti un break anche su quello. una
volta premuto OK, il debugger si lamenta che cnc1.dll ha
l'entry point fuori dalla sezione del codice... come t'ha
detto pelledoca è packato, quindi lasciamolo bollire nel suo
brodo ed ignoriamolo; i programmatori sono stati così geniali
da criptare SOLO la dll che si occupa della verifica della
registrazione, ma forse non si sono ricordati che la
validazione del seriale viene comunque passata al livello
superiore, cioè all'eseguibile che importa la DLL, GMFC.exe
nel nostro caso.
1.2) a
questo punto dovresti avere la finestra che ti chiede la
License Key e, siccome sappiamo già che verrà fuori il
MessageBox, torniamo in Olly e clicchiamo sulla E in alto che
ti mostra l'elenco dei moduli richiamati dall'eseguibile (come
vedi, c'è anche cnc1.dll, schiaffata senza pietà dentro
C:\Windows\System32... )
1.3) scegli
USER32.DLL, la libreria di sistema che contiene MessageBoxA,
premi il tasto destro, clicca su "View Names" e sempre con il
destro attiva un breakpoint su MessageBoxA; adesso hai sotto
controllo l'export di questa funzione dalla sua libreria
nativa, quindi in qualsiasi momento l'eseguibile principale la
richiamerà, Olly intercetterà la call.
1.4) torna nel
programma, scrivi un numero a caso, premi OK e TADAH! ecco
Olly sul palcoscenico! (questa frase fa sempre un certo
effetto... :roftl: ) ovviamente non sarai in GMFC ma in USER32
e più precisamente all'"entry point" della funzione
MessageBox; premi F8 varie volte per scorrere fino
all'effettiva call che visualizza il messaggio d'errore, Olly
andrà in pausa e te switcha su GMFC, premi OK ed il controllo
ritornerà in mano al debugger. premi F8 un altro paio di volte
fino al RETN, F8 un'altra volta e (per fortuna) sarai
direttamente dentro GMFC (lo vedi scritto in alto nel titolo
della finestra CPU).
PARTE 2: Risaliamo la
corrente (da bravi reverser salmonati, o salmoni
reversati )
2.1) a regola dovresti essere
all'indirizzo 00493589 ed adesso dobbiamo trovare il punto in
cui lui decide che il codice non va bene e chiama il
MessageBox; salendo di qualche linea ti accorgerai facilmente
che il problema è più a monte, perché la funzione comincia a
004934D1 ed a quel punto il seriale è già considerato
sbagliato.
2.2) come
fare allora? semplice, se hai "studiato" un pochino saprai che
i punti di rientro delle call vengono accumulate nello stack
che viene considerato come una pila a cui si accede tramite
PUSH e POP, quindi scendendo andremo verso la sorgente (si va
in basso nella finestra dello stack di OllyDbg, ma in realtà
gli indirizzi crescono quando risaliamo la pila).
2.3) comincia a scorrere lo stack in giù e ti
accorgerai che la stringa "Invalid key..." è presente varie
volte (questo perché viene passata da un livello all'altro
come il testimone di una staffetta) e questo ti fa capire che
l'errore era già nell'aria prima dei corrispondenti RETURN (se
usi il mio schema di colori sono in celeste su sfondo nero);
ad un certo punto (è a distanza circa 350 bytes dalla cima
dello stack [ESP]) troverai una serie di numeri che non sono
indirizzi relativi (sono il risultato dei calcoli fatti sul
seriale), poi ancora quella stringa ed alla fine incontrerai
il puntatore all'SE, molto utile in questo caso perché è
indicatore della fine della catena dei gestori delle eccezioni
ed infatti nel blocco successivo la stringa non c'è più ed
alla prima posizione troviamo un simpatico "RETURN to
GMFC.00415C7B from GMFC.004935F0" che ci illumina la via.
clicchiamoci con il destro e scegliamo "Follow in
Disassembler..."
PARTE
3: Faccia a
faccia col nemico
3.1) piano piano la nebbia si
dirada e si capisce meglio come quella strana DLL viene usata
dal programma... innanzitutto possiamo ottenere una lista
delle funzioni da essa esportata per avere le idee più chiare;
clicchiamo ancora sulla E in alto, ma stavolta facciamo "View
Names" su cnc1.dll e questa è la lista che otteniamo (ti ho
asteriscato le più "sospette"...):
Code: |
4000E88C pec1
Export AppDaysLeft
4000E6C0 pec1
Export AppIsExpired
4000E8E0 pec1
Export *AppIsRegistered*
4000DF34 pec1
Export AppIsSetup
4000E228 pec1
Export AppRemove
4000E030 pec1
Export AppSetup
4000DAFC pec1
Export *DateIsSetBack*
40010804 pec1
Export DelEncrypted
4001F088 .rsrc
Import KERNEL32.ExitProcess
4000DEFC pec1
Export GetCDriveSerial
40010758 pec1
Export GetEncrypted
4001F130 .rsrc
Import user32.GetKeyboardType
4001F08C .rsrc
Import KERNEL32.GetModuleHandleA
4001F07C .rsrc
Import KERNEL32.GetProcAddress
4001F078 .rsrc
Import KERNEL32.LoadLibraryA
4001B000 .pec
Export <ModuleEntryPoint>
4001F138 .rsrc
Import advapi32.RegQueryValueExA
400108F8 pec1
Export ResetDate
4001067C pec1
Export SaveEncrypted
4000F478 pec1
Export SetDevPassword
4000F42C pec1
Export *SharewareLimit*
4000F2BC pec1
Export *SharewareReg*
4001F148 .rsrc
Import
shell32.SHGetSpecialFolderLocation
4001F140 .rsrc
Import oleaut32.VariantChangeTypeEx
4001F080 .rsrc
Import KERNEL32.VirtualAlloc
4001F084 .rsrc
Import
KERNEL32.VirtualFree |
NOTA: ovviamente non c'interessa degli
import (le funzioni che servono a questa DLL), ma ci dobbiamo
concentrare sugli export (le funzioni che questa DLL offre ai
programmi che la invocano).
3.2) ora è il momento di
restringere il nostro campo d'azione ed isolare la funzione
che si occupa del check del seriale, cioè presumibilmente
quella dove ci troviamo in questo momento; per fare questo
possiamo esaminare il disassemblato ed eseguire mentalmente le
istruzioni in senso inverso per prevenire che il flusso giunga
nel punto in cui viene chiamata la procedura d'errore
(00493583 nel nostro caso), ma poche persone hanno questa
specie di potere Jedi, e per i comuni mortali, me incluso, è
più semplice usare un pochino di furbizia e colpo d'occhio.
3.3) la call subito successiva al punto in
cui siamo rientrati dal MessageBox chiama la funzione
cnc1.DateIsSetBack che controlla se abbiamo "manomesso" la
data per farlo funzionare lo stesso, ed infatti la stringa
corrispondente è "Invalid last execution time" (è scritta come
commento nella colonna di destra), quindi noi dobbiamo salire
ancora e più su troviamo riferimenti a quelle famose funzioni
di cnc1.dll (SharewareReg, AppIsRegistered, ...), che tra le
altre cose ora che è stata caricata e decriptata in memoria,
quindi tranquillamente visibile; salendo ancora più in alto
troviamo il punto d'entrata della funzione (00415AA4).
3.4) guardando dove vanno a finire i salti
condizionali, quelli che deviano il normale flusso in cascata
della funzione evitando le call "maligne" di cnc1.dll sono:
[1] 00415B2D -> dopo aver chiamato AppIsRegistered,
questo salta in blocco il corpo centrale e va al RETN in
fondo; [2] 00415C31 -> evita o meno il JMP verso il
medesimo RETN finale;
adesso che abbiamo capito come
GMFC interagisce con la DLL, settiamo un bel breakpoint con F2
all'inizio della funzione (sempre a 00415AA4).
PARTE 4:
A cuore
aperto...
4.1) Riavviamo il tutto, ignoriamo i
messaggi del driver e della DLL criptata, riscriviamo un
numero a caso (possibilmente qualcosa di facilmente
individuabile in memoria, tipo "123456"), premiamo OK e
rieccoci dentro Olly, stavolta prima che il seriale venga
bollato come farlocco (eheh sembra di poter tornare indietro
nel tempo ed impedire le cose che devono ancora accadere...
).
4.2) fino a 00415AD5 niente di che, mentre a 00415AD8
vediamo che la call porta il primo carattere del seriale come
valore in EAX ed i restanti come stringa in EDX; la successiva
call a 00415AF2 riporta il seriale in EDX e questo serve per
testare il valore in EAX e prendere o meno il salto
condizionale a 00415AFE:
Code: |
00415AFE |. /JE
SHORT 00415B16 00415B00 |. |PUSH
004E580C 00415B05 |. |MOV
ECX,[LOCAL.133] 00415B0B |. |ADD
ECX,1C0 00415B11 |. |CALL
00488EF0 00415B16 |> \PUSH
004E5468
; ASCII "GMFC V2.2"
00415B1B |. PUSH
004E545C
; ASCII "GM SoftwarE"
00415B20 |. CALL
DS:[4F3F4C]
; cnc1.AppIsRegistered
00415B26 |. AND
EAX,0FF 00415B2B |. TEST
EAX,EAX 00415B2D |. JNZ
00415CC8 |
questo salto tuttavia non ci preoccupa
molto, perché comunque finiamo alla chiamata di
AppIsRegistered; come già detto prima, i programmatori non
sono stati granché furbi, perché non solo le funzioni
esportate hanno nomi palesemente autoesplicativi, ma
oltretutto il loro uso è triviale: vengono chiamate solo per
ricevere flag in base a quali si decide l'esito della
registrazione; oltretutto, dato che la DLL durante
l'esecuzione deve essere decriptata e che gli export sono
"pubblici" e quindi comunque visibili dall'esterno, l'uso di
un packer/crypter per esse è del tutto inutile!
4.3) di importanza ben più rilevante è invece il
successivo JNZ (quello a 00415B2D), perché avevamo visto che
ci portava in fondo alla funzione saltando tutte le menate
della data modificata e dello shareware, quindi quando ci
arriviamo steppando con F8 ovviamente il salto non verrà
eseguito, dato che AppIsRegistered ha settato a 0 il flag in
EAX; per vedere subito l'effetto di questo salto cliccate due
volte sullo ZFlag a destra nella finestra dei registri (la Z =
1 sotto la A e sopra la S) portandonde il valore a 0. premiamo
F8, il salto verrà forzato e arriviamo a 00415CC8.
4.4) a questo punto la funzione prosegue liscia liscia
fino al RETN ed almeno ad occhio sembra che il controllo
principale era proprio quello; per sincerarsi delle nostre
supposizioni, premiamo F9 e vediamo che succede... tratteniamo
il respiro... il programma è partito! :finger:
4.5)
clicchiamo con il destro nella finestra del disassemblato e
scegliamo "Copy to executable" --> "All modifications"
--> "Copy all" --> "Save file" e diamogli un nome
diverso dall'originale; a voi il piacere di creare un patcher
tramite confronto tra le due versioni.
EPILOGO:
wow, abbiamo
scavalcato una protezione basata su una DLL packata, ma... era
davvero la soluzione migliore? prima di rotolarci in terra
urlando e piangendo di gioia(!), riflettiamo su cosa abbiamo
fatto e cosa era possibile fare:
(1) patchando
l'eseguibile abbiamo ottenuto l'effetto desiderato, cioè farlo
partire con qualsiasi, ma di sicuro non è la soluzione più
elegante perché tutte le volte che riparte ve lo richiede,
nonostante la finestra vada via anche semplicemente premendo
OK.
(2) la soluzione migliore, come sempre, è fare un
keygen che generi un seriale valido, ma per questo bisogna
necessariamente entrare nei particolari della funzione che
valida quello immesso, e non sempre questo processo è
invertibile, cioè a volte si può fare soltanto tramite attacco
a forza bruta; la parte da analizzare è quella che va da
00415B2D a 00415BEE, in cui bisogna entrare nelle varie call e
seguirle passo passo. io mi sono limitato a evitare i
controlli.
(3) quando possibile, da non disdegnare è
anche il serial-phishing; sebbene non abbia avuto il tempo di
controllare tutte le call, ho notato che in quel pezzo c'è un
discreto traffico di stringhe e se l'esperienza non mi inganna
mi sembrano parecchio dei pezzi di seriale...
(4) un approccio alternativo (e molto istruttivo)
sarebbe quello di dumpare e fixare la DLL, dopodiché entrare
nella AppIsRegistered e far sì che dia sempre esito positivo;
questa cosa è più trasparente ai fini del programma, che di
fatto si fida ciecamente di quello che gli dice cnc1.dll,
anche se lavorare a valle di *tutti* i controlli effettuati
dall'eseguibile principale ha il medesimo effetto.
per
essere sicuro che non vi fossero altri controlli ho fatto
girare un po' il programma (che tra le altre cose non ho
capito assolutamente a cosa serva! ) e mi pare che l'unico
punto fosse quello che ti ho indicato; se comunque ti accorgi
di altri check puoi provare a toglierli, tanto penso che tu
abbia capito la filosofia, no?
con questo
concludo, spero di esserti stato d'aiuto, illo.
buonanotte...
-=[Zero_G]=-
(!back on
track!) _________________ "To see a World in a
grain of Sand, Hold Infinity in palm of your
Hand."
Last edited by
Zero_G on Wed Aug 24, 2005 12:14 pm; edited 1 time in
total | |
Back to
top |
|
|
illo Newbie
Joined: 14 Aug
2005 Posts: 7
|
Posted: Wed Aug
24, 2005 11:09 am
Post subject: |
|
|
|
innanzitutto grazie a
pelledoca e Zero_G! avrete la mia eterna riconoscenza per
l'aiuto datomi ho appena letto molto velocemente il post (il
tempo è tiranno), appena posso mettermi tranquillo davanti al
pc vi faccio sapere com'e' andata. @Zero_G il
programma serve per controllare una macchina cnc che utilizza
l'elettronica MM2001 di cui ci sono svariati schemi nella
rete. serve a tagliare il polistirolo, in particolare le
ali & fusoliere degli aeromodelli. | |
Back to
top |
|
|
|
Watch
this topic for replies |
You can post new topics in this forum You
can reply to topics in this forum You can edit your
posts in this forum You can delete your posts in this
forum You can vote in polls in this forum You
can moderate
this forum |
|