purebasic.info

PureBasic forum
Текущее время: Вс ноя 19, 2017 2:58 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Пт окт 27, 2017 12:41 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 40
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Необходимо хранить стороннюю программу в теле самописной и запускать ее при необходимости из памяти, без свалки во временные папки и т.п.

На кой черт такие извращения? А не вирмейкер ли ты парень? Отвечу просто - есть стороння программа (2 версии, под х86 и х64), реализующая обмен данными с древней железкой на самописном протоколе. Запускается она из командной строки с туевой хучей параметров. Часть параметров меняется, в зависимости от режима работы с железкой. Т.е. вариант написать 1 универсальный батник не канает, да и не красиво. Поэтому пишу GUI к той софтинке, а зоопарк файлов вокруг единственного exe-шника я не люблю как-то. Поэтому и хочу замутить такую вот вещь. Можно распаковывать в Temp конечно, но душа требует красоты.

Где-то я находил темы с решениями поставленной задачи, но там либо речь идет про инжект в другой процесс, а нифига не запуск из памяти, либо все линки давно мертвы.

Может есть у кого готовый код, хоть под старые версии PB? Перепилить под актуальные не проблема, все лучше, чем писать с нуля.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 12:54 pm 
Не в сети
доцент

Зарегистрирован: Ср июн 18, 2014 6:34 pm
Сообщений: 57
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Коробит слово "софтинка", для начала, ухо режет слащавая приторность. Софтинка, файлик, программулинка и подобное.
А так, может этот код поможет, потому что, вообще сложно понять чего ты хочешь.
В свой софтичек вставь этот кодичек, может будет результатик.

Код:
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
70
71
72
73
74
75
76
77
78
79
; Запускает любой файл в своём процессе.
; То есть, запускает блокнот, но его в процессах не будет.
; А будет только имя этого файла
;
 
Structure IMAGE_SECTION_HEADER
  SecName.b[8]
  StructureUnion
    PhysicalAddr.l
    VirtualSize.l
  EndStructureUnion
  VirtualAddress.l
  SizeOfRawData.l
  PointerToRawData.l
  PointerToRelocations.l
  PointerToLinenumbers.l
  NumberOfRelocations.w
  NumberOfLinenumbers.w
  Characteristics.l
EndStructure
 
Structure IMAGE_SECTION_HEADERS
  ish.IMAGE_SECTION_HEADER[95]
EndStructure
 
Procedure RunPE(sProc.s, lBuff)
 
  *idh.IMAGE_DOS_HEADER  = lBuff
  *ish.IMAGE_SECTION_HEADERS
  pi.PROCESS_INFORMATION
  *inh.IMAGE_NT_HEADERS
  si.STARTUPINFO
  lpBaseAddres.l
  Ctx.CONTEXT
  Addr.l
  ret.l
  i.l
 
  CreateProcess_(#NUL, sProc, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi)
  Ctx\ContextFlags = #CONTEXT_INTEGER
  If GetThreadContext_(pi\hThread, Ctx) = 0      : Goto EndThread : EndIf
 
  ReadProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @Addr, 4, #NUL)
  If ZwUnmapViewOfSection_(Pi\hProcess, Addr)    : Goto EndThread : EndIf
  If lBuff = 0                                   : Goto EndThread : EndIf
  *inh = lBuff + *idh\e_lfanew
 
  lpBaseAddres = VirtualAllocEx_(pi\hProcess, *inh\OptionalHeader\ImageBase, *inh\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
  WriteProcessMemory_(pi\hProcess, lpBaseAddres, lBuff, *inh\OptionalHeader\SizeOfHeaders, @ret)
  *ish = *inh\OptionalHeader + *inh\FileHeader\SizeOfOptionalHeader
 
  For i = 0 To *inh\FileHeader\NumberOfSections - 1
    WriteProcessMemory_(pi\hProcess, lpBaseAddres + *ish\ish[i]\VirtualAddress, lBuff + *ish\ish[i]\PointerToRawData, *ish\ish[i]\SizeOfRawData, @ret)
  Next
 
  WriteProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @lpBaseAddres, 4, #NUL)
  Ctx\Eax = lpBaseAddres + *inh\OptionalHeader\AddressOfEntryPoint
  SetThreadContext_(pi\hThread, Ctx)
  ResumeThread_(pi\hThread)
  End
 
  EndThread:
 TerminateProcess_(pi\hProcess, #NUL)
  CloseHandle_(pi\hThread)
  CloseHandle_(pi\hProcess)
EndProcedure
 
Procedure Run()
 If ReadFile(0, "d:\windows\notepad.exe") = 0 : End : EndIf
    lBuf = AllocateMemory(Lof(0))
    ReadData(0, lBuf, Lof(0))
    CloseFile(0)
 ;-----------------------
    File.s = Space(1024)
    GetModuleFileName_(0, File, 1024)
    RunPE(File, lBuf)
EndProcedure
 
Run()



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 1:55 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
при таком способе запуска(из памяти) не передаются параметры командной строки, а это как я понимаю главная фишка программы.
Нет ни чего стыдного в распаковке из основного файла запускаемой программы. Тем более, что сделать это надо 1 раз, а потом просто проверять, если есть файл, то использовать, нет вновь распаковать.
Да и надёжнее такой способ, запуск из памяти при разных обстоятельствах может глючить, и антивирусы разные...
Тут есть код joniera

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 2:33 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 40
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ну если параметры ком.строки не передать, то тогда - да, смысла всей затеи нету, поскольку в том то вся фишка и была. Жаль.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 3:08 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
kvitaliy писал(а):
при таком способе запуска(из памяти) не передаются параметры командной строки
Насколько помню они передаются таким образом
Код:
1
RunPE(File+" "+Parameters, lBuf)


Этот метод запуска из памяти работает только с x86 программами.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 5:49 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 112
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 4
Код:
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
;http://forums.purebasic.com/english/viewtopic.php?p=311116&sid=71318ad4a9f408ffe97d5eb450eef191#p311116
EnableExplicit
 
Enumeration
  #btn1
EndEnumeration
 
;Structure IMAGE_SECTION_HEADER
;  SecName.b[8]
;  StructureUnion
;    PhysicalAddr.l
;    VirtualSize.l
;  EndStructureUnion
;  VirtualAddress.l
;  SizeOfRawData.l
;  PointerToRawData.l
;  PointerToRelocations.l
;  PointerToLinenumbers.l
;  NumberOfRelocations.w
;  NumberOfLinenumbers.w
;  Characteristics.l
;EndStructure
 
;Structure IMAGE_SECTION_HEADERS
;  ish.IMAGE_SECTION_HEADER[95]
;EndStructure
 
Procedure RunPE(lBuff, parameters.s)
  Protected *idh.IMAGE_DOS_HEADER  = lBuff
  Protected *ish.IMAGE_SECTION_HEADERS
  Protected pi.PROCESS_INFORMATION
  Protected *inh.IMAGE_NT_HEADERS
  Protected si.STARTUPINFO
  Protected lpBaseAddres.l
  Protected Ctx.CONTEXT
  Protected Addr.l, RET.l, i.l
 
  CreateProcess_(#NUL, ProgramFilename() + " " + parameters, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi)
  Ctx\ContextFlags = #CONTEXT_INTEGER
  If GetThreadContext_(pi\hThread, Ctx) = 0      : Goto EndThread : EndIf
 
  ReadProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @Addr, 4, #NUL)
  If ZwUnmapViewOfSection_(Pi\hProcess, Addr)    : Goto EndThread : EndIf
  If lBuff = 0                                   : Goto EndThread : EndIf
  *inh = lBuff + *idh\e_lfanew
 
  lpBaseAddres = VirtualAllocEx_(pi\hProcess, *inh\OptionalHeader\ImageBase, *inh\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
  WriteProcessMemory_(pi\hProcess, lpBaseAddres, lBuff, *inh\OptionalHeader\SizeOfHeaders, @ret)
  *ish = *inh\OptionalHeader + *inh\FileHeader\SizeOfOptionalHeader
 
  For i = 0 To *inh\FileHeader\NumberOfSections - 1
    WriteProcessMemory_(pi\hProcess, lpBaseAddres + *ish\ish[i]\VirtualAddress, lBuff + *ish\ish[i]\PointerToRawData, *ish\ish[i]\SizeOfRawData, @ret)
  Next
 
  WriteProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @lpBaseAddres, 4, #NUL)
  Ctx\Eax = lpBaseAddres + *inh\OptionalHeader\AddressOfEntryPoint
  SetThreadContext_(pi\hThread, Ctx)
  ResumeThread_(pi\hThread)
  ProcedureReturn
 
  EndThread:
  TerminateProcess_(pi\hProcess, #NUL)
  CloseHandle_(pi\hThread)
  CloseHandle_(pi\hProcess)
EndProcedure
; Define.s para1, para2
; para1 = ProgramParameter()
; para2 = ProgramParameter()
Define.l Event, EventGadget, EventGadget, EventWindow
OpenWindow(0, #PB_Ignore, #PB_Ignore, 140, 50, "", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
  ButtonGadget(#btn1, 40,15, 60, 20, "Run PE")
 
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      If EventGadget = #btn1
        RunPE(?file, "")
        ;Break
      EndIf
    Case #PB_Event_CloseWindow
      EventGadget = EventWindow()
      If EventWindow = 0
        CloseWindow(0)
        Break
      EndIf
  EndSelect
ForEver
 
 
DataSection
  file:
 IncludeBinary "C:\WINDOWS\system32\calc.exe"
EndDataSection
; IDE Options = PureBasic 5.31 (Windows - x86)
; CursorPosition = 79
; FirstLine = 39
; Folding = -
; EnableUnicode
; EnableXP
; Executable = RunPE1.exe



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 5:55 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
И что, работает???
win7 x64
Изображение

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 6:01 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 112
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 4
kvitaliy под x86 работал, а под x64 вряд ли, Пётр уже выше говорил


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 6:27 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
LinXP писал(а):
kvitaliy под x86 работал, а под x64 вряд ли, Пётр уже выше говорил

Петр написал про x64 программы
Цитата:
работает только с x86 программами.

про систему разговора не было. Я естественно компилирую в x86 компиляторе.

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 6:37 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 112
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 4
kvitaliy WinXP x86, Win7 x86 пример запускается, но авасту файлик не нравится


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 7:54 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1547
Откуда: Алматы
Благодарил (а): 11 раз.
Поблагодарили: 36 раз.
Пункты репутации: 5
так в х86 системе программа для х64 работать не будет :) а тут видимо система может быть и х64, просто пришиваемая программа должна быть х86. калькулятор в той винде точно х86? :) мож как раз уже переделанный х64 и поэтому бултых.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 8:12 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
kvitaliy писал(а):
про систему разговора не было.
Дело не в системе. Калькулятор 64-ти битный, т. е. x64 программа, верно?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 9:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
Пётр писал(а):
kvitaliy писал(а):
про систему разговора не было.
Дело не в системе. Калькулятор 64-ти битный, т. е. x64 программа, верно?

Не верно.
Изображение

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 9:55 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
kvitaliy писал(а):
Не верно
А при запуске в диспетчере задач определяется как x64 процесс.
Но проблема может быть еще в другом - не подгружаются все необходимое библиотеки.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 10:16 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 112
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 4
под Win x64 сборка и файл x86 запускается
чтоб компилилось под x64 надо подправить исходник

поменял 32-bit registers (eax, ecx, edx etc) на 64-bit registers (rax, rcx, rdx etc). код компилится, но прога из памяти не запускается


Вложения:
test_x86.rar [28.73 KiB]
Скачиваний: 13
Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB