Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22

Перевод Си на Delphi. Что я делаю не так?

21.12.2013, 09:36. Показов 1482. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C
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
#include <windows.h> 
 
 struct _block{ 
 int Start; // size,data 
 int Stop; // first byte after data 
 int Code; // type of coding 1-XOR 0xFF 
 } CAr[]={{0x479,0x4DF,1}}; 
 int WriteEnable=0x1FF; // установка прав на запись в кодовую секцию 
 
 int main(void){ 
 HANDLE h=CreateFile("test.exe",GENERIC_WRITE | GENERIC_READ, 0, NULL, 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
 if(h==0) exit(-1); 
 int sz=GetFileSize(h,NULL); 
 if(sz==INVALID_FILE_SIZE) exit(-2); 
 BYTE *Buf=0; 
 Buf=new BYTE[sz]; 
 if(Buf==0) exit(-3); 
 DWORD br=0; 
 int ret=ReadFile(h,Buf,sz,&br,NULL); 
 if(ret==0) exit(-4); 
 if(br!=sz) exit(-5); 
 Buf[WriteEnable]=0xC0; 
 int bnum=sizeof(CAr)/sizeof(_block); 
 for(int n=0;n<bnum;n++){ 
 _block *bl=&CAr[n]; 
 int start=bl->Start+1; 
 int size=bl->Stop - start; 
 Buf[bl->Start]=size; 
 for(int i=0;i<size;i++){ 
 BYTE v=Buf[start+i]; 
 v^=0xFF; 
 Buf[start+i]=v; 
 } 
 } 
 ret=SetFilePointer(h,0,0,FILE_BEGIN); 
 if(ret==INVALID_SET_FILE_POINTER) exit(-6); 
 ret=WriteFile(h,Buf,sz,&br,NULL); 
 if(ret==0) exit(-7); 
 if(br!=sz) exit(-8); 
 CloseHandle(h); 
 return 0; 
 }
Delphi
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
const
  CAr: array [1..3] of Integer = (1145, 1247, 1);
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
function TForm1.MainF: Integer;
type
  TMStruct = Record
    Start: Integer;
    Stop: Integer;
    Code: Integer;
end;
var
  _block: TMStruct;
  ret: Boolean;
  br: DWORD;
  Buf: string;
  h: THandle;
  sz, bum: Integer;
begin
  h:= CreateFile('test.exe',GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if h=0 Then begin Result:=-1; Exit; end;
  sz:=GetFileSize(h, nil);
  if GetLastError=INVALID_FILE_SIZE Then begin Result:=-2; Exit; end;
  //new(PBuf);
  //if(Buf==0) exit(-3);
 
  ret:= ReadFile(h, Buf, sz, br, nil);
  if not(ret) Then begin Result:=-4; Exit; end;
  if br<>sz Then begin Result:=-5; Exit; end;
 
  //Buf[WriteEnable]=0xC0;
 
  bnum:= sizeof(CAr)/sizeof(_block);
 //for(int n=0;n<bnum;n++)
 {
 _block *bl=&CAr[n];
 int start=bl->Start+1;
 int size=bl->Stop - start;
 Buf[bl->Start]=size;
 for(int i=0;i<size;i++){
 BYTE v=Buf[start+i];
 v^=0xFF;
 Buf[start+i]=v;
 }
 
 
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2013, 09:36
Ответы с готовыми решениями:

Запрос в Delphi, что я делаю не так?
Добрый день! Помогите пожалуйста сделать правильный запрос. Есть таблица1 с полями: Поле1-дата, Поле2-число, Поле3-число, Поле-4текст. ...

Вычислить арифметическое выражение
Написал простенькую программку для расчета (((A*X div B)*X div C)*X div D)*X выдает ошибку :\ В общем вот код program Project2; ...

Что-то не то с Майкрсофт визуал студио 2010 или я что-то не так делаю
Дело в том что при запуске вот этой программы: #include &lt;iostream&gt; using namespace std; int main () { for (int i=100; i&lt;=999;...

17
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
21.12.2013, 11:27
Buf - это указатель на байты, а не строка.
0
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
21.12.2013, 11:53  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Buf - это указатель на байты, а не строка.
Это понятно, но вы поглядите как оно затем используется.
0
angstrom
21.12.2013, 12:05
Какая разница как вы её потом используете. В ReadFile допустимо использовать массив Char-ов. Можно и String, но с объявленной длиной
Delphi
1
ReadFile(h, @Buf[1], sz, br, nil);
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
22.12.2013, 17:37
Жуткая тайна: String это не массив байт, и тем более не указатель на него, это класс.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
22.12.2013, 18:16
Цитата Сообщение от BOGG ART Посмотреть сообщение
Жуткая тайна: String это не массив байт, и тем более не указатель на него, это класс.
Ещё более жуткая тайна: String - это не класс, а указатель на структуру с массивом байт по нудевому смещению, а также длиной, количеством ссылок (и, кажется, в новых Delphi ещё чем-то) по отрицательному смещению. В общем, примерно то же, что и динамический массив.
1
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
23.12.2013, 20:11  [ТС]
Всем спасибо за ответы.
Но вот, я тут самостоятельно подразобрался и все равно у меня остался ряд вопросов.
Код Си у вас уже есть, посему вот код Delphi.

Delphi
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
function TForm1.MainF: Integer;
type
  TMStruct = Record
    Start: Integer;
    Stop: Integer;
    Code: Integer;
end;
const
  CAr: array [1..3] of Integer = ($479,$4DF,1);
  WriteEnable: Integer =$1FF;
var
  bl: ^TMStruct;
  ret: Boolean;
  br: DWORD;
  Buf, c: ^byte;
  h: THandle;
  sz, v: Byte;
  bnum, st, size, i, n: Integer;
begin
  h:= CreateFile('test.exe',GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if h=0 Then begin Result:=-1; Exit; end;
  sz:=GetFileSize(h, nil);
  if GetLastError=INVALID_FILE_SIZE Then begin Result:=-2; Exit; end;
  Buf:= nil;
  Buf:= @sz; //Buf=new BYTE[sz]
  if Buf= nil Then begin Result:=-3; Exit; end;
  ret:= ReadFile(h, Buf, sz, br, nil);
  if not(ret) Then begin Result:=-4; Exit; end;
  if br<>sz Then begin Result:=-5; Exit; end;
 
  {Buf[WriteEnable]=0xC0}
  //c:= nil;
  //c:= Buf+WriteEnable
  //c^:= $C0;
 
  {int bnum=sizeof(CAr)/sizeof(_block)}
  //bnum:= sizeof(CAr)/sizeof(TMStruct);
  for n:= 0 to bnum do
    begin
      bl:= @CAr[n];
      st:= bl.Start+1;
      size:= bl.Stop -st;
 
      {Buf[bl->Start]=size}
      //c:= nil;
      //c:= Buf+bl.Start
      //c^:= size;
 
      {BYTE v=Buf[start+i]}
      //c:= nil;
      //c:= Buf+st
      //c^:= size;
      for i:= 1 to size do
        begin
          inc(c);
          v:= Buf^;
          v:= v xor 255;
          c^:= v;
        end;
    end;
end;
А теперь пояснения и собственно вопросы.
Блоки кода, которые находятся за знаками "//", это то, что я пытался написать. В основном это мои попытки сложить указатели, дабы получить необходимый адрес. Данные блоки описаны выражениями из Си, которые находятся в "{}".
Один по отношению к bnum. Ибо я просто не очень понял в какой момент мне инициализировать структуру.

Вопросы:
1) Как верно организовать сложение указателей?
2) В какой момент и как инициализироваь структуру?
3) Верно ли написана строчка связанная с bnum и если нет, то как нужно?
4) И собственно... Что я делаю не так?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
23.12.2013, 21:03
Думаю Buf здесь проще всего юзать как динамический байтовый массив размером sz.
1. Там нет сложения указателей
2. До начала ее использования
3. bnum:= sizeof(CAr) div sizeof(TMStruct);
1
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
24.12.2013, 01:53  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Думаю Buf здесь проще всего юзать как динамический байтовый массив размером sz.
1. Там нет сложения указателей
2. До начала ее использования
3. bnum:= sizeof(CAr) div sizeof(TMStruct);
Бида в том, что нужно сохранить завязанность на указателях
1. А как же мне тогда задать необходимое смещение в памяти?
2. Это понятно. А чем ее заполнять нужно? А то судя по коду Си, я этого не догоняю.

Добавлено через 9 минут
2. И на каком именно моменте в коде должна производится инициализация?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
24.12.2013, 08:49
Цитата Сообщение от StarCLike Посмотреть сообщение
Бида в том, что нужно сохранить завязанность на указателях
Зачем? В Сишном коде нет никакой завязанности.
Цитата Сообщение от StarCLike Посмотреть сообщение
1. А как же мне тогда задать необходимое смещение в памяти?
Смещения в массивах задаются индексами.
Цитата Сообщение от StarCLike Посмотреть сообщение
А чем ее заполнять нужно?
Ничем. Ты в нее содержимое файла считываешь.
0
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
24.12.2013, 15:44  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Зачем? В Сишном коде нет никакой завязанности.
Я пытался сказать, что работать мне нужно именно с указателями, как в варианте на Си. И никак иначе.

Цитата Сообщение от FIL Посмотреть сообщение
Смещения в массивах задаются индексами.
Это мне прекрасно известно. Но опять же... Работать необходимо с указателями

Цитата Сообщение от FIL Посмотреть сообщение
Ничем. Ты в нее содержимое файла считываешь.
C
1
_block *bl=&CAr[n];
- А это разве не инициализация?

И еще я не могу понять, как работает данная запись:
C
1
int bnum=sizeof(CAr)/sizeof(_block);
Delphi
1
bnum:= sizeof(CAr) div sizeof(TMStruct);
Что и как она вычисляет?

Добавлено через 1 час 4 минуты
Хм... Попробовал такой вариант
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{Buf[WriteEnable]=0xC0}
c:= nil;
c:= Pointer(DWORD(Buf)+WriteEnable);
c^:= $C0;
 
{Buf[bl->Start]=size}
c:= nil;
c:= Pointer(DWORD(Buf)+bl.Start);
c^:= size;
 
{BYTE v=Buf[start+i]}
c:= nil;
c:= Pointer(DWORD(Buf)+st);
c^:= size;
Компилируется... Но верно ли это?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
24.12.2013, 18:01
Начнём с того, что это C++, а не C.
Цитата Сообщение от StarCLike Посмотреть сообщение
И еще я не могу понять, как работает данная запись:
C
1
int bnum=sizeof(CAr)/sizeof(_block);
Delphi
1
bnum:= sizeof(CAr) div sizeof(TMStruct);
Что и как она вычисляет?
Размер массива делить на размер элемента = количество элементов в массиве. В Delphi можно
Delphi
1
High(CAr) - Low(CAr)
1
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
24.12.2013, 18:16  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
Начнём с того, что это C++, а не C.
Знаю. Стоило написать верно.

И я снова переделал код
Delphi
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
function TForm1.MainF: Integer;
type
  TMStruct = Record
    Start: Integer;
    Stop: Integer;
    Code: Integer;
end;
const
  CAr: array [1..3] of Integer = ($479,$4DF,1);
  WriteEnable: Integer =$1FF;
  INVALID_SET_FILE_POINTER = DWORD(-1);
var
  bl: ^TMStruct;
  ret: Boolean;
  br: DWORD;
  Buf: array of Byte;
  h: THandle;
  sz, v: Byte;
  bnum, st, size, i, n: Integer;
begin
 
  h:= CreateFile('test.exe',GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if h=0 Then begin Result:=-1; Exit; end;
  sz:=GetFileSize(h, nil);
  if GetLastError=INVALID_FILE_SIZE Then begin Result:=-2; Exit; end;
  SetLength(Buf, sz);
  //if Buf= nil Then begin Result:=-3; Exit; end;
  ret:= ReadFile(h, @Buf[0], sz, br, nil);
  if not(ret) Then begin Result:=-4; Exit; end;
  //if GetLastError=ERROR_IO_PENDING Then begin Result:=-2; Exit; end;
  if br<>sz Then begin Result:=-5; Exit; end;
 
  {Buf[WriteEnable]=0xC0}
  Buf[WriteEnable]:=$C0;
 
  bnum:= sizeof(CAr) div sizeof(TMStruct);  //int bnum=sizeof(CAr)/sizeof(_block)
  for n:= 0 to bnum do
    begin
      bl:= @CAr[n];
      st:= bl.Start+1;
      size:= bl.Stop -st;
 
      {Buf[bl->Start]=size}
      Buf[bl.Start]:=size;
 
      for i:= 1 to size do
        begin
          v:=Buf[st+i];
          v:= v xor 255;
          Buf[st+i]:= v;
        end;
    end;
 
  if SetFilePointer(h, 0, nil, FILE_BEGIN)=INVALID_SET_FILE_POINTER Then begin Result:=-6; Exit; end;
  ret:= WriteFile(h,Buf,sz,br,nil);
  if not(ret) Then begin Result:=-7; Exit; end;
  if br<>sz Then begin Result:=-8; Exit; end;
  CloseHandle(h);
end;
И у меня снова проблемы (на картинке).
И снова вопросы.

Delphi
1
2
  {Buf[WriteEnable]=0xC0}
  Buf[WriteEnable]:=$C0;
Правомерна ли подобная запись?
Миниатюры
Перевод Си на Delphi. Что я делаю не так?  
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
24.12.2013, 18:36
В общем, типа такого выходит:
Delphi
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
uses
    Windows, SysUtils;
 
type
    _block = record
        Start, Stop, Code: Integer;
        end;
 
const
    CAr: array [0 .. 0] of _block = ((Start: $479; Stop: $4DF; Code: 1)); 
    WriteEnable: Integer = $1FF;
 
var
    h: THandle;
    sz: Cardinal;
    Buf: PByteArray;
    br: DWORD;
    ret1: LongBool;
    ret2: Cardinal;
    bnum: Integer;
    n, i: Integer;
    bl: ^_block;
    start, size: Integer;
    v: Byte;
 
begin
    h := CreateFile('test.exe', GENERIC_WRITE or GENERIC_READ, 0, nil,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if h = 0 then
        halt(-1);
    sz := GetFileSize(h, nil);
    if sz = INVALID_FILE_SIZE then
        halt(-2);
    Buf := nil;
    GetMem(Buf, sz);
    if Buf = nil then
        halt(-3);
    br := 0;
    ret1 := ReadFile(h, Buf, sz, br, nil);
    if ret1 = false then
        halt(-4);
    if br <> sz then
        halt(-5);
    Buf[WriteEnable] := $C0;
    bnum := High(CAr) - Low(CAr);
    for n := 0 to bnum - 1 do
    begin
        bl := @CAr[n];
        start := bl.Start + 1;
        size := bl.Stop - start;
        Buf[bl.Start] := size;
        for i := 0 to size - 1 do
        begin
            v := Buf[start + i];
            v := v xor $FF;
            Buf[start + i] := v;
        end;
    end;
    ret2 := SetFilePointer(h, 0, nil, FILE_BEGIN);
    if ret2 = INVALID_SET_FILE_POINTER then
        halt(-6);
    ret1 := WriteFile(h, Buf, sz, br, nil);
    if ret1 = false then
        halt(-7);
    if br <> sz then
        halt(-8);
    CloseHandle(h);
    halt(0);
end.
Но динамический массив был бы в тему. Да и WinAPIшные функции тут не особо нужны...

Добавлено через 2 минуты
Насчёт ошибки в ReadFile: там параметр var, так что надо просто Buf[0].
1
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
24.12.2013, 18:37  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
В общем, типа такого выходит:
Воу! Я на такое и не рассчитывал. Огромное спасибо!
0
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
25.12.2013, 06:47  [ТС]
Мы тут попытались несколько переработать код для паскаля
Pascal
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
uses
  Windows, SysUtils;
 
type
  _block = record
    Start, Stop, Code: Integer;
  end;
 
const
  CAr: array [0 .. 0] of _block = ((Start: $479; Stop: $4DF; Code: 1));
  WriteEnable: Integer = $1FF;
  INVALID_SET_FILE_POINTER = DWORD(-1);
  INVALID_FILE_SIZE = DWORD($FFFFFFFF);
  
var
  h: THandle;
  Buf: PByteArray;
  br: DWORD;
  ret1: LongBool;
  ret2: Cardinal;
  bnum: Integer;
  n, i: Integer;
  bl: ^_block;
  st, size, sz: Integer;
  v: Byte;
 
begin
  h:= CreateFile('test.exe', GENERIC_WRITE or GENERIC_READ, 0, nil,
                   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if h = 0 then halt(-1);
  sz:= GetFileSize(h, nil);
  if GetLastError = INVALID_FILE_SIZE then halt(-2);
  
  Buf:= nil;
  GetMem(Buf, sz);
  if Buf = nil then halt(-3);
  
  br:= 0;
  ret1:= ReadFile(h, Buf[0], sz, br, nil);
  if ret1 = false then halt(-4);
  if br <> sz then halt(-5);
 
  Buf[Integer(WriteEnable)]:= $C0;
  bnum:= High(CAr) - Low(CAr);
  
  for n := 0 to bnum do
    begin
      bl:= @CAr[n];
      st:= bl.Start + 1;
      size:= bl.Stop - st;
      Buf[bl.Start] := size;
      for i:= 0 to size - 1 do
        begin
          v:= Buf[st + i];
          v:= v xor $FF;
          Buf[st + i]:= v;
        end;
    end;
    
  ret2:= SetFilePointer(h, 0, nil, FILE_BEGIN);
  if ret2 = INVALID_SET_FILE_POINTER then halt(-6);
  ret1:= WriteFile(h, Buf[0], sz, br, nil);
  if ret1 = false then halt(-7);
  if br <> sz then halt(-8);
 
  CloseHandle(h);
  
  halt(0);
end.
И вот такая вот штука... (на картинке) (с первой и второй ошибкой, вроде разобрались, а вот остальные понять не можем)

И я еще немного приналегаю.
Есть вторая часть задания, переводом которой занимается другой человек.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdlib.h>
#include <stdio.h>
 typedef unsigned char BYTE;
 
void Decode(void){
  BYTE *Buf=0;
  __asm{
    mov eax,[ebp+4]
    mov Buf,eax
  }
  BYTE size=Buf[0];
  Buf[0]=0x90;
  for(int i=1;i<=size;i++){ BYTE v=Buf[i]; v^=0xFF; Buf[i]=v; }
}
 
int main(int argc, char* argv[]){
  Decode(); __asm nop;
  if(argc<2){ puts("No Parameter !"); getchar(); return -1;}
  int v=atoi((char *)argv[1]);
  if(v>1998){ puts("Incorrect usage !"); getchar(); return -2;}
  puts("All is Fine !");
  getchar();
return 0;
}
Нам мало чего объясни, просто попросили перевести. И насколько мы поняли, по мере работы, это то что программа шифровальщик должна шифровать часть данного кода (второй части). И во время шифрования происходит запись в кодовую секцию файла, ибо при динамической расшифровке не можем записывать в память.
Второй кусок мы перевели вот так:
Pascal
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
program decipher;
var
  Buf: ^byte;
  size, temp: byte;
  i, v, e: integer;
  vstr: string;
  procedure Decode;
  begin
    Buf:= nil;  { обнуление указателя }
    asm
      MOVL 4(%EBP), %EAX
      MOV %EAX, Buf
    end;
    { Буфер указывает на место возврата, дешифровка, начиная со след. байта }
    size:= Buf^;  { чтобы нормально прочитать size нужна
                   зашифрованная программа }
    { В зашифрованной программе запись в код должна быть разрешена}
    Buf^:= $90; { nop, запись в начало шифрованной области }
    for i:= 1 to size do
    begin
      inc(Buf);
      temp:= Buf^;
      temp:= temp xor 255;
      Buf^:= temp;
    end;
  end;
begin
  if paramcount < 1 then
    begin
      writeln('No parameter !');
      exit;
    end;
  vstr:= paramstr(1);
  Val(vstr, v, e);
  if e <> 0 then
    begin
      writeln('Parameter is not INT !');
      exit;
    end;
  Decode;
  asm nop; end; { Чтобы освободить байт под указание размера шифрованной области }
  if v > 1998 then writeln('Incorrect Usage !') else writeln('All is Fine !');
end.
Мы думаем, что структура CAr в шифровальщике задает секцию шифруемой области из второй части, а именно ту честь где в main идет код осле вызова Decode, ибо при запуске второй части должна производится динамическая дешифровка кода и воспроизводится некоторый код следующий за ней. Так же мы поняли, что на нужно пересчитать все эти секции.
Может кто расскажет как бороться с ошибками и как нам пересчитывать секции записи?
Работаем во FreePascal. Просто так получилось, что человек давший нам это задание, несколько оговорился, а исправился не так давно...

P.S. Наглость, как говорится, второе счастье.
Миниатюры
Перевод Си на Delphi. Что я делаю не так?  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
25.12.2013, 13:03
Цитата Сообщение от StarCLike Посмотреть сообщение
(с первой и второй ошибкой, вроде разобрались, а вот остальные понять не можем)
У вас везде не хватает разыменования. Вот такой код прекрасно компилируется:
Pascal
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
uses
  Windows, SysUtils;
 
type
  _block = record
    Start, Stop, Code: Integer;
  end;
 
const
  CAr: array [0 .. 0] of _block = ((Start: $479; Stop: $4DF; Code: 1));
  WriteEnable: Integer = $1FF;
  INVALID_SET_FILE_POINTER = DWORD(-1);
  INVALID_FILE_SIZE = DWORD($FFFFFFFF);
  
var
  h: THandle;
  Buf: PByteArray;
  br: DWORD;
  ret1: LongBool;
  ret2: Cardinal;
  bnum: Integer;
  n, i: Integer;
  bl: ^_block;
  st, size, sz: Integer;
  v: Byte;
 
begin
  h:= CreateFile('test.exe', GENERIC_WRITE or GENERIC_READ, 0, nil,
                   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if h = 0 then halt(-1);
  sz:= GetFileSize(h, nil);
  if GetLastError = INVALID_FILE_SIZE then halt(-2);
  
  Buf:= nil;
  GetMem(Buf, sz);
  if Buf = nil then halt(-3);
  
  br:= 0;
  ret1:= ReadFile(h, Buf[0], sz, br, nil);
  if ret1 = false then halt(-4);
  if br <> sz then halt(-5);
 
  Buf^[Integer(WriteEnable)]:= $C0;
  bnum:= High(CAr) - Low(CAr);
 
  for n := 0 to bnum do
    begin
      bl:= @CAr[n];
      st:= bl^.Start + 1;
      size:= bl^.Stop - st;
      Buf^[bl^.Start] := size;
      for i:= 0 to size - 1 do
        begin
          v:= Buf^[st + i];
          v:= v xor $FF;
          Buf^[st + i]:= v;
        end;
    end;
    
  ret2:= SetFilePointer(h, 0, nil, FILE_BEGIN);
  if ret2 = INVALID_SET_FILE_POINTER then halt(-6);
  ret1:= WriteFile(h, Buf[0], sz, br, nil);
  if ret1 = false then halt(-7);
  if br <> sz then halt(-8);
 
  CloseHandle(h);
  
  halt(0);
end.
На работоспособность, естественно, не проверял...
1
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 22
26.12.2013, 19:21  [ТС]
И снова здравствуйте.

Есть следующие параметры в Pascal:
Pascal
1
2
3
  WriteEnable: Integer = $1FF;
 
Buf^[Integer(WriteEnable)]:= $C0;
C++
1
2
3
int WriteEnable=0x1FF; // установка прав на запись в кодовую секцию
 
Buf[WriteEnable]=0xC0;
Поскольку код переписан на pascal, то вероятно изменились и эти параметры. Может кто знает, как определить эту самую кодовую секцию, в которую нужно записать $C0... или, что-то иное и почему?

Шифруется exe-файл, который компилируется из следубщего кода:
Pascal
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
program decipher;
var
  Buf: ^byte;
  size, temp: byte;
  i, v, e: integer;
  vstr: string;
  procedure Decode;
  begin
    Buf:= nil;
    asm
      MOVL 4(%EBP), %EAX
      MOV %EAX, Buf
    end;
    size:= Buf^;
    Buf^:= $90;
    for i:= 1 to size do
    begin
      inc(Buf);
      temp:= Buf^;
      temp:= temp xor 255;
      Buf^:= temp;
    end;
  end;
begin
  if paramcount < 1 then
    begin
      writeln('No parameter !');
      exit;
    end;
  vstr:= paramstr(1);
  Val(vstr, v, e);
  if e <> 0 then
    begin
      writeln('Parameter is not INT !');
      exit;
    end;
  Decode;
  asm nop; end;
  if v > 1998 then writeln('Incorrect Usage !') else writeln('All is Fine !');
end.
Зашифровать нужно лишь один if в самом конце. С помощью программы hiew мы разобрались, какую часть фала нам нужно зашифровывать и задали необходимые смещения
Pascal
1
CAr: array [0 .. 0] of _block = ((Start: $967; Stop: $96D; Code: 1));
Но вот как найти необходимую секцию и что обозначает вносимое туда $C0, мы не знаем и не понимаем...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2013, 19:21
Помогаю со студенческими работами здесь

Хотелось бы, чтоб по нажатию на кнопку что-то происходило. Но, Увы! Что я делаю не так?
Пытаюсь начать осваивать jQuery. Создал вот такой текст. (убрал лишнее) &lt;html&gt;&lt;head&gt; &lt;script&gt; ...

Что я делаю не так?
public class Evklid { public static void main(String args) { System.out.println(gcd (int a=161, int b=28)); } int...

Что делаю не так?
Мне надо сделать запрос который выведет: Количество и стоимость реализованных автомобилей каждым менеджером по подсчету заработной платы....

Что не так делаю
Всем привет! Подскажите, что не так делаю? select GS.G3E_FID AS &quot;Идентификатор&quot;, COM.DEPART_ID AS &quot;КОД РЭС&quot;, ...

что не так делаю?
привет помогите руки выпрямить: на втором листе в поле F9 должно возвращать значение =111-250 - не пашет вообще не могу сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru