首页
社区
课程
招聘
[旧帖] [原创][申请邀请码]无输入表程序的实现 0.00雪花
发表于: 2011-9-4 22:37 1731

[旧帖] [原创][申请邀请码]无输入表程序的实现 0.00雪花

2011-9-4 22:37
1731
int mystrcmp (
                                        const char * src,
                                        const char * dst
                                        )
{
        int ret = 0 ;
       
        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;
       
        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;
       
        return( ret );
}

DWORD MyGetProcAddress(
                                           HMODULE hModule, // handle to DLL module
                                           LPCSTR lpProcName // function name
                                           )
{
       
        int i=0;
        PIMAGE_DOS_HEADER pImageDosHeader = NULL;
        PIMAGE_NT_HEADERS pImageNtHeader = NULL;
        PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = NULL;
       
        pImageDosHeader=(PIMAGE_DOS_HEADER)hModule;
        pImageNtHeader=(PIMAGE_NT_HEADERS)((DWORD)hModule+pImageDosHeader->e_lfanew);
        pImageExportDirectory=(PIMAGE_EXPORT_DIRECTORY)((DWORD)hModule+pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
       
        DWORD *pAddressOfFunction = (DWORD*)(pImageExportDirectory->AddressOfFunctions + (DWORD)hModule);
        DWORD *pAddressOfNames = (DWORD*)(pImageExportDirectory->AddressOfNames + (DWORD)hModule);
        DWORD dwNumberOfNames = (DWORD)(pImageExportDirectory->NumberOfNames);
        DWORD dwBase = (DWORD)(pImageExportDirectory->Base);
       
        WORD *pAddressOfNameOrdinals = (WORD*)(pImageExportDirectory->AddressOfNameOrdinals + (DWORD)hModule);
       
        //这个是查一下是按照什么方式(函数名称or函数序号)来查函数地址的
        DWORD dwName = (DWORD)lpProcName;
        if ((dwName & 0xFFFF0000) == 0)
        {
                goto xuhao;
        }
        for (i=0; i<(int)dwNumberOfNames; i++)
        {
                char *strFunction = (char *)(pAddressOfNames[i] + (DWORD)hModule);
                if (mystrcmp(lpProcName, strFunction) == 0)
                {
                        return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);
                }
        }
        return 0;
        //这个是通过以序号的方式来查函数地址的
xuhao:
        if (dwName < dwBase || dwName > dwBase + pImageExportDirectory->NumberOfFunctions - 1)
        {
                return 0;
        }
        return (pAddressOfFunction[dwName - dwBase] + (DWORD)hModule);
}
//定位Kernel32
__declspec(naked) int GetKernel32Base()
{
        __asm
        {
                XOR     ECX, ECX                    ; ECX = 0
                        MOV     ESI, FS:[ECX + 0x30]        ; ESI = &(PEB) ([FS:0x30])
                        MOV     ESI, [ESI + 0x0C]           ; ESI = PEB->Ldr
                        MOV     ESI, [ESI + 0x1C]           ; ESI = PEB->Ldr.InInitOrder
next_module:
                MOV     EAX, [ESI + 0x08]           ; EBP = InInitOrder[X].base_address
                        MOV     EDI, [ESI + 0x20]           ; EBP = InInitOrder[X].module_name (unicode)
                        MOV     ESI, [ESI]                  ; ESI = InInitOrder[X].flink (next module)
                        CMP     [EDI + 12*2], CL            ; modulename[12] == 0 ?
                        JNE     next_module                 ; No: try next module.
                        ret
        }
}

typedef int (WINAPI *MESSAGEBOXA)(HWND hWnd,
                LPCTSTR lpText,
                LPCTSTR lpCaption,
                UINT uType
                );

MESSAGEBOXA     MyMessageBoxA;
typedef HMODULE (WINAPI *LOADLIBRARYA)(
                                                                          LPCTSTR lpFileName
                                                                          );
LOADLIBRARYA    MyLoadLibrary;

int main()
{
     ULONG hKernelBase = GetKernel32Base();

     MyLoadLibrary = (LOADLIBRARYA) MyGetProcAddress((HINSTANCE__ *)hKernelBase, "LoadLibraryA");

     HMODULE hMode = MyLoadLibrary("user32.dll");
     MyMessageBoxA = (MESSAGEBOXA)MyGetProcAddress(hMode, "MessageBoxA");
   
     MyMessageBoxA(NULL, "搜索内存API函数!", "测试", 0);

     return 0;
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
原理就是通过内联汇编实现寻找Kernel32然后在通过一些PE文件的知识获得dll里的函数
然后调用之  沙发可以自己站把··
2011-9-4 22:40
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
站个位置,呵呵
2011-9-4 23:39
0
雪    币: 392
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
man慢慢来
2011-9-5 01:16
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看不懂。。。。。
2011-9-5 08:10
0
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
LZ 木有讲清楚啊~
2011-9-5 08:17
0
雪    币: 252
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错,代码很清楚
2011-9-5 08:52
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感觉好像 绝总博客中 《打造XP下可运行的微型PE文件》 这篇文章的缩减版。
2011-9-5 09:44
0
雪    币: 67
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
MyGetProcAddress 不能这样用了

MyGetProcAddress("GetProcAddress")    再get
2011-9-5 09:46
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
回复来个标记
2011-9-5 10:23
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
直接可以的...  里面获取了getprocaddress
2011-9-5 14:49
0
游客
登录 | 注册 方可回帖
返回
//