Вот я начал ето переделывать... но обламался с одной функцией, может кто сможет перевести... Ну на делфи уже у вас есть (см. выше), я тут еще на С++ нашел, может кому будет легче...
На VB я уже сделал много (более 89 Кб), так что не влезет, а вот функцию с получением SID вписать могу, вот как это я делаю на VB:
Private Type LSA_UNICODE_STRING Length As Integer MaximumLength As Integer Buffer As Long End Type Private Type LSA_OBJECT_ATTRIBUTES Length As Long RootDirectory As Long ' Should be NULL ObjectName As Long ' LSA_UNICODE_STRING Should be NULL Attributes As Long ' Should be zero SecurityDescriptor As Long ' PTR Should be NULL SecurityQualityOfService As Long ' PTR Should be NULL End Type Private Function GetLocalSid() As String Dim UserName As String, UserNameSize As Long, _ Sid As String, SidSize As Long, _ domain As String, DomainSize As Long, _ snu As Long
UserNameSize = 255 ' Длинна всего и вся... SidSize = 255 DomainSize = 255
If GetUserName(UserName, UserNameSize) = 0& Then Exit Function ' Имя пользователя UserName = Left$(UserName, InStr(vbNull, UserName, vbNullChar, vbBinaryCompare) - vbNull) ' Получение SID Call LookupAccountName(vbNullString, UserName, Sid, SidSize, domain, DomainSize, snu) If IsValidSid(ByVal Sid) = 0& Then Exit Function ' Проверка на вшивость
Call ConvertSidToStringSid(Sid, snu) ' Конвертируем в строку Call CopyMemory(ByVal GetLocalSid, ByVal snu, 255) ' ConvertSidToStringSid долго кривлялась, пришлось делать так...
GetLocalSid = Left$(GetLocalSid, InStr(vbNull, GetLocalSid, vbNullChar, vbBinaryCompare) - vbNull) Call GlobalFree(snu) ' Освобождем от хлама End Function
Private Function GetLsaData(ByVal Policy As Long, ByVal KeyName As String, ByRef OutData As LSA_UNICODE_STRING) As Boolean Dim LsaObjectAttribs As LSA_OBJECT_ATTRIBUTES Dim LsaHandle As Long Dim LsaKeyName As LSA_UNICODE_STRING Dim ret As Long
If LsaOpenPolicy(ByVal 0&, LsaObjectAttribs, Policy, LsaHandle) > 0 Then Exit Function
LsaKeyName.Length = LenB(KeyName) ' LenB(KeyName) LsaKeyName.MaximumLength = LsaKeyName.Length + &H2 ' LsaKeyName.Length + &H2 KeyName = KeyName & vbNullChar & vbNullChar LsaKeyName.Buffer = StrPtr(KeyName) ' По идее ведь в VB строки и так в Unicode, или я ошибаюсь...
ret = LsaRetrievePrivateData(LsaHandle, LsaKeyName, OutData) MsgBox ret MsgBox LsaNtStatusToWinError(ret)
Call LsaFreeMemory(ByVal LsaKeyName.Buffer) Call LsaClose(LsaHandle) End Function
Private Sub GetLSAPasswords() Dim PrivateData As LSA_UNICODE_STRING
If Not LoadLSAFunctions Then Exit Sub
If GetLsaData(POLICY_GET_PRIVATE_INFORMATION, "RasDialParams!" & GetLocalSid, PrivateData) Then 'Call ProcessLSABuffer(PrivateData.Buffer, PrivateData.Length) 'Call LsaFree(PrivateData.buffer) End If UnLoadLSAFunctions End Sub
ret = LsaRetrievePrivateData(LsaHandle, LsaKeyName, OutData)
Нашел выход только сегодня!
Как ни странно, я этой функции передовал:
- VB строку через:
LsaKeyName.Buffer = StrPtr(KeyName) - и расширеную и обычную, хотя в VB все строки "расширены"
LsaKeyName.Buffer = VarPtr(ByteArray(0)) - и расширеный и нет массив... толку небыло
Передавал и строку и массив с пом. CopyMemory, копируя адреса...
В общем чего я только не пробовал... ничего не получалось... вот такая вот бяка...
Но вот сегодня после целого дня изучения одного из модулей трояна "Pinch", и 4-х часов сидения за дебаггером, мне все надоело и я решил глянуть а как эта функция вызывается... не найдя ничего нового решил еще рас попробовать с пом. функций выделения памяти... и о чудо! заработало
Так что если сделаю/еще где-нить запнусь, сюда отпишу... вот...
А вот, собственно, то, из-за чего я потратил не одну неделю на изучение всякой ерунды:
Private Function GetLsaData(ByVal Policy As Long, ByVal KeyName As String, ByRef OutData As LSA_UNICODE_STRING) As Boolean
 im LsaObjectAttribs As LSA_OBJECT_ATTRIBUTES
 im LsaHandle As Long
 im LsaKeyName As LSA_UNICODE_STRING
If Not LsaOpenPolicy(ByVal 0&, LsaObjectAttribs, Policy, LsaHandle) = 0 Then Exit Function
LsaKeyName.Length = LenB(KeyName) ' LenB(KeyName)
LsaKeyName.MaximumLength = LsaKeyName.Length + &H2 ' LsaKeyName.Length + &H2
' Мучался недели двe... Что я только сюда не передавал (массивы, строки), все не работало, пришлось через АПИ
LsaKeyName.Buffer = LocalAlloc(LMEM_ZEROINIT, &HFF) ' &HFF - кажется, максимальная длинна...
Call MultiByteToWideChar(0&, 0&, KeyName, Len(KeyName), LsaKeyName.Buffer, LsaKeyName.MaximumLength)
If Not LsaRetrievePrivateData(LsaHandle, LsaKeyName, OutData) = 0& Then
Call LsaClose(LsaHandle) ' Надо бы закрыть...
Exit Function
End If
Call LsaFreeMemory(LsaKeyName.Buffer) ' Call LocalFree(LsaKeyName.Buffer) Как ни странно, использовать можно и то, и другое
Call LsaClose(LsaHandle)
End Function
Ура товарищи!!!
В результате усиленного колдовства и еще более тщательного изучения и дизасемблирования листингов разной ерунды, были получены пароли к Диал-Ап соединениям с помощью VB6
Сегодня все собирать и приводить в должный вид мне лень, завтра выложу исходник модуля... как доделаю...
2 sne: Ночь у тебя интересная была . А я о Срр, ты не знаешь что за заголовочный файл там используеться?Я подключил "ntsecapi.h" но при компиляции в нем находит много ошибок. Чё за фигня?
Justas, как доделаю... я только вчера(сегодня) еще буфер получил с данными, теперь его нужно обработать...
DaSharm, я тоже пытался... когда хотел размер структуры узнать... у меня выдал две ошибки, я забил и пошел хеадеры просматривать...
потом Сюшные типы сравнил с АСМовыми, из windows.inc, и описал в VB...
А на счет заголовков - не волнуйся, сам напишешь, там не много нужно...
По ходу работка для тебя есть . Думаю ето тебя заинтересует:
--------
Following on from the service password issue I raised some time ago,
here's a little program that will dump various LSA secrets such
as service passwords (plain text), cached password hashes of the
last users to login to a machine, FTP, WEB, etc. plaintext
passwords, RAS dial up account names, passwords etc, workstation
passwords for domain access, etc.
run as: prog _sc_schedule [machine], prog nl$1, prog w3_root_data
or any other registry key under NTLM\security\policy\secrets.
The moral? If only microsoft would document just 10% of the
APIs, maybe people wouldn't make an issue of these things.
NOTE: THIS HAS TO BE RUN AS AN ADMINISTRATOR, OK?!
Cheers
Paul
ps. Sorry about the coding, but win32 programming is so tedious.
#include <windows.h>
#include <stdio.h>
#include "ntsecapi.h"
#define AST(x) if (!(x)) {printf("Failed line %d\n", __LINE__);exit(1);} else
void write();