发新话题
打印

[原创]汇编写进注册表启动的简单例子

[原创]汇编写进注册表启动的简单例子

文章作者:asm  
信息来源:邪恶八进制信息安全团队(www.eviloctal.com


一个写入注册表启动的例子...

注:以下是我初学win32汇编的的笔记,学那么久了,也该丢篇文章出来,呵呵.


对注册表的操作,例如写入,修改,删除,在一些高级语言,例如 C/C++ VB中都有对注册表操作的API,但是我感觉用win32汇编写,比较适合我自己。例如,创建一个REG_SZ类型的数值,就用RegCreateKey创建一个新项,在API手册中,对它的介绍是“在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项,如果返回ERROR_SUCCESS,则表示成功”在创建一个新项后,就要用RegSetValueEx设置它的数值,具体的代码如下:
复制内容到剪贴板
代码:
.386
.model flat, stdcall
option casemap :none
include      windows.inc
include      user32.inc
includelib   user32.lib
include      kernel32.inc
includelib   kernel32.lib
include      advapi32.inc
includelib   advapi32.lib
.data
szRegKey        db      'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue db      'Start',0 ;键值名称
szStr1           db   "c:\windwos\muma.exe" ;数据
.code
start:
_EnumKey   proc   _lpKey
   local   @hKey,@dwIndex,@dwLastTime:FILETIME
   
    invoke   RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
    .if   eax == ERROR_SUCCESS
   invoke   RegSetValueEx,@hKey,addr szRegValue,NULL,\
           REG_SZ,addr szStr1,19 ;写入一个REG_SZ类型的数据
   invoke   RegCloseKey,@hKey
   .endif
   ret
_EnumKey      endp
  invoke   _EnumKey,NULL
end start
程序中,利用伪指令invoke调用了RegCreateKey,关于RegCreateKey的参数,是这样描述“
invoke  RegCreateKeyEx,hKey,lpSubKey,Reserved,lpClass,dwOptions,samDesired,lpSecurityAttributes,phkResult,lpdwDisposition”
其中hKey用来指定了我们要创建新项的根建,当我们这样“invoke   RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey”调用的时候
就在“HKEY_LOCAL_MACHINE”这个根建下进行操作,然后设置 “eax == ERROR_SUCCESS” ,说明了操作成功,这样,我们便可以使用RegSetValueEx设置
数据名称和值。“invoke RegSetValueEx,@hKey,addr szRegValue,NULL, REG_SZ,addr szStr1,19” 创建了一个“Start”键值名称,它的数据值为“c:\windwos\muma.exe”,写入的子键位置在注册表启动...当然了,我们也可以设置一个REG_DWORD类型的数据值..

  记得有一次我提权的时候,发现主机的环境是,有执行exe文件的权限,不过不知道为什么,给它放个鸽子,就提示说“文件尾数超出”,传了个较小一点的木马,运行效果也是不满意。自然想到写一个再小的东西,也就是上面那个代码,然后编译,才2.5K,汗,执行速度绝对一流,然后又设置了木马的路径,等它重启的时候...嘎嘎....

  接着,如果把它写成GUI界面的,自然要给它定义一个资源文件,并且加入消息列队执行..下面是GUI界面的代码:
复制内容到剪贴板
代码:
.386
.model flat, stdcall
option casemap :none
include      windows.inc
include      user32.inc
includelib   user32.lib
include      kernel32.inc
includelib   kernel32.lib
include      advapi32.inc
includelib   advapi32.lib
ICO_MAIN   equ 1000
DLG_MAIN   equ 1000
IDC_Innovation  equ 1001
.data?
hInstance dd ?
.data
szRegKey        db      'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue db      'Start',0 ;键值名称
szStr1           db   "c:\windwos\muma.exe" ;数据
szTitle  db '操作成功',0
szCaption db '已经把c:\windwos\muma.exe设置为开机启动',0
.code
_EnumKey   proc   _lpKey
   local   @hKey,@dwIndex,@dwLastTime:FILETIME
   
invoke   RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
    .if   eax == ERROR_SUCCESS
   invoke   RegSetValueEx,@hKey,addr szRegValue,NULL,\
           REG_SZ,addr szStr1,19 ;写入一个REG_SZ类型的数据
   invoke   RegCloseKey,@hKey
   .endif
   ret
_EnumKey      endp
_ProcDlgMain proc  uses ebx edi esi hWnd,wMsg,wParam,lParam
  local  @szBuffer[128]:byte
  local  @stFindFile:WIN32_FIND_DATA
  mov  eax,wMsg
  .if  eax == WM_CLOSE ;这里程序退出
    invoke  EndDialog,hWnd,NULL
  .elseif  eax == WM_INITDIALOG
  invoke  LoadIcon,hInstance,ICO_MAIN
  .elseif  eax == WM_COMMAND
  mov  eax,wParam
  .if  ax == IDCANCEL
  invoke  EndDialog,hWnd,NULL
  .elseif ax == IDC_Innovation
  invoke   _EnumKey,NULL ;调用子程序完成写入操作
  invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK
  .endif
  .else
  mov  eax,FALSE
  ret
  .endif
  mov  eax,TRUE
  ret

_ProcDlgMain  endp
start:
  invoke  GetModuleHandle,NULL
  mov  hInstance,eax
  invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL   
  invoke  ExitProcess,NULL
end start
程序的变动不大,仅创建了一个模块对话框,只要几行代码就搞定.模块对话框的使用,省去了创建窗口,注册窗口类的麻烦.在_ProcDlgMain主程序中,WM_COMMAND是执行消息的标志,比如IDCANCEL,这个是“退出”,点击,消息列队执行,然后“invoke  EndDialog,hWnd,NULL”关闭主程序,干净利落. 相同的,“IDC_Innovation”后,调用_EnumKey子程序,_EnumKey执行的过程,也就写入了启动位置,写完后,设置一个MessageBox提示操作成功.
下面是RC资源文件代码:
复制内容到剪贴板
代码:
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include   <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define  ICO_MAIN   1000
#define  DLG_MAIN   1000
#define  IDC_Innovation  1001
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN  ICON   "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 105, 107, 190, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "写进注册表启动"
FONT 9, "宋体"
{
PUSHBUTTON "退出(&X)", IDCANCEL, 15, 15, 70, 35
PUSHBUTTON "开始写入数据(&I)", IDC_Innovation, 100, 15, 70, 35
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
本文有不足之处,请指点..........



[s:66]  [s:66]
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

[s:66]

还有很多对注册表操作的API,要看看到底实现什么功能了...像一些对注册表管理的软件,大多用这些函数...

呵呵 我是新手,弄了好久...如果有高见,请指点迷津.....
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

Run 键值应该是很古老的了吧.现在应该随便哪个垃圾杀毒软件都会去检查那里..就连现在在网上泡的菜鸟也一样.

所以我们是否可以想想办法在别的地方启动?当然也不要用服务方式启动自己.那样也会被查...可否考虑 vid 呢?
http://www.vtwo.cn

TOP

引用:
这里是引用第[2 楼]kking2006-10-10 04:57发表的:
Run 键值应该是很古老的了吧.现在应该随便哪个垃圾杀毒软件都会去检查那里..就连现在在网上泡的菜鸟也一样.

所以我们是否可以想想办法在别的地方启动?当然也不要用服务方式启动自己.那样也会被查...可否考虑 vid 呢?
这位朋友误会了,我只是在汇编上实现对注册表进行一次写入操作....当然也可以将szRegKey的值定义为

HKLM\SYSTEM\CurrentControlSet\Services,设置成系统服务...

当然,要说到木马启动,很多成熟的木马都有借鉴的地方.....
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

引用:
引用第3楼asm2006-10-11 11:27发表的:



这位朋友误会了,我只是在汇编上实现对注册表进行一次写入操作....当然也可以将szRegKey的值定义为

.......
呵呵。不好意思。误会了。原来目的是写注册表。木马的免杀与隐藏其实很麻烦。当然如果实在无法隐藏可以采用强行驻留方式。

  前些天中了个超级强悍的东西。用尽小弟平身所学也干不掉。

哎。
http://www.vtwo.cn

TOP

引用:
引用第4楼kking2006-12-06 15:50发表的:



呵呵。不好意思。误会了。原来目的是写注册表。木马的免杀与隐藏其实很麻烦。当然如果实在无法隐藏可以采用强行驻留方式。

.......
木马本身就是间谍,重在隐藏自己,如果采用强行驻留方式,从用户的角度讲,这个木马也活不久拉..
[s:73]
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

能不能不用函数方法来调用呢??谢谢,希望能不吝指教~~

TOP

引用:
引用第7楼igotcha于2007-03-22 18:15发表的 :
能不能不用函数方法来调用呢??谢谢,希望能不吝指教~~
不用函数的方法来调用?不明白你的意思哦


PS:N年的帖子都给顶出来了 
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

只是个关于子程序和局部变量的小问题,已经在罗云彬的书中看到方法了
呵呵,我真是太菜了~~~~~~

TOP

偶也正在学WIN32汇编,希望大家多多指教!

TOP

偶正在学win32汇编,这个代码比较短小,偶copy来慢慢研究一下哈。
谢谢搂住了!

TOP

现在的杀毒软件基本上都HOOK了写注册表的API,如果木马调用这些函数写注册表的话基本上都被杀,可以考虑别的方法了

TOP

游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

我编译gui的时候资源文件可以编译,asm文件编译出错了
我是直接复制你的代码,错误信息

33.asm(38) : error A2044:
33.asm(40) : fatal error A1011:

还有wMsg是不是应该改成uMsg??

asm指点一下,刚接触汇编

TOP

引用:
引用第14楼wolfluxay于2007-04-17 22:21发表的 :
我编译gui的时候资源文件可以编译,asm文件编译出错了
我是直接复制你的代码,错误信息

33.asm(38) : error A2044:
33.asm(40) : fatal error A1011:
.......
呵呵,这个错误是因为我把注释的 ; 写成;

".if eax == WM_CLOSE;这里程序退出"把这里的注释去掉就可以编译了

还有" invoke  _EnumKey,NULL ;调用子程序完成写入操作"

把注释去掉

wMsg是对话框的消息,不需要改
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

发新话题