不是一般的自动运行....(要绝对高手)

pursuer_zhao 2001-09-14 04:44:22
我做了一程序 ,想在系统启动时自动运行
我已经加在了注册表里
但为了安全怎么不让用户在注册表里或用MSCONFIG来删除?
或者把该键隐藏?

详细一点,最好例子
...全文
227 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
swordbroken 2001-09-15
  • 打赏
  • 举报
回复
gz
qinzm 2001-09-15
  • 打赏
  • 举报
回复
我不是高手
所以不回答
超级简单的东西
jucee 2001-09-15
  • 打赏
  • 举报
回复
gz
DXD 2001-09-15
  • 打赏
  • 举报
回复
bo2k的例子,也可看看.里面有隐藏进程的代码.举一反三,隐藏注册表健也一样
DXD 2001-09-15
  • 打赏
  • 举报
回复
Hook注册表函数RegEnumValue,如果枚局的值是自己要隐藏的程序,跳过.Hook Windows API可看看词典类,抓词的列子
kimryo 2001-09-15
  • 打赏
  • 举报
回复
还可以将system目录下的interanet.exe文件用你的木马替代,该文件很特殊,注册标中删之不去,文件如不存在,则windows自己创建。
kimryo 2001-09-15
  • 打赏
  • 举报
回复
其实直接在系统盘的根目录下取一个叫exploere.exe的文件就可以了。不可能将
system.ini的shell=exlporer.exe一行删了吧。在自动启动的文件上再做点文章,
如隐藏,动态改名,删除自己等等....
sunyuzhe114 2001-09-15
  • 打赏
  • 举报
回复
  我们知道,在windows系统下,可执行文件主要是exe和com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程,寻找特定进程是我们发现木马的方法之一(无论手动还是防火墙),随着入侵检测软件的不断发展,关联进程和socket已经成为流行的技术(例如著名的fport就能够检测出任何进程打开的tcp/udp端口),假设一个木马在运行时被检测软件同时查出端口和进程,我们基本上认为这个木马的隐藏已经完全失败(利用心理因素而非技术手段欺骗用户的木马不在我们的讨论范围之内)。在nt下正常情况用户进程对于系统管理员来说都是可见的,要想做到木马的进程隐藏,有两个办法,第一是让系统管理员看不见(或者视而不见)你的进程;第二是不使用进程。

  让系统管理员看不见进程的方法就是进行进程列表欺骗,为了了解如何看不见进程,我们首先要了解怎样能看得见进程:在windows中有多种方法能够看到进程的存在:psapi(process status api),pdh(performance data helper),toolhelp api,如果我们能够欺骗用户和入侵检测软件用来查看进程的函数(例如截获相应的api调用,替换返回的数据),我们就完全能实现进程隐藏,但是一来我们并不知道用户和入侵软件使用的是什么方法来查看进程列表,二来如果我们有权限和技术实现这样的欺骗,我们就一定能使用其它的方法更容易的实现进程的隐藏。(例如:能够替换dll或挂接api来隐藏进程不如直接用来做木马。)

  第二种方法是不使用进程,不使用进程使用什么?为了弄明白这个问题,我们必须要先了解windows系统的另一种“可执行文件”----dll,dll是dynamic link library(动态链接库)的缩写,dll文件是windows的基础,因为所有的api函数都是在dll中实现的。dll文件没有程序逻辑,是由多个功能函数构成,它并不能独立运行,一般都是由进程加载并调用的。(你你你,你刚刚不是说不用进程了?)别急呀,听我慢慢道来:因为dll文件不能独立运行,所以在进程列表中并不会出现dll,假设我们编写了一个木马dll,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马dll,如果那个进程是可信进程,(例如资源管理器explorer.exe,没人会怀疑它是木马吧?)那么我们编写的dll作为那个进程的一部分,也将成为被信赖的一员而为所欲为。

  运行dll文件最简单的方法是利用rundll32.exe,rundll/rundll32是windows自带的动态链接库工具,可以用来在命令行下执行动态链接库中的某个函数,其中rundll是16位而rundll32是32位的(分别调用16位和32位的dll文件),rundll32的使用方法如下:

  rundll32 dllfilename funcname

  例如我们编写了一个mydll.dll,这个动态链接库中定义了一个myfunc的函数,那么,我们通过rundll32.exe mydll.dll myfunc就可以执行myfunc函数的功能。

  这个和木马的进程隐藏有什么关系么?当然有了,假设我们在myfunc函数中实现了木马的功能,那么我们不就可以通过rundll32来运行这个木马了么?在系统管理员看来,进程列表中增加的是rundll32.exe而并不是木马文件,这样也算是木马的一种简易欺骗和自我保护方法(至少你不能去把rundll32.exe删掉吧?想从rundll32进程找到dll木马还是有一点麻烦的)

  使用rundll32的方法进行进程隐藏是简易的,非常容易被识破。(虽然杀起来会麻烦一点)比较高级的方法是使用特洛伊dll,特洛伊dll的工作原理是使用木马dll替换常用的dll文件,通过函数转发器将正常的调用转发给原dll,截获并处理特定的消息。例如,我们知道windows的socket1.x的函数都是存放在wsock32.dll中的,那么我们自己写一个wsock32.dll文件,替换掉原先的wsock32.dll(将原先的dll文件重命名为wsockold.dll)我们的wsock32.dll只做两件事,一是如果遇到不认识的调用,就直接转发给wsockold.dll(使用函数转发器forward);二是遇到特殊的请求(事先约定的)就解码并处理。这样理论上只要木马编写者通过socket远程输入一定的暗号,就可以控制wsock32.dll(木马dll)做任何操作。特洛伊dll技术是比较古老的技术,因此微软也对此做了相当的防范,在win2k的system32目录下有一个dllcache的目录,这个目录中存放着大量的dll文件(也包括一些重要的exe文件),这个是微软用来保护dll的法宝,一旦操作系统发现被保护的dll文件被篡改(数字签名技术),它就会自动从dllcache中恢复这个文件。虽然说有种种方法可以绕过dll保护(例如先更改dllcache目录中的备份再修改dll文件、或者利用knowndlls键值更改dll的默认启动路径等),但是可以想见的未来微软必将更加小心地保护重要的dll文件;同时由于特洛伊dll方法本身有着一些漏洞(例如修复安装、安装补丁、升级系统、检查数字签名等方法都有可能导致特洛伊dll失效),所以这个方法也不能算是dll木马的最优选择。

  dll木马的最高境界是动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。理论上来说,在windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的(私人领地、请勿入内),但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。在多种动态嵌入技术中(窗口hook、挂接api、远程线程),我最喜欢的是远程线程技术,这种技术非常简单,只要有基本的进线程和动态链接库的知识就可以很轻松地完成嵌入,下面就为大家介绍一下远程线程技术。

远程线程技术


  远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过createthread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过createremotethread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个dll木马(与进入进程内部相比,启动一个dll木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。

  首先,我们通过openprocess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)

 hremoteprocess = openprocess( process_create_thread | //允许远程创建线程
                process_vm_operation | //允许远程vm操作
                process_vm_write,//允许远程vm写
                false, dwremoteprocessid )

  由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(process_create_thread、vm_operation、vm_write)。

  然后,我们可以建立loadlibraryw函数这个线程来启动我们的dll木马,loadlibraryw函数是在kernel32.dll中定义的,用来加载dll文件,它只有一个参数,就是dll文件的绝对路径名pszlibfilename,(也就是木马dll的全路径文件名),但是由于木马dll是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)

 //计算dll路径名需要的内存空间
 int cb = (1 + lstrlenw(pszlibfilename)) * sizeof(wchar);
 //使用virtualallocex函数在远程进程的内存地址空间分配dll文件名缓冲区
 pszlibfileremote = (pwstr) virtualallocex( hremoteprocess, null, cb,
            mem_commit, page_readwrite);
 //使用writeprocessmemory函数将dll的路径名复制到远程进程的内存空间
 ireturncode = writeprocessmemory(hremoteprocess,
            pszlibfileremote, (pvoid) pszlibfilename, cb, null);
 //计算loadlibraryw的入口地址
 pthread_start_routine pfnstartaddr = (pthread_start_routine)
     getprocaddress(getmodulehandle(text("kernel32")), "loadlibraryw");

  ok,万事俱备,我们通过建立远程线程时的地址pfnstartaddr(实际上就是loadlibraryw的入口地址)和传递的参数pszlibfileremote(实际上是我们复制过去的木马dll的全路径文件名)在远程进程内启动我们的木马dll:

 //启动远程线程loadlibraryw,通过远程线程调用用户的dll文件
 hremotethread = createremotethread( hremoteprocess, null, 0,
                 pfnstartaddr, pszlibfileremote, 0, null);

  至此,远程嵌入顺利完成,为了试验我们的dll是不是已经正常的在远程线程运行,我编写了以下的测试dll:

 bool apientry dllmain(handle hmodule, dword reason, lpvoid lpreserved)
   {
    char szprocessid[64] ;
    switch ( reason )
     {
      case dll_process_attach:
       {
         //获取当前进程id
         _itoa ( getcurrentprocessid(), szprocessid, 10 );
         messagebox ( null, szprocessid, "remotedll", mb_ok );
       }
      default:
      return true;
     }
   }

  当我使用rmtdll.exe程序将这个testdll.dll嵌入explorer.exe进程后(pid=1208),该测试dll弹出了1208字样的确认框,同时使用ps工具也能看到

   process id: 1208
   c:\winnt\explorer.exe (0x00400000)
   ……
   c:\testdll.dll (0x100000000)
   ……

  这证明testdll.dll已经在explorer.exe进程内正确地运行了。

  无论是使用特洛伊dll还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。
111222 2001-09-15
  • 打赏
  • 举报
回复
具体就是写一个Browser Helper Object伴随着IE启动。

还可以对有些花哨的东西。

但绝对不可以把winsock用在BHO里,我刚刚的测试表明,IE5非法,IE6有安全警告。
同时,我发现explorer.exe运行的时候也启动BHO。

具体的就看你怎么做了。
111222 2001-09-15
  • 打赏
  • 举报
回复
我刚刚做了一个全方位的实验。

测试结果用BHO就可以。

随着IE启动。
pursuer_zhao 2001-09-15
  • 打赏
  • 举报
回复
高手。。。
pursuer_zhao 2001-09-15
  • 打赏
  • 举报
回复
to :sunyuzhe114(阿哲) 
1、怎么知道别人运行regedit,或msconfig?
2、3721中文服务是什么?(见笑了)
3、系统钩子程序怎么监视注册表?
我知道当运行regetid.exe 或msconfig.exe时系统调用RegEnumValue函数
但不知道怎么监视api.
有例子吗?

sunyuzhe114 2001-09-14
  • 打赏
  • 举报
回复
第一种方法,写一个timer函数大约一秒一次吧,当程序开始运行后在别人运行regedit,或msconfig时你就把键值删除,如果没有运行你就把键值加入。
第二种方法,你的机器里也有3721中文服务吧,学学它吧。
第三种方法,做一个系统钩子,把读写注注册表的api 截获剩下的就和第一种方法一样了,这种方法可以让所有的注册表监视程序失灵
pursuer_zhao 2001-09-14
  • 打赏
  • 举报
回复
什么意思?
怎么做?
prog_st 2001-09-14
  • 打赏
  • 举报
回复
不设定名称
pursuer_zhao 2001-09-14
  • 打赏
  • 举报
回复
to :Tice(孤笑) and Congy(少侠) 
谢谢二位,到是个不错的办法,不过听说有办法可以隐藏该键值的...
Congy 2001-09-14
  • 打赏
  • 举报
回复
在程序里加入一个TIMER,不停的检测键值是否存在,如果不存在,就添加键值
Tice 2001-09-14
  • 打赏
  • 举报
回复
做个后台程序,可以每隔1~2分钟检查一下主册表或MSCONFIG里的键值,如果被删除了,就再添加上去,你说对不对呀?
pursuer_zhao 2001-09-14
  • 打赏
  • 举报
回复
to :上边两位
不是高手就不要发话!
要静静听高手们发言!!
ExitWindows 2001-09-14
  • 打赏
  • 举报
回复

干嘛要学偷机摸狗?
我呸!!








给它取个象个人样的名字不就可以了么,如:rundll32.exe ...............
加载更多回复(1)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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