吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8770|回复: 6
收起左侧

[原创] [NOTE]很搓的逆一下GetStartupInfoW

[复制链接]
XuZhenG 发表于 2009-1-29 22:32
【文章作者】: [UnPacKcN]XuZheNg
【作者邮箱】
: xuzheng1111@126.com
【作者主页】
: http:
//hi.baidu.com/xuzheng1111
【软件名称】: 恕在下保护作者利益不公布了
【作者声明】
: 只是感兴趣,没有其他目的。菜鸟之作(写给菜鸟观看),高手飘过,不许BS。失误之处敬请诸位大侠赐教

------------------------------------------------------------------------------------------------------------

估计高手们没谁愿意逆这么搓的函数,干脆我来搞一下算了,顺便揭秘一下STARTUPINFOW中间的保留字

首先是结构声明〉〉

typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
}
STARTUPINFO,
*
LPSTARTUPINFO;

其实STARTUPINFOW中间的内容是由PEB中间的_RTL_USER_PROCESS_PARAMETERS结构里面的对应参数来填充的。

ASM code
:


7C801E54 >  8BFF            mov     edi, edi
7C801E56    55              push    ebp
7C801E57    8BEC            mov     ebp, esp
7C801E59    64:A1 18000000  mov     eax, dword ptr fs:[18]                        
; 取TEB地址
7C801E5F    8B40 30         mov     eax, dword ptr ds:[eax+30]                    ; 取PEB地址
7C801E62    8B48 10         mov     ecx, dword ptr ds:[eax+10]
7C801E65    8B45 08         mov     eax, dword ptr ss:[ebp+8]
7C801E68    C700 44000000   mov     dword ptr ds:[eax], 44
7C801E6E    8B91 84000000   
mov     edx, dword ptr ds:[ecx+84]
7C801E74    8950 04         mov     dword ptr ds:[eax+4], edx
7C801E77    8B51 7C         mov     edx, dword ptr ds:[ecx+7C]
7C801E7A    8950 08         mov     dword ptr ds:[eax+8], edx
7C801E7D    8B51 74         mov     edx, dword ptr ds:[ecx+74]
7C801E80    8950 0C         mov     dword ptr ds:[eax+C], edx
7C801E83    8B51 4C         mov     edx, dword ptr ds:[ecx+4C]
7C801E86    8950 10         mov     dword ptr ds:[eax+10], edx
7C801E89    8B51 50         mov     edx, dword ptr ds:[ecx+50]
7C801E8C    8950 14         mov     dword ptr ds:[eax+14], edx
7C801E8F    8B51 54         mov     edx, dword ptr ds:[ecx+54]
7C801E92    8950 18         mov     dword ptr ds:[eax+18], edx
7C801E95    8B51 58         mov     edx, dword ptr ds:[ecx+58]
7C801E98    8950 1C         mov     dword ptr ds:[eax+1C], edx
7C801E9B    8B51 5C         mov     edx, dword ptr ds:[ecx+5C]
7C801E9E    8950 20         mov     dword ptr ds:[eax+20], edx
7C801EA1    8B51 60         mov     edx, dword ptr ds:[ecx+60]
7C801EA4    8950 24         mov     dword ptr ds:[eax+24], edx
7C801EA7    8B51 64         mov     edx, dword ptr ds:[ecx+64]
7C801EAA    8950 28         mov     dword ptr ds:[eax+28], edx
7C801EAD    8B51 68         mov     edx, dword ptr ds:[ecx+68]
7C801EB0    8950 2C         mov     dword ptr ds:[eax+2C], edx
7C801EB3    F640 2D 07      test    byte ptr ds:[eax+2D], 7
7C801EB7    66
:8B51 6C      mov     dx, word ptr ds:[ecx+6C]
7C801EBB    66:8950 30      mov     word ptr ds:[eax+30], dx
7C801EBF    66:8B91 8800000>mov     dx, word ptr ds:[ecx+88]
7C801EC6    66:8950 32      mov     word ptr ds:[eax+32], dx
7C801ECA    8B91 8C000000   mov     edx, dword ptr ds:[ecx+8C]
7C801ED0    8950 34         mov     dword ptr ds:[eax+34], edx
7C801ED3    75 04           jnz     short kernel32.7C801ED9
7C801ED5    5D              pop     ebp
7C801ED6    C2 0400         retn    4
7C801ED9    8B51 18         
mov     edx, dword ptr ds:[ecx+18]
7C801EDC    8950 38         mov     dword ptr ds:[eax+38], edx
7C801EDF    8B51 1C         mov     edx, dword ptr ds:[ecx+1C]
7C801EE2    8950 3C         mov     dword ptr ds:[eax+3C], edx
7C801EE5    8B49 20         mov     ecx, dword ptr ds:[ecx+20]
7C801EE8    8948 40         mov     dword ptr ds:[eax+40], ecx
7C801EEB  ^ EB E8           jmp     short kernel32.7C801ED5



然后是C码(VS2008 + WinXp sp3编译执行验证通过):
声明等等自己写...

VOID WINAPI XzGetStartupInfoW(
                              
__out LPSTARTUPINFO lpStartupInfo
                              
)
{
   
// Get _RTL_USER_PROCESS_PARAMETERS structure
   
PRTL_USER_PROCESS_PARAMETERS prtlUserProcessParameteters;
   
__asm{
        
mov eax,fs:[0x18]
        
mov eax,dword ptr ds:[eax+0x30]
        
mov ecx,dword ptr ds:[eax+0x10]
        
mov prtlUserProcessParameteters,ecx
   
}
   
lpStartupInfo->cb = 0x44;
   
lpStartupInfo->lpReserved = prtlUserProcessParameteters->ShellInfo.Buffer;
   
lpStartupInfo->lpDesktop = prtlUserProcessParameteters->DesktopInfo.Buffer;
   
lpStartupInfo->lpTitle = prtlUserProcessParameteters->WindowTitle.Buffer;
   
lpStartupInfo->dwX = prtlUserProcessParameteters->StartingX;
   
lpStartupInfo->dwY = prtlUserProcessParameteters->StartingY;
   
lpStartupInfo->dwXSize = prtlUserProcessParameteters->CountX;
   
lpStartupInfo->dwYSize = prtlUserProcessParameteters->CountY;
   
lpStartupInfo->dwXCountChars = prtlUserProcessParameteters->CountCharsX;
   
lpStartupInfo->dwYCountChars = prtlUserProcessParameteters->CountCharsY;
   
lpStartupInfo->dwFillAttribute = prtlUserProcessParameteters->FillAttribute;
   
lpStartupInfo->dwFlags = prtlUserProcessParameteters->WindowFlags;
   
lpStartupInfo->wShowWindow = prtlUserProcessParameteters->ShowWindowFlags;
   
lpStartupInfo->cbReserved2 = prtlUserProcessParameteters->RuntimeData.Length;
   
lpStartupInfo->lpReserved2 = (LPBYTE)prtlUserProcessParameteters->RuntimeData.Buffer;
        
   
if((lpStartupInfo->dwFlags & STARTF_USESTDHANDLES))
    {
        
lpStartupInfo->hStdInput = prtlUserProcessParameteters->StandardInput;
        
lpStartupInfo->hStdOutput = prtlUserProcessParameteters->StandardOutput;
        
lpStartupInfo->hStdError = prtlUserProcessParameteters->StandardError;
    }
}


看到代码,很明显,第一个保留字lpReserved 其实就是ShellInfo(Shell信息)

第二个保留字cbReserved2 就是RuntimeData的长度,

第三个保留字lpReserved2 就是RuntimeData的内容。

最后,代码截图:

[ 本帖最后由 XuZhenG 于 2009-1-29 22:33 编辑 ]
XzGetStartupInfoW.JPG

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zapline 发表于 2009-1-30 16:42
【软件名称】: 恕在下保护作者利益不公布了

为啥这样说呢?
不是微软的吗?
 楼主| XuZhenG 发表于 2009-1-30 18:31
zapline 发表于 2009-1-30 21:52
_STARTUPINFO 这个结构也是你逆出来的吗?
对逆向工程探秘那本书上的例子影响很深刻啊:D
xie83544109 发表于 2009-1-30 23:43
高手
学习了:)
 楼主| XuZhenG 发表于 2009-2-3 17:48

回复 4# zapline 的帖子

_STARTUPINFOW结构在Windows SDK中间有声明...
hyperchem 发表于 2009-2-3 21:09
强大 学习!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 01:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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