Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] Visual C++ 2010 - Errore MSVCR100.dll mancante (rimuovere dipendenze runtime)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Ciao a tutti,
chiunque si cimenti nella programmazione in C++ sia che si tratti di programma (.exe) sia che si tratti della solita hack (.dll) da iniettare, potrebbe incappare (come è successo) nel problema per cui sul proprio pc tutto funziona e una volta ridistribuito il proprio applicativo/hack, questo non funziona sul pc di chi lo sta provando.
Premesso che di motivi per cui questo può accadere ce ne possono essere vari, voglio porre l'attezione sul caso della mancanza del runtime di visual C++ sul pc dove si verifica l'errore.

Un tipico messaggio potrebbe essere questo:
Impossibile avviare l'applicazione specificata.MSVCR100.DLL non è stato trovato. Una nuova installazione dell'applicazione potrebbe risolvere il problema.

I modi di risolverlo che mi vengono in mente sono:
1. dire alla persona con l'errore di installarsi il visual C++ runtime scaricandolo dal sito microsoft
2. dire alla persona di scaricarsi da internet la sola msvcr100.dll e copiarla nella cartella del programma o nella cartella di sistema
3. fare in modo che il nostro programma/hack NON dipenda da quella malefica .dll!

Immaginerete che sono qui per parlare del punto 3 Happywide
esatto!


Ma cominciamo dall'inizio.
Mi sono scritto una mini-dll che in pratica non fa nulla, e l'ho chiamata MyHack e voglio iniettarla in notepad.exe (potrebbe essere warrock o altro, non ha importanza per quello che vogliamo vedere noi).

Bene, se compilo la hack cosi com'è senza toccare nessun settaggio del mio progetto e poi simulo di stare su un pc SENZA la MSVCR100.DLL (l'ho rinominata) e la inietto in notepad utilizzando un tool generico come Winject, questo è quello che succede:
[Immagine: 00erroredipendenza.png]

Visto? il famigerato errore!
Perchè? perchè quando inietto la dll in notepad quello che succede è che una determinata parte del codice della dll (di inizializzazione) viene eseguito in automatico, peccato che sto codice non si trovi effettivamente nella hack stessa ma si trovi di fatto all'interno della libreria dinamica MSVCR100.DLL

Questo è un comportamento giusto e voluto da microsoft, peccato che nel nostro caso ci dia fastidio perchè accadrà che chi userà la nostra hack senza aver installato il runtime del vc otterrà questo errore e non sapendo che fare probabilmente scarterà la hack.

Ma andiamo a vedere che faccia ha la lista delle dipendenze della nostra hack con un tool tipo CFF Explorer:
[Immagine: 03adefaultsdipendenza.png]

Come vedete la nostra hack dipende da 2 librerie esterne che DEVONO trovarsi sul pc che la eseguirà (e nei percorsi giusti) e sono
KERNEL32.dll
MSVCR100.dll

bene, della prima non ci importa nulla in quanto è una libreria standard del sistema che arriva con windows stesso e quindi non mancherà mai a nessuno.
La seconda ci dice "attenzione! se questa msvcr100.dll dovesse mancare, io non funzionerò" Smile

Bene allora cominciamo a vedere qual è il settaggio di default in Visual C++ 2010 responsabile di questo tipo di comportamento.
Ci si arriva facendo tasto destro in Solution explorer sul nome del progetto (qui MyHack), quindi proprietà.
Espandiamo "Configuration properties"
Espandiamo "C/C++"
Andiamo in "Code Generation"
diamo un occhiata a destra alla voce "runtime library"
Qui l'immagine di cosa ci appare:
[Immagine: 03adefaults.png]

(c'entra poco con l'argomento, ma notate che sto lavorando con la configurazione RELEASE e NON debug, visto che quando si distribuisce una propria dll o programma si dovrebbe distribuire la release, inoltre se avessimo usato la debug, il nome del file sarebbe stato MSVC100D.dll dove quella d sta appunto per DEBUG)

Dall'immagine si vede che siamo settati per l'uso di un runtime "Multi-threaded DLL"
La parola importante qui da notare è "DLL".

Bene allora cambiamo questo settaggio in quest'altro:
[Immagine: 03bmultithread.png]


Ora è "Multi-threaded" e basta SENZA "DLL"

Bene, dopo aver cambiato questo settaggio ricompiliamo il programma e andiamo a vedere cosa dice il tool CFF Explorer con cui vediamo le dipendenze della nostra hack:
[Immagine: 03bmultithreaddipendenz.png]

Wow! non risulta piu essere dipendente da niente se non da Kernel32 che come abbiamo visto non ci interessa.
Ma sarà tutto vero?
Proviamo ad iniettare la nuova hack modificata in notepad.exe per vedere cosa succede (sempre con la msvcr100.dll rinominata in modo che non la possa trovare)
[Immagine: 00bok.png]

Bingo!
come si vede da WinJect l'iniezione ha avuto successo! e non è comparso nessun errore. Abbiamo risolto il problema Happywide

ciao
alla prossima
Digger









digger
20/03/2011, 22:57
#1
Cerca

ZioPaperino VIP
Messaggi: 2,350
Discussioni: 667
Registrato: 03-2011
Mix: 0
Il migliore Wink
Ora sono connesso da ipod touch, domani che posso accendere il pc sistemo e se funziona +1 =D
Cmq io all'hack ho già eseguito un debug, la devo rifare o posso lasciare questa e fare questa modifica?

20/03/2011, 23:58
#2
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 21/03/2011, 0:13 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
(20/03/2011, 23:58)ZioPaperino Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Il migliore Wink
Ora sono connesso da ipod touch, domani che posso accendere il pc sistemo e se funziona +1 =D
Cmq io all'hack ho già eseguito un debug, la devo rifare o posso lasciare questa e fare questa modifica?

puoi anche lasciare e fare questa modifica, ma comunque ti consiglio di metterlo sempre in "release" quando devi darlo ad altri, per tutta una serie di motivi, tanto è facile, basta che vai in alto nella toolbar dove c'è il tasto verde a forma di triangolo (tipo "play" dei lettori multimediali) e dal menu a discesa invece di "debug" selezioni "release" e ricompili

ah giusto per non essere frainteso, questo è l'ordine giusto da seguire:
1. vai in alto e cambi da debug a release
2. vai nelle proprietà del progetto e cambi quelle attuali (che dovrebbe dirti essere "release")

ti dico questo perchè se per sbaglio scegli "release" in alto, ma poi cambi i settaggi di "debug" non ti funzionerà e non capirai il motivo, devi essere coerente, per essere sicuro puoi anche cambiare nelle proprietà del progetto SIA debug che release cosi qualunque dei due userai sarà sempre corretto

in bocca al lupo
ciao



digger
21/03/2011, 0:08
#3
Cerca

ZioPaperino VIP
Messaggi: 2,350
Discussioni: 667
Registrato: 03-2011
Mix: 0
Citazione:in bocca al lupo

Sempre molto rassicurante ............

21/03/2011, 0:22
#4
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
adesso ho capito...hey si potrebbe avere quel global injector?? Tounge

19/08/2011, 16:16
#5
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
ma nooo imageshack mi ha segato uno screenshot Sad

global injector? intendi winject?
lo trovi in internet, se cerchi winject
comunque te l'ho uppato qui

[Per vedere i link devi REGISTRARTI.]

ciaps



digger
19/08/2011, 17:18
#6
Cerca

Iscritto
Messaggi: 1
Discussioni: 0
Registrato: 05-2013
Mix: 0
non ho capito.. io quale programma devo aprire x fixare il bug? e con quale programma?

20/05/2013, 14:22
#7
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 21/05/2013, 16:14 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
non c'è nessun programma per fixare il bug, il bug lo deve fixare il programmatore che ha coddato la hack. Nel momento in cui compila la dll deve stare attento ad avere certe opzioni di compilazione e linking, se le sbaglia nasce il problema
Il modo che hai tu per risolvere il problema è recuperare da qualche parte la dll mancante, che essendo una versione di debug non sta nel download del runtime di microsoft c++ . Quindi o te la passa qualcuno oppure la scarichi da internet (sperando di non beccarne una con virus) oppure devi installarti tutto il pacchetto di visual studio (nella versione giusta per la dll che ti manca) ma non te lo consiglio, troppo sbattimento


digger
21/05/2013, 16:12
#8
Cerca

Legen...wait for it
Messaggi: 1,511
Discussioni: 123
Registrato: 06-2012
Mix: 0
Bello! Ottimo!

25/05/2013, 15:41
#9
Cerca

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Certo, digger mi avevi già insegnato a farlo tempo fa :p

25/05/2013, 16:35
#10
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
ciao pocciox, si me lo ricordo Smile


digger
28/05/2013, 11:19
#11
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Errore stack Cyanstack 5 2,247 16/10/2013, 22:14
Ultimo messaggio: Pocciox
  NTLDR mancante (Windows XP) digger 9 4,838 16/12/2012, 20:52
Ultimo messaggio: pauldomy
  Programma Visual basic Aiuto Danyele360 37 8,614 16/12/2012, 19:53
Ultimo messaggio: pauldomy



Utenti che stanno guardando questa discussione: 1 Ospite(i)