Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите переписать код, с C++ на Delphi 
:(
    Опции темы
MihaelSA
Дата 24.3.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Переменные:
Код

HANDLE device;
char outputbuff[256]; 
char * strings[256];
 DWORD stringcount;


Функция 1
Код

void go()
{
    setup();
    DWORD controlbuff[64];
    DWORD dw;

    //create processing thread
    CreateThread(0,0,(LPTHREAD_START_ROUTINE)thread,0,0,&dw);

    //open device
    device=CreateFile("\\\\.\\PROTECTOR",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);

    // get index of NtCreateSection, and pass it to the driver, along with the
    //address of output buffer
    DWORD * addr=(DWORD *)(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateSection"));
    ZeroMemory(outputbuff,256);
    controlbuff[0]=addr[0];
    controlbuff[1]=(DWORD)&outputbuff[0];
    DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,&dw,0);
}


Вот что пока переписал:
Код

procedure Go();
var
  dw: Cardinal;
  controlbuff: Pointer; //хм
  Addr: Pointer;        //вроде не так
begin
  Setup;
  CreateThread(nil,0,@Thread,nil,0,dw);
  Device:= CreateFile('\\.\PROTECTOR',GENERIC_READ+GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);

  Addr:= GetProcAddress(GetModuleHandle(PChar('ntdll.dll')), 'NtCreateSection'); //не уверен
    //DWORD * addr=(DWORD *)(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateSection"));
  ZeroMemory(@outputbuff, 256);
  //controlbuff[0]:=Addr[0];
    //controlbuff[0]=addr[0];
  //controlbuff[1]=(DWORD)&outputbuff[0];
  DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,dw,nil);
end;


Функция 2
Код

void thread()
{
    DWORD a,x; 
    char msgbuff[512];

    while(1)
    {
        memmove(&a,&outputbuff[0],4);
    
        //if nothing is there, Sleep() 10 ms and check again
        if(!a){
            Sleep(10);
            continue;
        }
        // looks like our permission is asked. If the file in question is already in the white list,
        ///give a positive response
    char*name=(char*)&outputbuff[8];
    for(x=0;x<stringcount;x++)
    {
        if(!stricmp(name,strings[x])){a=1;goto skip;}
    }

    // ask user's permission to run the program
    
    
    strcpy(msgbuff, "Do you want to run ");
    strcat(msgbuff,&outputbuff[8]);
    // if user's reply is positive, add the program to the white list

    if(IDYES==MessageBox(0, msgbuff,"WARNING",MB_YESNO|MB_ICONQUESTION|0x00200000L))
    {
        a=1; 
        strings[stringcount]=_strdup(name);
        stringcount++;
    }
    else a=0;

    //a = (*saveProc)("!!!");
    //a = (*saveProc)(msgbuff);

    // write response to the buffer, and driver will get it
    skip:memmove(&outputbuff[4],&a,4);
    //tell the driver to go ahead
    a=0;
    memmove(&outputbuff[0],&a,4);
    }
}

PM MAIL   Вверх
MihaelSA
Дата 24.3.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



или хотябы покажите где у меня тут затык
программа работает через раз:
один раз запустил - всё ок, ловит запуск программ
2й раз - нет
3й - раз всё ОК

непонятно  smile 

ПЫСЫ: эта версия с использованием библиотеки на VC++

Добавлено через 10 минут и 50 секунд
млин, оказывается в библиотеке у меня вообще не вызывалась функция.
сделал вызов - получил крах программы

Это сообщение отредактировал(а) MihaelSA - 24.3.2008, 10:15

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  app.rar 208,31 Kb
PM MAIL   Вверх
Alix
Дата 24.3.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Цитата(MihaelSA @  24.3.2008,  08:44 Найти цитируемый пост)
  Addr:= GetProcAddress(GetModuleHandle(PChar('ntdll.dll')), 'NtCreateSection'); //не уверен
    //DWORD * addr=(DWORD *)(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateSection"));
  ZeroMemory(@outputbuff, 256);
  //controlbuff[0]:=Addr[0];
    //controlbuff[0]=addr[0];
  //controlbuff[1]=(DWORD)&outputbuff[0];
ну как минимум там был адрес + 1, а у тебя просто. (Кстати что это еще за прикол такой с +1?)
Во-вторых, что тебе мешает описать controlbuff как array [0..63] of DWORD; (такой тип в дельфи есть).
Почему то закомментировано присвоение значений этому массиву в дельфи. 
И еще, как ты описал эти переменные в дельфи?
Код
HANDLE device;
char outputbuff[256]; 
char * strings[256];
 DWORD stringcount;




--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MihaelSA
Дата 24.3.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



  Device: THandle;
  outputbuff: array[0..255] of char;
  strings: String; //это вобщеи и не нужно
  stringcount: DWORD;

вовот, как сделать +1 к адресу ?

сейчас во так:

Код

procedure Go();
var
  dw: DWORD ;
  controlbuff: PByteArray; //нашёл гдето в форумах
  Addr: PByteArray ;        
begin
  Setup;

  CreateThread(nil,0,@Thread,nil,0,dw);
  Device:= CreateFile('\\.\PROTECTOR',GENERIC_READ+GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);

  Addr:= GetProcAddress(GetModuleHandle(PChar('ntdll.dll')), 'NtCreateSection'); //как сделать +1 ?

  ZeroMemory(@outputbuff, 256);

  controlbuff[0]:=addr[0];
  controlbuff[1]:= outputbuff[0];
  DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,dw,nil);
}
end;

PM MAIL   Вверх
MihaelSA
Дата 25.3.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



ну, разве никто не может?

PM MAIL   Вверх
vovksextra
Дата 28.3.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Проверить не начем - писал с головы ))

А то что ты прикрепил - разбиратся нету времени и желания

Код


procedure go;
Var
  outputbuff:Array [0..255] of char;
  controlbuff: array [0..63] of DWORD;
  dw: DWORD;
  device: THandle;
  addr: Pchar;
begin
     ..........
    addr:= GetProcAddress(GetModuleHandle(PChar('ntdll.dll')), 'NtCreateSection');
    addr:=Addr+1;
    fillchar(outputbuff,256,#0);
    controlbuff[0]:=DWORD(addr);
    controlbuff[1]:= DWORD(outputbuff[0]);
    DeviceIoControl(device,1000,@controlbuff,Sizeof(controlbuff),@controlbuff,Sizeof(controlbuff),dw,nil);
    ............
end;





Это сообщение отредактировал(а) vovksextra - 28.3.2008, 12:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.