首页
社区
课程
招聘
[求助]关于DLL远程注入的疑问
发表于: 2009-2-12 12:00 8325

[求助]关于DLL远程注入的疑问

2009-2-12 12:00
8325
我把我的一个DLL文件注入到计算器(CALC.EXE)后,计算器会完全没有响应(可以确定注入成功了),请问这是怎么一回事?当然DLL文件中是有死循环(不断写注册表)的.列出关键代码如下:
///////////////////////////这是DLL注入主函数的代码

procedure injfun(dwReason:DWord);
var
  hthread2:Thandle;//定义一个句柄
  threadid2:DWord;
begin
      enterdebug;
      hthread2:=CreateThread(nil,0,@writereg,nil,0,ThreadID2);   //此线程写注册表
      two;  
end.


////////////////////////////////////////////////////////////////////////////  
其中writereg函数是循环写注册表的..  
同样的代码在我的另一个工程中(EXE)运行却没一点问题
哪位高人能帮忙看看
另外,还想问一下,我的TWO函数里也有创建线程的代码,但是注入后似乎没有创建那个线程,   不知道怎么回事?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
DllMain中开完线程马上返回,千万别在这里死循环
2009-2-12 12:29
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
不循环不行啊..不然就达不到目的了
2009-2-12 13:32
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
你要非在DllMain中循环不返回那肯定假死啊,要循环开线程循环去
2009-2-12 14:18
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
我当然知道
是开线程循环的..
2009-2-12 14:53
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
怎么感觉看雪的朋友们没以前热情了呢
2009-2-12 15:03
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
开线程就没事呀 我就是这么做的
2009-2-12 16:31
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
我只是看看…哪里不对?
2009-2-12 17:09
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
sleep一下行不行呢?
2009-2-12 19:06
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
要用到线程! 你要在这个被注入的程序内创建一条线程!
2009-2-12 19:53
0
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
11
最好代码再贴多一点。建议启动线程后,先让其suspend,过会Ⅱ在恢复其运行。
2009-2-12 21:29
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
线程循环的时候 Application.processmessage一下看 行不
2009-2-12 23:50
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
今天上班过来一看,很多朋友回复了,很开心....谢谢大家的关心
sleep测试过,还是很卡
Application.ProcessMessages要用到FORM单元才行.会让DLL变得很大的
不知道有什么可以替代的办法

如果可以的话哪位大大给我一份DLL注入(要循环直到目标进程退出)的DELPHI代码
我的邮箱是277406378@QQ.COM
先谢过了
2009-2-13 11:06
0
雪    币: 220
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
hthread2:=CreateThread(nil,0,@writereg,nil,0,@ThreadID2);

好象CreateThread最后一个参数是DWORD *吧
2009-2-13 14:24
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
经过各位的提点,问题已经得到解决.现把关键代码贴一下

procedure injfun(dwReason:DWord);   //DLL注入主函数
var
  hthread2:Thandle;//定义一个句柄
  threadid2:DWord;
begin
                                                        //writereg为循环写注册表函数
       hthread2:=CreateThread(nil,0,@writereg,nil,0,ThreadID2);   
       MessageBox(0,'create thread success!','lzwx',MB_OK);
       ExitThread(0);        //这里必须加上,不然会卡死的
end;


希望朋友们解决问题以后都能贴上解决的办法,不然讨论就没意义了

另外还有一个不明白的地方,请各位朋友指教:
1. 在DLL主注入函数中不加ExitThread(0)的时候注入,会在注入成功的时候弹出三次创建线程成功的提示,然后退出注入目标进程的时候会再弹出一次,好像这个注入函数一直在循环一样,请问这是怎么回事?
2009-2-14 10:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
注入时的三次分别是加载DLL时一次,线程创建时一次,线程退出时一次;退出注入时一次是DLL卸载时那一次。你必须进行判断
2009-2-14 11:20
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
有种恍然大悟的感觉!
但是我加了exitthread(0)为什么就没有了呢?
2009-2-14 17:40
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
18
你应该在DllMain中判断一下dwReason再做相应动作,否则创建线程那部分代码会多次运行,我想这不是你想要的结果
2009-2-14 18:44
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
19
还有,你那里不应该使用ExitThread,return TRUE就可以了。再加上对dwReason的判断你再试一下
2009-2-14 18:51
0
雪    币: 174
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
谢谢..你是用VC的吧
2009-2-15 13:27
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
21
我是用VC的,语言表达不一样,步骤是一样的
2009-2-15 14:33
0
游客
登录 | 注册 方可回帖
返回
//