20121126
20121124
D3D: Пишем DLL-инжектор, но уже на C++
[Ссылочка] на урок. Разбираем код DLL-инжектора на C++, который я сваял из тестового D3D-приложения.
А [вот] ссылочка на весь проект, выложенная на [GitHub]. Комментарии на английском. Проект будет пилиться вместе с записью уроков, так что можно его считать тестовой площадкой. Для компиляции понадобится MSVS, я использую 2012 Express.
Сейчас буду записывать следующий урок, для затравки - читаем [это] и [это].
А [вот] ссылочка на весь проект, выложенная на [GitHub]. Комментарии на английском. Проект будет пилиться вместе с записью уроков, так что можно его считать тестовой площадкой. Для компиляции понадобится MSVS, я использую 2012 Express.
Сейчас буду записывать следующий урок, для затравки - читаем [это] и [это].
20121103
D3D: Пишем DLL-инжектор
[Ссылочка] на урок.
[Ссылочка] на компилятор (версия demo для win x86).
А вот полный код:
OpenLibrary(0, "kernel32.dll")
OpenLibrary(1, "user32.dll")
#PROCESS_ALL_ACCESS = $1F0FFF
#MEM_COMMIT = $1000
#MEM_RESERVE = $2000
#PAGE_READWRITE = $4
Text$ = "test.dll"
dllName = @Text$
dllNameSize = 8
loadLibAddr = GetFunction(0, "LoadLibraryA")
Debug(loadLibAddr)
hProcess = RunProgram("d:\keng_loader\d3d9_lesson0_keng", "", GetCurrentDirectory(), #PB_Program_Open)
pID = ProgramID(hProcess)
pHandle = CallFunction(0, "OpenProcess", #PROCESS_ALL_ACCESS, 0, pID)
allocAddr = CallFunction(0, "VirtualAllocEx", pHandle, 0, dllNameSize, #MEM_COMMIT+#MEM_RESERVE, #PAGE_READWRITE)
Debug(allocAddr)
CallFunction(0, "WriteProcessMemory", pHandle, allocAddr, dllName, dllNameSize, 0)
CallFunction(0, "CreateRemoteThread", pHandle, 0, 0, loadLibAddr, allocAddr, 0, 0)
CallFunction(0, "CloseHandle", pHandle)
CloseLibrary(0)
CloseLibrary(1)
Почему на бейсике? Потому что моя задача - объяснить алгоритм работы, а реализация на конкретном языке - дело вкуса. Кому-то ассемблер нравится, кому-то Си, кому-то - C# или Delphi. Не переживайте, в видео всё разжёвано.
[Ссылочка] на компилятор (версия demo для win x86).
А вот полный код:
OpenLibrary(0, "kernel32.dll")
OpenLibrary(1, "user32.dll")
#PROCESS_ALL_ACCESS = $1F0FFF
#MEM_COMMIT = $1000
#MEM_RESERVE = $2000
#PAGE_READWRITE = $4
Text$ = "test.dll"
dllName = @Text$
dllNameSize = 8
loadLibAddr = GetFunction(0, "LoadLibraryA")
Debug(loadLibAddr)
hProcess = RunProgram("d:\keng_loader\d3d9_lesson0_keng", "", GetCurrentDirectory(), #PB_Program_Open)
pID = ProgramID(hProcess)
pHandle = CallFunction(0, "OpenProcess", #PROCESS_ALL_ACCESS, 0, pID)
allocAddr = CallFunction(0, "VirtualAllocEx", pHandle, 0, dllNameSize, #MEM_COMMIT+#MEM_RESERVE, #PAGE_READWRITE)
Debug(allocAddr)
CallFunction(0, "WriteProcessMemory", pHandle, allocAddr, dllName, dllNameSize, 0)
CallFunction(0, "CreateRemoteThread", pHandle, 0, 0, loadLibAddr, allocAddr, 0, 0)
CallFunction(0, "CloseHandle", pHandle)
CloseLibrary(0)
CloseLibrary(1)
Почему на бейсике? Потому что моя задача - объяснить алгоритм работы, а реализация на конкретном языке - дело вкуса. Кому-то ассемблер нравится, кому-то Си, кому-то - C# или Delphi. Не переживайте, в видео всё разжёвано.
Монетизация
...если это можно так назвать. :)
Подумал тут - а может, делать трейнеры на заказ? Скажем, символичные 10 центов за опцию. 10 опций - доллар, 12 опций - доллар 20 центов. Ну и бесплатные обновления, если в следующих версиях игр что-то перестанет работать.
Обсуждения и другие варианты - в комментарии.
Подумал тут - а может, делать трейнеры на заказ? Скажем, символичные 10 центов за опцию. 10 опций - доллар, 12 опций - доллар 20 центов. Ну и бесплатные обновления, если в следующих версиях игр что-то перестанет работать.
Обсуждения и другие варианты - в комментарии.
Подписаться на:
Сообщения (Atom)