Копирование через WriteFile, CreateFile

Тема в разделе "WASM.BEGINNERS", создана пользователем kas, 10 мар 2006.

  1. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    Как скопировать файл через через WriteFile, CreateFile?

    Надо открыть самого себя прочитать все и сохранить..

    Проблемы в прочтении всего кода файла.

    Помогите плз.
     
  2. ARMICRON

    ARMICRON New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    41
    Попробуй лучше функцию

    BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSR lpNewFileName, BOOL bFailIfExists)

    lpExistingFileName-ASCII-строка путь до файла(D:\1.txt)

    lpNewFileName-ASCII-строка файл-приемник, которого может и не существовать

    bFailIfExists-параметр 0 или 1

    0-при наличии файла он переззписывается

    1-при наличии файла копирование не производится

    ЗЫ купи книгу или смотри справочник Win32 Api
     
  3. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    не то..

    мне надо именно WriteFile, CreateFile!
     
  4. ARMICRON

    ARMICRON New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    41
    kas

    Тогда приаттачь программу.

    ЗЫ Ошибку без кода найти трудно :)
     
  5. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102


    я КАК ПОНИМАЮ, тебе просто нужно скопировать свою прогу в другой файл?

    Если да, см. код.

    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 и не забудь всё освободить потом.
     
  6. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    ок! спасибо

    Ну вот например есть файл. + в конце его записан еще файл

    Как этот файл прочитать и загрузить в память?
     
  7. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102
    Так, как я сказал.

    Я понял что ты пишешь. Я уже писал это.

    Склеиватель PE файлов?

    Как столкнёшься с проблемой замены иконки, обратись ко мне.
     
  8. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    ну вот написал на примере..

    Почему то не работает.. в чем ошибка?

    Кстати.. в дебагере я заметил то что после



    mov hFile,eax затерает строку путь к файлу (ModN)



    Я новичек ошибок наверное много :)


    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include ..\inc\windows.inc
    6. include ..\inc\user32.inc
    7. include ..\inc\kernel32.inc
    8. includelib ..\lib\user32.lib
    9. includelib ..\lib\kernel32.lib
    10.  
    11. .data
    12. Target db "aaa.exe",0
    13. .data?
    14.  
    15. shit DWORD ?
    16. ModN db ?
    17.  
    18. size1 dd ?
    19. pMem dd ?
    20.  
    21. hFile HANDLE ?
    22. hFile2 HANDLE ?
    23.  
    24. .code
    25. start:
    26.  
    27. invoke GetModuleFileName, NULL, addr ModN, 512d
    28.  
    29. invoke CreateFile,addr ModN,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    30. mov hFile,eax
    31.  
    32. invoke  CreateFile,addr Target, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, 0
    33. mov hFile2,eax
    34.  
    35. invoke GetFileSize, addr hFile, NULL
    36. mov size1,eax
    37. invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax
    38. invoke GlobalLock, eax
    39. mov pMem,eax
    40. invoke ReadFile, addr hFile, eax,addr size1, addr shit, NULL
    41. invoke WriteFile,addr hFile2,addr pMem,addr size1,addr shit, NULL
    42.  
    43. invoke  CloseHandle, addr hFile
    44. invoke  CloseHandle, addr hFile2
    45.  
    46. invoke ExitProcess, 0
    47. end start
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    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):
    1.   invoke GlobalAlloc,GMEM_FIXED,eax
    2.   mov pMem,eax
    3.   ...
    4.   invoke GlobalFree,pMem ;не забывай освобождать (хотя перед ExitProcess это не обязательно)
    5.   ...
     
  10. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    спасибо работает :)
     
  11. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    у меня новая проблема.. )

    как зашифровать обычным inc,dec?

    Ну как я понял нужно узнать размер файла. и шифровать каждый байт. Как можно это написать?

    Шифровать как понял надо pMem

    Размер нам известен size1
     
  12. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102


    Встречный вопрос: Зачем?

    Ну если хочется.

    ebx-начало, от куда шифровать:)

    @1:

    inc BYTE ptr[ebx]

    inc ebx

    jmp @1
     
  13. kas

    kas New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    12
    mov ebx,size1

    @1:

    inc BYTE ptr[pMem]

    inc ebx

    jnz @1



    делаю вот так прально?
     
  14. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102


    Ну да, только это бесконечный цикл, а тебе нужно условие выхода из него.



    А при чём здесь размер? Размер можно использовать в качестве условия выхода, а в ebx нужно положить УКАЗАТЕЛЬ НА ДАННЫЕ.

    Хотя, можно вот так:

    mov ebx,pMem

    add ebx,size1

    @1:

    inc BYTE ptr[ebx]

    dec ebx

    cmp ebx,pMem

    jnz @1



    Тоесть тоже самое но в обратную сторону.