purebasic.info

PureBasic forum
Текущее время: Сб сен 23, 2017 2:10 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Добавление новой секции в PE файл
СообщениеДобавлено: Вт мар 13, 2012 8:56 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 368
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
SergeyA, практика :wink:
Вот кодес, и не мучай больше людей. Работает не на всех прогах (на упакованных, ясен пень, ну и на всяких хитрожопых, это ты уж сам код дописывай), но на простеньких на пурике пашет.
Код:
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
114
115
116
117
118
Structure IMAGE_SECTION_HEADER
  Name.s{8}
  VirtualSize.i
  VirtualAddress.i
  SizeOfRawData.i
  PointerToRawData.i
  PointerToRelocations.i
  PointerToLineNumbers.i
  NumberOfRelocations.w
  NumberOfLineNumbers.w
  Characteristics.i
EndStructure
 
 
 
file.s = OpenFileRequester("", "", "EXE,DLL files|*.exe;*.dll|All files|*.*", 0)
If Not file
  End
EndIf
 
If Not ReadFile(0, file)
  MessageRequester("", "Can`t read file:" + #CR$ + file, #MB_ICONERROR)
  End
EndIf
 
 
fileSize = Lof(0)
If fileSize = 0
  MessageRequester("", "File is empty", #MB_ICONERROR)
  End
EndIf
 
*File = AllocateMemory(fileSize)
 
ReadData(0, *File, fileSize)
CloseFile(0)
*idh.IMAGE_DOS_HEADER = *File
*inh.IMAGE_NT_HEADERS = *File + *idh\e_lfanew
 
 
If *inh\Signature <> $4550
  MessageRequester("", "Not valid PE header", #MB_ICONERROR)
  End
EndIf
 
 
; перечисляем все секции и определяем фдреса для нашей секции
myPointerToRawData = 0
myVirtualAddress = 0
 
;Debug *inh\FileHeader\SizeOfOptionalHeader
 
*pish = *inh + SizeOf(IMAGE_FILE_HEADER) + *inh\FileHeader\SizeOfOptionalHeader + 4
For i = 0 To (*inh\FileHeader\NumberOfSections - 1)
  *ish.IMAGE_SECTION_HEADER = *pish + (SizeOf(IMAGE_SECTION_HEADER) * i)
  PointerToRawData = *ish\PointerToRawData + *ish\SizeOfRawData
  VirtualAddress = *ish\VirtualAddress + (*ish\VirtualSize / $1000) * $1000 + $1000
  If PointerToRawData > myPointerToRawData
    myPointerToRawData = PointerToRawData
  EndIf
  If VirtualAddress > myVirtualAddress
    myVirtualAddress = VirtualAddress
  EndIf
;   Debug "RAW:"
;   Debug *ish\PointerToRawData
;   Debug *ish\SizeOfRawData
;   Debug "VIRT:"
;   Debug *ish\VirtualAddress
;   Debug *ish\VirtualSize
Next
 
; т.е. для добавления секции нужно инкрементить *inh\FileHeader\NumberOfSections
; и получить смещение на место для описания секции *ish.IMAGE_SECTION_HEADER = *pish + (SizeOf(IMAGE_SECTION_HEADER) * (*inh\FileHeader\NumberOfSections - 1))
; стоит сравнить это смещение с RWA первой секции (точнее нийти минимальный RWA из всех секций) должно быть свободно не менее SizeOf(IMAGE_SECTION_HEADER)
 
 
;добавляем секцию пока без проверок
 
#MySectVirtualSize = $100
 
 
 
*inh\FileHeader\NumberOfSections + 1
*ish.IMAGE_SECTION_HEADER = *pish + (SizeOf(IMAGE_SECTION_HEADER) * (*inh\FileHeader\NumberOfSections - 1))
*ish\Name = ".my_tst"
*ish\PointerToRawData = myPointerToRawData
*ish\SizeOfRawData = ?EndMyCode - ?MyCode
*ish\VirtualAddress = myVirtualAddress
*ish\VirtualSize = #MySectVirtualSize
*ish\Characteristics = $60000020
 
; меняем размер образа
*inh\OptionalHeader\SizeOfImage = myVirtualAddress + #MySectVirtualSize
 
; меняем точку входа
OldEntryPoint = *inh\OptionalHeader\AddressOfEntryPoint + *inh\OptionalHeader\ImageBase ; ! действителна для приложений с фиксированной базой образа
*inh\OptionalHeader\AddressOfEntryPoint = myVirtualAddress
 
 
If Not CreateFile(0, file + ".my.exe")
  MessageRequester("", "Can`t create file:" + #CR$ + file + ".my.exe", #MB_ICONERROR)
  End
EndIf
 
; особо не стал тут с созданием кода заморачиваться
WriteData(0, *File, fileSize)
WriteData(0, ?MyCode, ?EndMyCode - ?MyCode)
FileSeek(0, Lof(0) - 5)
WriteData(0, @OldEntryPoint, 4)
CloseFile(0)
 
End
 
; код вызова OEP
MyCode:
!push 0x401000
!RETN
EndMyCode:



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

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

Цитата:
Работает не на всех прогах

Это наверное из - за того что релоки править надо с помощью WINAPI SetFilePointer

Вообщее тема по работе с PE файлами очень интересная и познавательная.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 14, 2012 7:07 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
На нетлюксе куча сурсов инфекторов.

_________________
Materia Lucida


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

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

Изучать лучше тут

Код:
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
#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
 
 NewSectSize.l = $1500          ; размер добавляемой секции
 *DOS_HEADER.IMAGE_DOS_HEADER            
 *NT_HEADERS.IMAGE_NT_HEADERS
 *SECTION_HEADERS.IMAGE_SECTION_HEADERS
 *NewSecEntry.IMAGE_SECTION_HEADER
 Buf.l
 BytesRead.l
 
file.s = OpenFileRequester("Open PE file", "", "PEfiles|*.exe;*.dll|All files|*.*", 0)
If file
   If OpenFile(0, file)  
       FileSize.l = FileSize(file)
       FileSize   = FileSize & $fffff000 + NewSectSize    
       BufAdr     = AllocateMemory(FileSize + NewSectSize)
     If ReadFile(0, file)
           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 ; Если это PE файл
           ; Поиск максимального RVA
           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         = "new_sect"
           *NewSecEntry\VirtualSize     = NewSectSize
           *NewSecEntry\SizeOfRawData   = NewSectSize
           *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 NewSectSize & $00000fff > 0
               *NT_HEADERS\OptionalHeader\SizeOfImage = (*NewSecEntry\VirtualAddress + NewSectSize) &  $fffff000 + *NT_HEADERS\OptionalHeader\SectionAlignment
           Else
               *NT_HEADERS\OptionalHeader\SizeOfImage = *NewSecEntry\VirtualAddress + NewSectSize
           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   ;  Добавляем число секций
            ; меняем EP
           OldEP = *NT_HEADERS\OptionalHeader\AddressOfEntryPoint   ; запоминаем старую EP
           *NT_HEADERS\OptionalHeader\AddressOfEntryPoint = *NewSecEntry\VirtualAddress
           ; Затираем bound import если он есть
           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, file + ".exe")
                FileSeek(0, 0)
                WriteData(0, BufAdr, *NewSecEntry\PointerToRawData + *NewSecEntry\SizeOfRawData)
            ;    Устанавливаем пойнтер на офсет начала новой секции и записываем нужные инструкции
                FileSeek(0, *SECTION_HEADERS\ish[MaxRVAIndex + 1]\PointerToRawData)
                For i = 0 To 20
                   WriteByte(0, $90)
                Next i
                WriteByte(0, $68)    ; Прыгаем на родную EP
                WriteLong(0, OldEP + *NT_HEADERS\OptionalHeader\ImageBase)
                WriteByte(0, $0C3)
                CloseFile(0)
           EndIf  
           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


SergeyA писал(а):
Это наверное из - за того что релоки править надо

Не, не из за этого. У exe-файлов вапще нет релоков
Поправочка, EXE файлы х64 имеют таки релоки

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


Последний раз редактировалось pablov Пн окт 19, 2015 7:02 pm, всего редактировалось 2 раз(а).

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

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

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


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

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

Че-че?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 18, 2012 11:56 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
pablov
Что чё. Это называется у малварщиков инфектом. Сурсов тыщи милёны. Есть сложные - морф, пермутация етц.

_________________
Materia Lucida


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

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

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


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

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
pablov
Пожалусто, выбирите сами что вам нужно:

http://vx.netlux.org/
http://www.kernelmode.info/forum/index.php

_________________
Materia Lucida


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

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

Код:
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
 
#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         = ".lock"
           *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\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, OutFile + ".exe")
                FileSeek(0, 0)
                WriteData(0, BufAdr, *NewSecEntry\PointerToRawData + *NewSecEntry\SizeOfRawData)
                FileSeek(0, *SECTION_HEADERS\ish[MaxRVAIndex + 1]\PointerToRawData)
                WriteData(0, Buffer, Size) ; Здесь добавляю секцию которая при запуске должна выполнится
                CloseFile(0)
           EndIf  
           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
 
 



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

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

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


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

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

Смотря окуда хочешь читать. Если из бинарника с диска, используй PointerToRawData (offset) твоей секции, а если из памяти запущенного exe, тогда VirtualAddress твоей секции

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


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

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

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


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

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

И как зашифровать данные в памяти чтоб exe лежал в секции не в первоначальном виде, пробовал PackMemory, но тогда не могу использовать UnpackMemory

Код:
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\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) + " Protect.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, *SECTION_HEADERS\ish[MaxRVAIndex + 1]\PointerToRawData)
                WriteByte(0, $68)
                WriteLong(0, OldEP + *NT_HEADERS\OptionalHeader\ImageBase)
                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
 



Этот код будет извлекать из своих ресурсов заранее приготовленный EXE (Stub) и добавлять в него секцию, а в секцию будет записывать выбранный EXE файл, при запуске EXE (Stub) файла, он должен найти эту секцию, считать её (секцию) в буфер, расшифровать и запустить из памяти, секцию нашёл, данные из секции в буфер получил.


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

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 787
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Цитата:
Этот код будет извлекать из своих ресурсов заранее приготовленный EXE (Stub) и добавлять в него секцию, а в секцию будет записывать выбранный EXE файл, при запуске EXE (Stub) файла, он должен найти эту секцию, считать её (секцию) в буфер, расшифровать и запустить из памяти, секцию нашёл, данные из секции в буфер получил.

омг, как все это извращение применимо на практике? :D


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

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


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

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


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

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