首页
社区
课程
招聘
菜鸟请教简单加壳问题
发表于: 2006-6-15 11:00 4022

菜鸟请教简单加壳问题

2006-6-15 11:00
4022
我写了个简单的壳,但不知为什么总是不行,实在没法,特来请教:
壳代码如下:
;外壳开始
.code
  ShellStart         dd    $
@@oep:
  OldOep             dd    0
@@textstart:
  SecStart           dd    0
@@textsize:
  SecSize            dd    0
  ShellCodeStart     dd    $
  call @@addr
@@addr:
        pop eax
        mov ebx, eax
        sub eax, @@addr - @@textstart
        mov edx, dword ptr [eax]
       
        mov eax, ebx
        sub eax, @@addr - @@textsize
        mov ecx, dword ptr [eax]

@@Decrypt:
        ;xor byte ptr [edx], 55
        inc edx
        loop @@Decrypt

        mov eax, ebx
        sub eax, @@addr - @@oep
        jmp dword ptr [eax]
        ShellSize        dd     $ -  offset ShellStart

;外壳结束

如果将行xor byte ptr [edx], 55注释掉,程序能正常启动,否则,用softICE调试发现运行xor byte ptr [edx], 55后,没有接着运行inc edx,而且指令地址也突变了。搞了很久总是不明白为什么,请达人指点。谢谢。

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
有没有编译出来的。
你得SecStart           dd    0有问题。
是外壳自己的sec还是原程序的sec
如果是原程序的怎么没有装入import
那就是自己的,是自己的是否修改页面保护了?sec.charactsticRWE才可以。

是不是运行中把自己也销毁了,所以出错了?
2006-6-15 11:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那个SecStart是被加壳程序的一个节首地址,我是想将一个被加壳程序的某个节全部内容按字节与一个数进行异或,将被加壳程序的入口地址,节首地址和大小存入外壳,然后从外壳开始执行,就是从节首地址开始,再异或回来,然后跳到原入口地址执行,就是这样。必须要该引入表吗?这样是不行的是吧?我没有改节属性,我改一下试试。
2006-6-15 11:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
改了节属性后就可以了。
但又遇到一个非常奇怪的问题,我对.text节的前16个字节分别加1,在外壳里不作任何处理,被加壳的程序可以正常运行,如果在外壳里对这16个字节分别减1,则不能正常运行。我用ultraedit看了加壳前后的两个可执行程序,相应位置的16个字节确实存在1的差异。但是用softICE调试时发现内存里的相应位置的值是加1前的值,所以做减1操作反而使它不对了。
简而言之,就是原来是C8,加1后用ultraedit看是C9,用softICE调试发现值还是C8,因此外壳中不作减1处理反而能正常运行。我是给notepad.exe做加壳的。
2006-6-15 12:46
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
受不了,你得把pack部分贴了才能看出问题
2006-6-15 12:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好的,我这就贴啊。我是怕大家不耐烦看。

.data
  szFilter          db "PE files(*.exe, *.dll)", 0, "*.exe;*.dll", 0, "All files(*.*)", 0, "*.*", 0, 0
  szCaption  db "test packer by thirdlee", 0
  szOpenFileErr db "打开文件失败!", 0
  szNotPEFile  db "该文件不是PE文件!", 0
  szSectionName db ".lee", 0
  szModified    db "这个文件已经被我修改过了。", 0
  szBackup      db ".bak", 0
  szMemErr      db "申请内存失败!", 0
  szOver        db "修改完毕!", 0
  szEncryptSec  db ".text", 0
  pShellMap     dd 0
  pSecMap       dd 0
  dwSecOffset   dd 0
  dwSecSize     dd 0
  dwSecVirtualAddr dd  0
  dwRWSize         dd          1024*60
  dwCount          dd  0

       
.data?
  ofn      OPENFILENAME    <>
  hInst        dd               ?
  szFileName   db          MAX_PATH dup (?)
  hFile        HANDLE      ?
  dosh         IMAGE_DOS_HEADER     <>
  nth          IMAGE_NT_HEADERS32   <>
  sech         IMAGE_SECTION_HEADER <>
  szFileBackup db         MAX_PATH dup (?)

       
.code
main:
    ;获取实例句柄       
        invoke GetModuleHandle, eax
        mov hInst, eax
       
        ;填充打开文件对话框的结构体
        mov ofn.hInstance, eax
        mov ofn.lStructSize, sizeof ofn
        mov ofn.lpstrFilter, offset szFilter
        mov ofn.lpstrFile, offset szFileName    ;用来保存选中的文件名(含路径)
        mov ofn.nMaxFile, sizeof szFileName
       
        ;调用通用的打开文件对话框
        invoke GetOpenFileName, offset ofn
        .if eax == 0
                invoke ExitProcess, 0
        .endif
       
        ;打开文件
        invoke CreateFile, offset szFileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ \
                        or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
        .if eax == INVALID_HANDLE_VALUE
            invoke MessageBox, NULL, offset szOpenFileErr, offset szCaption, MB_OK or MB_ICONINFORMATION
                invoke ExitProcess, 0
        .endif
       
        mov hFile, eax
        invoke ReadFile, hFile, offset dosh, sizeof IMAGE_DOS_HEADER, esp, 0
        .if dosh.e_magic != IMAGE_DOS_SIGNATURE
                invoke CloseHandle, hFile
                invoke MessageBox, NULL, offset szNotPEFile, offset szCaption, MB_OK or MB_ICONINFORMATION               
                invoke ExitProcess, 0
        .endif
       
        invoke SetFilePointer, hFile, dosh.e_lfanew, NULL, FILE_BEGIN
        invoke ReadFile, hFile, offset nth, sizeof IMAGE_NT_HEADERS32, esp, 0
        .if nth.Signature != IMAGE_NT_SIGNATURE
                invoke CloseHandle, hFile
                invoke MessageBox, NULL, offset szNotPEFile, offset szCaption, MB_OK or MB_ICONINFORMATION
                invoke ExitProcess, 0
        .endif
       
        movzx ecx, nth.FileHeader.NumberOfSections
   
        xor ebx, ebx
        xor edx, edx
ReadSection:
        push ecx
        push ebx
        push edx
        invoke ReadFile, hFile, offset sech, sizeof IMAGE_SECTION_HEADER, esp, 0
        invoke lstrcmp, offset szSectionName, offset sech.Name1
        .if eax == 0
                invoke CloseHandle, hFile
                invoke MessageBox, NULL, offset szModified, offset szCaption, MB_OK or MB_ICONINFORMATION
                invoke ExitProcess, 0
        .endif
       
        ;获取要加密节的相关信息
        invoke lstrcmp, offset szEncryptSec, offset sech.Name1
        .if eax == 0
                push sech.PointerToRawData
                pop dwSecOffset
                push sech.SizeOfRawData
                pop dwSecSize
                mov dwSecSize, 10h
                push sech.VirtualAddress
                pop dwSecVirtualAddr
                mov eax, nth.OptionalHeader.ImageBase
                add dwSecVirtualAddr, eax
                mov sech.Characteristics, 0E00000E0h
                mov eax, sizeof IMAGE_SECTION_HEADER
                neg eax
                invoke SetFilePointer, hFile, eax, NULL, FILE_CURRENT
                invoke WriteFile, hFile, offset sech, sizeof IMAGE_SECTION_HEADER, esp, 0
        .endif

        pop edx
        mov eax, sech.PointerToRawData
        add eax, sech.SizeOfRawData
        mov edx, eax

        pop ebx
        mov eax, sech.VirtualAddress
        add eax, sech.Misc.VirtualSize
        mov ebx, eax
       
        pop ecx
        dec ecx
        .if ecx > 0
                jmp ReadSection
        .endif

        pushad
        ;这个文件没有被改过,在改之前先备份
        invoke lstrcpy, offset szFileBackup, offset szFileName
        invoke lstrcat, offset szFileBackup, offset szBackup
        invoke CopyFile, offset szFileName, offset szFileBackup, FALSE

        ;给新加的节赋名称
        invoke lstrcpy, offset sech.Name1, offset szSectionName
    popad
       
        mov eax, ShellSize
        mov sech.Misc.VirtualSize, eax
        mov sech.VirtualAddress, ebx
        mov sech.PointerToRawData, edx
        mov sech.SizeOfRawData, eax
        mov sech.PointerToRelocations, ecx
        mov sech.PointerToLinenumbers, ecx
        mov dword ptr sech.NumberOfRelocations, ecx
       
        ;文件按块对齐
        xor edx, edx
        mov eax, sech.SizeOfRawData
        mov ebx, 1ffh
        idiv ebx
        .if edx != 0
                sub edx, 200h
                neg edx
                add sech.SizeOfRawData, edx
        .endif
         
        ;节对齐
        mov ebx, sech.VirtualAddress
        mov edx, 00000fffh
        and ebx, edx
        .if ebx != 0
                sub ebx, 1000h
                neg ebx
                add sech.VirtualAddress, ebx
        .endif
       
        ;修改节属性
        mov sech.Characteristics, 0E00000E0h

        ;写入新的节头信息
        invoke WriteFile, hFile, offset sech, sizeof IMAGE_SECTION_HEADER, esp, 0
       
        ;申请内存来读第一个节数据
        invoke VirtualAlloc, NULL, dwSecSize, MEM_COMMIT, PAGE_READWRITE
        .if eax == NULL
                invoke CloseHandle, hFile
                invoke MessageBox, NULL, offset szMemErr, offset szCaption, MB_OK or MB_ICONINFORMATION
                invoke ExitProcess, 0
        .endif
        mov pSecMap, eax
       
        ;读入第一个节
        push 0
        pop dwCount
        invoke SetFilePointer, hFile, dwSecOffset, NULL, FILE_BEGIN
        mov eax, dwSecSize
        xor edx,edx
        idiv dwRWSize
        mov ecx, eax
        mov eax, pSecMap
        add eax, dwCount
@@ReadSecData:
        .if ecx > 0
                push edx
                invoke ReadFile, hFile, eax, dwRWSize, esp, 0
                pop edx
                add eax, dwRWSize
                dec ecx
                jmp @@ReadSecData
        .endif

        .if edx != 0
                invoke ReadFile, hFile, eax, edx, esp, 0
        .endif

        ;对读出的数据进行加密处理
        push 0
        pop dwCount
        mov ecx, dwSecSize
        mov eax, pSecMap
        add eax, dwCount
@@Crypt:
        xor byte ptr [eax], 1
        inc eax
        loop @@Crypt

        ;把数据写回去
        push 0
        pop dwCount
        invoke SetFilePointer, hFile, dwSecOffset, NULL, FILE_BEGIN
        mov eax, dwSecSize
        xor edx, edx
        idiv dwRWSize
        mov ecx, eax
        mov eax, pSecMap
        add eax, dwCount
@@WriteSecData:
        .if ecx > 0
                push edx
                invoke WriteFile, hFile, eax, dwRWSize, esp, 0
                pop edx
                add eax, dwRWSize
                dec ecx
                jmp @@WriteSecData
        .endif

        .if edx != 0
                invoke WriteFile, hFile, eax, edx, esp, 0
        .endif

        ;释放申请的内存空间
        invoke VirtualFree, pSecMap, 0, MEM_RELEASE

       
        inc nth.FileHeader.NumberOfSections
        mov eax, sech.Misc.VirtualSize       
        add nth.OptionalHeader.SizeOfImage, eax
        mov edx, 00000fffh
        and eax, edx
        .if eax != 0
                sub eax, 1000h
                neg eax
                add nth.OptionalHeader.SizeOfImage, eax
        .endif

        ;去掉bound import
        ;(88)表示11*8, 即 DataDirectory[11]
        push 0
        pop nth.OptionalHeader.DataDirectory(88).VirtualAddress

        ;拷贝壳代码
        invoke VirtualAlloc, NULL, ShellSize, MEM_COMMIT, PAGE_READWRITE
        .if eax == NULL
                invoke CloseHandle, hFile
                invoke MessageBox, NULL, offset szMemErr, offset szCaption, MB_OK or MB_ICONINFORMATION
                invoke ExitProcess, 0
        .endif
        mov pShellMap, eax

        push dwSecVirtualAddr
        push dwSecSize

        mov ecx, ShellSize
        mov esi, ShellStart
        mov edi, offset pShellMap
        rep movsb

        pop dwSecSize
        pop dwSecVirtualAddr
       
        ;保存旧入口地址
        mov eax, dword ptr nth.OptionalHeader.AddressOfEntryPoint
        add eax, dword ptr nth.OptionalHeader.ImageBase
        mov ebx, offset OldOep - offset ShellStart
        add ebx, offset pShellMap
        mov dword ptr[ebx], eax

        ;保存第一个节表的虚拟地址
        mov eax, dwSecVirtualAddr
        mov ebx, offset SecStart - offset ShellStart
        add ebx, offset pShellMap
        mov dword ptr [ebx], eax

        ;保存第一个节的大小
        mov eax, dwSecSize
        mov ebx, offset SecSize - offset ShellStart
        add ebx, offset pShellMap
        mov dword ptr [ebx], eax

        ;写入新的入口地址
        mov eax, sech.VirtualAddress
        add eax, ShellCodeStart - ShellStart + 4
        mov nth.OptionalHeader.AddressOfEntryPoint, eax

        invoke SetFilePointer, hFile, dosh.e_lfanew, NULL, FILE_BEGIN
        invoke WriteFile, hFile, offset nth, sizeof IMAGE_NT_HEADERS32, esp, 0
       
        mov eax, sech.PointerToRawData
        push eax
        invoke SetFilePointer, hFile, eax, NULL, FILE_BEGIN
        mov eax, ShellSize
        invoke WriteFile, hFile, offset pShellMap, eax, esp, 0
        invoke VirtualFree, pShellMap, 0, MEM_RELEASE
         
        pop eax
        add eax, sech.SizeOfRawData
        dec eax
        invoke SetFilePointer, hFile, eax, NULL, FILE_BEGIN
        invoke WriteFile, hFile, offset szCaption, 1, esp, 0       
       
        invoke CloseHandle, hFile

        invoke MessageBox, NULL, offset szOver, offset szCaption, MB_OK or MB_ICONINFORMATION
        invoke ExitProcess, 0
       
end main
2006-6-15 13:06
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
7
真长。

估计是后面的段VA跟前面一样。

文件和内存的情况不太一样。

并且加密前16字节不保险,可能破坏 iat 或it

你还是找个壳看看。

这么像个劣质病毒不像壳。
2006-6-15 13:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢。写得是比较烂。我也是看了别人的代码,然后自己想将一个节全部改变,然后再在壳中改回来,然后写了上面的代码来试一下。
我再看一下别人的代码好了。
2006-6-15 13:19
0
游客
登录 | 注册 方可回帖
返回
//