找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2421|回复: 1

lib文件研究(一)

[复制链接]
发表于 2015-3-21 15:14:05 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 元始天尊 于 2015-3-21 15:16 编辑

现在有2个构想:
1.支持所有pe格式字节码转换为静态lib格式,以实现无dll运行,反逆向,反调试
2.在1的基础上实现lib字节码优化,链接时优化

今天研究了下lib文件格式,已经有初步成果,大家来看看吧:
手动构造obj文件格式代码(mfc+stl):
  1. #define CODEALIGN 16
  2. #define TYPE_FUNCTION 0x20
  3. void MakeObj()
  4. {
  5.         std::vector<BYTE> filedata;
  6.         IMAGE_FILE_HEADER objheader;
  7.         int symbolnum = 0;

  8.         //加入文件头
  9.         memset(&objheader, 0, sizeof(objheader));
  10.         filedata.insert(filedata.end(), (BYTE*)&objheader, (BYTE*)(&objheader + 1));

  11.         //加入10个.text段
  12.         int secnum = 10;
  13.         int offsetraw = 0;//后置数据偏移
  14.         int offsetsymbol = 4;//符号字串偏移,之前有字串数DWORD

  15.         symbolnum = secnum;
  16.         std::vector<BYTE> rawdata;//储存各个section指向的数据
  17.         std::vector<BYTE> symbolinfo;//存储COFF Symbol Table
  18.         std::vector<BYTE> functors;//存储符号名数组

  19.         for (int i = 0; i < secnum; i++)
  20.         {
  21.                 IMAGE_SECTION_HEADER textsec;
  22.                 //构造int _cdecl func?(void);字节码
  23.                 BYTE code[CODEALIGN] = { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
  24.                 *(int*)(code + 1) = i;//构造 return i; 语句;
  25.                 rawdata.insert(rawdata.end(), code, code + CODEALIGN);
  26.                 memset(&textsec, 0, sizeof(textsec));
  27.                 memcpy(textsec.Name, ".text", sizeof(".text"));
  28.                 textsec.SizeOfRawData = ((sizeof(code) - 1) / CODEALIGN + 1) * CODEALIGN;
  29.                 textsec.PointerToRawData = sizeof(IMAGE_FILE_HEADER) + secnum * sizeof(IMAGE_SECTION_HEADER) + offsetraw;
  30.                 textsec.Characteristics = IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ;
  31.                 filedata.insert(filedata.end(), (BYTE*)&textsec, (BYTE*)(&textsec + 1));
  32.                 offsetraw += CODEALIGN;

  33.                 //构造symboltable和section关联
  34.                 IMAGE_SYMBOL symbol;
  35.                 std::ostringstream os;
  36.                 os << "?func" << i << "@@YAHN@Z";//构造符号
  37.                 std::string temp(os.str());
  38.                 functors.insert(functors.end(),temp.c_str(),temp.c_str()+temp.size()+1);

  39.                 memset(&symbol, 0, sizeof(symbol));
  40.                 symbol.N.LongName[1] = offsetsymbol;
  41.                 symbol.SectionNumber = i + 1;
  42.                 symbol.Type = TYPE_FUNCTION;
  43.                 symbol.StorageClass = IMAGE_SYM_CLASS_EXTERNAL;
  44.                 symbolinfo.insert(symbolinfo.end(), (BYTE*)&symbol,(BYTE*)(&symbol+1));
  45.                 offsetsymbol += temp.size()+1;
  46.         }
  47.         filedata.insert(filedata.end(), rawdata.begin(), rawdata.end());

  48.         //更新头部
  49.         IMAGE_FILE_HEADER* pobjheader=(IMAGE_FILE_HEADER*)filedata.data();
  50.         pobjheader->Machine = IMAGE_FILE_MACHINE_I386;
  51.         pobjheader->NumberOfSections = secnum;
  52.         pobjheader->PointerToSymbolTable = filedata.size();//计算符号表偏移
  53.         pobjheader->NumberOfSymbols = symbolnum;
  54.         //加入符号表
  55.         filedata.insert(filedata.end(), symbolinfo.begin(), symbolinfo.end());
  56.         //加入符号名数组个数
  57.         int strsize = functors.size() + 4;
  58.         filedata.insert(filedata.end(), (BYTE*)&strsize, (BYTE*)(&strsize + 1));
  59.         //加入符号名数组
  60.         filedata.insert(filedata.end(), functors.begin(), functors.end());

  61.         DWORD writenum;
  62.         auto_handle<HANDLE> handle(CreateFile("test.obj", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL));
  63.         WriteFile(handle, filedata.data(), filedata.size(), &writenum, NULL);
  64.         //lib test.obj /out:test.lib 得到lib  
  65.         //#pragma comment(lib,"test.lib")包含lib
  66. }
复制代码


该段代码是我根据coff规范研究得到,够早了10个int func?(double)放在obj中
得到obj以后,用lib test.obj /out:test.lib 得到lib  
将该lib用于要链接的工程里,如下:
  1. #pragma comment(lib,"test.lib")
  2. #define DEF(i) int __cdecl func##i(double)

  3. DEF(0);
  4. DEF(1);
  5. DEF(2);
  6. DEF(3);
  7. DEF(4);
  8. DEF(5);
  9. DEF(6);
  10. DEF(7);
  11. DEF(8);
  12. DEF(9);

  13. typedef int(__cdecl* FUNCARRAY)(double);
  14. FUNCARRAY fa[] = { func0, func1, func2, func3, func4, func5, func6, func7, func8, func9 };

  15. int _tmain(int argc, _TCHAR* argv[])
  16. {
  17.         for (int i = 0; i < 10;i++)
  18.                 std::cout << fa[i](0.0)<<std::endl;
  19.         return 0;
  20. }
复制代码


winhex obj结构:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   4C 01 0A 00 00 00 00 00  44 02 00 00 0A 00 00 00   L       D      
00000010   00 00 00 00 2E 74 65 78  74 00 00 00 00 00 00 00       .text      
00000020   00 00 00 00 10 00 00 00  A4 01 00 00 00 00 00 00           ?      
00000030   00 00 00 00 00 00 00 00  20 00 50 60 2E 74 65 78             P`.tex
00000040   74 00 00 00 00 00 00 00  00 00 00 00 10 00 00 00   t               
00000050   B4 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ?              
00000060   20 00 50 60 2E 74 65 78  74 00 00 00 00 00 00 00     P`.text      
00000070   00 00 00 00 10 00 00 00  C4 01 00 00 00 00 00 00           ?      
00000080   00 00 00 00 00 00 00 00  20 00 50 60 2E 74 65 78             P`.tex
00000090   74 00 00 00 00 00 00 00  00 00 00 00 10 00 00 00   t               
000000A0   D4 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ?              
000000B0   20 00 50 60 2E 74 65 78  74 00 00 00 00 00 00 00     P`.text      
000000C0   00 00 00 00 10 00 00 00  E4 01 00 00 00 00 00 00           ?      
000000D0   00 00 00 00 00 00 00 00  20 00 50 60 2E 74 65 78             P`.tex
000000E0   74 00 00 00 00 00 00 00  00 00 00 00 10 00 00 00   t               
000000F0   F4 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ?              
00000100   20 00 50 60 2E 74 65 78  74 00 00 00 00 00 00 00     P`.text      
00000110   00 00 00 00 10 00 00 00  04 02 00 00 00 00 00 00                  
00000120   00 00 00 00 00 00 00 00  20 00 50 60 2E 74 65 78             P`.tex
00000130   74 00 00 00 00 00 00 00  00 00 00 00 10 00 00 00   t               
00000140   14 02 00 00 00 00 00 00  00 00 00 00 00 00 00 00                  
00000150   20 00 50 60 2E 74 65 78  74 00 00 00 00 00 00 00     P`.text      
00000160   00 00 00 00 10 00 00 00  24 02 00 00 00 00 00 00           $      
00000170   00 00 00 00 00 00 00 00  20 00 50 60 2E 74 65 78             P`.tex
00000180   74 00 00 00 00 00 00 00  00 00 00 00 10 00 00 00   t               
00000190   34 02 00 00 00 00 00 00  00 00 00 00 00 00 00 00   4               
000001A0   20 00 50 60 B8 00 00 00  00 C3 90 90 90 90 90 90     P`?   ?     
000001B0   90 90 90 90 B8 01 00 00  00 C3 90 90 90 90 90 90       ?   ?     
000001C0   90 90 90 90 B8 02 00 00  00 C3 90 90 90 90 90 90       ?   ?     
000001D0   90 90 90 90 B8 03 00 00  00 C3 90 90 90 90 90 90       ?   ?     
000001E0   90 90 90 90 B8 04 00 00  00 C3 90 90 90 90 90 90       ?   ?     
000001F0   90 90 90 90 B8 05 00 00  00 C3 90 90 90 90 90 90       ?   ?     
00000200   90 90 90 90 B8 06 00 00  00 C3 90 90 90 90 90 90       ?   ?     
00000210   90 90 90 90 B8 07 00 00  00 C3 90 90 90 90 90 90       ?   ?     
00000220   90 90 90 90 B8 08 00 00  00 C3 90 90 90 90 90 90       ?   ?     
00000230   90 90 90 90 B8 09 00 00  00 C3 90 90 90 90 90 90       ?   ?     
00000240   90 90 90 90 00 00 00 00  04 00 00 00 00 00 00 00                  
00000250   01 00 20 00 02 00 00 00  00 00 13 00 00 00 00 00                  
00000260   00 00 02 00 20 00 02 00  00 00 00 00 22 00 00 00               "   
00000270   00 00 00 00 03 00 20 00  02 00 00 00 00 00 31 00                 1
00000280   00 00 00 00 00 00 04 00  20 00 02 00 00 00 00 00                  
00000290   40 00 00 00 00 00 00 00  05 00 20 00 02 00 00 00   @               
000002A0   00 00 4F 00 00 00 00 00  00 00 06 00 20 00 02 00     O            
000002B0   00 00 00 00 5E 00 00 00  00 00 00 00 07 00 20 00       ^           
000002C0   02 00 00 00 00 00 6D 00  00 00 00 00 00 00 08 00         m         
000002D0   20 00 02 00 00 00 00 00  7C 00 00 00 00 00 00 00           |      
000002E0   09 00 20 00 02 00 00 00  00 00 8B 00 00 00 00 00             ?   
000002F0   00 00 0A 00 20 00 02 00  9A 00 00 00 3F 66 75 6E           ?  ?fun
00000300   63 30 40 40 59 41 48 4E  40 5A 00 3F 66 75 6E 63   c0@@YAHN@Z ?func
00000310   31 40 40 59 41 48 4E 40  5A 00 3F 66 75 6E 63 32   1@@YAHN@Z ?func2
00000320   40 40 59 41 48 4E 40 5A  00 3F 66 75 6E 63 33 40   @@YAHN@Z ?func3@
00000330   40 59 41 48 4E 40 5A 00  3F 66 75 6E 63 34 40 40   @YAHN@Z ?func4@@
00000340   59 41 48 4E 40 5A 00 3F  66 75 6E 63 35 40 40 59   YAHN@Z ?func5@@Y
00000350   41 48 4E 40 5A 00 3F 66  75 6E 63 36 40 40 59 41   AHN@Z ?func6@@YA
00000360   48 4E 40 5A 00 3F 66 75  6E 63 37 40 40 59 41 48   HN@Z ?func7@@YAH
00000370   4E 40 5A 00 3F 66 75 6E  63 38 40 40 59 41 48 4E   N@Z ?func8@@YAHN
00000380   40 5A 00 3F 66 75 6E 63  39 40 40 59 41 48 4E 40   @Z ?func9@@YAHN@
00000390   5A 00                                              Z

dumpbin /all结果:
Microsoft (R) COFF/PE Dumper Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file D:\Projects\peExtractor\peExtractor\test.obj

File Type: COFF OBJECT

FILE HEADER VALUES
             14C machine (x86)
               A number of sections
               0 time date stamp Thu Jan 01 08:00:00 1970
             244 file pointer to symbol table
               A number of symbols
               0 size of optional header
               0 characteristics

SECTION HEADER #1
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     1A4 file pointer to raw data (000001A4 to 000001B3)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #1
  00000000: B8 00 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #2
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     1B4 file pointer to raw data (000001B4 to 000001C3)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #2
  00000000: B8 01 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #3
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     1C4 file pointer to raw data (000001C4 to 000001D3)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #3
  00000000: B8 02 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #4
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     1D4 file pointer to raw data (000001D4 to 000001E3)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #4
  00000000: B8 03 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #5
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     1E4 file pointer to raw data (000001E4 to 000001F3)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #5
  00000000: B8 04 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #6
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     1F4 file pointer to raw data (000001F4 to 00000203)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #6
  00000000: B8 05 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #7
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     204 file pointer to raw data (00000204 to 00000213)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #7
  00000000: B8 06 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #8
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     214 file pointer to raw data (00000214 to 00000223)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #8
  00000000: B8 07 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #9
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     224 file pointer to raw data (00000224 to 00000233)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #9
  00000000: B8 08 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

SECTION HEADER #A
   .text name
       0 physical address
       0 virtual address
      10 size of raw data
     234 file pointer to raw data (00000234 to 00000243)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60500020 flags
         Code
         16 byte align
         Execute Read

RAW DATA #A
  00000000: B8 09 00 00 00 C3 90 90 90 90 90 90 90 90 90 90  ?....?..........

COFF SYMBOL TABLE
000 00000000 SECT1  notype ()    External     | ?func0@@YAHN@Z (int __cdecl func0(double))
001 00000000 SECT2  notype ()    External     | ?func1@@YAHN@Z (int __cdecl func1(double))
002 00000000 SECT3  notype ()    External     | ?func2@@YAHN@Z (int __cdecl func2(double))
003 00000000 SECT4  notype ()    External     | ?func3@@YAHN@Z (int __cdecl func3(double))
004 00000000 SECT5  notype ()    External     | ?func4@@YAHN@Z (int __cdecl func4(double))
005 00000000 SECT6  notype ()    External     | ?func5@@YAHN@Z (int __cdecl func5(double))
006 00000000 SECT7  notype ()    External     | ?func6@@YAHN@Z (int __cdecl func6(double))
007 00000000 SECT8  notype ()    External     | ?func7@@YAHN@Z (int __cdecl func7(double))
008 00000000 SECT9  notype ()    External     | ?func8@@YAHN@Z (int __cdecl func8(double))
009 00000000 SECTA  notype ()    External     | ?func9@@YAHN@Z (int __cdecl func9(double))

String Table Size = 0x9A bytes

  Summary

          A0 .text


结果:
0
1
2
3
4
5
6
7
8
9
符合预期。。。
回复

使用道具 举报

发表于 2015-3-24 14:46:14 | 显示全部楼层
lib也能这样搞??





    回复 赞! 靠!

    使用道具 举报

    本版积分规则

    QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

    GMT+8, 2024-11-24 13:11 , Processed in 0.031519 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表