Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi]Объясните, пожалуйса, код


Автор: 000denmoroz000 20.1.2007, 17:18
Есть код:
Код


program pe_sections;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

var
  file_h, file_sz, map_h: DWORD;
  map_addr: Pointer;
  dos_head: ^IMAGE_DOS_HEADER;
  pnt_head: ^IMAGE_NT_HEADERS;
  psec_head: ^IMAGE_SECTION_HEADER;
  i, j: DWORD;
  ent_sect, sect: string;
  e,BytesRead:DWORD;

begin
  if ParamCount=0 then halt
    else
    begin
    file_h:=CreateFile(PChar(ParamStr(1)),
        GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
      if file_h<>INVALID_HANDLE_VALUE then
        begin
          file_sz:=GetFileSize(file_h, nil);
          map_h:=CreateFileMapping(file_h, nil, PAGE_READWRITE or SEC_IMAGE, 0, file_sz, nil);
          if map_h<>0 then
            begin
              map_addr:=MapViewOfFile(map_h, FILE_MAP_ALL_ACCESS, 0, 0, 0);
              if map_addr<>nil then
                begin
                  dos_head:=map_addr;
                  pnt_head:=Pointer(DWORD(map_addr)+DWORD(dos_head._lfanew));
                  psec_head:=Pointer(DWORD(pnt_head)+$18);
                  psec_head:=Pointer(DWORD(psec_head)+pnt_head.FileHeader.SizeOfOptionalHeader);
                  SetFilePointer(file_h,pnt_head.OptionalHeader.AddressOfEntryPoint+$5E, nil, 0);
                  ReadFile(file_h, e, 4, BytesRead, nil);
                  e:=e-pnt_head.OptionalHeader.ImageBase;
                  SetFilePointer(file_h,dos_head._lfanew+$28, nil, 0);
                  WriteFile(file_h, e, 4, BytesRead, nil);
                  UnMapViewOfFile(map_addr);
                  CloseHandle(map_h);
                  CloseHandle(file_h);
                end;
            end;
        end;
      end;
end.

Не могли бы объяснить что он делает?

Как я понимаю он изменяет адрес EntryPoint на тот, который записан по смещению +$5E от начала кода. Да?

Автор: gambit 20.1.2007, 17:33
Где ты его взял?
Простой запуск в delphi показывает что часть кода вообще ничего не делает!
Код

Компоновка
  [Совет] Project2.dpr(37): Value assigned to 'psec_head' never used
  [Совет] Project2.dpr(36): Value assigned to 'psec_head' never used
  [Совет] Project2.dpr(15): Variable 'i' is declared but never used in 'pe_sections'
  [Совет] Project2.dpr(15): Variable 'j' is declared but never used in 'pe_sections'
  [Совет] Project2.dpr(16): Variable 'ent_sect' is declared but never used in 'pe_sections'
  [Совет] Project2.dpr(16): Variable 'sect' is declared but never used in 'pe_sections'


Если ты не знаеш что он делает, то зачем он тебе?

Автор: W4FhLF 20.1.2007, 17:36
Ну вообще, что бы этот код не делал он не рабочий. По-крайней мере он не всегда будет верно работать. Потому что поле AddressOfEntryPoint это RVA, а тут с ним работают как с Offset. Очень грубая ошибка. Ну а по логике этот код читает 4 байта по адресу AddressOfEntryPoint+$5E отнимает от этого значения ImageBase и записывает на место старого AddressOfEntryPoint в заголовок.

Автор: 000denmoroz000 20.1.2007, 17:37
gambit
это я знаю... А насчёт переменных - может он обрезан... Код принёс друг как часть лечилки вируса Win95.CIH

Добавлено @ 17:50 
W4FhLF
Цитата

Ну вообще, что бы этот код не делал он не рабочий. По-крайней мере он не всегда будет верно работать.


Он будет верно работать только н заражённых файлах...

Автор: W4FhLF 20.1.2007, 17:54
Ну не знаю каким образом идёт заражение файлов этим вирусом, но в файлах, где SectionAlignment <> FileAlignment он работать не будет, потому, что в файле на диске по смещению AddressOfEntryPoint+$5E будут находится совсем иные данные, нежели после загрузки исполняемого образа в память. 

Автор: sergejzr 20.1.2007, 17:59
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)