首页
社区
课程
招聘
菜鸟求助
发表于: 2010-4-20 17:50 3082

菜鸟求助

2010-4-20 17:50
3082
我想扩大记事本最后一个节的大小,是一个资源节。
修改了PE文件的5个变量,分别是OptionalHeader.AddressOfEntryPoint,IMAGE_SECTION.HEADER.Characteristics,
IMAGE_SECTION_HEADER.MISC.VirtualSize,IMAGE_SECTION_HEADER.SizeOfRawData,OptionalHeader.SizeOfImage
其中VirtualSize=原来的VirtualSize大小+加入代码的大小。
SizeOfRawData=加代码后VirtualSize的大小除以FileAlignment 然后取模加一,乘以FileAlignment
SizeOfImage=最后一节的VirtualAddress+(加代码后的VirtualSize大小除以SectionAlignment,然后取模加一,乘以SectionAlignment)

但是这样赋值后,注入代码的记事本打开时显示不是win32程序,我想应该是赋值错了,或者是还需要修改更多的变量,请问这里边哪里错,请大家帮个忙。
我只是学习,没干什么坏事,请大家不要捉弄我。

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
嗨。。。

请LZ把代码放出来,这样才容已看出你那里出错。。。
2010-4-20 18:20
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
.386
.model flat,stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc
includelib lib\kernel32.lib
includelib lib\user32.lib

.data
hFile dd 0
szCaption db "test",0
szMessage db "success",0
szMessage1 db "fail",0
szFileName db "test.exe",0
szUser32 db "user32.dll",0
szApiName db "MessageBoxA",0

.code
_main:
  push 02h
  push offset szFileName
  call _lopen
  mov hFile,eax
  
  sub esp,1000h
  mov edi,esp

  push 1000h
  push edi
  push hFile
  call _lread  

  mov eax,[edi+3ch]
  add edi,eax
  assume edi:ptr IMAGE_NT_HEADERS

  mov eax,[edi].OptionalHeader.ImageBase
  mov aOldBase,eax
  mov eax,[edi].OptionalHeader.AddressOfEntryPoint
  mov aOldEntryPoint,eax

  movzx eax,[edi].FileHeader.NumberOfSections
  dec eax
  mov ecx,28h
  mul ecx
  add eax,sizeof IMAGE_NT_HEADERS
  add eax,edi
  mov ebx,eax
  assume ebx:ptr IMAGE_SECTION_HEADER

  mov [ebx].Characteristics,0e0000020h  
  mov eax,[ebx].Misc.VirtualSize
  push eax
  add eax,[ebx].VirtualAddress
  mov [edi].OptionalHeader.AddressOfEntryPoint,eax
  add [ebx].Misc.VirtualSize,offset _m2-offset _m1
  mov eax,[ebx].Misc.VirtualSize
  mov ecx,[edi].OptionalHeader.FileAlignment
  cdq
  div ecx
  inc eax
  mul ecx
  mov [ebx].SizeOfRawData,eax
  mov eax,[ebx].Misc.VirtualSize
  mov ecx,[edi].OptionalHeader.SectionAlignment
  cdq
  div ecx
  inc eax
  mul ecx
  add eax,[ebx].VirtualAddress
  mov [edi].OptionalHeader.SizeOfImage,eax
  push offset szUser32
  call LoadLibraryA
  push offset szApiName
  push eax
  call GetProcAddress
  mov aMessageBoxA,eax

  pop eax
  add eax,[ebx].PointerToRawData
  mov edi,esp

  push FILE_BEGIN
  push eax
  push hFile
  call _llseek
  push offset _m2-offset _m1
  push offset _m1
  push hFile
  call _lwrite
  push FILE_BEGIN
  push 0
  push hFile
  call _llseek
  push 1000h
  push edi
  push hFile
  call _lwrite
  add esp,1000h

  push hFile
  call _lclose
  
  

  push MB_OK or MB_ICONINFORMATION
  push offset szCaption
  push offset szMessage
  push 0
  call MessageBoxA

  ret

_m1:
  call _r
_r:
  pop ebp
  sub ebp,offset _r

  push MB_OK or MB_ICONINFORMATION
  lea eax,szMsg1[ebp]
  push eax
  lea eax,szMsg1[ebp]
  push eax
  push 0
  call aMessageBoxA[ebp]
  mov eax,aOldBase[ebp]
  add eax,aOldEntryPoint[ebp]
  push eax
  ret

  szMsg1 db "退出",0
  aMessageBoxA dd 0
  aOldEntryPoint dd 0
  aOldBase dd 0
_m2:

end _main
我也是刚学罗老板的书,不懂搞头的大了,得罪的地方请大哥原谅。
2010-4-20 18:39
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果这段代码把_m1:设在_main处,注入代码的记事本就会提示不是win32程序,不知道哪里错了。
2010-4-20 18:51
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
只测试注入的文件能不能打开,用OD
2010-4-20 18:52
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我尝试运行你的代码:

.386
.model flat,stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc
includelib lib\kernel32.lib
includelib lib\user32.lib

.data
hFile dd 0
szCaption db "test",0
szMessage db "success",0
szMessage1 db "fail",0
szFileName db "test.exe",0
szUser32 db "user32.dll",0
szApiName db "MessageBoxA",0

.code
_main:
  push 02h
  push offset szFileName
  call _lopen
  mov hFile,eax
  
  sub esp,1000h
  mov edi,esp
 
  push 1000h
  push edi
  push hFile
  call _lread  

  mov eax,[edi+3ch]
  add edi,eax
  assume edi:ptr IMAGE_NT_HEADERS

  mov eax,[edi].OptionalHeader.ImageBase
  mov aOldBase,eax                        ; 《== 这里就挂了!
..
..
..


一些建议:
- 把 aMessageBoxA, aOldEntryPoint, aOldBase 放在.data里
- 在你的m1程序里改用aaMessageBoxA, aaOldEntryPoint, aaOldBase:

_m1:
  call _r
_r:
  pop ebp
  sub ebp,offset _r

  push MB_OK or MB_ICONINFORMATION
  lea eax,szMsg1[ebp]
  push eax
  lea eax,szMsg1[ebp]
  push eax
  push 0
  call aaMessageBoxA[ebp]
  mov eax,aaOldBase[ebp]
  add eax,aaOldEntryPoint[ebp]
  push eax
  ret

  szMsg1 db "Exit",0
  aaMessageBoxA dd 0
  aaOldEntryPoint dd 0
  aaOldBase dd 0


- 用malloc制造一个储存,然后把你的m1程序写进去
- 用memcpy来把aMessageBoxA写去aaMessageBoxA, 等等。。。
- 过后才把储存写去文件。。。
2010-4-22 08:40
0
游客
登录 | 注册 方可回帖
返回
//