查看: 818|回复: 27

构造假堆栈

[复制链接]

该用户从未签到

草莽豪杰

威望
69
金钱
787
贡献
20
推广数
0
紫钻
0
阅读权限
30
在线时间
25 小时
最后登录
2013-11-18
发表于 2013-6-17 10:28:28 | 显示全部楼层 |阅读模式
本帖最后由 wow 于 2013-6-17 10:29 编辑
  1. #include <windows.h>

  2. /////////////////////////////////////////////////////////////////////////////////
  3. //   __stdcall 与 _cdecl 两个函数最后只会影响edi跟esi的值,函数都不会出什么问题
  4. /////////////////////////////////////////////////////////////////////////////////

  5. // __stdcall 方式的函数
  6. void WINAPI Use_Stdcall_Bypass_Call_Func(DWORD  dwFakeStackFrameArray[260] ,
  7.                                                                                  DWORD FunctionName,
  8.                                                                                  DWORD *dwArgv,
  9.                                                                                  DWORD dwcount,
  10.                                                                                  DWORD dwXAddr);
  11. // _cdecl  方式的函数
  12. void WINAPI Use_cdecl_Bypass_Call_Func(DWORD  dwFakeStackFrameArray[260] ,
  13.                                                                            DWORD FunctionName,
  14.                                                                            DWORD *dwArgv,
  15.                                                                            DWORD dwcount,
  16.                                                                            DWORD dwXAddr);

  17. void BypassCallStackCheck(LPTSTR szDllName);
  18. void FuncG(void);



  19. void FuncG(void)
  20. {
  21.     BypassCallStackCheck(TEXT("kernel32.dll"));
  22.         MessageBox(NULL, "Test Bypass Call Stack Check", "winsun: Bypass", 0);
  23. }

  24. void BypassCallStackCheck(LPTSTR szDllName)
  25. {
  26.         DWORD dwFakeStackFrame[260] = {0};

  27.         DWORD   dwFakeRetAddr = 0xFEFEFEFE;
  28.     PDWORD  pdwEbp = NULL;
  29.         PCHAR   pszTitle = "ByPass Call Stack Check \0";
  30.         PCHAR   pszCaption = "winsun \0";
  31.         DWORD   dwMsgBoxAddr = 0;
  32.         DWORD   dwRealAddr = 0;
  33.     PBYTE   pbSearchRet = NULL;
  34.         dwMsgBoxAddr = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
  35.         
  36.     for ( int iLoop = 0; iLoop < 100; )
  37.     {
  38.         dwFakeStackFrame[iLoop]   = (DWORD)&dwFakeStackFrame[iLoop+2];
  39.                 dwFakeStackFrame[iLoop+1] = dwFakeRetAddr;
  40.                 iLoop += 2;
  41.     }


  42.         HMODULE hmodle = GetModuleHandle(szDllName);
  43.         if (hmodle == NULL)
  44.         {
  45.                 // can't find the module
  46.                 return ;
  47.         }
  48.         DWORD RetAddress = NULL;
  49.         try
  50.         {
  51.                 // 找代码段里面的ret指令
  52.                 PIMAGE_DOS_HEADER  mzhead = (PIMAGE_DOS_HEADER) hmodle;
  53.                 PIMAGE_NT_HEADERS peheader =
  54.                         (PIMAGE_NT_HEADERS)((DWORD)mzhead + mzhead->e_lfanew);
  55.                 LPBYTE pbuf = (LPBYTE)( (DWORD)mzhead + peheader->OptionalHeader.BaseOfCode );
  56.                 DWORD dwsize = peheader->OptionalHeader.SizeOfCode;
  57.                 for (DWORD i=0; i<dwsize; i++, pbuf++)
  58.                 {
  59.                         if (*pbuf == 0x0C3)
  60.                         {
  61.                                 RetAddress = (DWORD)pbuf;
  62.                                 break;
  63.                         }
  64.                 }
  65.         }
  66.         catch (...)
  67.         {
  68.                 // 不可读异常
  69.                 return ;
  70.         }
  71.         if (RetAddress == NULL)
  72.         {
  73.                 // no ret code in module
  74.                 return ;
  75.         }

  76.         //  函数参数,[0]最后一个参数,[1]倒数第二个参数...
  77.         DWORD argv[4] = {0};
  78.         argv[0] = MB_OK;
  79.         argv[1] = (DWORD)pszCaption ;
  80.         argv[2] = (DWORD)pszTitle;
  81.         argv[3] = NULL;

  82.     Use_Stdcall_Bypass_Call_Func(dwFakeStackFrame, dwMsgBoxAddr, argv, 4, RetAddress); // 0x7c921224);
  83. }

  84. _declspec (naked) void WINAPI Use_Stdcall_Bypass_Call_Func(DWORD dwFakeStackFrameArray[260] ,
  85.                                                                                                                    DWORD FunctionName,
  86.                                                                                                                    DWORD *dwArgv,
  87.                                                                                                                    DWORD dwcount,
  88.                                                                                                                    DWORD dwXAddr)
  89. {
  90.         _asm
  91.         {
  92.                 //function prologue(函数前导指令)
  93.                 mov edi, edi
  94.                 push ebp
  95.                 mov ebp, esp
  96.                
  97.                 //function body
  98.                 push esi
  99.                 mov esi,ebp
  100.                
  101.                 push REAL_RET_ADDR
  102.                 mov  eax,dwArgv
  103.                 mov  ecx,dwcount

  104.                 // 函数使用的参数入当前栈
  105. push_argv:
  106.                 mov  ebx,[eax]
  107.                 push ebx
  108.                 add  eax,4
  109.                 dec  ecx
  110.                 jnz  push_argv

  111.                 push dwXAddr
  112.                 mov  eax, FunctionName
  113.                 mov  ebp, dwFakeStackFrameArray //把假栈帧基地址赋值给EBP
  114.                 jmp  eax //跳入MessageBox()函数执行
  115.                                 
  116. REAL_RET_ADDR:
  117.                 mov  ebp,esi
  118.                 pop  esi
  119.                 //function epilogue(函数后继指令),for stack balance
  120.                 mov  esp, ebp
  121.                 pop  ebp
  122.                 ret  20
  123.         }
  124. }

  125. _declspec (naked) void WINAPI Use_cdecl_Bypass_Call_Func(  DWORD dwFakeStackFrameArray[260] ,
  126.                                                                                                                    DWORD FunctionName,
  127.                                                                                                                    DWORD *dwArgv,
  128.                                                                                                                    DWORD dwcount,
  129.                                                                                                                    DWORD dwXAddr)
  130. {
  131.         _asm
  132.         {
  133.                 //function prologue(函数前导指令)
  134.                         mov edi, edi
  135.                         push ebp
  136.                         mov ebp, esp

  137.                         //function body
  138.                         push esi
  139.                         mov esi,ebp
  140.                         push edi
  141.                         mov edi,dwcount

  142.                         push REAL_RET_ADDR
  143.                         mov  eax,dwArgv
  144.                         mov  ecx,dwcount
  145. push_argv:
  146.                         mov  ebx,[eax]
  147.                         push ebx
  148.                         add  eax,4
  149.                         dec  ecx
  150.                         jnz  push_argv

  151.                         push dwXAddr
  152.                         mov  eax, FunctionName
  153.                         mov  ebp, dwFakeStackFrameArray //把假栈帧基地址赋值给EBP
  154.                         jmp  eax //跳入MessageBox()函数执行

  155. REAL_RET_ADDR:
  156.                         rol edi,2
  157.                         add esp,edi
  158.                         pop edi
  159.                         mov  ebp,esi
  160.                         pop  esi
  161.                         //function epilogue(函数后继指令),for stack balance
  162.                         mov  esp, ebp
  163.                         pop  ebp
  164.                         ret  20
  165.         }
  166. }


  167. int main()
  168. {
  169.         FuncG();
  170.         return 0;
  171. }
复制代码
[catsoul=3]你懂的。[/catsoul]

评分

参与人数 1威望 +10 金钱 +100 贡献 +10 收起 理由
夜尽天明 + 10 + 100 + 10 不错。

查看全部评分

[发帖际遇]: wow 发帖时在路边捡到 5 金钱,偷偷放进了口袋. 幸运榜 / 衰神榜

该用户从未签到

正式版主

威望
189
金钱
2256
贡献
72
推广数
0
紫钻
2
阅读权限
220
在线时间
87 小时
最后登录
2013-11-25

Breeze管理组突出贡献论坛元老白羊座入驻新人版主专用优秀版主

发表于 2013-6-17 11:30:31 | 显示全部楼层
在我眼里就是天书哎。。
[发帖际遇]: 狸猫 在论坛发帖时没有注意,被小偷偷去了 1 金钱. 幸运榜 / 衰神榜

该用户从未签到

惊鸿侠影

威望
103
金钱
2936
贡献
365
推广数
0
紫钻
0
阅读权限
55
在线时间
60 小时
最后登录
2013-11-27
QQ
发表于 2013-6-17 11:44:40 | 显示全部楼层
表示我也看不懂的
[发帖际遇]: 青春手卷 乐于助人,奖励 3 威望. 幸运榜 / 衰神榜
钓鱼岛只属于中国,苍井空才是世界的。

该用户从未签到

寂寞高手

寂寞高手中的高手

威望
99
金钱
6542
贡献
10
推广数
0
紫钻
0
阅读权限
50
在线时间
387 小时
最后登录
2013-11-28

白羊座入驻新人互助团

发表于 2013-6-17 11:57:09 | 显示全部楼层
注释太少了吧,看的真艰难,还看不懂
[发帖际遇]: 一个袋子砸在了 姬霸腾 头上,姬霸腾 赚了 14 金钱. 幸运榜 / 衰神榜

该用户从未签到

超级版主

威望
321
金钱
2111
贡献
61
推广数
4
紫钻
2
阅读权限
240
在线时间
88 小时
最后登录
2013-11-10

狮子座Breeze管理组优秀版主版主专用入驻新人突出贡献论坛元老荣誉会员互助团帅哥勋章超级版主专用

发表于 2013-6-17 12:12:37 | 显示全部楼层
能说说是什么代码吗。
[发帖际遇]: 青春染指悲伤ヽ 被钱袋砸中进医院,看病花了 9 金钱. 幸运榜 / 衰神榜
这个人是一个低调的人,什么都不会留下

该用户从未签到

逍遥游侠

拾夏寒绝、浸秋泪散

威望
152
金钱
1731
贡献
124
推广数
0
紫钻
3
阅读权限
40
在线时间
60 小时
最后登录
2013-11-22

白羊座Breeze管理组

QQ
发表于 2013-6-17 12:31:25 | 显示全部楼层

C++的,你不是技术人员么?

点评

我不懂VB ok。。。还有我问他是什么代码。。  发表于 2013-6-17 07:28 PM
[发帖际遇]: 夜尽天明 发帖时在路边捡到 8 金钱,偷偷放进了口袋. 幸运榜 / 衰神榜

该用户从未签到

茶馆传奇

威望
384
金钱
11456
贡献
108
推广数
0
紫钻
0
阅读权限
80
在线时间
91 小时
最后登录
2013-11-27

灌水之王入驻新人双子座论坛元老荣誉会员互助团突出贡献解答组金牛座

发表于 2013-6-17 17:16:57 | 显示全部楼层
都是底层的东西 基础教学~
[发帖际遇]: mar1321 乐于助人,奖励 2 威望. 幸运榜 / 衰神榜

该用户从未签到

逍遥游侠

拾夏寒绝、浸秋泪散

威望
152
金钱
1731
贡献
124
推广数
0
紫钻
3
阅读权限
40
在线时间
60 小时
最后登录
2013-11-22

白羊座Breeze管理组

QQ
发表于 2013-6-18 15:18:30 | 显示全部楼层

我都告诉你这是C++的你还告诉我你不懂VB是什么意思?
[发帖际遇]: 一个袋子砸在了 夜尽天明 头上,夜尽天明 赚了 3 金钱. 幸运榜 / 衰神榜

该用户从未签到

风云使者

威望
176
金钱
5055
贡献
19
推广数
0
紫钻
0
阅读权限
45
在线时间
83 小时
最后登录
2013-11-26

狮子座

发表于 2013-6-19 09:47:52 | 显示全部楼层
还是Hook。。。
Win7下运行出错
原因是Use_Stdcall_Bypass_Call_Func里面的
jmp  eax //跳入MessageBox()函数执行
改成call eax则正常。
[发帖际遇]: 一个袋子砸在了 qqlinhai 头上,qqlinhai 赚了 7 金钱. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|Archiver|手机版|小黑屋|BR魔兽编程交流论坛 ( 湘ICP备2021017612号-1 )

GMT+8, 2025-8-22 04:07 AM , Processed in 0.145790 second(s), 43 queries .

Powered by breeze365

Copyright © 2001-2020, Tencent Cloud.

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