您的位置:程序门 -> delphi -> windows sdk/api



apihook的菜鸟问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


apihook的菜鸟问题[已结贴,结贴人:fbiboss]
发表于:2008-01-14 21:01:40 楼主
为什么一直出错呀


unit       apihook       ;

interface      

uses      
    sysutils,       windows,       winsock,     dialogs;

type
    {       要hook的api函数定义       }
        twidetomulti       =       function       (cp:cardinal;     deflags:cardinal;   lpwidechar:pwidechar;
        cchwidechar:integer;         lpmultibytestr:pansichar;       cchmultibyte:integer;
        lpdefaultchar:pansichar;       lpuseddefaultchar:pbool):       integer;       stdcall;
             

    procedure       hookapi;
    procedure       unhookapi;

var  
        processhandle:       hwnd;
        baseaddress:       array       [0..2]       of       pointer;  
        oldproc:       array       [0..2]       of       array       [0..7]       of       byte;
        newporc:       array       [0..2]       of       array       [0..7]       of       byte;

implementation  

function       mywidetomulti(cp:cardinal;     deflags:cardinal;   lpwidechar:pwidechar;
        cchwidechar:integer;         lpmultibytestr:pansichar;       cchmultibyte:integer;
        lpdefaultchar:pansichar;       lpuseddefaultchar:pbool):       integer;       stdcall;
var
        nsize:       cardinal;
begin
        showmessage('已经调用自己');   可以弹出这句,可是接下来就出错了
        //showmessage(string(lpwidechar));
        writeprocessmemory(processhandle,       baseaddress[0],       @oldproc[0],       8,       nsize);
      result       :=   widechartomultibyte(cp,     deflags,   lpwidechar,
        cchwidechar,         lpmultibytestr,       cchmultibyte,
        lpdefaultchar,       lpuseddefaultchar)   ;
          writeprocessmemory(processhandle,       baseaddress[0],       @newporc[0],       8,       nsize);//在程序正常打開後再修改成自定義函數的地址,使所有程序在下次打開時都要先調用自定義函數
        //   unhookapi;
end;

procedure       hookapi;
var  
        dllmodule:       thandle;
        nsize:       cardinal;  
        dat:       dword;
        tmp       :       array       [0..3]       of       byte;  
begin  
        processhandle       :=       dword(-1);  
        dllmodule       :=       loadlibrary('kernel32.dll');
        {       系统函数入口点地址       }
        baseaddress[0]       :=       getprocaddress(dllmodule,'widechartomultibyte');
        dat       :=       dword(@mywidetomulti);
        move(dat,       tmp,       4);  
        newporc[0][0]       :=       $b8;       {       汇编跳转指令       }  
        newporc[0][1]       :=       tmp[0];       {       跳转到自身的函数       }  
        newporc[0][2]       :=       tmp[1];  
        newporc[0][3]       :=       tmp[2];  
        newporc[0][4]       :=       tmp[3];  
        newporc[0][5]       :=       $ff;  
        newporc[0][6]       :=       $e0;  
        newporc[0][7]       :=       0;  
        {       读取系统函数内存地址       }  
        readprocessmemory(processhandle,       baseaddress[0],       @oldproc[0],       8,       nsize);  
        {       用自己的函数地址覆盖系统的函数地址       }  
        writeprocessmemory(processhandle,       baseaddress[0],       @newporc[0],       8,       nsize);  
        closehandle(processhandle);  
end;  

procedure       unhookapi;
var  
        nsize:       cardinal;  
begin
        {       恢复所修改的地址       }
        writeprocessmemory(processhandle,       baseaddress[0],       @oldproc[0],       8,       nsize);
end;  

end.
发表于:2008-01-14 22:42:021楼 得分:20
api   入口的字节对齐问题?自己debug看看嘛~呵呵
发表于:2008-01-15 08:19:552楼 得分:0
我不会呀,就这也是抄别人的改了下就出错了,
是不是不同的函数指令长度不一样啊?具体怎么改了呀???
发表于:2008-01-15 10:18:523楼 得分:20
顶,学习中...
发表于:2008-01-17 09:12:484楼 得分:10
帮顶


快速检索

最新资讯
热门点击