purebasic.info

PureBasic forum
Текущее время: Сб ноя 18, 2017 6:37 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 08, 2012 5:05 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
SergeyA писал(а):
пробовал PackMemory, но тогда не могу использовать UnpackMemory
Почему не можешь использовать?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 08, 2012 5:14 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Ну например с помощью PackMemory я сжимаю содержимое в области памяти, далее записываю результат в секцию, на этом всё, процесс завершается, после я запускаю тот EXE в котором находится эта секция, считываю в память содержимое секции а тут UnpakMemory начинает ругаться что не может получить доступ к памяти по адресу XXXXXXXX

Выглядит так:

Код:
1
2
3
4
5
6
7
8
9
10
 
...
 
FileSeek(0, *SECTION_HEADERS\ish[i]\VirtualSize) ; Прыгнул туда куда надо
SourceBuf = AllocateMemory(*SECTION_HEADERS\ish[i]\VirtualSize) ; Размер получил правильный
ReadData(0, SourceBuf, *SECTION_HEADERS\ish[i]\VirtualSize) ; Считал всё правильно
DestBuf = AllocateMemory(Здесь я не знаю размер) ; Не знаю как определить размер
UnpackMemory(SourceBuf, DestBuf) ; Постоянно ругается
...
 


_________________
https://www.instagram.com/sergey.afonichev/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 08, 2012 5:30 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
SergeyA писал(а):
Не знаю как определить размер.
Из своей проги вытащил.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure UnPak(*pak, *PacSize.Integer)
  Protected *Unpak_mem, RealSize
  *Unpak_mem = 0
  *PacSize\i = 0
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x86
    RealSize = PeekL(*pak+2)
  CompilerElse
    RealSize = PeekL(*pak+4)
  CompilerEndIf
  If RealSize>0 And RealSize<1000000
    *mem = AllocateMemory(RealSize)
    If *mem
      If UnpackMemory(*pak, *mem) = RealSize
        *Unpak_mem = *mem
        *PacSize\i = RealSize
      Else
        FreeMemory(*mem)
      EndIf
    EndIf
  EndIf
  ProcedureReturn *Unpak_mem
EndProcedure


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 08, 2012 5:52 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Не хочет.. если есть время и желание, попробуйте сами.

1. Скомпилируйте любой код, например с MessageRequester()
2. Запустите AddSection,
------1 - Файл который добавляем
------2 - Выберите только что скомпилированный exe

3. На выходе получите файл (имя) Prot.exe
4. Запустите ReadSection и UnpackMemory выведет ошибку


Вложения:
Pack.rar [2.3 KiB]
Скачиваний: 108
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 1:20 am 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Наконец то, сделал, обошёлся без PackMemory.

_________________
https://www.instagram.com/sergey.afonichev/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 12:46 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Есть у кого нибудь пример добавление иконки в EXE файл?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 3:30 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Сделал я что хотел, но файл работает только в той дериктории где он был создан, если копировать в другую то не работает, почему???

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
EnableExplicit
 
Structure IMAGE_SECTION_HEADER
  SecName.s{8}
  StructureUnion
    PhysicalAddr.l
    VirtualSize.l
  EndStructureUnion
  VirtualAddress.l
  SizeOfRawData.l
  PointerToRawData.l
  PointerToRelocations.l
  PointerToLinenumbers.l
  NumberOfRelocations.w
  NumberOfLinenumbers.w
  Characteristics.l
EndStructure
 
Structure IMAGE_SECTION_HEADERS
  ish.IMAGE_SECTION_HEADER[95]
EndStructure
 
Procedure RunPE(lBuff, parameters.s)
  Protected *idh.IMAGE_DOS_HEADER  = lBuff
  Protected *ish.IMAGE_SECTION_HEADERS
  Protected pi.PROCESS_INFORMATION
  Protected *inh.IMAGE_NT_HEADERS
  Protected si.STARTUPINFO
  Protected lpBaseAddres.l
  Protected Ctx.CONTEXT
  Protected Addr.l, Rets.l, i.l
  CreateProcess_(#NUL, ProgramFilename() + " " + parameters, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi)
  Ctx\ContextFlags = #CONTEXT_INTEGER
  If GetThreadContext_(pi\hThread, Ctx) = 0      : Goto EndThread : EndIf
  ReadProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @Addr, 4, #NUL)
  If ZwUnmapViewOfSection_(Pi\hProcess, Addr)    : Goto EndThread : EndIf
  If lBuff = 0                                   : Goto EndThread : EndIf
  *inh = lBuff + *idh\e_lfanew
  lpBaseAddres = VirtualAllocEx_(pi\hProcess, *inh\OptionalHeader\ImageBase, *inh\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
  WriteProcessMemory_(pi\hProcess, lpBaseAddres, lBuff, *inh\OptionalHeader\SizeOfHeaders, @Rets)
  *ish = *inh\OptionalHeader + *inh\FileHeader\SizeOfOptionalHeader
  For i = 0 To *inh\FileHeader\NumberOfSections - 1
    WriteProcessMemory_(pi\hProcess, lpBaseAddres + *ish\ish[i]\VirtualAddress, lBuff + *ish\ish[i]\PointerToRawData, *ish\ish[i]\SizeOfRawData, @Rets)
  Next
  WriteProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @lpBaseAddres, 4, #NUL)
  Ctx\Eax = lpBaseAddres + *inh\OptionalHeader\AddressOfEntryPoint
  SetThreadContext_(pi\hThread, Ctx)
  ResumeThread_(pi\hThread)
  ProcedureReturn
  EndThread:
 TerminateProcess_(pi\hProcess, #NUL)
  CloseHandle_(pi\hThread)
  CloseHandle_(pi\hProcess)
EndProcedure
 
Procedure XOrByte(sText.l, TextLen.l, Key.b)
  MOV ecx, TextLen
  MOV esi, sText
  MOV edi, sText
  CLD
  Cipher:
 !lodsb
  XOR al, Key
  !stosb
  LOOP l_cipher
EndProcedure
 
Procedure ReadSection(File.s)
 
  Protected *DOS_HEADER.IMAGE_DOS_HEADER              
  Protected *NT_HEADERS.IMAGE_NT_HEADERS
  Protected *SECTION_HEADERS.IMAGE_SECTION_HEADERS
  Protected i.i, Size.l, MainBuffer, OutBuffer
 
  Size.l = FileSize(File)
  Size   = Size  & $FFFFF000
  MainBuffer = AllocateMemory(Size)
  If ReadFile(0, File)
    ReadData(0, MainBuffer, Size)
    *DOS_HEADER = MainBuffer
    *NT_HEADERS = MainBuffer + *DOS_HEADER\e_lfanew
    *SECTION_HEADERS = *NT_HEADERS\OptionalHeader + *NT_HEADERS\FileHeader\SizeOfOptionalHeader
    If *DOS_HEADER\e_magic = $5A4D And *NT_HEADERS\Signature = $4550
      For i = 1 To *NT_HEADERS\FileHeader\NumberOfSections - 1
        If *SECTION_HEADERS\ish[i]\SecName = ".pak"
          Break
        EndIf
      Next i
      FileSeek(0, *SECTION_HEADERS\ish[i]\PointerToRawData)
      OutBuffer = AllocateMemory(*SECTION_HEADERS\ish[i]\VirtualSize)
      ReadData(0, OutBuffer, *SECTION_HEADERS\ish[i]\VirtualSize)
      XOrByte(OutBuffer, *SECTION_HEADERS\ish[i]\VirtualSize, 01)
      FreeMemory(MainBuffer)
      CloseFile(0)
      PokeB(OutBuffer, $4d)
      PokeB(OutBuffer + 1, $5a)
      PokeB(OutBuffer + 2, $90)
      PokeB(OutBuffer + 3, $00)
      PokeB(OutBuffer + 4, $03)
      PokeB(OutBuffer + 5, $00)
      ProcedureReturn OutBuffer
    EndIf  
  EndIf
  ProcedureReturn 0
EndProcedure  
 
Global FilePath.s, FileBuffer
FilePath = ProgramFilename()
FileBuffer = ReadSection(FilePath)
RunPE(FileBuffer, "")
FreeMemory(FileBuffer)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 3:41 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
Антивирусам не понравилась твоя прога. https://www.virustotal.com/file/82e9408 ... 344515961/

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 3:42 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Да плевать на них, я не вирус пишу, почему в других дериктория не запускается??

_________________
https://www.instagram.com/sergey.afonichev/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 3:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
Должно запускаться.
Попробуй наставить в коде MessageRequester'ров в местах где могут возникать ошибки, так и найдешь в чем причина.

PS.
Кстати хорошая идея по поводу создания упаковщика.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 4:06 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Идея то хорошая... если бы ещё разбираться в PE файлах :D

_________________
https://www.instagram.com/sergey.afonichev/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 09, 2012 6:49 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
SergeyA писал(а):
Есть у кого нибудь пример добавление иконки в EXE файл?

http://forums.purebasic.com/english/vie ... 0a1f9b765f
SergeyA писал(а):
если бы ещё разбираться в PE файлах

Дык покури PE-формат, литературы в инете море

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 10, 2012 3:45 am 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Нашёл в чём причина,если я шифрую данные находящиеся в буфере при добавлении секции, то не работает, если без шифрования... добавляю как есть, то всё нормально работает в любом месте жёсткого диска, не справедливость какая - то....

_________________
https://www.instagram.com/sergey.afonichev/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 12, 2012 12:38 am 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 733
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Всё о том же... добавляю в секцию PE файла exe файл, как изменить точку входа? чтоб сначала выполнилась моя секция которая будет производить действие над оригинальными секциями?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 
#DOS_SIGNATURE = $5A4D
#NT_SIGNATURE  = $4550
 
Structure IMAGE_SECTION_HEADER
  SecName.s{8}
  StructureUnion
    PhysicalAddr.l
    VirtualSize.l
  EndStructureUnion
  VirtualAddress.l
  SizeOfRawData.l
  PointerToRawData.l
  PointerToRelocations.l
  PointerToLinenumbers.l
  NumberOfRelocations.w
  NumberOfLinenumbers.w
  Characteristics.l
EndStructure
 
Structure IMAGE_SECTION_HEADERS
  ish.IMAGE_SECTION_HEADER[64]
EndStructure
 
*DOS_HEADER.IMAGE_DOS_HEADER              
 *NT_HEADERS.IMAGE_NT_HEADERS
 *SECTION_HEADERS.IMAGE_SECTION_HEADERS
 *NewSecEntry.IMAGE_SECTION_HEADER
 Buf.l
 BytesRead.l
 
InFile.s = OpenFileRequester("In File", "", "PE File|*.exe", 0)
OutFile.s = OpenFileRequester("Out File", "", "PE File|*.exe", 0)
If OpenFile(0, InFile.s)
  Size = FileSize(InFile)
  Buffer = AllocateMemory(Size)
  ReadData(0, Buffer, Size)
  CloseFile(0)
EndIf  
 
If OutFile
   If OpenFile(0, OutFile)  
       FileSize.l = FileSize(OutFile)
       FileSize   = FileSize & $fffff000 + Size    
       BufAdr     = AllocateMemory(FileSize + Size)
     If ReadFile(0, OutFile)
           ReadData(0, BufAdr, FileSize)
           CloseFile(0)  
           *DOS_HEADER = BufAdr
           *NT_HEADERS = BufAdr + *DOS_HEADER\e_lfanew
           *SECTION_HEADERS = *NT_HEADERS\OptionalHeader + *NT_HEADERS\FileHeader\SizeOfOptionalHeader
        If *DOS_HEADER\e_magic = #DOS_SIGNATURE And *NT_HEADERS\Signature = #NT_SIGNATURE
           MaxRVA.l = *SECTION_HEADERS\ish[0]\VirtualAddress
           MaxRVAIndex.l = 0
           For i = 1 To *NT_HEADERS\FileHeader\NumberOfSections - 1
              If *SECTION_HEADERS\ish[i]\VirtualAddress > MaxRVA  
                 MaxRVA = *SECTION_HEADERS\ish[i]\VirtualAddress
                 MaxRVAIndex = i
              EndIf      
           Next i
           *NewSecEntry = *SECTION_HEADERS\ish[*NT_HEADERS\FileHeader\NumberOfSections]
           FillMemory(*NewSecEntry, SizeOf(IMAGE_SECTION_HEADER), 0, #PB_Byte)
           *NewSecEntry\SecName         = ".pak"
           *NewSecEntry\VirtualSize     = Size
           *NewSecEntry\SizeOfRawData   = Size
           *NewSecEntry\Characteristics = $60000020
           If (MaxRVA + *SECTION_HEADERS\ish[MaxRVAIndex]\VirtualSize) & $00000fff > 0
               *NewSecEntry\VirtualAddress = (MaxRVA + *SECTION_HEADERS\ish[MaxRVAIndex]\VirtualSize) & $fffff000 + *NT_HEADERS\OptionalHeader\SectionAlignment
           Else
               *NewSecEntry\VirtualAddress = MaxRVA + *SECTION_HEADERS\ish[MaxRVAIndex]\VirtualSize
           EndIf
           If Size & $00000fff > 0
               *NT_HEADERS\OptionalHeader\SizeOfImage = (*NewSecEntry\VirtualAddress + Size) &  $fffff000 + *NT_HEADERS\OptionalHeader\SectionAlignment
           Else
               *NT_HEADERS\OptionalHeader\SizeOfImage = *NewSecEntry\VirtualAddress + Size
           EndIf              
           *NewSecEntry\PointerToRawData = *SECTION_HEADERS\ish[*NT_HEADERS\FileHeader\NumberOfSections-1]\PointerToRawData + *SECTION_HEADERS\ish[*NT_HEADERS\FileHeader\NumberOfSections-1]\SizeOfRawData
           *NT_HEADERS\FileHeader\NumberOfSections + 1
           OldEP = *NT_HEADERS\OptionalHeader\AddressOfEntryPoint + *NT_HEADERS\OptionalHeader\ImageBase
           *NT_HEADERS\OptionalHeader\AddressOfEntryPoint = *NewSecEntry\VirtualAddress
           If *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]\VirtualAddress <> 0
                *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]\VirtualAddress = 0
                *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]\Size = 0          
           EndIf
           If CreateFile(0, Left(InFile, Len(InFile) - 4) + " Pro.exe")
                FileSeek(0, 0)
                WriteData(0, BufAdr, *NewSecEntry\PointerToRawData + *NewSecEntry\SizeOfRawData)
                FileSeek(0, *SECTION_HEADERS\ish[MaxRVAIndex + 1]\PointerToRawData)
                WriteData(0, Buffer, Size)
                FileSeek(0, *NewSecEntry\PointerToRawData)
                WriteByte(0, $68)
                WriteLong(0, OldEP)
                WriteByte(0, $0C3)
                CloseFile(0)
           EndIf  
           FreeMemory(Buffer)    
           FreeMemory(BufAdr)
        Else
           MessageRequester("Ахтунг", "No valid PE File", #MB_OK|#MB_ICONWARNING)
        EndIf  
     EndIf
   Else    
        MessageRequester("Ахтунг", "Can't open file" + Chr(10) + "Possible file is occupied other program.", #MB_OK|#MB_ICONWARNING)
   EndIf
EndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 12, 2012 2:10 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
SergeyA писал(а):
как изменить точку входа?

Чем это не устраивает
Код:
1
2
  OldEP = *NT_HEADERS\OptionalHeader\AddressOfEntryPoint   ; запоминаем старую EP 
  *NT_HEADERS\OptionalHeader\AddressOfEntryPoint = *NewSecEntry\VirtualAddress ; Меняем точку входа на начало новой секции


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB