急求如何调用另一进程中的某函数

okmnji79513 2008-12-04 03:44:10
RT
举个最简单的例子:

type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure bb;
{ Public declarations }
end;

procedure TForm1.bb;
begin
showmessage('bb123');
end;

比如就这个简单的单form程序,是别人写的我看不到源代码,但知道这个函数就是一个procedure且不带参数。现在我想编一个程序调用这个函数bb。
通过查资料,我想通过dll注入,然后得到TForm1实例,实例是得到了,但是frm:=TForm(FindControl(form1的句柄));-->(FindControl是根据网上自定义的,非Controls中的)后, frm中无bb函数,我想可能是frm:=TForm(...)这里不应该用TForm,而应该用frm对应的TForm1类,但是DLL中无此类,自己在DLL中定义一个一模一样的类的话,frm.bb执行的是DLL中bb的代码 而非 EXE中bb的代码。 搞不定了, 又想到用内存,但有不会,不知道可不可行。

求高手指教!!!暂先给100分,不够再加。

ps:还有我想到,如果那个exe不是delphi写的的话,我的思路就=nil了啊.....
...全文
403 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
HeroicDragon 2008-12-22
  • 打赏
  • 举报
回复
你应该申明一个与被调用类一样的类结构,然后再用这个类的结构去套目前地址,这样才能访问。

记得在李维的深入VCL 里有好多这样的例子,你可以参考一下。
僵哥 2008-12-22
  • 打赏
  • 举报
回复
做成DCOM吧。
okmnji79513 2008-12-22
  • 打赏
  • 举报
回复
顶一下
okmnji79513 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 withcsharp 的回复:]
procedure TFrm_DllForm.exec_proc_ptgj(flag: integer;
param: array of string);
var
d: Dword;
begin
d := Off_Const_ptgj;
asm

mov eax, dword ptr [$926FD4]
mov eax, dword ptr [eax+$1C]
mov esi, dword ptr [eax+$20]
mov eax,2
mov EDX,$FFFFFFF0
mov ecx, esi

ca…
[/Quote]
汇编部分看不太懂,能解释下不?
okmnji79513 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 withcsharp 的回复:]
你先找到 地址就好办了
然后注入 然后 如下调用

......[/Quote]
就是函数地址怎么找?我不会。有人说用ida反汇编,我搞了下,不太会用,没找到函数地址。注入和调用我会。


[Quote=引用 37 楼 BlueTrees 的回复:]
如果是delphi写的,对一个对象的具体类不清楚的,可以用RTTI来找到他的public函数。
[/Quote]
这个我先学习下。
BlueTrees 2008-12-20
  • 打赏
  • 举报
回复
如果是delphi写的,对一个对象的具体类不清楚的,可以用RTTI来找到他的public函数。
radarhp 2008-12-18
  • 打赏
  • 举报
回复
远程注入。。。。。网上代码一堆,注入个dll就搞定鸟
withcsharp 2008-12-18
  • 打赏
  • 举报
回复
你先找到 地址就好办了
然后注入 然后 如下调用

procedure TFrm_DllForm.exec_proc_ptgj(flag: integer;
param: array of string);
var
d: Dword;
begin
d := Off_Const_ptgj;
asm

mov eax, dword ptr [$926FD4]
mov eax, dword ptr [eax+$1C]
mov esi, dword ptr [eax+$20]
mov eax,2
mov EDX,$FFFFFFF0
mov ecx, esi

call d

end;
{
004930F8 6A FF PUSH -1
004930FA 6A 00 PUSH 0
004930FC 6A 00 PUSH 0
004930FE 6A 00 PUSH 0
00493100 8BCE MOV ECX,ESI
00493102 E8 C96AFBFF CALL elementc.00449BD0
00493107 5F POP EDI
00493108 B0 01 MOV AL,1
0049310A 5E POP ESI

}
setexec_result(['普通攻击:call ' + inttostr16(Off_Const_ptgj)]);
end;
zhangxiaommmm 2008-12-18
  • 打赏
  • 举报
回复
注入到b进程的dll,就能调用b进程的某个过程吗?
很复杂吧
Jack_Yin 2008-12-17
  • 打赏
  • 举报
回复
我是来学习的,呵呵!
okmnji79513 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 lake_cx 的回复:]
封装成进程外的COM组件
[/Quote]
这个不是很了解,要学习下先
okmnji79513 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bd_lyy791128 的回复:]
看看病毒的工作方式吧,注入是一方面,还需要地址重定位。
[/Quote]

可以这样调用吗?:(假设 Y进程 知道下面 tt函数的 偏移地址)
X进程 中的函数:

procedure tt;
begin
showmessage('tt');
end;


Y进程:

TKK:procedure of object;

TForm1.Button1Click(Sender: TObject);
var kk:TKK;
begin
@kk:=pointer(X进程的基地址+X进程中tt函数的偏移地址);
kk;
end;
okmnji79513 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bd_lyy791128 的回复:]
看看病毒的工作方式吧,注入是一方面,还需要地址重定位。
[/Quote]

如何个 重定位? 能讲讲吗?
okmnji79513 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 Avan_Lau 的回复:]
這個exe的保護機制在起作用。
load進來后,返回的是第一個鏡像地址
[/Quote]

第二个 地址 如何得到??
金卯刀 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 okmnji79513 的回复:]
引用 23 楼 Avan_Lau 的回复:
其實你打開exe應該可以發現(加載后),有兩個exe的鏡像地址,前面一個并不是真正的!

'两个exe的镜像地址',这个什么意思?LoadLibrary返回2个??
[/Quote]
這個exe的保護機制在起作用。
load進來后,返回的是第一個鏡像地址
风吹来 2008-12-06
  • 打赏
  • 举报
回复
看看病毒的工作方式吧,注入是一方面,还需要地址重定位。
okmnji79513 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 Avan_Lau 的回复:]
其實你打開exe應該可以發現(加載后),有兩個exe的鏡像地址,前面一個并不是真正的![/Quote]

'两个exe的镜像地址',这个什么意思?LoadLibrary返回2个??
金卯刀 2008-12-06
  • 打赏
  • 举报
回复
前面給出的解決方法的前提是:都是delphi寫的,且exe有公布出函數,且非對象方法或類方法。基于這些條件,如無法滿足,做這些努力,是徒勞的。
解釋一下,為什么loadlibrary加載exe后,調用函數會出錯?其實你打開exe應該可以發現(加載后),有兩個exe的鏡像地址,前面一個并不是真正的!至于如何解決...
lake_cx 2008-12-06
  • 打赏
  • 举报
回复
封装成进程外的COM组件
okmnji98423 2008-12-06
  • 打赏
  • 举报
回复
说我回复太快......

我是想问下:
[Quote=引用 25 楼 bd_lyy791128 的回复:]
还需要地址重定位。
[/Quote]

这个是和 pe引入函数表 有关吧??
加载更多回复(22)

1,183

社区成员

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

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