极难!hook大师刘麻子请进:hookapi的重入问题。 ( 积分: 300 )

  • 主题发起人 主题发起人 hzm7512
  • 开始时间 开始时间
&quot;最起码也要知道你选择的位置不能把一条指令给拆开或破坏了&quot;<br>见http://www.delphibbs.com/delphibbs/dispq.asp?lid=2878699中的lmde单元
 
tt.t 能不能把你的邮箱留给我<br> M A S T E R C N @ 163 . COM
 
下面就是我使用的代码大挪移的方法,<br>在调用原函数时,不需要恢复原函数的代码<br><br>type<br> &nbsp;T_ShellAbout = function (Wnd: HWND; szApp, szOtherStuff: PAnsiChar; Icon: HICON): Integer; stdcall;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br> &nbsp;mi: TModuleInfo;<br> &nbsp;hd: THandle;<br> &nbsp;lp: PChar;<br> &nbsp;tf: PChar;<br> &nbsp;ntf: T_ShellAbout;<br> &nbsp;s, s1: String;<br> &nbsp;bf: String;<br>begin<br> &nbsp;SetLength(bf, 1024);<br> &nbsp;s := 'Test_Text_A';<br> &nbsp;s1 := 'Info';<br> &nbsp;hd := GetModuleHandle('shell32.dll');<br> &nbsp;tf := GetProcAddress(hd, 'ShellAboutA');<br> &nbsp;@ntf := tf;<br> &nbsp;ShowMessage(Format('Original: %P', [@ntf]));<br> &nbsp;ntf(Handle, 'test', 'fad',<br> &nbsp; &nbsp;LoadIcon(HInstance, 'MAINICON'));<br> &nbsp;if GetModuleInformation(<br> &nbsp; &nbsp;GetCurrentProcess, hd, @mi, SizeOf(mi)) then<br> &nbsp;begin<br> &nbsp; &nbsp;Caption := Format('%P, %d', [mi.lpBaseOfDll, mi.SizeOfImage]);<br> &nbsp; &nbsp;lp := VirtualAlloc(nil, mi.SizeOfImage,<br> &nbsp; &nbsp; &nbsp;MEM_COMMIT, PAGE_EXECUTE_READWRITE);<br> &nbsp; &nbsp;if lp &lt;&gt; nil then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;CopyMemory(lp, mi.lpBaseOfDll, mi.SizeOfImage);<br> &nbsp; &nbsp; &nbsp;@ntf := tf - mi.lpBaseOfDll + lp;<br> &nbsp; &nbsp; &nbsp;ShowMessage(Format('TheCopy: %P', [@ntf]));<br> &nbsp; &nbsp; &nbsp;ntf(Handle, 'test', 'fad',<br> &nbsp; &nbsp; &nbsp; &nbsp;LoadIcon(HInstance, 'MAINICON'));<br> &nbsp; &nbsp; &nbsp;VirtualFree(lp, 0, MEM_RELEASE);<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;<br><br>procedure TForm1.Button3Click(Sender: TObject);<br>begin<br> &nbsp;//必须加上这一行,否则shell32.dll 不会被加载<br> &nbsp;ShellAbout(Handle, 'test', 'fad',<br> &nbsp; &nbsp;LoadIcon(HInstance, 'MAINICON'));<br>end;
 
lich, <br>呵呵,搬的够彻底。<br>dbin[At]sohu.com
 
呵呵,<br>最简单也是最有效的方法,不过却不容易想到<br>而且,被HOOK 的DLL却要多占一倍的内存,<br>如果对系统中的几十个进程的一个很大的DLL进行HOOK,<br>浪费的内存就可想而知了
 
这样作的好处是,如果挪走的代码中有对相对地址的访问不会出现问题,如果仅搬走几条指令就需要对指令进行分析,必要时进行修正。<br>不过挪走的代码有对自身绝对地址的访问时还会有问题,<br>不过这种情况很少发生,<br>我认为在能通过分析解决的情况下还是只要挪走几条指令就好了,全都搬走太兴师动众了。<br>不过这种方法对跟踪/破解程序还是有用处的。
 
对于自身绝对地址的访问,<br>实际上会转向原来的DLL 中的函数,是没有问题的<br><br>我刚开始想的就是挪走几条指令,<br>但难度太大:<br>1.要分析指令的字节数,避免破坏指令<br>2.如果挪走的指令中包含了相对地址的跳转和调用,则需要自己将其翻译为绝对地址的跳转<br><br>虽然这些都可以通过程序来实现,但是需要考虑很多种情况,<br>对机器代码的分析也没有现成的程序或工具,难度较大<br><br>如果能解决上面的那两个问题,就不用这样全部复制了
 
“对于自身绝对地址的访问,实际上会转向原来的DLL 中的函数”<br>就是啊,如果访问的刚好是你hook替换掉的部分就可能出问题了
 
to lich: 用代码转移的方法将hook的函数转移掉,如果我想访问原理的函数,该怎么办?<br>如果能调用的话,在调用期间能不能hook其它程序也在调用这个函数呢?
 
看我上面的代码, 有对原函数的调用,也有对复制出来的函数的调用<br>当你修改了原函数, 需要再调用修改前的函数时, 则需要调用复制出来的函数<br><br>使用这种方法, 一个函数即使被多次HOOK 也不会有问题,<br>但如果进行回复可能就会有问题的<br><br>HOOK时, 通过Windows Hook ,例如键盘,鼠标钩子,或者消息钩子,<br>可以修改任何一个进程的函数内容, 根据进程信息来判断是否进行HOOK<br>也可以根据需要针对某个进程进行HOOK, 可以自己灵活控制的
 
谢谢各位大家了,上个星期不知道为什么上不了大富翁了,现在结贴放分.
 
to hzm7512,问题解决了吗?能否告知如何解决的呢?谢了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
676
import
I
后退
顶部