Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143

Правильное освобождение библиотеки

29.09.2017, 14:13. Показов 1544. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня возникли проблемы с совобожднием DLL из памяти
Использую FreeLibraryAndExitThread, т.к. DLL попадает в память не естественным путём, а с помощью инъекции.

код dll
PureBasic
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
  Structure MYDATA
  master_pid.i
  dll_handle.i
  dll_size.i
  DIPOFFSET.i
  PRESENTOFFSET.i
  hook_offset1.i
  hook_offset2.i
EndStructure
 
Global *mem.MYDATA
 
Procedure Exit(Instance)
  FreeLibraryAndExitThread_(Instance, 0)
EndProcedure
Procedure WriteDataHANDLE(h, addr, buffer, size)
  Protected oldp
  If h
    If VirtualProtectEx_(h, addr, size, #PAGE_EXECUTE_READWRITE, @oldp)
      If WriteProcessMemory_(h, addr, buffer, size, 0) = 0
        MessageRequester("WriteDataHANDLE", "Запись в память не удалась!" + Chr(10) + GetLastErrorAsText(GetLastError()))
      EndIf
      VirtualProtectEx_(h, addr, size, oldp, 0)
    Else
      MessageRequester("WriteDataHANDLE", "Protect change failed!" + Chr(10) + GetLastErrorAsText(GetLastError()))
    EndIf
  Else
    MessageRequester("WriteDataHANDLE", "h=0" + Chr(10) + GetLastErrorAsText(GetLastError()))
  EndIf
EndProcedure
Procedure SendMasterText(txt.s="")
  If txt = ""
    ClearClipboard()
  Else
    SetClipboardText(txt)
  EndIf
EndProcedure
Procedure LoadData()
  
  *temp = VirtualAlloc_(0, *mem\dll_size, #MEM_COMMIT|#MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
  SendMasterText("*temp = "+Hex(*temp))
  hMaster = OpenProcess_(#PROCESS_ALL_ACCESS, #False, *mem\master_pid)
  SendMasterText("hMaster = "+Str(hMaster))
  If hMaster
    ReadProcessMemory_(hMaster, *mem\dll_handle, *temp, *mem\dll_size, @readed)
    SendMasterText("readed from master = "+Str(readed))
    CloseHandle_(hMaster)
  EndIf
  
  pid= GetPidProcess("crossfire.exe")
  SendMasterText("gamepid = "+Str(pid))
  If pid
    h = OpenProcess_(#PROCESS_ALL_ACCESS, #False, pid)
    If h
      SendMasterText("gameh = "+Str(h))
      *hook_addr = VirtualAllocEx_(h, 0, *mem\dll_size, #MEM_COMMIT|#MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
      SendMasterText("*hook_addr = "+Hex(*hook_addr))
      WriteProcessMemory_(h, *hook_addr, *temp, *mem\dll_size, @written)
      VirtualFree_(*temp, *mem\dll_size, #MEM_RELEASE)
      
      d3ddll = LLib_GetModuleAddress(pid, "d3d9.dll")
      SendMasterText("d3ddll = "+Hex(d3ddll))
      
      addr_dip = d3ddll + *mem\DIPOFFSET
      addr_present = d3ddll + *mem\PRESENTOFFSET
      
      SendMasterText("addr_dip = "+Hex(addr_dip))
      SendMasterText("addr_present = "+Hex(addr_present))
      
      buf1.a = $E9
      buf2.i = (*hook_addr + *mem\hook_offset1) - addr_dip - 5
      
      buf3.a = $E9
      buf4.i = (*hook_addr + *mem\hook_offset2) - addr_present - 5
      
      SendMasterText("buf2 = "+Str(buf2))
      SendMasterText("buf4 = "+Str(buf4))
      
      WriteDataHANDLE(h, addr_dip, @buf1, 1)
      WriteDataHANDLE(h, addr_dip+1, @buf2, 4)
      
      WriteDataHANDLE(h, addr_present, @buf3, 1)
      WriteDataHANDLE(h, addr_present+1, @buf4, 4)
      
      CloseHandle_(h)
    EndIf
  EndIf
EndProcedure
Procedure F(cmd1.s, cmd2.s)
  ProcedureReturn FindString(cmd1, cmd2)
EndProcedure
Procedure TalkingThread(lpParam)
  
  *mem = AllocateStructure(MYDATA)
  SendMasterText("CCFLoader ready")
  
  Repeat
    command.s = GetClipboardText()
    
    If F(command, "CCFMaster masterpid=")
      
      *mem\master_pid = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader PID_OK("+Str(*mem\master_pid)+")")
      
    ElseIf F(command, "CCFMaster dllhandle=")
      
      *mem\dll_handle = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader DLLHANDLE_OK("+Str(*mem\dll_handle)+")")
      
    ElseIf F(command, "CCFMaster dllsize=")
      
      *mem\dll_size = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader DLLSIZE_OK("+Str(*mem\dll_size)+")")
      
    ElseIf F(command, "CCFMaster DIPOFFSET=")
      
      *mem\DIPOFFSET = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader DIPOFFSET_OK("+Str(*mem\DIPOFFSET)+")")
      
    ElseIf F(command, "CCFMaster PRESENTOFFSET=")
      
      *mem\PRESENTOFFSET = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader PRESENTOFFSET_OK("+Str(*mem\PRESENTOFFSET)+")")
      
    ElseIf F(command, "CCFMaster hook_offset1=")
      
      *mem\hook_offset1 = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader hook_offset1_OK("+Str(*mem\hook_offset1)+")")
      
    ElseIf F(command, "CCFMaster hook_offset2=")
      
      *mem\hook_offset2 = Val(StringField(command, 2, "="))
      SendMasterText("CCFLoader hook_offset2_OK("+Str(*mem\hook_offset2)+")")
      
    ElseIf F(command, "CCFMaster StartDataLoading")
      
      LoadData()
      SendMasterText("CCFLoader Data Loading Finished...")
      
    ElseIf F(command, "CCFMaster finish")
      
      SendMasterText("CCFLoader FINISHING")
      Break
      
    EndIf
    Delay(25)
  ForEver
 
  FreeStructure(*mem)
  CreateThread_(0, 0, @Exit(), lpParam, 0, 0)
EndProcedure
ProcedureDLL AttachProcess(Instance)
  CreateThread_(0, 0, @TalkingThread(), Instance, 0, 0)
EndProcedure
где-то прочёл, что лучше всего освобождать в потоке, но толку 0, процесс падает(
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2017, 14:13
Ответы с готовыми решениями:

Правильное освобождение памяти
Здрасти. Двумерный динам. массив: int** matr=new int*; for (int i=0; i<rows; ++i) matr=new int; ...

Правильное освобождение памяти
Есть код class Test { public: int **container; int counter = 0; Test(unsigned int size) { container = new int*;

Правильное освобождение памяти при std::vector
vector<Worker*> workers; workers.push_back(new Worker("Jack", 1000)) Как теперь правильно освободить память? Как я понял у...

10
Эксперт по электронике
6815 / 3240 / 337
Регистрация: 28.10.2011
Сообщений: 12,654
Записей в блоге: 7
02.10.2017, 16:28
Думаю про проблемы не с освобождением dll, а с тем что устанавливается хук, но не снимается.
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
04.10.2017, 08:28  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Думаю про проблемы не с освобождением dll, а с тем что устанавливается хук, но не снимается.
хук ставится в стороннем процессе и не имеют отношения к "носителю" данной dll. так что не из-за этого
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.10.2017, 21:59
Для чего CreateThread_(0, 0, @Exit(), lpParam, 0, 0) ?
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
12.10.2017, 13:09  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Для чего CreateThread_(0, 0, @Exit(), lpParam, 0, 0) ?
потому что
Цитата Сообщение от mcleshiy Посмотреть сообщение
где-то прочёл, что лучше всего освобождать в потоке, но толку 0, процесс падает(
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
12.10.2017, 13:30
Цитата Сообщение от mcleshiy Посмотреть сообщение
где-то прочёл, что лучше всего освобождать в потоке, но толку 0, процесс падает(
Нет.
Как инжектируется DLL?
1
Эксперт по электронике
6815 / 3240 / 337
Регистрация: 28.10.2011
Сообщений: 12,654
Записей в блоге: 7
12.10.2017, 15:39
Цитата Сообщение от mcleshiy Посмотреть сообщение
потому что
TalkingThread выполняется в потоке. Создавать еще один нет необходимости.
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
13.10.2017, 13:24  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Как инжектируется DLL?
в процессе выделяется память, в ней прописывается вызов двух функций LoadLibrary и ExitThread

Добавлено через 19 секунд
Цитата Сообщение от locm Посмотреть сообщение
TalkingThread выполняется в потоке. Создавать еще один нет необходимости.
Понял, принял
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
13.10.2017, 13:34
Скинь dll и инжектор.
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
13.10.2017, 17:03  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Скинь dll и инжектор.
нашёл другое решение своей цели, тема закрыта
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 2
20.02.2018, 23:17
спасибо вам за советы, у меня была похожая проблема.ваш метод сработал,пойду дальше грызть гранит наук..)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2018, 23:17
Помогаю со студенческими работами здесь

Поменять make и release так, чтобы организовать правильное уничтожение объектов и освобождение памяти
Имеем код: #include <iostream> struct Base { public: ~Base() { std::cout << "Base::~Base" << std::endl; } ...

Правильное swprintf, правильное wprintf ?
Вродеж бы по ,,инструкции,,.... ..... wchar_t str = L"tanya"; // обозначает, что строка не однобайтная, а двуб ...

про библиотеки в VS C++ (какие библиотеки нужны для функций 'cout' и 'cin')
какие библиотеки нужны для функций 'cout' и 'cin' ???

Как посмотреть какие библиотеки тянут другие библиотеки процесса
Привет, есть процесс, у него подтянуты dll'ки список которых я могу просматривать прогой Process Explorer. НО вопрос как посмотреть...

Подключение библиотеки Crypto. Если возможно, нужна ссылка на скачивание данной библиотеки
Возникли сложности с подключением библиотеки Crypto: import Crypto.Cipher.AES Выдает следующую ошибку: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru