小坏 发布的文章

Delphi 获取系统版本{2K~10}

Function RtlGetVersion(Var lpOsInfo :TOSVersionInfoExW):DWORD; Stdcall; External 'ntdll.dll';
//GetVersionEx 在Win8以后的的版本会以兼容模式来获取结果导致获取到的NT内核版本都是6.2所以这里用RtlGetVersion
Function GetOs():Byte;
  Const
    SM_SERVERR2 = 89;
Var
  OSINFO: TOSVersionInfoExW;
begin
  Result := 255;
  OSINFO.dwOSVersionInfoSize := SizeOf(TOSVersionInfoExW);
  if RtlGetVersion(OSINFO) = 0 then
  begin
    if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 0) then
      Result := 1//'Windows 2000'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 1) then
      Result := 2//'Windows XP'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 2) and (GetSystemMetrics(SM_SERVERR2) = 0) then
      Result := 3//'Windows Server 2003'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 2) and (GetSystemMetrics(SM_SERVERR2) <> 0) then
      Result := 4//'Windows Server 2003 R2'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 5//'Windows Vista'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 6//'Windows Server 2008'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 1) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 7//'Windows Server 2008 R2'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 1) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 8//'Windows 7'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 2) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 9//'Windows 8'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 2) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 10//'Windows Server 2012'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 3) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 11//'Windows 8.1'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 3) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 12//'Windows Server 2012 R2'
    else if (OSINFO.dwMajorVersion = 10) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 13//'Windows 10'
    else if (OSINFO.dwMajorVersion = 10) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 14//'Windows Server 2016 Technical Preview'
    else
      Result := 255;
  end;
end;


战略make Hook LsaApLogonUserEx2时X86/X64需要注意的地方

Type
{$IFDEF WIN64}
  xDWORD = DWORD64;
{$ELSE}
  xDWORD = DWORD;
{$ENDIF}

PMSV1_0_INTERACTIVE_LOGON= ^MSV1_0_INTERACTIVE_LOGON;
MSV1_0_INTERACTIVE_LOGON = Record
  MessageType     :MSV1_0_LOGON_SUBMIT_TYPE;
  LogonDomainName :UNICODE_STRING;
  UserName        :UNICODE_STRING;
  Password        :UNICODE_STRING;
End;
  
 
// 计算的时候需要考虑X86/X64的区别{内存地址长度的问题}
Function AdjustPointer(Buffer, Base:Pointer):xDWORD;
begin 
  if (xDWORD(Buffer) < xDWORD(Base)) then
  begin
    Result := xDWORD(Buffer);
  end else
  begin
    Result := (xDWORD(Buffer) - xDWORD(Base));
  end;
end;

// 计算字符串的偏移地址
ProtocolSubmitBuffer^.LogonDomainName.Buffer := PWideChar(xDWORD(ProtocolSubmitBuffer) + AdjustPointer(ProtocolSubmitBuffer^.LogonDomainName.Buffer, ClientBufferBase));

Windows Vista/7/8/8.1/2012下文件夹安全选项标签{用户权限标签} 失踪的处理

以下内容复制保存为 .reg 注册表文件后 双击导入即可


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shellex\PropertySheetHandlers\{1f2e5c40-9550-11ce-99d2-00aa006e086c}]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoSecurityTab"=-

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoSecurityTab"=-


DLL与EXE之间的恩爱情仇

program Bin;
{$APPTYPE CONSOLE}

uses
  Windows;
  
Function RunApi(lpPorc :Pointer):Integer; Stdcall; external 'Test.Dll' name 'RunApi';

Var
  lpPorc :Pointer;
begin
  lpPorc := @MessageBoxW;// 这里可以自己动态加载需要的API
  RunApi(lpPorc);//传入API的内存地址
end.



library DLL;

Uses
  Windows;

Type
  TMyMessageBox = function(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;

Function RunApi(lpPorc :Pointer):Integer;
Var
  pMessageBox :TMyMessageBox;
begin
  Result := -1;
  if Assigned(lpPorc) Then 
  begin
    pMessageBox := lpPorc;
    pMessageBox(0, 'Test', 'hahaha', 0);  //调用EXE传进来的API
    Result := 1;
  end;
end;

Exports
  RunApi;

begin
end.


通过以上代码可以在DLL中调用EXE中的API或函数

而DLL里只需要定义就行了

比如某Rat的EXE和DLL都带有通讯库这样会造成内存消耗的加大

以及DLL在动态传输时体积的增大

如果将EXE中的通讯库直接传入DLL然后由DLL直接调用进行操作体积可以减小很多