分类 笔记 下的文章

Process32First/Process32Next X64下使用

  PProcessEntryW = ^TProcessEntryW;
  TProcessEntryW = Record
    dwSize:DWORD;
    {$IFDEF CPUX64}
    cntUsage:UInt64;
    {$ELSE}
    cntUsage:DWORD;
    {$ENDIF}
    th32ProcessID:DWORD;
    th32DefaultHeapID:DWORD;
    th32ModuleID:DWORD;
    cntThreads:DWORD;
    th32ParentProcessID:DWORD;
    pcPriClassBase:DWORD;
    dwFlags:DWORD;
    szExeFile:Array[0..MAX_PATH - 1] of WideChar;
  end;

将数据类型tagPROCESSENTRY32中的cntUsage修改下即可 X86下用32位的无符号整数X64下用64位的无符号整数

之前搜了好多有人在MSDN社区说把dwFlags修改成64位整数结果测试后完全无效....

只修改个cntUsage即可 Win7 SP1 X64测试完全可用

Patch1:

不过有个很蛋疼的问题是 这套API本应该是给32位用的 64位用本来就不合适

强制改数据类型用是可以用但是 数据会错位...

cntUsage修改成8位直接的64位整数后直接取th32ProcessID的话肯定会返回0

解决方法就是向前挪2位....

Patch2:

PID

th32ProcessID        = PDWORD(PByte(DWORD(@tagPROCESSENTRY32) + 8))^;

父进程PID

th32ParentProcessID  = PDWORD(PByte(DWORD(@tagPROCESSENTRY32) + 32))^;

进程名称

szExeFile            = PWideChar(PByte(DWORD(@tagPROCESSENTRY32) + 44));

其余的不用基本没啥用

Delphi使用WM_CopyData来进行多进程之间的数据传递

下面代码只为实现不考虑线程安全因素 仅供参考

unit Unit_Main;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
  TForm_Main = class(TForm)
    Memo: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure ShareMSG(Var Msg:TMessage); Message WM_COPYDATA;
  end;
Var
  Form_Main: TForm_Main;
  uMax     :Integer;
implementation
{$R *.dfm}
Procedure TForm_Main.ShareMSG(Var Msg:TMessage);
begin
  if Msg.Msg = WM_COPYDATA then
  begin
    Caption    := '第:' + IntToStr(PCopyDataStruct(Msg.LParam)^.cbData) + '次收到数据!~';
    Msg.Result := 1; //返回1
  end;
end;

Function ThreadProc(lpParam:Pointer):DWORD; Stdcall;
Var
  hWin  :HWND;
  Data  :TCopyDataStruct;
  uCount:Integer;
begin
  Result := 0;
  hWin   := HWND(lpParam);
  for uCount := 1 to uMax do
  begin
    ZeroMemory(@Data, SizeOf(Data));
    Data.dwData := 0;
    Data.cbData := uCount;  //数据的大小
    Data.lpData := Nil;     //数据内存指针
    if SendMessage(hWin, WM_COPYDATA, 0, lParam(@Data)) = 1 then
    begin
      Form_Main.Memo.Lines.Add('第:' + IntToStr(uCount) + '次发送!~');
    end;
    Sleep(30);
  end;    
end;  

procedure TForm_Main.Button1Click(Sender: TObject);
Var
  hWin :HWND;
  lThread   :THandle;
  lThreadId :DWORD;  
begin
  hWin := FindWindowW('TForm_Main', 'Process_B'); 
  if hWin > 32 then
  begin
    uMax    := StrToInt(Edit1.Text);
    lThread := CreateThread(nil, 0, @ThreadProc, Pointer(hWin), 0, lThreadId);
    CloseHandle(lThread);
  end Else
  begin
    Memo.Lines.Text := '没有找到进程B的窗口';
  end;    
end;
end.


Delphi DLL注入x86/x64/Win2k~Win8.1全可用

之前测东西的时候要用就随手倒腾了一个

program Inject;

{$APPTYPE CONSOLE}


{$IF CompilerVersion >= 21.0}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}

uses
  Winapi.Windows;
  
Type
  NtCreateThreadExProc = Function(Var hThread:THandle; Access:DWORD; Attributes:Pointer; hProcess:THandle; pStart:Pointer; pParameter:Pointer; Suspended:BOOL; StackSize, u1, u2:DWORD; Unknown:Pointer):DWORD; stdcall;  


Function CheckOs():Boolean;
Var
  lpVersionInformation :TOSVersionInfoW;
begin
  Result := False;
  if GetVersionExW(lpVersionInformation) then
  begin
    if lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_NT Then
    begin
      if (lpVersionInformation.dwMajorVersion < 6) then
      begin
        Result := True;
      end;  
    end;  
  end;
end;

Function EnableDebugPrivilege():Boolean;
Var
  hToKen   :THandle;
  TokenPri :TTokenPrivileges;
begin
  Result := False;
  if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES, hToKen)) Then
  begin
    TokenPri.PrivilegeCount  := 1;
    If LookupPrivilegeValueW(Nil, 'SeDebugPrivilege', TokenPri.Privileges[0].Luid) Then
    begin
      TokenPri.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      Result := AdjustTokenPrivileges(hToken, False, TokenPri, SizeOf(TTokenPrivileges),  Nil, PDWORD(Nil)^);
    end Else Writeln('LookupPrivilege Error');
    CloseHandle(hToKen);
  end;
end;

Function RemoteThread(hProcess:THandle; pThreadProc:Pointer; pRemote:Pointer):THandle;
Label NtCreate, Create;
Var
  pFunc    :Pointer;
  hThread  :THandle;
begin
  hThread := 0;
  if Not CheckOs() then //根据系统版本来选择使用的API
  begin
    NtCreate:
    pFunc   := GetProcAddress(LoadLibraryW('ntdll.dll'), 'NtCreateThreadEx'); 
    if pFunc = Nil then Goto Create;  
    NtCreateThreadExProc(pFunc)(hThread, $1FFFFF, Nil, hProcess, pThreadProc, pRemote, False, 0, 0, 0, Nil);
    if hThread = 0 then Goto Create;
  end Else
  begin
    Create:
    hThread := CreateRemoteThread(hProcess, Nil, 0, pThreadProc, pRemote, 0, PDWORD(Nil)^);    		
  end; 
  Writeln('RemoteThread Ok!');
  Result := hThread;
end;  

Function InjectDll2Pid(szPath:PWideChar; uPID:DWORD):Boolean;
Var
  hProcess  :THandle;
  hThread   :THandle;
  szRemote  :PWideChar;
  uSize     :SIZE_T;
  uWrite    :SIZE_T;
  pStartAddr:Pointer;
begin
  Result := False;
  if EnableDebugPrivilege then
  begin //先提升下进程的权限
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, uPID);
    if hProcess > 0 then
    begin
      uSize    := lstrlenW(szPath) * 2 + 4;
      szRemote := VirtualAllocEx(hProcess, Nil, uSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      if WriteProcessMemory(hProcess, szRemote, szPath, uSize, uWrite) And (uWrite = uSize) then
      begin
        pStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'LoadLibraryW');
        hThread := RemoteThread(hProcess, pStartAddr, szRemote);
        Result  := hThread <> 0;
        CloseHandle(hThread);
      end Else
      begin
        Writeln('WriteMemory Error');
      end;  
    end;  
  end;  
end;  

Function StrToInt(S: String): Integer;
Var
  E: Integer;
Begin
  Val(S, Result, E);
End;

begin
  InjectDll2Pid(PWideChar(ParamStr(2)), StrToInt(ParamStr(1)));
end.


一个蛋疼的问题处理记录

公司电闸突然跳闸工作机断电关机

开机一切正常 fedora 输入登密码后 卡死在系统设置加载那里。。重启,更换内核版本启动都无效

重启 进入Fedora ,with Linux 。。。。。。。 正常进入

卸载其他的内核版本 

reboot

再次进入Fedora ,with Linux 。。

uname -r

yum -y install install kernel-devel kernel-headers kernel-modules-extra kernel-tools kernel-tools-libs kernel-tools-libs-devel

//install uname-r 的对应版本

重新安装内核跟相关的东西。。

reboot

搞定。。。


PS:

由于把其他的内核版本都卸载了所以导致LVM2的机械硬盘无法挂载 重新安装内核后可挂

WinlogonHack Upgrade

Inject Lsass.exe

Hook LsaApLogonUserEx2
  if(IsAdmin)
    (Save/Post) PassWord
  else
    Exit Or Msg(The password is incorrect)



<p>

<a href="http://bcs.duapp.com/flandre/Blog/20140731/fda97789-d8fe-4620-a8b2-6fdec5cb8cb8.jpg"><br />

fda97789-d8fe-4620-a8b2-6fdec5cb8cb8.jpg
</p>