关于HOOK API的问题,也许只是数据操作的问题,100分求救~~~

rappercn 2005-09-09 01:38:57
我在网上找了一段用于hook ws2_32.dll中recv和send函数的api,编译之后可以正常使用,但是有一个地方有问题,想了两天不知道怎么改才好,麻烦大家帮我看看。

{---------------------------------------}
{函数功能:Recv函数的HOOK
{函数参数:同Recv
{函数返回值:integer
{---------------------------------------}
function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
dwSize: cardinal;
begin

//这儿进行接收的数据处理
TByteArray(Buf)[0] := 254;

//调用直正的Recv函数
WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);
Result := OldRecv(S, Buf, len, flags);
JmpCode.Address := @MyRecv;
WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);
end;

上面这个函数,实现了hook recv函数的功能,其中:
TByteArray(Buf)[0] := 254;
是我对该字节数组的修改,也就是说不管收到什么,都把第一位改成FE,我这样改了之后,通过写log,发现TByteArray(Buf)[0]确实是变了,但是再交给recv函数处理后,recv接收到的Buf还是我修改以前的。

该DLL确实已经实现了hook功能,就是这里我弄不明白,谁知道为什么的给我讲一下啊。
...全文
180 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleeplions 2005-09-17
  • 打赏
  • 举报
回复
标记,学习,没有做实验,会不会myrecv修改的是一个拷贝????
mbmseason 2005-09-14
  • 打赏
  • 举报
回复
受教
rappercn 2005-09-14
  • 打赏
  • 举报
回复
问得我已经没信心了,再等一天,没人知道走人了。
rappercn 2005-09-10
  • 打赏
  • 举报
回复
我是在学这个东西,但是现在急用,谁能告诉我,问题出在什么地方吗?
rappercn 2005-09-10
  • 打赏
  • 举报
回复
看不懂啊,各位前辈,不要离开我的主题啊。

我的问题怎么就没人关心呢?
ly_liuyang 2005-09-10
  • 打赏
  • 举报
回复
呵呵
我当然使用我说的方法实现了几乎全部API的Hook方法

采用查表,就可以实现代码对齐!!!!!!

看X86手册就有的

给出部分表

OneByteOpcodes: array[char] of string =
// 0
('add #Eb , #Gb ', 'add #Ev , #Gv ', 'add #Gb , #Eb ', 'add #Gv , #Ev ',
'add al, #Hb ', 'add @eax, #Hv ', 'push es', 'pop es',
'or #Eb , #Gb ', 'or #Ev , #Gv ', 'or #Gb , #Eb ', 'or #Gv , #Ev ',
'or al, #Ib ', 'or @eax, #Iv ', 'push cs', '@c2',
// 1
'adc #Eb , #Gb ', 'adc #Ev , #Gv ', 'adc #Gb , #Eb ', 'adc #Gv , #Ev ',
'adc al, #Ib ', 'adc @eax, #Iv ', 'push ss', 'pop ss',
'sbb #Eb , #Gb ', 'sbb #Ev , #Gv ', 'sbb #Gb , #Eb ', 'sbb #Gv , #Ev ',
'sbb al, #Ib ', 'sbb @eax, #Iv ', 'push ds', 'pop ds',
// 2
'and #Eb , #Gb ', 'and #Ev , #Gv ', 'and #Gb , #Eb ', 'and #Gv , #Ev ',
'and al, #Ib ', 'and @eax, #Iv ', '@pe', 'daa',
'sub #Eb , #Gb ', 'sub #Ev , #Gv @m ', 'sub #Gb , #Eb ', 'sub #Gv , #Ev @m ',
'sub al, #Ib ', 'sub @eax, #Iv ', '@pc', 'das',
// 3
'xor #Eb , #Gb ', 'xor #Ev , #Gv ', 'xor #Gb , #Eb ', 'xor #Gv , #Ev ',
'xor al, #Ib ', 'xor @eax, #Iv ', '@ps', 'aaa',
'cmp #Eb , #Gb ', 'cmp #Ev , #Gv ', 'cmp #Gb , #Eb ', 'cmp #Gv , #Ev ',
'cmp al, #Ib ', 'cmp @eax, #Iv ', '@pd', 'aas',
// 4
'inc @eax', 'inc @ecx', 'inc @edx', 'inc @ebx',
'inc @esp', 'inc @ebp', 'inc @esi', 'inc @edi',
'dec @eax', 'dec @ecx', 'dec @edx', 'dec @ebx',
'dec @esp', 'dec @ebp', 'dec @esi', 'dec @edi',
// 5
'push @eax', 'push @ecx', 'push @edx', 'push @ebx',
'push @esp', 'push @ebp', 'push @esi', 'push @edi',
'pop @eax', 'pop @ecx', 'pop @edx', 'pop @ebx',
'pop @esp', 'pop @ebp', 'pop @esi', 'pop @edi',
// 6
'pusha', 'popa', 'bound #Gv , #Ma ', 'arpl #Ew , #Gw ',
'@pf', '@pg', '@so', '@sa',
'push #Iv ', 'imul #Gv , #Ev , #Iv ', 'push #Ib ', 'imul #Gv , #Ev , #Ib ',
'insb', 'ins@o4', 'outsb', 'outs@o4',
// 7
'jo #Jbj', 'jno #Jbj', 'jb #Jbj', 'jnb #Jbj',
'jz #Jbj', 'jnz #Jbj', 'jbe #Jbj', 'jnbe #Jbj',
'js #Jbj', 'jns #Jbj', 'jp #Jbj', 'jnp #Jbj',
'jl #Jbj', 'jnl #Jbj', 'jle #Jbj', 'jnle #Jbj',
// 8
'@ga#Eb , #Ib ', '@ga#Ev , #Iv ', '@ga#Ev , #Ib ', '@ga#Ev , #Hb ',
'test #Eb , #Gb ', 'test #Ev , #Gv ', 'xchg #Eb , #Gb ', 'xchg #Ev , #Gv ',
'mov #Eb , #Gb ', 'mov #Ev , #Gv ', 'mov #Gb , #Eb ', 'mov #Gv , #Ev ',
'mov #Ew , #Sw ', 'lea #Gv , #M ', 'mov #Sw , #Ew ', 'pop #Ev ',
// 9
'nop', 'xchg eax, @ecx', 'xchg eax, @edx', 'xchg eax, @ebx',
'xchg eax, @esp', 'xchg eax, @ebp', 'xchg eax, @esi', 'xchg eax, @edi',
'c@o2@o4@e ', 'c@o4@o8', 'call #Ap ', 'wait',
'pushf #Fv ', 'pop #Fv ', 'sahf', 'lahf',
// A
'mov al, #Ob ', 'mov @eax, #Ov ', 'mov #Ob , al', 'mov #Ov , @eax',
'movsb', 'movs@o4', 'cmpsb', 'cmps@o4',
'test al, #Ib ', 'test @eax, #Iv ', 'stosb', 'stos@o4',
'lodsb', 'lods@o4', 'scasb', 'scas@o4',
// B
'mov al, #Ib ', 'mov cl, #Ib ', 'mov dl, #Ib ', 'mov bl, #Ib ',
'mov ah, #Ib ', 'mov ch, #Ib ', 'mov dh, #Ib ', 'mov bh, #Ib ',
'mov @eax, #Iv ', 'mov @ecx, #Iv ', 'mov @edx, #Iv ', 'mov @ebx, #Iv ',
'mov @esp, #Iv ', 'mov @ebp, #Iv ', 'mov @esi, #Iv ', 'mov @edi, #Iv ',
// C //Fixed by DaFixer from 'ret #Ib '
'@gb#Eb , #Ib ', '@gb#Ev , #Ib ', 'ret #Iw ', 'ret',
'les #Gv , #Mp ', 'lds #Gv , #Mp ', 'mov #Eb , #Ib ', 'mov #Ev , #Iv ',
'enter #Lw , #Ib ', 'leave', 'ret #Lw ', 'ret',
'int 3', 'int #Ib ', 'into', 'iret',
// D
'@gb#Eb , 1', '@gb#Ev , 1', '@gb#Eb , cl', '@gb#Ev , cl',
'aam', 'aad', '%c ', 'xlat',
'@ca', '@cb', '@cc', '@cd',
'@ce', '@cf', '@cg', '@ch',
// E
'loopn #Jbj', 'loope #Jbj', 'loop #Jbj', 'jcxz #Jbj',
'in al, #Ib ', 'in @eax, #Ib ', 'out #Ib , al', 'out #Ib , @eax',
'call #Jvc', 'jmp #Jvj', 'jmp #Ap ', 'jmp #Jbj',
'in al, dx', 'in @eax, dx', 'out dx, al', 'out dx, @eax',
// F
'lock', '%c ', 'repne', 'rep',
'hlt', 'cmc', '@gc#Eb @h1', '@gc#Ev @h2 ',
'clc', 'stc', 'cli', 'sti',
'cld', 'std', '@gd@h3', '@ge@h4');


_____________________
http://lysoft.7u7.net
mbmseason 2005-09-09
  • 打赏
  • 举报
回复
质疑ly_liuyang所说的安全方法:

ly_liuyang说的原代码中的不安全因素是由于API具有可重入性,并行执行的其他线程可能在API入口恢复的情况下执行该API函数。
ly_liuyang所谓的安全方法是将API入口处的某几个字节的代码移动到自己定义的代码的末端,并在其后添加转移指令,使得该API被调用时,先执行自定义代码,再执行移动的原API代码,再跳转到原API的截断部分继续执行。但是,问题出在你如何能够确定你移动的那几个字节的原API代码不会将一个机器指令割裂!?即使你通过反汇编DLL得到该API的前N个可以正常截断的代码,但是,不同API的代码是不同的,这使你的代码对不同API不具有通用性,而且,不同系统上同名的API编码也是有差别的,这又使你的代码不易在不同平台间移植。如果要将这种代码设计为通用的,那么付出的劳动量将非常大!
个人认为,要解决重入的不安全问题,可行的是尽量缩小自定义代码执行的相对时间。而缩小自定义代码执行的相对时间的简易方法是在自定义代码的头部将同进程中的其他所有线程挂起,代自定义代码执行结束后恢复各线程。

另外,对于不了解汇编的程序员,做API HOOK的简易方法是使用第三方提供的中间代码(好象微软自身就写了这样的一个代码,有兴趣可以去查一下)
rappercn 2005-09-09
  • 打赏
  • 举报
回复
问题还是没解决啊,难道此方法不行吗?不考虑安全问题的话,该怎么做才好呢?
kongguangming 2005-09-09
  • 打赏
  • 举报
回复
你需要看一看tcp/ip的书籍,对网络传输的数据格式有个了解。
ly_liuyang 2005-09-09
  • 打赏
  • 举报
回复
这样的Hook存在线程安全问题
API是可以重入的

你在修改数据的时候,如果别的线程也调用这个API,会出现什么情况?

可靠的方法是复制API入口(最少5Bytes并注意机器码对齐,假设地址为A)到新的地方(地址为B),然后添加"JMP到A+5这个地址"这个机器码
调用原来的API就Call那个新地方B就是的

具体实现方法不便公开

_____________________
http://lysoft.7u7.net
abc3000 2005-09-09
  • 打赏
  • 举报
回复
看着眼熟,超级猛料里面的?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧