没想通,想不通,不懂求高手帮助.函数作为参数问题.(300分)

  • 主题发起人 startzero
  • 开始时间
S

startzero

Unregistered / Unconfirmed
GUEST, unregistred user!
例子:<br>原函数<br>function add(a,b:integer):integer;<br>begin<br><br>end;<br>另一函数<br>function new(myadd pointer):integer;<br>begin<br>end;<br>在原函数作为另一函数的参数进行处理.<br>new(@add) &nbsp; &nbsp; &nbsp; //那原来的函数参数怎么办,原来的函数没办法带上自己的参数.<br>还有另外一个附加问题,多线程中,线程函数原来的返回值怎么得到.
 
有没高手帮个忙啊,卡住了,不知道怎么办.急啊,在线等...<br>函数作为按地址做为参数传递.原函数的参数要怎么办啊,
 
type<br>&nbsp; TAdd = function(a,b:integer):integer;<br><br>function Add(a,b:integer):integer;<br>begin<br>....<br>end;<br><br>function NewFunc(func: TAdd; a, b:integer): integer;<br>begin<br>&nbsp; Result := func(a, b);<br>end;<br><br>var<br>&nbsp; f : TAdd;<br>&nbsp; a, b: integer;<br>&nbsp; r:integer;<br>begin<br>&nbsp; f := Add;<br>&nbsp; a:=1;b:=2;<br>&nbsp; r := NewFunc(f, a, b);<br>end;<br><br><br>附加问题没有理解你的意思,不知道你说的原来的返回值是什么
 
学习,学习...
 
原函数<br>procedure down(); <br>var<br>&nbsp; Address:pointer;<br>begin<br>Address:=pointer($121ddf); &nbsp; &nbsp;//目的就是要加个变量,使变量=$121ddf<br>&nbsp; asm<br>&nbsp; &nbsp; pushad<br>&nbsp; &nbsp; call Address<br>&nbsp; &nbsp; popad<br>end;<br>end;<br>调用函数<br>procedure CallFunc(MyCall:pointer);stdcall; &nbsp;//调用的远程声请<br>var<br>&nbsp; ProcAddress:pointer; //申请的内存地址<br>&nbsp; NumberOfByte:Dword; //辅助返回值<br>&nbsp; TempHandle:Thandle; &nbsp;//远程句柄<br>begin<br>&nbsp; ProcessH:=OpenProcess(PROCESS_ALL_ACCESS, false, processid);<br>&nbsp; //申请内存<br>&nbsp; ProcAddress:=VirtualAllocEx(ProcessH,nil,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE);<br>&nbsp; //写内存<br>&nbsp; WriteProcessMemory(ProcessH,ProcAddress,mycall,4096,NumberOfByte);<br>&nbsp; //远程运行<br>&nbsp; TempHandle:=CreateRemoteThread(ProcessH,nil,0,ProcAddress,nil,0,NumberOfByte);<br>&nbsp; //等待结束<br>&nbsp; WaitForSingleObject(TempHandle,INFINITE);<br>&nbsp; //释放远程句柄<br>&nbsp; CloseHandle(TempHandle);<br>&nbsp; //释放申请有内存<br>&nbsp; VirtualFreeEx(ProcessH,ProcAddress,4096,MEM_RELEASE);<br>&nbsp; closehandle(ProcessH);<br>end;<br>实现:<br>callfunc(@down);<br>这里没法带上原函数变量.求个解决办法.让$121ddf用变量代替而不是内存地址常量.
 
是这个意思?<br><br>function CallFunc(pf: Pointer; a,b: integer): integer;<br>begin<br>&nbsp; asm<br>&nbsp; mov eax, a<br>&nbsp; mov edx, b<br>&nbsp; call pf<br>&nbsp; end;<br>end;<br><br><br>procedure MyAdd(a, b: Integer); register;<br>begin<br>&nbsp; showmessage(Format('%d + %d = %d', [a,b,a+b]));<br>end;<br><br>procedure TForm32.Button2Click(Sender: TObject);<br>var<br>&nbsp; a, b: integer;<br>&nbsp; p : pointer;<br>begin<br>&nbsp; a := 1;<br>&nbsp; b := 2;<br>&nbsp; p := @MyAdd;<br>&nbsp; callfunc(p,a,b);<br>end;
 
你的方法是可以有参数.<br>不过我主要目的不是变量参数.我是想把内存中的函数地址作为参数.<br>这是一个游戏外挂的用途.游戏更新,CALL函数地址随着更新.我需要把这个当作变量.<br>我再看看从你例子能不能得到启发.<br>最好你能帮我修改看看能不能实现.<br>还有就是pointer($121ddf);中,把$121ddf换成单元中的全局变量,竟然会通过编译,但运行后得不到效果.游戏会被关掉.也就是说获取不到那个全局变量的值.我用那个全量变量的数值进去没有问题.<br>单个函数来说,引用单元中的全局变量应该是可以引用的到的.不懂是什么问题.单个函数调用可以,用上面的回调.二次调用就出错.
 
用汇编是最好的方式
 
你的思路没有问题,技术上也是可行的。<br><br>$121ddf 是游戏中某个函数的地址吧?你调用当然没有问题,但是如果换成当前程序<br>的全局变量可就不行了,因为你这段代码是在游戏的进程空间内执行的,同样的地址<br>内容可不相同,没准你就访问了一些非法区域呢。
 
是这个原因.<br>有点明白了,是不是有办法把一个数值变量用远程注入办法写到游戏中,再取了这个变量值呢.<br>你能不能给我看看有什么办法解决
 
那是不是没其它办法了,只能我在游戏进程中再申请一个空间.将游戏更新后的CALL地址,写入内存值.再想办法调用过去
 
你使用相对地址就可以了。变量不过是内存中的一段空间,我的习惯是把变量也放在<br>代码段,然后获取当前IP,根据当前地址计算偏移,剩下的就不用我说了吧,呵呵
 
饿,汇编学得少.不会计算偏移.先给分吧,要是能帮我解决下,再开个贴再送300分.
 

Similar threads

S
回复
0
查看
962
SUNSTONE的Delphi笔记
S
S
回复
0
查看
784
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
976
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部