Не работает ресурс в Win7

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cyberkazi, 21 Apr 2011.

  1. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Всем привет!!! У меня такой вопрос: на win7 не запускатеся файл помещенный внутри моего приложения как ресурс на делфи, т.е. она работала на win XP.
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    можешь нормально объяснить?
     
  3. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Короче я в проект добавил ресурс внутри которого находится еще один exe-файл (ну поместил его внутри моего приложения) скажем при кликании кнопки на форме этот exe-файл запускался из моего приложения, прога вроде бы работала на WinXp, но не работает на Win7. Что посоветуешь???
     
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    покажи код как ты извлекаешь ресурс?
     
  5. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Получается я не извлекаю, а сразу запускаю из ресурсов! Этот же код работал на XP
    Вот код запуска файла из ресурса...

    implementation

    {$R Myexe.RES}

    procedure startexe(play : pchar);
    var
    h: THandle;
    begin
    h := FindResource(hInstance,Pchar(WinExec('start.exe',SW_SHOWNORMAL)),'exe');
    FreeResource(h);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    start('myexefile');
    end
     
  6. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Код какой то странный. Он действительно делает то, что предполагается? Есть сомнения.
    ===
    Во первых: в процедуре Button1Click вызывается функция start, которую ты не привел.
    Во вторых: в процедуре startexe входящий параметр play нигде не используется.
    А в третьих... Очень печально, но под XP твой код не должен был работать. Вернее не так, как ты думаешь. Твой код запускает не программу с ресурсов, а файл start.exe, который лежит в одной папке с твоей программой :) Так что положи файлик start.exe в каталог со своей программой и смотри, как она работала на XP :)
     
    #6 Chrome~, 21 Apr 2011
    Last edited: 21 Apr 2011
  7. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    этот код вообще бредовый! какой "работал на ХР"? просто для FindResource вторым параметром передается переменная типа PAnsiChar, а ты вызываешь программу start.exe, которая лежит в папке с основной программой, функцией WinExec, и результат возвращаемы ею конвертишь в PChar. Это ни в коем случае не является запуском приложения из ресурсов!
     
  8. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    вот тут можешь почитать как запустить файл из памяти на асме: http://wasm.ru/article.php?article=memfile
     
  9. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    даа, ну этот код почему то работал в XP! Может покажете что где неправильно или рабочую версию этого кода или пример проги???
     
  10. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Работал только потому, что в папке с программой лежал файл, который надо было запустить.
     
    #10 Chrome~, 21 Apr 2011
    Last edited: 21 Apr 2011
  11. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Понятно, можете выложить исходник для этой проги если конечно знаете???
     
  12. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    прправочка (для ТС): не в файле а в папке с программой :)
     
  13. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    посмотри как это реализовано на ассемблере, ссылку давал выше
     
  14. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Брат если бы я понимал ассемблер, наверно сделал бы! Исходник на делфи выложить сможешь???
     
  15. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    Нету желания тра*ать себе мозг, так как это не так уж и просто :) если тебе это так критично нужно, то читай об формате исполняемого файла и работе загрузчика, так как не думаю, что кто-то будет писать код за тебя. но я бы посоветовал тебе извлечь файл во временную директорию и запускать его оттуда, а после завершения удалять ;)
     
  16. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    гугли извлечения из ресурсов,потом проверяешь файл который извлек на существование,и запускаешь,примеров извлечения туева хуча
     
  17. cyberkazi

    cyberkazi New Member

    Joined:
    19 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    А вообще можно сразу из ресурсов запустить exe-файл, не извлекая ее?????
     
  18. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    не думаю, как ты вообще себе это представляешь? чтобы запустить файл его надо извлечь сначала.
     
  19. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 cyberkazi можно конечно сразу запустить. Всё очень просто:
    1) из ресурсов достаёшь файл и закидываешь кудать в память
    2) парсишь PE файл. Выделяя память под образ программы, но по её ImageBase адресу. так что твой ImageBase должен кардинально отличаться от той проги.
    3) Выделяешь память под секции и копируешь туда их. не забывая про устновку правильных прав доступа
    4) обрабатываешь таблицу импорта, не забывая о IAT и hint
    5) правильно настраиваешь PEB и TEB
    6) передаешь управления на точку входа в программу.

    Всё очень просто, буквально строк 500 на Си. Или 600 не делфи )
    Так что забудь про это, с твоими знаниями тебе такого не повторить никогда.

    ну или альтернативный способ:
    1) На основе секций PE файла создаешь секции в памяти
    2) создаешь TEB, PEB и прочие хрени ручками
    3) создаешь новый процесс напрямую через NtCreateProcessEx
    4) создаешь удаленный поток на точку входа (остановленный)
    5) ставишь APC на виндовую функцию обработки импорта и прочей хрени
    6) информинуешь csrss о создание процесса и потока
    7) запускаешь поток

    Вот и готово. Но с этим способом мороки больше чем с первым ). и если первый способ - обычные Api функции, то для второго понадобятся NativeApi и причем не документированные вызовы к csrss
     
    #19 slesh, 22 Apr 2011
    Last edited: 22 Apr 2011
  20. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    да он помрет пока это сделает, проще уже извлечь наверно...