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

QQ登录

只需一步,快速开始

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

4gb_patch原理

[复制链接]
发表于 2015-2-22 17:36:44 | 显示全部楼层 |阅读模式

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

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

×
花1分钟搞了一下,该程序是允许程序支持4GB空间的小工具,今天恰好又见以前人讨论这个,现在分析一下:
话休絮烦,ida载入后直接找到代表WinMain的函数sub_4015A6,
  1. int __stdcall sub_4015A6(HINSTANCE hInstance, int a2, int a3, int a4)
  2. {
  3.   const WCHAR *v4; // eax@1
  4.   const WCHAR *v5; // eax@1

  5.   ::hInstance = hInstance;
  6.   v4 = GetCommandLineW();
  7.   v5 = sub_401218(v4);
  8.   if ( v5 )
  9.   {
  10.     sub_401087(v5);
  11.   }
  12.   else if ( sub_4011A1() == 1 )
  13.   {
  14.     DialogBoxParamW(hInstance, (LPCWSTR)0x65, 0, DialogFunc, 0);
  15.   }
  16.   return 0;
  17. }
复制代码

sub_401218显然是处理命令行的,不用管,进入sub_4011A1和sub_401087看看:

  1. int __cdecl sub_401087(LPCWSTR lpExistingFileName)
  2. {
  3.   HANDLE v1; // eax@1
  4.   void *v2; // ebx@1
  5.   int result; // eax@2
  6.   LPVOID v4; // edi@5
  7.   WCHAR NewFileName; // [sp+8h] [bp-210h]@1
  8.   DWORD NumberOfBytesRead; // [sp+210h] [bp-8h]@5
  9.   SIZE_T dwSize; // [sp+214h] [bp-4h]@3

  10.   sub_40162A(&NewFileName, lpExistingFileName);
  11.   sub_401638(&NewFileName, L".Backup");
  12.   CopyFileW(lpExistingFileName, &NewFileName, 1);
  13.   v1 = CreateFileW(lpExistingFileName, 0xC0000000, 1u, 0, 3u, 0x80u, 0);
  14.   v2 = v1;
  15.   if ( v1 == (HANDLE)-1 )
  16.   {
  17.     MessageBoxW(0, L"Couldn't open executable!", L"4GB Patch", 0x30u);
  18.     result = 0;
  19.   }
  20.   else
  21.   {
  22.     dwSize = GetFileSize(v1, 0);
  23.     if ( dwSize > 0x8000 )
  24.       dwSize = 0x8000;
  25.     v4 = VirtualAlloc(0, dwSize, 0x1000u, 4u);
  26.     if ( ReadFile(v2, v4, dwSize, &NumberOfBytesRead, 0) )
  27.     {
  28.       SetFilePointer(v2, 0, 0, 0);
  29.       *(_WORD *)((char *)v4 + *((_DWORD *)v4 + 15) + 22) |= 32u;
  30.       WriteFile(v2, v4, dwSize, &NumberOfBytesRead, 0);
  31.       CloseHandle(v2);
  32.       result = 1;
  33.     }
  34.     else
  35.     {
  36.       VirtualFree(v4, 0, 0x8000u);
  37.       CloseHandle(v2);
  38.       MessageBoxW(0, L"Couldn't read executable!", L"4GB Patch", 0x30u);
  39.       result = 0;
  40.     }
  41.   }
  42.   return result;
  43. }
  44. int __usercall sub_4011A1@<eax>(int a1@<ebx>)
  45. {
  46.   int result; // eax@2
  47.   WCHAR ExistingFileName; // [sp+0h] [bp-254h]@1
  48.   int v3; // [sp+208h] [bp-4Ch]@1
  49.   int v4; // [sp+20Ch] [bp-48h]@1
  50.   int v5; // [sp+214h] [bp-40h]@1
  51.   WCHAR *v6; // [sp+224h] [bp-30h]@1
  52.   int v7; // [sp+228h] [bp-2Ch]@1
  53.   int v8; // [sp+238h] [bp-1Ch]@1

  54.   sub_4015ED(a1, &ExistingFileName, 0, 0x208u);
  55.   sub_4015ED(a1, &v3, 0, 0x4Cu);
  56.   v4 = 0;
  57.   v6 = &ExistingFileName;
  58.   v3 = 76;
  59.   v5 = (int)L"All Files (*.*)";
  60.   v7 = 260;
  61.   v8 = (int)L"Select Executable...";
  62.   if ( GetOpenFileNameW((LPOPENFILENAMEW)&v3) )
  63.     result = sub_401087(&ExistingFileName);
  64.   else
  65.     result = 2;
  66.   return result;
  67. }
复制代码

可见小工具提供了命令行和选择2种方式,最后都要执行sub_401087
该函数读取文件并改写pe结构,具体为IMAGE_FILE_HEADER.Characteristics 增加IMAGE_FILE_LARGE_ADDRESSS_AWARE 意为支持2GB以上地址。。
分析完毕
回复

使用道具 举报

发表于 2015-2-22 19:18:31 来自手机 | 显示全部楼层
那路或多!原来如此简单哈。
回复 赞! 靠!

使用道具 举报

发表于 2015-2-23 09:42:38 | 显示全部楼层
原来如此,多谢分享
回复 赞! 靠!

使用道具 举报

发表于 2015-2-23 11:09:52 | 显示全部楼层
学习了 感谢分享
回复 赞! 靠!

使用道具 举报

本版积分规则

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

GMT+8, 2024-11-22 15:01 , Processed in 0.033543 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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