| Посл.ответ | 
Сообщение | 
 Ранг: 218.5 (наставник), 2thx Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 18 января 2007 20:12   · Личное сообщение ·  #1 
Нужно слегка увеличить размер секции (кода) в файле (в пределах Virtual-размера). Какая прога это может?
   | Сообщение посчитали полезным:  | 
 | 
 Ранг: 218.5 (наставник), 2thx Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 20 июля 2007 03:18   · Личное сообщение ·  #2  | 
 Ранг: 162.2 (ветеран) Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 20 июля 2007 05:16   · Личное сообщение ·  #3 
0xy
У тебя 3-х гиговое узерское АП? Ты писать пытаешься за 0x80000000, хотя олька видит что там. Для какого размера ты пытаешься вызвать VirtualProtect ? Что говорит GetLastError?
   | Сообщение посчитали полезным:   | 
 Ранг: 218.5 (наставник), 2thx Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 20 июля 2007 19:10   · Личное сообщение ·  #4 
asd пишет:
 Что говорит GetLastError? 
57h
 Вот код: 
 004010DC  |> \6A 00         PUSH 0                                   ; /hTemplateFile = NULL
 004010DE  |.  6A 00         PUSH 0                                   ; |Attributes = 0
 004010E0  |.  6A 03         PUSH 3                                   ; |Mode = OPEN_EXISTING
 004010E2  |.  6A 00         PUSH 0                                   ; |pSecurity = NULL
 004010E4  |.  6A 01         PUSH 1                                   ; |ShareMode = FILE_SHARE_READ
 004010E6  |.  68 00000080   PUSH 80000000                            ; |Access = GENERIC_READ
 004010EB  |.  68 60554000   PUSH SHEETER.00405560                    ; |FileName = "c:\temp\rb\zet8-100u.exe.bak"
 004010F0  |.  FF15 1C404000 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA
 004010F6  |.  8BF0          MOV ESI,EAX
 004010F8  |.  83FE FF       CMP ESI,-1
 004010FB  |.  75 13         JNZ SHORT SHEETER.00401110
 004010FD  |.  68 A4504000   PUSH SHEETER.004050A4                    ;  ASCII "Cannot open file!"
 00401102  |.  E8 F9FEFFFF   CALL SHEETER.00401000
 00401107  |.  83C4 04       ADD ESP,4
 0040110A  |.  5F            POP EDI
 0040110B  |.  5E            POP ESI
 0040110C  |.  5D            POP EBP
 0040110D  |.  5B            POP EBX
 0040110E  |.  59            POP ECX
 0040110F  |.  C3            RET
 00401110  |>  6A 00         PUSH 0                                   ; /MapName = NULL
 00401112  |.  6A 00         PUSH 0                                   ; |MaximumSizeLow = 0
 00401114  |.  6A 00         PUSH 0                                   ; |MaximumSizeHigh = 0
 00401116  |.  68 02000001   PUSH 1000002                             ; |Protection = PAGE_READONLY|SEC_IMAGE
 0040111B  |.  6A 00         PUSH 0                                   ; |pSecurity = NULL
 0040111D  |.  56            PUSH ESI                                 ; |hFile = 00000048
 0040111E  |.  FF15 18404000 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileMappingA
 00401124  |.  8B3D 14404000 MOV EDI,DWORD PTR DS:[<&KERNEL32.CloseHa>
 0040112A  |.  56            PUSH ESI                                 ; /hObject = 00000048
 0040112B  |.  8BE8          MOV EBP,EAX                              ; |
 0040112D  |.  FFD7          CALL EDI                                 ; \CloseHandle
 0040112F  |.  85ED          TEST EBP,EBP
 00401131  |.  75 13         JNZ SHORT SHEETER.00401146
 00401133  |.  68 8C504000   PUSH SHEETER.0040508C                    ;  ASCII "Cannot create mapping!"
 00401138  |.  E8 C3FEFFFF   CALL SHEETER.00401000
 0040113D  |.  83C4 04       ADD ESP,4
 00401140  |.  5F            POP EDI
 00401141  |.  5E            POP ESI
 00401142  |.  5D            POP EBP
 00401143  |.  5B            POP EBX
 00401144  |.  59            POP ECX
 00401145  |.  C3            RET
 00401146  |>  6A 00         PUSH 0                                   ; /MapSize = 0
 00401148  |.  6A 00         PUSH 0                                   ; |OffsetLow = 0
 0040114A  |.  6A 00         PUSH 0                                   ; |OffsetHigh = 0
 0040114C  |.  6A 04         PUSH 4                                   ; |AccessMode = FILE_MAP_READ
 0040114E  |.  55            PUSH EBP                                 ; |hMapObject = 00000058
 0040114F  |.  FF15 10404000 CALL DWORD PTR DS:[<&KERNEL32.MapViewOfF>; \MapViewOfFile
 00401155  |.  8BF0          MOV ESI,EAX
 00401157  |.  85F6          TEST ESI,ESI
 00401159  |.  75 16         JNZ SHORT SHEETER.00401171
 0040115B  |.  68 74504000   PUSH SHEETER.00405074                    ;  ASCII "Cannot create map view!"
 00401160  |.  E8 9BFEFFFF   CALL SHEETER.00401000
 00401165  |.  83C4 04       ADD ESP,4
 00401168  |.  55            PUSH EBP
 00401169  |.  FFD7          CALL EDI
 0040116B  |.  5F            POP EDI
 0040116C  |.  5E            POP ESI
 0040116D  |.  5D            POP EBP
 0040116E  |.  5B            POP EBX
 0040116F  |.  59            POP ECX
 00401170  |.  C3            RET
 00401171  |>  8B46 3C       MOV EAX,DWORD PTR DS:[ESI+3C]
 00401174  |.  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]
 00401178  |.  51            PUSH ECX                                 ; /pOldProtect = 0063FAB0
 00401179  |.  6A 04         PUSH 4                                   ; |NewProtect = PAGE_READWRITE
 0040117B  |.  8B7C30 50     MOV EDI,DWORD PTR DS:[EAX+ESI+50]        ; |
 0040117F  |.  57            PUSH EDI                                 ; |Size = 5A6000 (5922816.)
 00401180  |.  56            PUSH ESI                                 ; |Address = 83F00000
 00401181  |.  FF15 0C404000 CALL DWORD PTR DS:[<&KERNEL32.VirtualPro>; \VirtualProtect
 
Размер региона также не изменяется:
 
 Memory map, item 292
  Address=83F00000
  Size=003A0000 (3801088.)
  Owner=         83F00000 (itself)
  Section=
  Type=Priv 00021002
  Access=R
  Initial access=
 
Но проблема вызвана не ресайзом, а именно попыткой открыть даступ на запись.
 ЗЫ
 Всё это под Win 9x, само собой!
  | Сообщение посчитали полезным:   | 
 Ранг: 162.2 (ветеран) Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 20 июля 2007 19:17 · Поправил: asd   · Личное сообщение ·  #5 
0xy
в MSDN в пояснении написано
 Windows Me/98/95:  You cannot use VirtualProtect on any memory region located in the shared virtual address space (from 0x80000000 through 0xBFFFFFFF).
 К томуже так
 8B7C30 50 MOV EDI,DWORD PTR DS:[EAX+ESI+50] ; | 
 0040117F |. 57 PUSH EDI ; |Size = 5A6000 (5922816.) 
 00401180 |. 56 PUSH ESI ; |Address = 83F00000
 не получится сделать даже для образа загруженного в нормальное место. На сколько помню  SEC_IMAGE ставит атрибуты такие, какие они заданы в заголовках секций. Поэтому нельзя обращаться к этой памяти как к единому региону, что ты и пытаешься сделать.
   | Сообщение посчитали полезным:   | 
 Ранг: 218.5 (наставник), 2thx Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 20 июля 2007 20:34   · Личное сообщение ·  #6 
asd пишет:
 На сколько помню SEC_IMAGE ставит атрибуты такие, какие они заданы в заголовках секций.  
Чет не похоже: в файле ВСЕ секции Writeable (C0000040), а регион этот получается ReadOnly.
 К тому же, под NT вроде всё работает.
 PS
 А код не мой, а из тулзы HoBleen
 И проблема в том, что прога дальше пишит в этот регион. И нужно как-то открыть доступ на запись.
 Может, это можно сделать СРАЗУ, подобрав правильные атрибуты CreateFileMappingA/MapViewOfFile?
 Хотя ведь и ресайз региона не пройдет...   
  | Сообщение посчитали полезным:   | 
 Ранг: 162.2 (ветеран) Активность: 0.09↘0 Статус: Участник 
 
 | 
Создано: 20 июля 2007 21:20 · Поправил: asd   · Личное сообщение ·  #7 
0xy
читай уже мсдн, прежде чем использовать код  
SEC_IMAGE Sets the file that is specified to be an executable image file. 
 Because the mapping information and file protection are taken from the image file, no other attributes are valid with SEC_IMAGE.
 Windows Me/98/95:  This flag is not supported.
ps Если задача всё таже - растянуть секции, то об этом флаге можешь забыть и под nt. Чтобы править образ надо мапить его обычным образом.
   | Сообщение посчитали полезным:   | 
  Ранг: 240.5 (наставник) Активность: 0.19↘0 Статус: Участник Author of ACKiller  
 
 | 
Создано: 21 июля 2007 07:37   · Личное сообщение ·  #8 
0xy
Ээ.. давно писал, исходников не осталось, влом еще раз набивать   
Ну ты сам напиши - читаешь всесь файл, разбераешь таблицу секций и по ним проецируй все секции. У тебя должен получиться образ РЕшника в памяти. Потом в таблице секций заменяй raw offset значения значениями virtual offset и сохраняй весь образ. Всё! Ничего сложного. Заодно подучишь формат РЕ   
Насчет exception'a - я делал так: проецировал системой, через CreateFileMapping с флагом SEC_IMAGE, изменял атрибуты сеций в таблице секций и сохранял образ. VirtualProtect нужен был для того, чтобы не заморачиваться с пересохранением образа - если его открыть как writeable, то все изменения, естейственно, сохраняться, а мне в оригинальном файле это не нужно. Если эта фича не поддерживается в 9х, то надо делать то же самое вручную.
   | Сообщение посчитали полезным:   |