如何给CALL传递参数?

lengx1 2007-05-15 05:27:58
Procedure findguai; //要调用的函数
var
address:Pointer;
begin
asm
pushad
call address //就是这个数,希望能像变量一样使用
popad
end;
end;

function FunIn(Hid:cardinal;FunName:pointer):cardinal;
var
TmpHandle: THandle;
ThreadID: Thandle;
ThreadAdd:pointer;
WriteCount: DWORD;
begin
ThreadAdd := VirtualAllocEx(hid, nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//在目标进程建立内存空间
WriteProcessMemory(hid, ThreadAdd,FunName, 4096, WriteCount);//将要注入的过程写到上面建立的内存空间中
TmpHandle := CreateRemoteThread(hid, nil, 0, ThreadAdd, nil, CREATE_SUSPENDED, ThreadID);//获得注入后过程的句柄ID
result:=TmpHandle;//返回句柄ID
end;

HPRO := OpenProcess(PROCESS_ALL_ACCESS, False,pid);
homeAdd:=FunIn(HPRO,@findguai);//调用注入函数,@findguai是地址
ResumeThread(homeAdd); //运行注入的CALL线程
CloseHandle(homeAdd); //关闭线程



虽然是Delphi的,但意思能看明白就差不多了,借人气问问
findguai是我要调用的函数,其中的call address希望address可以像参数/变量一样使用。而代码注入到目标进程以后,就没办法读本程序内的数据了。CreateRemoteThread第5个参数好像可以传参数进去,但也必须是指针类型,而且我也不知道该怎么用。而且函数内好像也不可以使用API,所以一直试到现在都没找到办法,测试的机器都死机N次了.......各位仁兄帮帮忙吧。。。
...全文
1103 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengx1 2007-05-16
  • 打赏
  • 举报
回复
以前曾经想过,在目标程序B内注入的Procedure findguai;函数里,定义一个integer之类的变量,把这个变量的地址告诉我的主程序A,通过主程序A Writer内存改变那个变量的值。
但是直接VirtualAllocEx注入的似乎不能使用API,还是不行。。。。
lengx1 2007-05-16
  • 打赏
  • 举报
回复
ThreadAdd这个是canshu=0x1234ABC的首地址,但是ThreadAdd放在我自己的主程序内,目标程序里怎么知道呢?
lengx1 2007-05-15
  • 打赏
  • 举报
回复
这//Procedure canshu; //要传入的参数
个//var
备// address:Pointer;
用//begin
方//address:=0x1234ABC; //赋值
法//end;

canshu:Pointer; //方法一
canshu:=0x1234ABC //方法一

function FunIn(Hid,canshu); //注入
var
TmpHandle: THandle;
ThreadID: Thandle;
ThreadAdd:pointer;
WriteCount: DWORD;
begin
ThreadAdd := VirtualAllocEx(hid, nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//在目标进程建立内存空间
WriteProcessMemory(hid, ThreadAdd,FunName, 4096, WriteCount);//将要注入的过程写到上面建立的内存空间中
TmpHandle := CreateRemoteThread(hid, nil, 0, ThreadAdd, nil, CREATE_SUSPENDED, ThreadID);//获得注入后过程的句柄ID
result:=TmpHandle;//返回句柄ID
end;

备用方法和方法一是以前用过的...不过当时没有把下面的代码写完
以这个方式写进去,address/canshu就应该等于0x1234ABC了吧?..ThreadAdd是canshu=1234ABC的地址,这个地址好像没有给注入进目标进程啊...该怎么在目标进程内用呢?
  • 打赏
  • 举报
回复
“安全”的地址可用于写入呢?

你不都已经在用了么 VirtualAllocEx
husheng34 2007-05-15
  • 打赏
  • 举报
回复
push就进了栈,还要地址做什么,

全在栈里搞不就行了,就算字符串,结构,什么东东

有耐心,用 DWORD也能一个一个压进去,

在把首地址push进去,call就行了
lengx1 2007-05-15
  • 打赏
  • 举报
回复
其实我现在就有一个函数是
push 0x1234ABC //0x1234ABC是变量
call address
这样的,但是0x1234ABC 这个变量不知道如何传进去

楼上说的方法,关键是要选择好一个地址..而这个地址不知道该如何选..如果写入的地址是程序正在使用或者比较关键的地址,可能会出点问题吧...哪些是比较“安全”的地址可用于写入呢?
  • 打赏
  • 举报
回复
简单的说,你要用到一个字符串变量吧,
那么用WriteProcessMemory把这个字符串写到一个位置,比如是0x49000000
长度自己控制.
call address <-------这里这个函数直接使用0x49000000地址上的变量就好了.
干嘛非要以参数形式压栈呢,不管怎么说你这个函数需要的参数内容肯定在远程进程中出现.
当然你要是一个Int型参数的话,push 参数,然后在call 之后pop 变量 使用cdecl这种方式声明变量
yjgx007 2007-05-15
  • 打赏
  • 举报
回复
push var1
push var2
call address

///////////////////////
address(var1, var2);

push次序依照address函数声明是_stdcall还是_cdcel
lengx1 2007-05-15
  • 打赏
  • 举报
回复
Y___Y
哇,有点希望了^_^
老大讲详细点...
Y___Y 2007-05-15
  • 打赏
  • 举报
回复
这个xxx变量没办法弄进去?整形直接压进去,其它压指针
lengx1 2007-05-15
  • 打赏
  • 举报
回复
push xxx
以后肯定会用到这样的参数传递...就是这个xxx变量也一样没办法弄进去啊...

应该是和上面这个问题一样的解决方法吧。。。
Y___Y 2007-05-15
  • 打赏
  • 举报
回复
push进去
lengx1 2007-05-15
  • 打赏
  • 举报
回复
Procedure 我的变量参数;
....声明变量..给变量赋值..

function FunIn(目标进程,我的变量参数);
这样做的话..变量还是成了常量...


直接用WriteProcessMemory写,写进去的是值,不知道该怎么拿出来...
  • 打赏
  • 举报
回复
通常这种情况 你需要用WriteProcessMemory写到相应位置 ,你所需要的参数
然后findguai函数内部直接去取这个变量就可以了.
就跟使用全局变量一个道理.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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