Felony
پنج شنبه 19 آذر 1388, 11:37 صبح
:لبخند:سلام ،
فکر کردم مشکل حل شده تاپیک قبلی رو پاک کردم ...
علی آقا من از تو سورس کامپوننت ProcessInfo شما کدی استخراج کردم و تابعی نوشتم که بشه دسترسی Debug Privilege برای برنامه گرفت و تو برنامه به درستی کار میکنه ، ولی من میخوام به وسیله ی این کد به یک برنامه دیگه دسترسی Debug Privilege رو بدم ، یعنی هندل برنامه رو به کد بدم و براش دسترسی Debug Privilege درخواست کنم ، کد رو به شکل زیر تغییر دادم ولی نمیتونه دسترسی بگیره ، میشه یه نگاه بندازید .
من جای GetCurrentProcess هندل برنامه ی مورد نظر خودم رو دادم .
Function NTSetPrivilege(APPHand:THandle;sPrivilege: string; bEnabled: Boolean): Boolean;
var
hToken: THandle;
TokenPriv: TOKEN_PRIVILEGES;
PrevTokenPriv: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
begin
Result := True;
// Only for Windows NT/2000/XP and later.
if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;
Result := False;
// obtain the processes token
if OpenProcessToken(APPHand,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
try
// Get the locally unique identifier (LUID) .
if LookupPrivilegeValue(nil, PChar(sPrivilege),
TokenPriv.Privileges[0].Luid) then
begin
TokenPriv.PrivilegeCount := 1; // one privilege to set
case bEnabled of
True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
False: TokenPriv.Privileges[0].Attributes := 0;
end;
ReturnLength := 0; // replaces a var parameter
PrevTokenPriv := TokenPriv;
// enable or disable the privilege
AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),
PrevTokenPriv, ReturnLength);
end;
finally
CloseHandle(hToken);
end;
end;
// test the return value of AdjustTokenPrivileges.
Result := GetLastError = ERROR_SUCCESS;
end;
به صورت زیر هم ازش استفاده میکنم :
var
Hand:THandle;
begin
Hand:=FindWindow('TForm1','Form1');
if NTSetPrivilege(Hand,'SeDebugPrivilege',True) then
ShowMessage('Process updated to Debug Privilege')
else
ShowMessage('Can not update to Debug Privilege');
مشکل از کجا هست ؟ به جای هندل باید چیز دیگه ای مثل ProcessID یا ... به تابع فرستاده بشه ؟
فکر کردم مشکل حل شده تاپیک قبلی رو پاک کردم ...
علی آقا من از تو سورس کامپوننت ProcessInfo شما کدی استخراج کردم و تابعی نوشتم که بشه دسترسی Debug Privilege برای برنامه گرفت و تو برنامه به درستی کار میکنه ، ولی من میخوام به وسیله ی این کد به یک برنامه دیگه دسترسی Debug Privilege رو بدم ، یعنی هندل برنامه رو به کد بدم و براش دسترسی Debug Privilege درخواست کنم ، کد رو به شکل زیر تغییر دادم ولی نمیتونه دسترسی بگیره ، میشه یه نگاه بندازید .
من جای GetCurrentProcess هندل برنامه ی مورد نظر خودم رو دادم .
Function NTSetPrivilege(APPHand:THandle;sPrivilege: string; bEnabled: Boolean): Boolean;
var
hToken: THandle;
TokenPriv: TOKEN_PRIVILEGES;
PrevTokenPriv: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
begin
Result := True;
// Only for Windows NT/2000/XP and later.
if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;
Result := False;
// obtain the processes token
if OpenProcessToken(APPHand,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
try
// Get the locally unique identifier (LUID) .
if LookupPrivilegeValue(nil, PChar(sPrivilege),
TokenPriv.Privileges[0].Luid) then
begin
TokenPriv.PrivilegeCount := 1; // one privilege to set
case bEnabled of
True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
False: TokenPriv.Privileges[0].Attributes := 0;
end;
ReturnLength := 0; // replaces a var parameter
PrevTokenPriv := TokenPriv;
// enable or disable the privilege
AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),
PrevTokenPriv, ReturnLength);
end;
finally
CloseHandle(hToken);
end;
end;
// test the return value of AdjustTokenPrivileges.
Result := GetLastError = ERROR_SUCCESS;
end;
به صورت زیر هم ازش استفاده میکنم :
var
Hand:THandle;
begin
Hand:=FindWindow('TForm1','Form1');
if NTSetPrivilege(Hand,'SeDebugPrivilege',True) then
ShowMessage('Process updated to Debug Privilege')
else
ShowMessage('Can not update to Debug Privilege');
مشکل از کجا هست ؟ به جای هندل باید چیز دیگه ای مثل ProcessID یا ... به تابع فرستاده بشه ؟