不知道这么问是否正确!
应用程序A运行后 释放了B 并且运行B 当B运行完成 A继续运行
如果用C来实现 禁止A调用B这个过程!能解决问题的,或能说出应该怎么实现的哥们,分不够说话!

解决方案 »

  1.   

    HOOK CreateProcess这个API就可以做到...
      

  2.   

    使用APIHook技术
    Hook:CreateProcess这个API
    我在CSDN上的FAQ有提到的,自己去找了Power by
    http://lysoft.7u7.net
      

  3.   

    楼上两位,可以具体点说明吗?我自己再研究一下.我对HOOK技术实在不很了解.希望得到你们的帮助,谢谢!
      

  4.   

    其实有个简单办法,如果只想禁止A调用B的语,你用C给B改个名不就得了...
    如果你觉得这样不行的话,那再讨论HOOK的办法吧~
      

  5.   

    转API HOOK的例子数据定义单元unit DefUnit;interfaceusesMessages, Windows;constWM_GETWORD = WM_USER + Ord('Y') + Ord('y') + Ord('g') + Ord('w');csMappingFileName = 'Mapping File By Yygw'; //内存映象名csMaxStringLen = 64; //最大字符串长度csCodeSize = 4096; //加载到内存映象视图的代码长度csJmpCode = $E9; //跳转指令机器码csGdiName = 'GDI32'; //GDI32.DLLcsApiFunName = 'ExtTextOutA'; //函数名csUserName = 'HOOK_DLL'; //用户DLL名csUserFunName = 'MyExtTextOutA'; //用户函数名typeTIDT = array [0..5] of Byte; //IDT表TLongJump = packed record //跳转指令JmpOp: Byte; //操作码Addr: Pointer; //地址end;PShareMem = ^TShareMem;TShareMem = packed record//以下参数面向主程序hProcWnd: HWND; //应用程序主窗口hHookWnd: HWND; //当前挂钩窗口hProc: THandle; //应用程序进程IDpMouse: TPoint; //鼠标位置HookDelay: Cardinal; //取词延时(ms)Enabled: Boolean; //允许取词lpText: array[0..csMaxStringLen] of Char; //当前取到的词TextRect: TRect; //当前文本框 //以下参数内部使用lpOldExtTextOutA: Pointer; //旧函数入口lpNewExtTextOutA: Pointer; //自定义函数入口lpRing0_WriteMemory: Pointer; //挂接函数入口lpOldRing0_WriteMemory: Pointer; //旧代码入口AllowTake: Boolean; //可以取词OldCode: TLongJump; //旧函数代码NewCode: TLongJump; //跳转代码lpSour, lpDes: Pointer; //内存复制地址lpOldGate: DWord; //旧中断门入口IDT: TIDT; //IDT数据Code: array [0..csCodeSize - 1] of Byte; //代码区end;constSizeOfLongJump = SizeOf(TLongJump);varpShMem: pShareMem; //指向一块>2G的共享地址implementationend.//Api挂接单元,需调试unit ApiHook;interfaceusesMessages, Windows;function InitApiHook: Boolean; //初始化挂接function InstallApi: Boolean; //挂接ExtTextOutAfunction UnInstallApi: Boolean; //卸去挂接function CloseApiHook: Boolean; //关闭挂接implementationusesDefUnit; varpHookMem: PShareMem; //伪指针,实际代码中被替换为pShMemhMappingFile: THandle; //映象文件句柄Inited: Boolean; //已初始化Hooked: Boolean; //已挂接constcsExceptionUsed = 5; //中断号//跳到Ring0修改内存的过程//源地址和目标地址放在pShMem^.lpSour和lpDes中//实际代码被加载到pShMem^.Code中可由所有进程共享调用运行//内部的pHookMem被替换为pShMem的值procedure Ring0_WriteMemory;asmPUSHA //保存现场LEA EAX, pHookMemSIDT TShareMem([EAX]).IDT //获取 IDTMOV EBX, DWORD PTR [TShareMem([EAX]).IDT + 2]ADD EBX, 8 * csExceptionUsed //Ebx -> IDT 中 csExceptionUsed 中断入口CLI //清中断MOV DX, WORD PTR [EBX + 6] //保存中断门高字SHL EDX, 16MOV DX, WORD PTR [EBX] //低字MOV DWORD PTR [TShareMem([EAX]).lpOldGate], EDX //计算实际运行的代码和原代码的地址差MOV ECX, DWORD PTR [TShareMem([EAX]).lpRing0_WriteMemory]SUB ECX, DWORD PTR [TShareMem([EAX]).lpOldRing0_WriteMemory]LEA EAX, @Ring0Code //"安装挂钩" - 用户中断门ADD EAX, ECX //获得运行代码的@Ring0Code地址MOV WORD PTR [EBX], AX //低字SHR EAX, 16MOV WORD PTR [EBX + 6], AX //高字DB $CD, csExceptionUsed //INT csExceptionUsed 的机器码//触发中断跳到Ring0代码LEA EAX, pHookMemMOV EBX, DWORD PTR [TShareMem([EAX]).IDT + 2] //恢复中断门ADD EBX, 8 * csExceptionUsedMOV EDX, DWORD PTR [TShareMem([EAX]).lpOldGate]MOV WORD PTR [EBX], DXSHR EDX, 16MOV WORD PTR [EBX +6], DXJMP @Exit@Ring0Code: //运行在Ring0下的代码CLILEA EAX, pHookMemMOV EBX, TShareMem[EAX].lpSour //源地址MOV EDX, TShareMem[EAX].lpDes //目标地址MOV ECX, SizeOfLongJump@Loop:MOV AL, [EBX] //内存复制MOV [EDX], ALINC EBXINC EDXLOOP @LoopIRETD //返回到Ring3@Exit:POPA //恢复现场end;//用户的ExtTextOutA函数//实际代码被加载到pShMem^.Code中可由所有进程共享调用运行//内部的pHookMem被替换为pShMem的值procedure MyExtTextOutA;asmPUSH EBPMOV EBP, ESP//以下代码用SoftICE跟踪调试时正常//但实际使用时在窗口最小化或鼠标指向快速启动栏时死机{PUSH EBXPUSH ECXPUSH EDXPUSH ESIPUSH EDI//恢复原ExtTextOutA代码LEA EAX, pHookMemLEA EBX, TShareMem([EAX]).OldCode //旧函数代码MOV TShareMem([EAX]).lpSour, EBXMOV EBX, TShareMem([EAX]).lpOldExtTextOutA //旧函数入口MOV TShareMem([EAX]).lpDes, EBXMOV EBX, TShareMem([EAX]).lpRing0_WriteMemoryCALL EBX //调用Ring0_WriteMemory恢复原函数代码//调用原ExtTextOutAMOV EAX, [EBP + $24] //lpDxPUSH EAXMOV EAX, [EBP + $20] //cbCountPUSH EAXMOV EAX, [EBP + $1C] //lpStringPUSH EAXMOV EAX, [EBP + $18] //lprcPUSH EAXMOV EAX, [EBP + $14] //fuOptionsPUSH EAXMOV EAX, [EBP + $10] //YPUSH EAXMOV EAX, [EBP + $0C] //XPUSH EAXMOV EAX, [EBP + $08] //hdcPUSH EAXLEA EAX, pHookMemMOV EBX, TShareMem([EAX]).lpOldExtTextOutACALL EBXPUSH EAX //返回结果//重新挂接ExtTextOutALEA EAX, pHookMemLEA EBX, TShareMem([EAX]).NewCode //跳转指令MOV TShareMem([EAX]).lpSour, EBXMOV EBX, TShareMem([EAX]).lpOldExtTextOutA //原函数入口MOV TShareMem([EAX]).lpDes, EBXMOV EBX, TShareMem([EAX]).lpRing0_WriteMemoryCALL EBX //调用Ring0_WriteMemory重新挂接POP EAXPOP EDIPOP ESIPOP EDXPOP ECXPOP EBX}MOV EAX, False //调试时用,返回假@Exit:POP EBP //返回RET $20end;
      

  6.   

    //安装Api挂钩function InstallApi: Boolean;varpHookCode: Pointer; //要加载到pShMem^.Code中的代码入口CodeSize: Integer; //实际代码长度pInt: PInteger; //指向一个32位整数i: Integer;Ring0Fun: Pointer; //实际的Ring0_WriteMemory入口beginResult := False;if Hooked or not Inited thenExit; //已挂接过或未初始化Hooked := False;pShMem^.lpOldExtTextOutA := GetProcAddress(GetModuleHandle(csGdiName),csApiFunName); //原函数入口if pShMem^.lpOldExtTextOutA <> nil thenbegin//pShMem^.lpOldExtTextOutA := Pointer($BFF21CB8);//我的机器上有别的挂钩程序,得不到ExtTextOutA的正确地址,只好手动修改pHookCode := @Ring0_WriteMemory; //要加载到pShMem^.Code的代码入口CodeSize := Cardinal(@InstallApi) - Cardinal(@Ring0_WriteMemory);CopyMemory(@pShMem^.Code, pHookCode, CodeSize); //复制代码for i := 0 to CodeSize - 1 doif Cardinal((@pShMem^.Code[i])^) = Cardinal(@pHookMem) thenbeginpInt := @pShMem^.Code[i]; //查找代码中的pHookMem并将它替换为pShMempInt^ := Cardinal(pShMem);end;pShMem^.lpRing0_WriteMemory := @pShMem^.Code; //Ring0_WriteMemory入口pShMem^.lpOldRing0_WriteMemory := @Ring0_WriteMemory; //原始代码入口pShMem^.lpNewExtTextOutA := Pointer(Cardinal(@pShMem^.Code) +Cardinal(@MyExtTextOutA) - Cardinal(@Ring0_WriteMemory)); //用户ExtTextOutA入口CopyMemory(@pShMem^.OldCode, pShMem^.lpOldExtTextOutA, SizeOf(TLongJump)); //保存原函数代码pShMem^.NewCode.JmpOp := csJmpCode; //产生跳转代码pShMem^.NewCode.Addr := Pointer(Cardinal(pShMem^.lpNewExtTextOutA) -Cardinal(pShMem^.lpOldExtTextOutA) - SizeOf(TLongJump));pShMem^.lpSour := @pShMem^.NewCode; //新跳转代码pShMem^.lpDes := pShMem^.lpOldExtTextOutA; //原函数入口Ring0Fun := pShMem^.lpRing0_WriteMemory; //Ring0_WriteMemory入口asmMOV EAX, Ring0Fun //挂接MyExtTextOutACALL EAXend;Result := True;Hooked := True;end;end;//释放Api挂钩function UnInstallApi: Boolean;varRing0Fun: Pointer; //实际的Ring0_WriteMemory入口beginif not Hooked thenbeginResult := False;Exit;end;pShMem^.Enabled := False;pShMem^.AllowTake := False;pShMem^.lpSour := @pShMem^.OldCode; //原函数代码pShMem^.lpDes := pShMem^.lpOldExtTextOutA; //原函数入口Ring0Fun := pShMem^.lpRing0_WriteMemory; //Ring0_WriteMemory入口asmMOV EAX, Ring0Fun //恢复原函数代码CALL EAXend;Hooked := False;Result := True;end;//创建内存映象文件,初始化Api挂接环境function InitApiHook: Boolean;beginInited := False;Hooked := False;hMappingFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,SizeOf(TShareMem), PChar(csMappingFileName)); //文件映象if hMappingFile <> 0 thenbeginpShMem := PShareMem(MapViewOfFile(hMappingFile, FILE_MAP_WRITE, 0, 0, 0));if pShMem <> nil then //映射视图,得到一块地址>2G被所有进程共享的空间beginZeroMemory(pShMem, SizeOf(TShareMem)); //数据块清零Inited := True;end else beginCloseHandle(hMappingFile); //无法创建内存块MessageBox(GetCurrentProcess, 'Cannot create the Share Memory Block!', 'Error', MB_OK)end;endelseMessageBox(GetCurrentProcess, 'Cannot create the Share Memory Block!', 'Error', MB_OK); //无法创建文件映象Result := Inited;end;//关闭映象文件,释放共享内存块function CloseApiHook: Boolean;beginif not Inited thenbeginResult := False;Exit;end;UnInstallApi; //取消挂接UnMapViewOfFile(pShMem); //释放内存块CloseHandle(hMappingFile); //关闭句柄Inited := False;Result := True;end;end.测试用主窗口单元unit MainFrm;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTMainForm = class(TForm)cbHook: TCheckBox;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure cbHookClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varMainForm: TMainForm;implementationuses ApiHook;{$R *.DFM}procedure TMainForm.FormCreate(Sender: TObject);beginInitApiHook;InstallApi;end;procedure TMainForm.FormDestroy(Sender: TObject);beginCloseApiHook;end;procedure TMainForm.cbHookClick(Sender: TObject);beginif cbHook.Checked thenInstallApielseUnInstallApi;end;end. 
     
      

  7.   

    to pankun(剑神一笑):
    我也想改掉B的名字 或者 做替换,可是A可以自动释放出B 然后在执行.除非替换包含在A里的B,这样必须修改A了!我对HOOK了解很少 只是最近才发现这个比较有用.才开始研究地.希望你辅导,辅导!
      

  8.   

    哦,看来只有用HooK CreateProcess来实现了:)
    你自己先试一下吧.
      

  9.   

    to huojiehai(海天子) 可能是我没说明白
    A程序不是我做的
    B程序是反黑程序C才是 我要去写的程序