[ dejan85 @ 24.01.2009. 18:54 ] @
| Uzeo sam neki C kod pisan za linux, nabildovao ga u .NET(Console application), pa je pucao na stack owerflow, ali kad sam u opcijama stavio velicinu steka na nekih 16mega sve je radilo kako treba. Zatim kreiram mfc dll projekat i napravim dll od istog koda, ucitam dll iz C#-a i pri pozivu funkcije iz dll-a puca na stack owerflow iako sam pri bildovanju dll-a isto stavio 16mega za stack. Ne znam u cemu je problem? |
[ mmix @ 24.01.2009. 19:13 ] @
Pa za pocetak problem je sto ti uopste treba 16mb za stek. Umesto sto krpis flasterima, sto ne bi resio problem overflow-a?
[ dejan85 @ 24.01.2009. 19:27 ] @
16 mega sam stavio prvo i sve je radilo kako treba, mozda radi i sa 4 to je nebitno, promenicu. Nego problem je sto kad pozovem dll uvek puca (i sa 16).
Citat:
Umesto sto krpis flasterima, sto ne bi resio problem overflow-a?
Ma nekrpim nista, samo sam uzeo tudji kod koji radi to sto treba, i pokusavam da ga pozovem iz C#-a.
[ saigon_from_europe @ 25.01.2009. 16:24 ] @
mmix kaze da je povecanje steka "krpljenje" jer stek bi trebalo da raste i opada, tako da nikada ni ne dodje do 16MB. Deluje mi da tebi stek "curi", pa kada povecas stek da radi samo zato sto se stek ne prepuni dok program radi.
Proveri C# deklaracije funkcija iz DLL-a koje koristis. Kada pucaju stvari sa stekom kada se koriste C/C++ funkcije iz nenativnog okruzenja to najcesce znaci da deklaracije u jeziku u kojem se DLL koristi nisu iste kao deklaracije u samom DLL-u. To ume da se manifestuje na razlicite nacine.
Najtipicnija greska je sta je kada se pomesa sta je preneto po referenci a sta po vrednosti. Ako to nije, uzmi i napisi na papiru sve konverzije koje imas. Tj. koji tipovi se javlaju u C-u, naspram C#-a, proveri spisak da li je sve ok, i onda gledajuci u papir proveri funkciju po funkciju da li je svako preslikavanje ok. Greske nastaju kada se npr. pomesa long i int (32 u C-u naspram 64 u C#-u) i slicno. Proveri i da li su sve deklaracije u C-u ono sto ocekujes. Npr. long moze da bude i 64 bita u C-u; to nije deo standarda nego implementacije.
Da bih lakse uocio greske ja volim da iskopiram iz .h fajla deklaraciju i da je stavim tacno iznad C# deklaracije da bih mogao lakse da proverim sta radim.
PS To sam uglavnom radio iz VB6 a samo jednom iz C#-a i tada nisam imao problema, ali problem je opsti, nije vezan samo za .net.
[ dejan85 @ 26.01.2009. 13:50 ] @
Mozda gresim u nacinu kako povecavam stek. Do sad sam isao na Linker->System i menjam Reserve size: 16000000 i commit size: 160000. Sad sam citao da treba da se ubaci u .def fajl kako STACKSIZE, pa sam i to uradio ali opet puca. Osim toga, ne znam da li onda i u c#-u treba da povecam velicinu steka, jer odatle pozivam program, ili dll "ima poseban stek".
Znam da konverzije prave problem, pazio sam na njih, ali za test sam napravio funkciju koja nema argumente i koja ne vraca nista (podesio sam parametre u funkciji) i napravio praznu c# aplikaciju koja samo poziva jednom tu funkciju iz c koda i tu puca na steck owerflow, a kada tu istu fukciju izvrsim iz c/c++ consolne aplikacije ona se izvrsi. To je ono sto pravi problem, a ne da li je krpljenje ili ne.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.