Как скопировать файл через через WriteFile, CreateFile? Надо открыть самого себя прочитать все и сохранить.. Проблемы в прочтении всего кода файла. Помогите плз.
Попробуй лучше функцию BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSR lpNewFileName, BOOL bFailIfExists) lpExistingFileName-ASCII-строка путь до файла(D:\1.txt) lpNewFileName-ASCII-строка файл-приемник, которого может и не существовать bFailIfExists-параметр 0 или 1 0-при наличии файла он переззписывается 1-при наличии файла копирование не производится ЗЫ купи книгу или смотри справочник Win32 Api
я КАК ПОНИМАЮ, тебе просто нужно скопировать свою прогу в другой файл? Если да, см. код. invoke GetModuleFileName, NULL, addr ModN, 512d invoke CreateFile,addr ModN,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL mov hFile,eax invoke GetFileSize, hFile, NULL mov size1,eax invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax invoke GlobalLock, eax mov pMem,eax invoke ReadFile, hFile, eax, size1, addr shit, NULL invoke WriteFile,hFile2,pMem,size1,addr shit, NULL hFile2 - ХЕНДЛ файла, в который необходимо записать. shit - просто мусор(DWORD) Естественно, не забудь предварительно открыть hFile2 и не забудь всё освободить потом.
ок! спасибо Ну вот например есть файл. + в конце его записан еще файл Как этот файл прочитать и загрузить в память?
Так, как я сказал. Я понял что ты пишешь. Я уже писал это. Склеиватель PE файлов? Как столкнёшься с проблемой замены иконки, обратись ко мне.
ну вот написал на примере.. Почему то не работает.. в чем ошибка? Кстати.. в дебагере я заметил то что после mov hFile,eax затерает строку путь к файлу (ModN) Я новичек ошибок наверное много Код (Text): .386 .model flat,stdcall option casemap:none include ..\inc\windows.inc include ..\inc\user32.inc include ..\inc\kernel32.inc includelib ..\lib\user32.lib includelib ..\lib\kernel32.lib .data Target db "aaa.exe",0 .data? shit DWORD ? ModN db ? size1 dd ? pMem dd ? hFile HANDLE ? hFile2 HANDLE ? .code start: invoke GetModuleFileName, NULL, addr ModN, 512d invoke CreateFile,addr ModN,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL mov hFile,eax invoke CreateFile,addr Target, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, 0 mov hFile2,eax invoke GetFileSize, addr hFile, NULL mov size1,eax invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax invoke GlobalLock, eax mov pMem,eax invoke ReadFile, addr hFile, eax,addr size1, addr shit, NULL invoke WriteFile,addr hFile2,addr pMem,addr size1,addr shit, NULL invoke CloseHandle, addr hFile invoke CloseHandle, addr hFile2 invoke ExitProcess, 0 end start
kas 1) ModN db ? выделяет под строку всего 1 байт, нужно ModN db 512d dup(?) 2) addr нужно использовать только там, где нужно передать в функцию не значение переменной, а ее адрес, в твоем коде это только addr ModN и addr shit, остальные нужно убрать 3) CreateFile с флагом CREATE_NEW выдаст ошибку, если файл уже существует; если не хочешь возиться с проверками используй CREATE_ALWAYS 4) GlobalAlloc(GMEM_MOVEABLE..) это отстой. Используй GMEM_FIXED без всяких Lock\Unlock: Код (Text): invoke GlobalAlloc,GMEM_FIXED,eax mov pMem,eax ... invoke GlobalFree,pMem ;не забывай освобождать (хотя перед ExitProcess это не обязательно) ...
у меня новая проблема.. ) как зашифровать обычным inc,dec? Ну как я понял нужно узнать размер файла. и шифровать каждый байт. Как можно это написать? Шифровать как понял надо pMem Размер нам известен size1
Встречный вопрос: Зачем? Ну если хочется. ebx-начало, от куда шифровать @1: inc BYTE ptr[ebx] inc ebx jmp @1
Ну да, только это бесконечный цикл, а тебе нужно условие выхода из него. А при чём здесь размер? Размер можно использовать в качестве условия выхода, а в ebx нужно положить УКАЗАТЕЛЬ НА ДАННЫЕ. Хотя, можно вот так: mov ebx,pMem add ebx,size1 @1: inc BYTE ptr[ebx] dec ebx cmp ebx,pMem jnz @1 Тоесть тоже самое но в обратную сторону.