DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wy123325
今日帖子: 36
在线用户: 33
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/18 15:47:20
标题:
这个DLL怎么注入或调用? 浏览:616
加入我的收藏
楼主: library ifo;

uses
  SysUtils,Classes,Windows, madCodeHook,ActiveX;

{$R *.res}

type
  _tagpropertykey = packed record
    fmtid: TGUID;
    pid: DWORD;
  end;
  PROPERTYKEY = _tagpropertykey;

   //----------
   // IShellItem interface declaration
   //----------

  IShellItem = interface(IUnknown)
    ['{43826d1e-e718-42ee-bc55-a1e261c37bfe}']
    function BindToHandler(const pbc: IBindCtx; const bhid: TGUID;
      const riid: TIID; out ppv): HResult; stdcall;
    function GetParent(var ppsi: IShellItem): HResult; stdcall;
    function GetDisplayName(sigdnName: DWORD; var ppszName: LPWSTR): HResult; stdcall;
    function GetAttributes(sfgaoMask: DWORD; var psfgaoAttribs: DWORD): HResult; stdcall;
    function Compare(const psi: IShellItem; hint: DWORD;
      var piOrder: Integer): HResult; stdcall;
  end;

   //----------
   // ISHellEnumItems interface declaration
   //----------

  IEnumShellItems = interface(IUnknown)
    ['{70629033-e363-4a28-a567-0db78006e6d7}']
    function Next(celt: ULONG; out rgelt; pceltFetched: PLongint): HResult; stdcall;
    function Skip(celt: ULONG): HResult; stdcall;
    function Reset: HResult; stdcall;
    function Clone(out ppenum: IEnumShellItems): HResult; stdcall;
  end;

   //----------
   // IShellItemArray interface declaration
   //----------

  IShellItemArray = interface(IUnknown)
    ['{b63ea76d-1f85-456f-a19c-48159efa858b}']
    function BindToHandler(const pbc: IBindCtx; const rbhid: TGUID;
      const riid: TIID; out ppvOut): HResult; stdcall;
    function GetPropertyStore(flags: DWORD; const riid: TIID; out ppv): HResult; stdcall;
    function GetPropertyDescriptionList(const keyType: PropertyKey;
      const riid: TIID; out ppv): HResult; stdcall;
    function GetAttributes(dwAttribFlags: DWORD; sfgaoMask: DWORD;
      var psfgaoAttribs: DWORD): HResult; stdcall;
    function GetCount(var pdwNumItems: DWORD): HResult; stdcall;
    function GetItemAt(dwIndex: DWORD; var ppsi: IShellItem): HResult; stdcall;
    function EnumItems(var ppenumShellItems:    IEnumShellItems): HResult; stdcall;
  end;

   //----------
   // SHCreateShellItemArrayFromDataObject declaration
   //----------

   TSHCreateShellItemArrayFromDataObject = function(pdo: IDataObject;
      const riid: TGUID; ppv: Pointer): HRESULT; StdCall;

   //----------
   // Operations done by IFileOperation
   //----------

   TFileOperation = (opCopy, opMove, opDelete, opRename);

var
   //----------
   // Hook's nextProcs
   //----------

   CoCreateInstance_np: function(const clsid: TCLSID; unkOuter: Pointer;
     dwClsContext: Longint; const iid: TIID; pv: Pointer): HResult; stdcall;

   CopyItems_np: function( p: POinter; punkItems: IUnknown;
      psiDestinationFolder: IShellItem ): HRESULT; stdcall;

   CopyItem_np: function( p: POinter; psiitem: IShellItem;
      psiDestinationFolder: IShellItem; pszCopyName: LPCWSTR;
      pfopsItem: Pointer ): HRESULT; stdcall;

   DeleteItem_np: function( p: POinter; psiItem: IShellItem; pfopsItem:
      Pointer ): HRESULT; stdcall;

   DeleteItems_np: function( p: POinter; punkItems: IUnknown ): HRESULT; stdcall;

   MoveItems_np: function( p: POinter; punkItems: IUnknown;
      psiDestinationFolder: IShellItem ): HRESULT; stdcall;

   MoveItem_np: function( p: POinter; psiitem: IShellItem;
      psiDestinationFolder: IShellItem; pszCopyName: LPCWSTR;
      pfopsItem: Pointer ): HRESULT; stdcall;

   RenameItem_np: function( p: Pointer; psiItem: IShellItem; pszNewName:
      LPCWSTR; pfopsItem: Pointer ): HRESULT; stdcall;

   RenameItems_np: function( p: Pointer; punkItems: IUnknown; pszNewName:
      LPCWSTR ): HRESULT; stdcall;

const
   IID_ShellItemArray : TGUID = '{b63ea76d-1f85-456f-a19c-48159efa858b}';
   IID_DataObject: TGUID = '{0000010E-0000-0000-C000-000000000046}';
   SIGDN_FILESYSPATH     = $80058000;
   SIGDN_NORMALDISPLAY   = $00000000;

//----------
// Little function for string to PWideChar convertion
//----------

function PWideToString( wide: PWideChar ): string;
var
   pAtual: Pointer;
begin
   pAtual := wide;
   Result := '';

   // A PWideChar ends when a #0#0 is found. 2 bytes, then we can
 // typecast for a Word comparasion

   while PWord( pAtual )^ <> 0 do
   begin

      // We use only the first byte. Jump 2.
      Result := Result + Chr( PByte( pAtual )^ );
      pAtual := Pointer( Integer( pAtual ) + 2 );
   end;
end;

//----------
// Convert and returns as true, to be used on one line IF
//----------


function ConvertWtoS( wide: PWideChar; var output: string ): Boolean;
begin
   Result := True;
   output := PWideToString( wide );
end;

//----------
// All one item operation will step here.
//----------

function canPerform_ShellItem( item, dest: IShellItem; secParam: LPCWSTR;
   op: TFileOperation ): Boolean;
var
   itemPath, destPath: PWideChar;
   sItemPath, sDestPath: string;
begin
   Result := True;

   if Item.GetDisplayName( SIGDN_FILESYSPATH, itemPath ) = S_OK then
   begin
      // Extract the origin file path
      sItemPath := PWideToString( itemPath );

      // For deletion, there's no need for destiny
      if op <> opDelete then
      begin
         // There's destiny
         if ( dest <> nil ) and (dest.GetDisplayName(
          SIGDN_FILESYSPATH, destPath ) = S_OK) then

          // Transforms the string including a path delimiter
          sDestPath := IncludeTrailingPathDelimiter( PWideToString( destPath ) )
         else sDestPath := IncludeTrailingPathDelimiter( ExtractFilePath( sItemPath ) );


         // If there's no destiny, we'll use the origin
         if secParam = nil then
          sDestPath := sDestPath + ExtractFileName( sItemPath )
         else sDestPath := sDestPath + PWideToString( secParam );
      end;

      case op of
         opCopy:
          // Shows a messageBox
          Result := MessageBoxA( 0, PansiChar( 'Copying from: ' + sItemPath + #13#10 + 'to: ' + sDestPath ),'Allow?', MB_YESNO ) = ID_YES;

         opMove  :
          // Shows a messageBox
          Result := MessageBoxA( 0, PansiChar( 'Moving from: ' + sItemPath + #13#10 + 'to: ' + sDestPath ),'Allow?', MB_YESNO ) = ID_YES;

         opDelete:
          // Shows a messageBox
          Result := MessageBoxA( 0, PansiChar( 'Deleteing file : ' + sItemPath ),'Allow?', MB_YESNO ) = ID_YES;

         opRename:
          // Shows a messageBox
          Result := MessageBoxA( 0, PansiChar( 'Renaming from: ' + sItemPath + #13#10 + 'to: ' + sDestPath ),'Allow?', MB_YESNO ) = ID_YES;

      end;
   end;
end;

//----------
// Many items performing method
//----------

function canPerform_ShellItemArray( itemArr: IShellItemArray; dest: IShellItem;
   op: TFileOperation ): Boolean;
var
   nTotal: Cardinal;
   nAux: Integer;
   shellItem: IShellItem;
begin
   Result := True;

   // Is a valid array?
   if itemArr.GetCount( nTotal ) = S_OK then
   begin
      for nAux := 0 to nTotal -1 do
      begin

         // Extract the current item
         if itemArr.GetItemAt( nAux, shellItem ) = S_OK then
         begin
          // check if the operation can be performed
          Result := Result and canPerform_ShellItem( shellItem, dest, nil, op );

          // In abortion case, break
          if not Result then
          Break;
         end;
      end;
   end;
end;

//----------
// Many items performing method, trough IDataObject
//----------

function canPerform_DataObject( dataObject: IDataObject; dest: IShellItem;
   op: TFileOperation ): Boolean;
var
   SHConverteFromData: TSHCreateShellItemArrayFromDataObject;
   shellItemArr: IShellItemArray;
begin
   Result := True;

   // Windows Vista has implemented a function to convert an
 // IDataObject to ISHellItemArray. We'll use it.

   @SHConverteFromData := GetProcAddress( GetModuleHandle('shell32.dll'),
      'SHCreateShellItemArrayFromDataObject' );

   // Functoun found, use it.
   if (@SHConverteFromData <> nil) and ( SHConverteFromData(
      dataObject, IID_ShellItemArray, @shellItemArr ) = S_OK ) then
   begin

      // Perform the item now.
      Result := canPerform_ShellItemArray( shellItemArr, dest, op );
   end;
end;

//----------
// Many items performing method, trough punkData
//----------

function canPerform_PunkItem( punkItems: IUnknown; dest: IShellItem;
   op: TFileOperation ): Boolean;
var
   shellItemArr: IShellItemArray;
   dataObject: IDataObject;
begin
   Result := True;

   if punkItems.QueryInterface( IID_ShellItemArray, shellItemArr ) = S_OK then

      // If we have a ShellItemArr, check directly
      result := canPerform_ShellItemArray( shellItemArr, dest, op )


   // In case of IDataObject, convert to IShellItemArray
   else if punkItems.QueryInterface( IID_DataObject, dataObject ) = S_OK then

      result := canPerform_DataObject( dataObject, dest, op );
end;

//----------
// Given an interface pointer, find out the position by it's index
//----------

function GetInterfaceMethod(const intf; methodIndex: dword) : pointer;
begin
   result := pointer(pointer(dword(pointer(intf)^) + methodIndex * sizeOf(cardinal))^);
end;

//----------
// DeleteItems callBack
//----------

function DeleteItems_cb( p: POinter; punkItems: IUnknown ): HRESULT; stdcall;
begin
   if canPerform_PunkItem( punkItems, nil, opDelete ) then
      Result := deleteItems_np( p, punkItems )

   else Result := E_ABORT;
end;




//----------
// DeleteItem callBack
//----------


function DeleteItem_cb( p: POinter; psiItem: IShellItem;
   pfopsItem: Pointer ): HRESULT; stdcall;
begin
   if canPerform_ShellItem( psiItem, nil, nil, opDelete ) then
      Result := deleteItem_np( p, psiItem, pfopsItem )

   else Result := E_ABORT;
end;




//----------
// CopyItem callBack
//----------


function CopyItem_cb( p: POinter; psiItem: IShellItem; psiDestinationFolder:
   IShellItem; pszCopyName: LPCWSTR; pfopsItem: Pointer ): HRESULT; stdcall;
begin
   if canPerform_ShellItem( psiItem, psiDestinationFolder, pszCopyName, opCopy ) then
      Result := CopyItem_np( p, psiItem, psiDestinationFolder, pszCopyName,
         pfopsItem )

   else Result := E_ABORT;
end;




//----------
// CopyItems callBack
//----------


function CopyItems_cb( p: POinter; punkItems: IUnknown; psiDestinationFolder:
   IShellItem ): HRESULT; stdcall;
begin
   if canPerform_PunkItem( punkItems, psiDestinationFolder, opCopy ) then
      Result := CopyItems_np( p, punkItems, psiDestinationFolder )

   else Result := E_ABORT;
end;




//----------
// MoveItem callBack
//----------


function MoveItem_cb( p: POinter; psiItem: IShellItem; psiDestinationFolder:
   IShellItem; pszCopyName: LPCWSTR; pfopsItem: Pointer ): HRESULT; stdcall;
begin
   if canPerform_ShellItem( psiItem, psiDestinationFolder, pszCopyName, opMove ) then
      Result := MoveItem_np( p, psiItem, psiDestinationFolder, pszCopyName,
         pfopsItem )

   else Result := E_ABORT;
end;




//----------
// MoveItems callBack
//----------


function MoveItems_cb( p: POinter; punkItems: IUnknown; psiDestinationFolder:
   IShellItem ): HRESULT; stdcall;
begin
   if canPerform_PunkItem( punkItems, psiDestinationFolder, opMove ) then
      Result := MoveItems_np( p, punkItems, psiDestinationFolder )

   else Result := E_ABORT;
end;




//----------
// RenameItem callBack
//----------


function RenameItem_cb( p: Pointer; psiItem: IShellItem; pszNewName:
   LPCWSTR; pfopsItem: Pointer ): HRESULT; stdcall;
begin
   if canPerform_ShellItem( psiItem, nil, pszNewName, opRename ) then
      Result := RenameItem_np( p, psiItem, pszNewName, pfopsItem )

   else Result := E_ABORT;
end;




//----------
// RenameItems callBack
//----------


function RenameItems_cb( p: Pointer; punkItems: IUnknown; pszNewName:
   LPCWSTR ): HRESULT; stdcall;
begin
   if canPerform_PunkItem( punkItems, nil, opRename ) then
      Result := RenameItems_np( p, punkItems, pszNewName )

   else Result := E_ABORT;
end;




//----------
// coCreateInstance callBack
//----------


function CoCreateInstance_cb(const clsid: TCLSID; unkOuter: Pointer;
  dwClsContext: Longint; const iid: TIID; pv: Pointer): HResult; stdcall;
const
   IFileOperation_GUID = '3AD05575-8857-4850-9277-11B85BDB8E09';

   procedure HookFunctionIndex( index: Integer; CallBack: Pointer; var NextProc: Pointer );
   begin
      // Hook if it is not yet hooked
      if NextProc = nil then
         HookCode( GetInterfaceMethod( pv^, index ), CallBack, NextProc );
   end;

begin
   // Call the original API to get it's instance pointer
   Result := CoCreateInstance_np( clsid, unkOuter, dwClsContext, iid, pv );

   // Check IFileOperation GUID
   if pos( IFIleOperation_GUID, GUIDToString(clsid) ) <> 0 then
   begin

      //----------
      // Hook each function of our interface
      //----------

      HookFunctionIndex( 12, @RenameItem_Cb , @RenameItem_np  );
      HookFunctionIndex( 13, @RenameItems_Cb, @RenameItems_np );
      HookFunctionIndex( 14, @MoveItem_Cb   , @MoveItem_np    );
      HookFunctionIndex( 15, @MoveItems_cb  , @MoveItems_np   );
      HookFunctionIndex( 16, @CopyItem_cb   , @CopyItem_np    );
      HookFunctionIndex( 17, @CopyItems_cb  , @CopyItems_np   );
      HookFunctionIndex( 18, @DeleteItem_cb , @DeleteItem_np  );
      HookFunctionIndex( 19, @DeleteItems_cb, @DeleteItems_np );
   end;
end;

begin
   // coCreateInstance hook
   HookAPI( 'ole32.dll', 'CoCreateInstance', @CoCreateInstance_cb, @CoCreateInstance_np );
end.
----------------------------------------------
-
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/18 15:49:05
1楼: Hey guys. I was able to successfully hook IFileOperation methods under Windows Vista and Windows Seven. This made me able to intercept file operations done by explorer.exe in order to log, change it's parameters, accept or deny file copies, movements, renaming or deletion. All good, but this can be a long subject. Given this, here is the source code. It has being written using Borland Delphi 7 using MadCodeHook, but you can use any library you want for code hooking.


The idea behind this scene is to hook the interface method by it's index. It's likelly if you have a table of procedures in a memory area. This is how the interface is exposed in memory. All we do is to patch this table, using madCodeHook's function hookCode(). It will place a JUMP inside the place where the entries of this table points to.


These are the methods of IFileOperation:



/* IUnknown methods */
STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
STDMETHOD_( ULONG, Release )( THIS ) PURE;


/* IFileOperation methods */
STDMETHOD( Advise )( THIS_ IFileOperationProgressSink *, DWORD * ) PURE;
STDMETHOD( Unadvise )( THIS_ DWORD ) PURE;
STDMETHOD( SetOperationFlags )( THIS_ DWORD ) PURE;
STDMETHOD( SetProgressMessage )( THIS_ LPCWSTR ) PURE;
STDMETHOD( SetProgressDialog )( THIS_ IOperationsProgressDialog * ) PURE;
STDMETHOD( SetProperties )( THIS_ IPropertyChangeArray * ) PURE;
STDMETHOD( SetOwnerWindow )( THIS_ HWND ) PURE;
STDMETHOD( ApplyPropertiesToItem )( THIS_ IShellItem * ) PURE;
STDMETHOD( ApplyPropertiesToItems )( THIS_ IUnknown * ) PURE;
STDMETHOD( RenameItem )( THIS_ IShellItem *, LPCWSTR, IFileOperationProgressSink * ) PURE;
STDMETHOD( RenameItems )( THIS_ IUnknown *, LPCWSTR ) PURE;
STDMETHOD( MoveItem )( THIS_ IShellItem *, IShellItem *, LPCWSTR, IFileOperationProgressSink * ) PURE;
STDMETHOD( MoveItems )( THIS_ IUnknown *, IShellItem * ) PURE;
STDMETHOD( CopyItem )( THIS_ IShellItem *, IShellItem *, LPCWSTR, IFileOperationProgressSink * ) PURE;
STDMETHOD( CopyItems )( THIS_ IUnknown *, IShellItem * ) PURE;
STDMETHOD( DeleteItem )( THIS_ IShellItem *, IFileOperationProgressSink * ) PURE;
STDMETHOD( DeleteItems )( THIS_ IUnknown * ) PURE;
STDMETHOD( NewItem )( THIS_ IShellItem *, DWORD, LPCWSTR, LPCWSTR, IFileOperationProgressSink * ) PURE;
STDMETHOD( PerformOperations )( THIS ) PURE;
STDMETHOD( GetAnyOperationsAborted )( THIS_ BOOL * ) PURE;


Given this, all we need to do is to count how many methods we have till we find the one we want. In case we want this ones: RenameItem, RenameItems, MoveItem, MoveItems, CopyItem, CopyItems, DeleteItem and DeleteItems. As Gabriel Lopes, a friend, said on his tests, DeleteItem will aways call the base kernel32 API called DeleteFileA/W. But we are still hooking inside the interface to keep it standardized. Theier indexes are 12, 13, 14, 15, 16, 17 and 19. The interface GUID we need to look for before hooking is {3AD05575-8857-4850-9277-11B85BDB8E09}. Interface hooking is accomplished by hooking the API CoCreateInstance and comparing the GUID with that one.


All functions wich manages with more then one item, according to MSDN will receive something called PunkItems instead of only one ShellItem. This PunkItem can be a ShellItemArray or a DataObject. Those ShellItems have this method called GetDisplayName(), which will tell us the full path of the item being copied, moved or deleted. The ShellItemArray is an interfaced object with the key methods getCount() and getItemAt() that able us to walk trough the ShellItems. The DataObject itself was the one which gave me more work, basically, there is this API from shell32.dll called SHCreateShellItemArrayFromDataObject. Obvious unh? But I would never guess by my self the existence of this API. Anyway, it works and can convert the DataObject passed to DeleteItems, MoveItems and CopyItems to a ShellItem.

Another detail before we go into the code. Note that on the hooked methods there's a first param of type POINTER, which there's is not on the MSDN definitions. That's given because all method inside an interface must have somewhere in the function the "self" pointer.

Here's the code. Maybe you want to copy it to notepad or any editor for a better viewing. Ah, of course, you need to inject it in order to get other processes monitoring.
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/18 17:35:11
2楼: 那么问题来了,
你到底是要注入还是要调用?
----------------------------------------------
--
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/18 17:45:55
3楼: 能用就行了,

我想实现这功能,传入 文件路径,  阻止复制这些指定的文件。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/19 1:57:40
4楼: 那就是要注入咯。
远线程注入就可以了。
不过,看你引用了madcodehook了,那可以直接用madcodehook提供的方法注入就是了。
----------------------------------------------
--
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/19 9:42:02
5楼: bahamut8348 (leonna) 您好,能不能帮我看下,上面的ifo.dll怎么注入,给个例子,谢谢你。madcodehook 在下面网站里
http://www.madshi.net/
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/19 11:38:40
6楼: madcodehook的例子网上好多,这个东西自己看怎么折腾吧。
但是安全软件一扫就出来了。

就是注意一下库要和系统对应就可以了。
比如32位系统对应32位库,64位系统对应64位库。
----------------------------------------------
--
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/19 14:12:55
7楼: 传入 文件路径,调用ifo.dll里的哪个函数?怎么调用?
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/19 17:32:29
8楼: 这玩意注入到资源管理器里,给资源管理器用的。
各种输出函数并不是直接给你调用的。

是你在执行比如文件复制时,由资源管理器调用的。
----------------------------------------------
--
作者:
男 kkkmmm (KKKMMM) ▲▲▲▲△ -
注册会员
2018/8/19 21:09:37
9楼: DLL注入是给被注入对象调用,然后在实际的被Hook函数初始位置插入JUMP指令跳转至自己的处理函数,完了再选择继续传递或者不传递给原被Hook函数.
D7能用的MadCodeHook估计都是V2,没有64位支持,Bug不少,不过32位下面能用.
----------------------------------------------
-
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/20 9:15:06
10楼: 哪到低是怎么调用?能不能给个代码?谢谢了
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/20 10:27:31
11楼: 都告诉你关键字了。。。
“远线程注入”
还不知道怎么找就没办法了。
----------------------------------------------
--
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/20 10:52:21
12楼: 注入,哪英文说明中作者最后标明了,注入的例子也有,我一直问的是怎么调用我想要的功能。
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2018/8/20 10:56:22
13楼: 或者你弄个消息钩子,可以把你的DLL注入到指定的进程或全局注入。
远线程太敏感了,杀软会提示的
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/8/20 10:56:31
13楼: 你的代码被注入到了目标程序中。
你的代码是不是被执行,问目标程序去。
不然怎么叫 回调 呢?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/20 12:13:42
14楼: 都有例子了,还问啥。。。

都hook了,只是你提供回调函数给目标程序调用罢了。
怎么调用要看目标程序怎么调用。

文件操作在win下基本就是资源管理器。

具体你直接啃作者的说明不就可以了么?
都拿到人家的完整代码包了还不会用,那还怎么办?
----------------------------------------------
--
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/20 13:53:43
15楼: 好吧,你牛。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/8/20 14:02:19
16楼: 我看是楼主很牛。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/20 14:26:52
17楼: 代码我早就放在上面了,会用就不用问了,你们都牛。
我还第一次问问题,复了这么久,这么多,没有一行用的代码,还真是不可想像啊。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/8/20 15:09:20
18楼: 你自己都说有注入的例子,那还提供什么代码呢?

都告诉你关键字了。想直接要代码那网上不是一大把么?
这种通路代码贴的有什么意思呢?
----------------------------------------------
--
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/20 17:11:18
19楼: 你牛
----------------------------------------------
-
作者:
男 qq9077 (9077) ▲▲▲△△ -
注册会员
2018/8/20 19:09:35
20楼: function CoCreateInstance_cb() 是进行函数地址替换的

然后你的dll 加载后有个 
begin
   // coCreateInstance hook
   HookAPI( 'ole32.dll', 'CoCreateInstance', @CoCreateInstance_cb, @CoCreateInstance_np );
end.
你可以在这里加入一个sendmessage 往你的程序窗口发送一个消息
看下DLL在你loadlib后就收到消息还是要你 在调用一次
----------------------------------------------
-
作者:
男 bbm011 (bbm011) ★☆☆☆☆ -
盒子活跃会员
2018/8/21 9:52:02
21楼: 谢谢 qq9077 (9077)
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行31.25毫秒 RSS