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

QQ登录

只需一步,快速开始

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

提取动态链接库ntdll的函数到静态lib

[复制链接]
发表于 2015-11-16 00:49:41 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 元始天尊 于 2015-11-21 00:32 编辑

        以_alldiv函数为例,为什么挑它呢? 因为他没有对数据引用,也没有全局变量导致重定位问题,纯机器码,用来测试我的“任意机器码转静态lib”最好不过
  1. // CodeCopier.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include <windows.h>
  4. #include <stdio.h>

  5. #define BEA_ENGINE_STATIC
  6. #define BEA_USE_STDCALL
  7. #include "BeaEngine.h"
  8. #pragma comment(lib,"BeaEngine.lib")

  9. #define        TYPE_I386        0x00000001
  10. #define        TYPE_AMD64        0x00000002
  11. #define TYPE_EXE        0x00000100
  12. #define TYPE_DLL        0x00000200
  13. #define TYPE_SYS        0x00000400
  14. #define TYPE_PE                0x00010000
  15. #define TYPE_FILE        0x10000000//文件
  16. #define TYPE_MEMMAP        0x20000000//文件内存映射代码
  17. #define TYPE_MEM        0x40000000//纯内存代码

  18. #define TYPE_FILE_DLL_X86 (TYPE_FILE | TYPE_PE | TYPE_DLL | TYPE_I386)

  19. #include <vector>
  20. using namespace std;

  21. BOOL OpenPeByFileName(PCHAR FilePath, PVOID* OutBaseAddr)
  22. {
  23.         if (!GetFileAttributesA(FilePath) & FILE_ATTRIBUTE_NORMAL)
  24.                 return FALSE;
  25.         *OutBaseAddr = (PVOID)(((ULONG_PTR)LoadLibrary(FilePath)) & ~0xF);
  26.         return TRUE;
  27. }

  28. BOOL OpenCodeContainer(ULONG CodeType, PCHAR Name, ULONG Id, PVOID* OutBaseAddr)
  29. {
  30.         switch (CodeType)
  31.         {
  32.                 case TYPE_FILE_DLL_X86:
  33.                         return OpenPeByFileName(Name, OutBaseAddr);
  34.                         break;
  35.                 default:
  36.                         break;
  37.         }
  38.         return FALSE;
  39. }

  40. int GetFunctionLen(ULONG_PTR Begin)
  41. {
  42.         DISASM disasm;
  43.         int sum = 0;
  44.         int len = 0, maxsize = 0xFFFF;
  45.         do
  46.         {
  47.                 memset(&disasm, 0, sizeof(disasm));
  48.                 disasm.EIP = (UIntPtr)Begin + (UIntPtr)sum;
  49.                 len = Disasm(&disasm);
  50.                 sum += len;
  51.                 if (len > 0)
  52.                 {
  53.                         if (strstr(disasm.CompleteInstr, "ret"))
  54.                                 break;//发现ret指令则假设函数退出并以此推测函数大小和
  55.                 }
  56.         } while (len > 0 && sum <= maxsize);
  57.         return sum;
  58. }

  59. BOOL WriteCodeToObj(HANDLE File, ULONG_PTR Begin, ULONG Len)
  60. {
  61.         //1.构造section目录
  62.         //2.构造section内容,将各个section内部数据存储到lib中,lib的section的个数为导出符号数,导出地址需要适应IMAGE_SCN_ALIGN_??BYTES
  63.         //3.构造COFF Symbol Table
  64.         //4.加入导出符号名数组

  65.         std::vector<BYTE> filedata;
  66.         IMAGE_FILE_HEADER objheader;
  67.         int symbolnum = 0;

  68.         //加入文件头
  69.         memset(&objheader, 0, sizeof(objheader));
  70.         filedata.insert(filedata.end(), (BYTE*)&objheader, (BYTE*)(&objheader + 1));

  71.         //加入k个.text段
  72.         int secnum = 1;//要求dll输出最后一个为辅助函数
  73.         int offsetraw = sizeof(IMAGE_FILE_HEADER)+secnum * sizeof(IMAGE_SECTION_HEADER);//后置数据偏移
  74.         int offsetsymbol = 4;//符号字串偏移,之前有字串数DWORD
  75.         int index = 0;

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

  80.         IMAGE_SECTION_HEADER secheader;
  81.         memset(&secheader, 0, sizeof(secheader));
  82.         memcpy(secheader.Name, ".text", IMAGE_SIZEOF_SHORT_NAME);
  83.         secheader.SizeOfRawData = Len;
  84.         secheader.PointerToRawData = offsetraw ;
  85.         secheader.Characteristics = IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ;


  86.         secheader.PointerToRelocations = secheader.PointerToRawData + secheader.SizeOfRawData;
  87.         filedata.insert(filedata.end(), (BYTE*)&secheader, (BYTE*)(&secheader + 1));

  88.         //构造symboltable和section关联
  89.         IMAGE_SYMBOL symbol;
  90.         BYTE* funcname = (BYTE*)"_alldiv";
  91.         functors.insert(functors.end(),funcname,funcname+8);
  92.         memset(&symbol, 0, sizeof(symbol));
  93.         symbol.N.LongName[1] = offsetsymbol;
  94.         symbol.SectionNumber = index + 1;
  95.         symbol.Type = 0x20;// TYPE_FUNCTION
  96.         symbol.StorageClass = IMAGE_SYM_CLASS_EXTERNAL;
  97.         symbolinfo.insert(symbolinfo.end(), (BYTE*)&symbol, (BYTE*)(&symbol + 1));

  98.         filedata.insert(filedata.end(), (BYTE*)Begin,(BYTE*)Begin + Len);

  99.         //更新头部
  100.         IMAGE_FILE_HEADER* pobjheader = (IMAGE_FILE_HEADER*)filedata.data();
  101.         pobjheader->Machine = IMAGE_FILE_MACHINE_I386;
  102.         pobjheader->NumberOfSections = secnum;
  103.         pobjheader->PointerToSymbolTable = filedata.size();//计算符号表偏移
  104.         pobjheader->NumberOfSymbols = symbolnum;
  105.         //加入符号表
  106.         filedata.insert(filedata.end(), symbolinfo.begin(), symbolinfo.end());
  107.         //加入符号名数组个数
  108.         int strsize = functors.size() + 4;
  109.         filedata.insert(filedata.end(), (BYTE*)&strsize, (BYTE*)(&strsize + 1));
  110.         //加入符号名数组
  111.         filedata.insert(filedata.end(), functors.begin(), functors.end());

  112.         DWORD writenum;
  113.         WriteFile(File, filedata.data(), filedata.size(), &writenum, NULL);
  114.         return TRUE;
  115. }

  116. void main()
  117. {
  118.         //第一步,打开文件或内存
  119.         PVOID BaseAddr = NULL;
  120.         ULONG BufSize;
  121.         OpenCodeContainer(TYPE_FILE_DLL_X86, "e:\\ntdll.dll", 0, &BaseAddr);;

  122.         HANDLE hObj = CreateFileA("alldiv.obj", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
  123.        
  124.         if (BaseAddr)
  125.         {
  126.                 ULONG_PTR Begin = (ULONG_PTR)GetProcAddress((HMODULE)BaseAddr, "_alldiv");
  127.                 int Len = GetFunctionLen(Begin);
  128.                 WriteCodeToObj(hObj, Begin, Len);
  129.         }

  130.         CloseHandle(hObj);
  131. }

复制代码


生成obj结果
  1. ext:00000000
  2. .text:00000000 ; =============== S U B R O U T I N E =======================================
  3. .text:00000000
  4. .text:00000000
  5. .text:00000000                 public _alldiv
  6. .text:00000000 _alldiv         proc near
  7. .text:00000000
  8. .text:00000000 arg_0           = dword ptr  4
  9. .text:00000000 arg_4           = dword ptr  8
  10. .text:00000000 arg_8           = dword ptr  0Ch
  11. .text:00000000 arg_C           = dword ptr  10h
  12. .text:00000000
  13. .text:00000000                 push    edi
  14. .text:00000001                 push    esi
  15. .text:00000002                 push    ebx
  16. .text:00000003                 xor     edi, edi
  17. .text:00000005                 mov     eax, [esp+0Ch+arg_4]
  18. .text:00000009                 or      eax, eax
  19. .text:0000000B                 jge     short loc_21
  20. .text:0000000D                 inc     edi
  21. .text:0000000E                 mov     edx, [esp+0Ch+arg_0]
  22. .text:00000012                 neg     eax
  23. .text:00000014                 neg     edx
  24. .text:00000016                 sbb     eax, 0
  25. .text:00000019                 mov     [esp+0Ch+arg_4], eax
  26. .text:0000001D                 mov     [esp+0Ch+arg_0], edx
  27. .text:00000021
  28. .text:00000021 loc_21:                                 ; CODE XREF: _alldiv+Bj
  29. .text:00000021                 mov     eax, [esp+0Ch+arg_C]
  30. .text:00000025                 or      eax, eax
  31. .text:00000027                 jge     short loc_3D
  32. .text:00000029                 inc     edi
  33. .text:0000002A                 mov     edx, [esp+0Ch+arg_8]
  34. .text:0000002E                 neg     eax
  35. .text:00000030                 neg     edx
  36. .text:00000032                 sbb     eax, 0
  37. .text:00000035                 mov     [esp+0Ch+arg_C], eax
  38. .text:00000039                 mov     [esp+0Ch+arg_8], edx
  39. .text:0000003D
  40. .text:0000003D loc_3D:                                 ; CODE XREF: _alldiv+27j
  41. .text:0000003D                 or      eax, eax
  42. .text:0000003F                 jnz     short loc_59
  43. .text:00000041                 mov     ecx, [esp+0Ch+arg_8]
  44. .text:00000045                 mov     eax, [esp+0Ch+arg_4]
  45. .text:00000049                 xor     edx, edx
  46. .text:0000004B                 div     ecx
  47. .text:0000004D                 mov     ebx, eax
  48. .text:0000004F                 mov     eax, [esp+0Ch+arg_0]
  49. .text:00000053                 div     ecx
  50. .text:00000055                 mov     edx, ebx
  51. .text:00000057                 jmp     short loc_9A
  52. .text:00000059 ; ---------------------------------------------------------------------------
  53. .text:00000059
  54. .text:00000059 loc_59:                                 ; CODE XREF: _alldiv+3Fj
  55. .text:00000059                 mov     ebx, eax
  56. .text:0000005B                 mov     ecx, [esp+0Ch+arg_8]
  57. .text:0000005F                 mov     edx, [esp+0Ch+arg_4]
  58. .text:00000063                 mov     eax, [esp+0Ch+arg_0]
  59. .text:00000067
  60. .text:00000067 loc_67:                                 ; CODE XREF: _alldiv+71j
  61. .text:00000067                 shr     ebx, 1
  62. .text:00000069                 rcr     ecx, 1
  63. .text:0000006B                 shr     edx, 1
  64. .text:0000006D                 rcr     eax, 1
  65. .text:0000006F                 or      ebx, ebx
  66. .text:00000071                 jnz     short loc_67
  67. .text:00000073                 div     ecx
  68. .text:00000075                 mov     esi, eax
  69. .text:00000077                 mul     [esp+0Ch+arg_C]
  70. .text:0000007B                 mov     ecx, eax
  71. .text:0000007D                 mov     eax, [esp+0Ch+arg_8]
  72. .text:00000081                 mul     esi
  73. .text:00000083                 add     edx, ecx
  74. .text:00000085                 jb      short loc_95
  75. .text:00000087                 cmp     edx, [esp+0Ch+arg_4]
  76. .text:0000008B                 ja      short loc_95
  77. .text:0000008D                 jb      short loc_96
  78. .text:0000008F                 cmp     eax, [esp+0Ch+arg_0]
  79. .text:00000093                 jbe     short loc_96
  80. .text:00000095
  81. .text:00000095 loc_95:                                 ; CODE XREF: _alldiv+85j
  82. .text:00000095                                         ; _alldiv+8Bj
  83. .text:00000095                 dec     esi
  84. .text:00000096
  85. .text:00000096 loc_96:                                 ; CODE XREF: _alldiv+8Dj
  86. .text:00000096                                         ; _alldiv+93j
  87. .text:00000096                 xor     edx, edx
  88. .text:00000098                 mov     eax, esi
  89. .text:0000009A
  90. .text:0000009A loc_9A:                                 ; CODE XREF: _alldiv+57j
  91. .text:0000009A                 dec     edi
  92. .text:0000009B                 jnz     short loc_A4
  93. .text:0000009D                 neg     edx
  94. .text:0000009F                 neg     eax
  95. .text:000000A1                 sbb     edx, 0
  96. .text:000000A4
  97. .text:000000A4 loc_A4:                                 ; CODE XREF: _alldiv+9Bj
  98. .text:000000A4                 pop     ebx
  99. .text:000000A5                 pop     esi
  100. .text:000000A6                 pop     edi
  101. .text:000000A7                 retn    10h
  102. .text:000000A7 _alldiv         endp
  103. .text:000000A7
  104. .text:000000A7 _text           ends
  105. .text:000000A7
  106. .text:000000A7
  107. .text:000000A7                 end
复制代码


另附lib解压obj大法:
保存以下代码到1.bat
for %%i in (*.lib) do (
for /f %%j in ('lib /nologo /list %%i') do (
  echo %%j
  lib /nologo /extract:%%j %%i
)
)

设置lib.exe到环境变量path中,命令行定位到lib目录,执行1.bat即可

回复

使用道具 举报

发表于 2015-11-19 00:46:18 | 显示全部楼层
不错,这收藏了,以后想静态链接就爽多了!
回复 赞! 靠!

使用道具 举报

发表于 2015-11-25 16:51:00 | 显示全部楼层
回复

使用道具 举报

本版积分规则

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

GMT+8, 2024-11-22 02:09 , Processed in 0.030549 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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