PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]


Страниц : 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

El Sanchez
06-12-2012, 18:11
El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать. »
ОК, принцип работы такой:
1. Если указан полный путь, будет завершаться процесс по указанному пути. Если имя файла, то все с таким же именем.
2. При получении дескриптора завершаемого процесса при необходимости права вызывающего процесса (инсталлятора) повышаются до уровня отладчика.
3. Последовательность завершения: 1) Посылаем окну программы сообщение WM_CLOSE; 2) Если окна нет и посылать некому (службы), то в виртуальном адресном пространстве процесса вызываем функцию ExitProcess; 3) Если сопротивляется, то TerminateProcess.


#define A = (Defined UNICODE) ? "W" : "A"
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
PROCESS_TERMINATE = $1;
PROCESS_CREATE_THREAD = $2;
PROCESS_VM_OPERATION = $8;
PROCESS_VM_READ = $10;
PROCESS_VM_WRITE = $20;
PROCESS_QUERY_INFORMATION = $400;
SYNCHRONIZE = $100000;
MEM_COMMIT = $1000;
MEM_RESERVE = $2000;
PAGE_EXECUTE_READWRITE = $40;
TOKEN_QUERY = $8;
TOKEN_ADJUST_PRIVILEGES = $20;
SE_PRIVILEGE_ENABLED = $2;
MAX_PATH = 260;
TA_FAILED = 0;
TA_SUCCESS_CLEAN = 1;
TA_SUCCESS_KILL = 2;
WM_CLOSE = $10;
WAIT_OBJECT_0 = $0;
WAIT_TIMEOUT = $102;


type
TPROCESSENTRY32 = record
dwSize, cntUsage, th32ProcessID: DWORD;
th32DefaultHeapID: Longint;
th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array [0..259] of Char;
end;

LUID = record
LowPart: DWORD;
HighPart: Longint;
end;

LUID_AND_ATTRIBUTES = record
Luid: LUID;
Attributes: DWORD;
end;

TOKEN_PRIVILEGES = record
PrivilegeCount: DWORD;
Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';


/////////////////////////////////////////////////////////
function CharArrayToString(aChar: array of Char): String;
begin
Result := '';
while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

////////////////////////////////////////////////////////////
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
dwID: DWORD;
begin
GetWindowThreadProcessId(hwnd, dwID);
if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
Result := True;
end;

////////////////////////////////////////////////////////////////////////
function TerminateApp(const szProcess: String; dwTimeout: DWORD): DWORD;
var
hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
pe32: TPROCESSENTRY32;
aBuf: array [0..259] of Char;
szFileName, szDeviceName: String;
tkp: TOKEN_PRIVILEGES;
SeDebugNameValue: LUID;
i, lpMemory, ret: Longint;
lpThreadId, dwDrives: DWORD;
begin
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
try
pe32.dwSize := SizeOf(pe32);
if not Process32First(hProcessSnap, pe32) then Exit;
while Process32Next(hProcessSnap, pe32) do
begin
if CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
// try open process
hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
if hProc = TA_FAILED then
begin
// open process token adjust privileges
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
try
// fill token privileges struct
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// set debug privileges
if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
// try open process with debug privileges
hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
if hProc = TA_FAILED then Exit;
finally
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
CloseHandle(hToken);
end;
end;
// if szProcess is full path
if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then
begin
GetProcessImageFileName(hProc, aBuf[0], SizeOf(aBuf));
szFileName := CharArrayToString(aBuf);
dwDrives := GetLogicalDrives();
for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
begin
QueryDosDevice(Format('%s:', [Chr(Ord('A') + i)]), aBuf[0], SizeOf(aBuf));
szDeviceName := CharArrayToString(aBuf);
if Pos(szDeviceName, szFileName) = 0 then Continue;
StringChangeEx(szFileName, szDeviceName, Format('%s:', [Chr(Ord('A') + i)]), True);
if CompareText(szProcess, szFileName) = 0 then Break;
end;
if CompareText(szProcess, szFileName) <> 0 then
begin
CloseHandle(hProc);
Continue;
end;
end;
// try stop process
try
EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
case WaitForSingleObject(hProc, dwTimeout) of
WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
WAIT_TIMEOUT: try
lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
if lpProcName = 0 then Exit;
//
lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
//
hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
if hThread > 0 then
case WaitForSingleObject(hThread, dwTimeout) of
WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
end;
finally
CloseHandle(hThread);
end;
end;
finally
CloseHandle(hProc);
if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
end;
end;
finally
CloseHandle(hProcessSnap);
end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
TerminateApp('jqs.exe', 5000);
end;

DEZMONDS
07-12-2012, 15:08
Подскажите я сделал репак программки сохранил все пути и данные но программа после запуска начинает проверять свой ключ на оф сайте тобиш подлинность если заблокировать доступ в инет срабатывает кряк и программа дальше запускается и работает ...

возможно есть функция или скрипт inno setup что сама по себе блокирует все соединения из вне ..в инет .. или подскажите где посмотреть или как сделать если есть ...

:Beer: мне нужно не вручную а автоматом и не через антивирус ...как делает это skidrow в своих крЯках.... зарание спасибо...

SoulSide
07-12-2012, 16:35
DEZMONDS, На этом форуме обсуждение взлома не приветствуется.
А так, если какая программа лезет в интернет, то смотрите в сторону C:\WINDOWS\system32\drivers\etc\ на файл hosts (http://ru.wikipedia.org/wiki/Hosts).

DEZMONDS
07-12-2012, 16:45
SoftLine, да но мне взлом не нужен мне надо что бы в скрипте inno setup прописать как ты говоришь в файле hosts запрет програмы или копирнуть этот хост и как на различные системы винды указать путь? антивирус наверно сразу орать будет что типа репак лезет в запрещенные файлы... и воозможно это сделать автоматом? или подскажите в правельном направлении думаю? через inno setup это делать или кряк дописивать?

YURSHAT
07-12-2012, 16:52
DEZMONDS, вам нужно знать веб адреса на которые лезет программулина и соответственно сделать их локальными.
Прописать в хост примерно такие строки
127.0.0.1 forum.oszone.net

DEZMONDS
07-12-2012, 17:35
YURSHAT, да я понял ... но все же только вручную? или можно как то через скрипт инно?

Gnom_aka_Lexander
07-12-2012, 18:18
тут (http://forum.oszone.net/post-2023130-1291.html) то, что тебе нужно. грузим файл в стринг-лист, дописываем туда-же нужные строчки, снова сохраняем в файл. для хоста потребуется запросить права админа - парой страниц назад найдешь, полный пример именно для хост-файла - тоже есть на форуме, хотя в примере по ссылке все что нужно - указать нужный файл для полноценного примера. в который раз убеждаюсь - все форумы по сабжу можно закрывать - решены уже совершенно все вопросы, многие не по одному разу, единственное, что поддерживает жизнь форумов в этой тематике - лентяи, которым нужно, чтоб все сделали за них. Даже нажали кнопку в поиске.

SoulSide
07-12-2012, 20:41
DEZMONDS, Прогнав поиск, вот что выдало по файлу hosts: #200, #477, #532.

Gnom_aka_Lexander
07-12-2012, 20:55
к #532 дополню - более корректно перевод строки будет +chr(13)+chr(10)+
chr(13) - возврат каретки в начало
chr(10) - собственно, новая строка

R.i.m.s.k.y.
08-12-2012, 19:21
inno умеет только bmp в формы вставлять? как быть с прозрачностью фона, ведь у каждого своя тема оформления венды и установщика?

Gnom_aka_Lexander
08-12-2012, 19:31
для прозрачных изображений была написана библиотека botva2.dll, есть еще формат bmp 32 бита, но инно его не умеет

R.i.m.s.k.y.
08-12-2012, 20:05
Gnom_aka_Lexander,
ReplaceColor := clWhite; ReplaceWithColor := clBtnFace; не помогут?

Gnom_aka_Lexander
08-12-2012, 20:38
R.i.m.s.k.y., иногда помогают. но иногда такое г.. получается, что просто диву даешься :) в принципе, я сам предпочитаю именно с битмапами работать, просто рисуешь все элементы каждой страницы целиком и все.

R.i.m.s.k.y.
08-12-2012, 20:45
просто рисуешь все элементы каждой страницы целиком и все. »
это как?
может упростить задачу? фиксировать цвет фона? какие элементы тогда нужно гвоздями прибивать?

Gnom_aka_Lexander
08-12-2012, 20:50
Элементы - в том смысле, что всякие рамочки, панельки и тому подобное.
При отрезании цвета косяк будет на переходах цвета - там будет грязь состоящая из фонового цвета и пикселей полутонов вырезанного.

Gnom_aka_Lexander
10-12-2012, 17:38
нету стандартных ивентов для WizardForm, типа OnMove, может и добавят, потом. поэтому только каллбек и никак иначе. почему-бы в каллбек распаковки не добавить ловлю сообщений и окна и обработку WM_MOVE?

Johny777
10-12-2012, 17:55
Gnom_aka_Lexander, ещё есть Application.OnMessage
http://forum.oszone.net/post-1894849-1439.html
http://forum.oszone.net/post-1660375-1363.html
я там тоже отслеживал событие WM_MOVE но как обычно облом. :(

Gnom_aka_Lexander
10-12-2012, 18:00
я там тоже отслеживал событие WM_MOVE »
там и не получится, это цикл сбора сообщений, он выполняется один раз, будучи вызванным, используется в длинных циклах, для размораживания окна программы(обычно), когда ради цикла нет необходимости запускать отдельный поток. поэтому только каллбек.

popt2t
11-12-2012, 14:42
Не могу понять, по какой причине не срабатывает ISSkin. Помогите разобраться пожалуйста!

Делаю вот так:


[Files]
; Добавляем ISSkin DLL, который используется в инсталляторах Inno Setup.
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy

; Добавляем файл визуального стиля, в котором находятся нужные ресурсы для визуализации.
; Вы также можете использовать Microsoft Visual Styles (*.msstyles).
Source: ISSkin.cjstyles; DestDir: {tmp}; Flags: dontcopy

[Секция Code]
// Импортируем LoadSkin API из ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

// Импортируем UnloadSkin API из ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Импортируем ShowWindow Windows API из User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';


function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('ISSkin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\ISSkin.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
// Скрываем окно до выгрузки скина, чтобы пользователь не увидел
// окно инсталлятора без визуальных стилей до его закрытия.
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
Sleep(110);
UnloadSkin();
end;

Gnom_aka_Lexander
11-12-2012, 15:36
Версия длл-ки - анси-юникод должна совпадать с версией инно, именно поэтому в комплекте их две - одна для анси, другая для юникод.




© OSzone.net 2001-2012