Кто-нибудь изучал прогу на предмет отвязывания от CD? У меня сейчас правда и проги то нет, но летом была - племянник привозил, заниматься ею было тогда некогда, поэтому сделал клон, но на моем не очень мощном компе игра прилично тормозила, думаю из-за того что запускалась с клона тоже добавляло тормозов. Ссылки на инфу приветствуются, а также ценные мысли.
В одно время написал отлучалку специально для GTA, если надо могу приаттачить, а вообще перехват GetDriveType, плюс файлы музыки необходимо открывать с помощью CreateFile в директории GTA. К тому же есть версия проги, с записью лога недостающих файлов на винте, по CreateFile.
MoKC0DeR > ИМХО в инете есть готовые nocd Готовое не особенно интересует, т.к. могут не совпадать версии или ещё что.. Booster > если надо могу приаттачить Приаттач.. исходники, было бы интересно взглянуть
Вот аттач. Работает на w2k и выше. Пробовал запускать на других играх, не выходило. Возможно необходимо делать перехват и других функций: GetVolumeInformation, LoadLibrary и т.д. Но у меня не было возможности плотно этим заниматься. Может быть у кого-нибудь есть по этому поводу мысли? _990865612__Hook_DriveType_2000.rar
Спасибо. Tasm пора уже задвинуть куда подальше Как я понял перехватываем две функции GetDriveType и CreateFile, тут нужно будет действительно сделать версию с логом имен файлов передаваемых в CreateFile, а то не понятно за какими файлами она ломится на диск Когда у меня появится снова игра нужно будет переписать всё под masm или fasm, + унифицировать до win98, потому как я игры на NT не ставлю
Вобщем тутор несколько грубоватый, мой метод написать DLL(уже написал), которая после загрузки захучит CreateFileA и сделает лог необходимых файлов, соответственно добавить в прогу код загрузки DLL и исправить EP на этот код, далее можно менять DLL на своё усмотрение с соответствующим нужным кодом - очень универсально. Вот только попробовать пока не на чем, игры то у меня нет %)
Вот собственно код DLL, может кому пригодится Код (Text): .486 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib kernel32.lib include C:\masm32\macros\macros.inc include C:\masm32\macros\Strings.mac include GetAddressOfVAForCurrentApiInIAT.asm CreateFileHookProc PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD SetHook PROTO :DWORD, :DWORD, :DWORD, :DWORD WriteToMemory PROTO :DWORD, :DWORD, :DWORD, :DWORD .DATA ALIGN DWORD hFile dd 0 .DATA? ALIGN DWORD sBuff db 1024 dup (?) .CODE ALIGN DWORD DllEntry proc uses ebx hinstDLL:DWORD, fdwReason:DWORD, lpvReserved:DWORD mov eax, fdwReason .IF eax == DLL_PROCESS_ATTACH mov ebx, OFFSET sBuff .IF $invoke(GetModuleFileName, NULL, ebx, SIZEOF sBuff) mov ecx, eax lea eax, [eax+sBuff-1] @loop: cmp BYTE PTR [eax], '\' je @end_parse dec eax loop @loop jmp @initialization_failed @end_parse: mov BYTE PTR [eax], 0 .IF $invoke(lstrcat, ebx, $CTA0("\\C\*reateFileA.log")) invoke CreateFile, ebx, GENERIC_WRITE,\ FILE_SHARE_READ, 0, CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je @initialization_failed mov hFile, eax invoke GetModuleHandle, NULL .IF $invoke(SetHook, OFFSET CreateFileHookProc, eax, $CTA0("kernel32.dll"), $CTA0("C\*reateFileA")) xor eax, eax inc eax jmp @r .ENDIF .ENDIF .ENDIF .ELSEIF eax == DLL_PROCESS_DETACH .IF (hFile) invoke CloseHandle, hFile .ENDIF .ENDIF @initialization_failed: xor eax, eax @r: ret DllEntry Endp ALIGN DWORD CreateFileHookProc proc uses ebx lpFileName, dwDesiredAccess, dwShareMode,\ lpSecurityAttributes, dwCreationDistribution, dwFlagsAndAttributes, hTemplateFile LOCAL Written:DWORD LOCAL sBuffer[1024]:CHAR invoke SetFilePointer, hFile, 0, NULL, FILE_END lea ebx, sBuffer .IF $invoke(lstrcpy, ebx, lpFileName) .IF $invoke(lstrcat, ebx, $CTA0("\n")) .IF $invoke(lstrlen, ebx) > 2 lea ecx, Written invoke WriteFile, hFile, ebx, eax, ecx, 0 jmp @F .ENDIF .ENDIF .ENDIF invoke WriteFile, hFile, $CTA0("\[An error occurred\]\n"), 21, ADDR Written, 0 @@: invoke CreateFile, lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,\ dwCreationDistribution, dwFlagsAndAttributes, hTemplateFile ret CreateFileHookProc endp ALIGN DWORD WriteToMemory proc hProcess:DWORD, AddressToWrite:DWORD, lpBytesToWrite:DWORD, nSize:DWORD LOCAL OldProtect:DWORD invoke WriteProcessMemory, hProcess, AddressToWrite, lpBytesToWrite,\ nSize, NULL .IF eax == 0 invoke VirtualProtectEx, hProcess, AddressToWrite, nSize,\ PAGE_READWRITE, ADDR OldProtect .IF eax != 0 invoke WriteProcessMemory, hProcess, AddressToWrite, lpBytesToWrite,\ nSize, NULL push eax invoke VirtualProtectEx, hProcess, AddressToWrite, nSize,\ OldProtect, ADDR OldProtect pop eax .ENDIF .ENDIF ret WriteToMemory endp ALIGN DWORD SetHook proc uses ebx lpHookProc:DWORD, BaseOfImage:DWORD, lpszNameOfDll:DWORD, lpszNameOfApi:DWORD invoke GetModuleHandle, lpszNameOfDll invoke GetProcAddress, eax, lpszNameOfApi test eax, eax jz @F invoke GetAddressOfVAForCurrentApiInIAT, BaseOfImage, lpszNameOfDll, eax test eax, eax jz @F mov ebx, eax push SIZEOF DWORD lea eax, lpHookProc push eax push ebx invoke GetCurrentProcess push eax call WriteToMemory @@: ret SetHook endp End DllEntry