-

- 加为好友
- 发送私信
- 在线聊天
-
mydo
- 等级:

- 可用分等级:
- 总技术专家分:
- 总技术专家分排名:
- 揭帖率:
-
|
| 发表于:2008-04-27 22:42:27 楼主 |
Unlocker加强版技术特征 Unlocker是一个偶闲时写的小工具,主要功能有: 1. 解锁已打开文件; 2.建立以特定用户身份的shell。 上一个版本的概述在:[原创]C# 与 汇编 的一次亲密接触。 [size=14px]加强版本新增的特征有: 1.采取了和 regmon & filemon 类似的方法,将 dll 等模块嵌入到主PE中, 使之成为真正的 "绿色" 工具。 - C# code
Assembly asmy = Assembly.GetExecutingAssembly();
ResourceManager rm = new ResourceManager("unlocker.Properties.Resources", asmy);
FileStream fs;
FileInfo fi;
Byte[] bs = (byte[])rm.GetObject("unlocker");
if (bs.Length != 0)
{
fs = File.Create(Application.StartupPath.ToString() +
@"\unlocker.dll", bs.Length, FileOptions.SequentialScan);
fs.Write(bs, 0, bs.Length);
fs.Flush();
fs.Close();
fi = new FileInfo(Application.StartupPath.ToString() +
@"\unlocker.dll");
if (fi.Exists == false)
{
IsDllExist = false;
//IsSucessed = false;
}
else if (fi.Length != bs.Length)
{
IsDllExist = true;
}
else
{
fi.Attributes = fi.Attributes | FileAttributes.Hidden |
FileAttributes.System;
fi.Refresh();
IsDllExist = true;
IsSucessed = true;
}
}
2.因为gcc没有naked函数的功能(虽然有naked选项,但是生成不了naked函数 如果哪位知道是什么问题,请不吝指出,多谢。),所以用汇编写了一个 静态库进行连接。之所以要采用naked函数是想实现不定参数的跨函数传递, 比如:[/size] - C/C++ code
void myprintf(const char *ft,...)
{
printf(ft,?????);//wrong!
}
而在汇编或vc中这个比较好办,我们设计一个"透明"的跳板,好像从myprintf 直接跳转到printf一样: - Assembly code
_MsgShow_Console proc
jmp printf
_MsgShow_Console endp
但在要做中间处理的情况下,就更复杂一些,比如: - C/C++ code
void myprintf_msgbox(const char *ft,...)
{
char buf[BUFSIZ]={0};
sprintf(buf,ft,?????);//wrong!
MessageBox(NULL,buf,"message",MB_OK);
}
这时不能直接做跳转,必须手动写参数处理,就像偶以前在汇编区回答过一位 VC仁兄的问题 <如何处理函数的不定参数> 一样: - Assembly code
_MsgShow_Win32 proc
push ebp ;save ebp is very important
mov eax,[esp+4] ;temp return address
lea ebp,[esp+4]
sub esp,0100h ;create tmp buf (0x100 bytes)
mov esi,esp ;save tmp buf address
add eax,2
movzx ecx,byte ptr [eax]
shr ecx,2 ;get parms number total size / size(dword)
mov ebx,esp ;save esp
.while ecx > 0h
mov eax,[ebp + ecx*4]
push eax
dec ecx
.endw
push esi
call sprintf
invoke MessageBoxA,0,ebx,addr cp,0
lea esp,[ebp-4]
pop ebp ;restore ebp
ret
_MsgShow_Win32 endp
然后在gcc中只要按需求定义宏,就可以实现完全自动的DEBUG输出了: - C/C++ code
#ifdef _DRV_DEBUG_
#if defined(_DRV_CONSOLE_)
#define MsgShow(...) _MsgShow_Console(__VA_ARGS__)
#elif defined(_DRV_WIN32_)
#define MsgShow(...) _MsgShow_Win32(__VA_ARGS__)
#elif defined(_DRV_CORE_)
#define MsgShow(...) _MsgShow_Core(__VA_ARGS__)
#else
#error : Must Choose One From 3 Show Model.
#endif
#else
#define MsgShow(...) ((void)0)
#endif
对于内核中的 "printf" 函数我们同样有: - Assembly code
_MsgShow_Core proc
jmp DbgPrint
_MsgShow_Core endp
3.在unlocker中加入了建立用户shell的功能,方便测试。比如可以方便的生成本地最高 权限SYSTEM用户的shell,以及其他任何管理员和用户的shell;可以在当前是user级别 用户的环境下直接产生Administrator级别用户的shell。 4.增加了 关闭核心句柄 的功能。使之在NT下可以关闭像 PageFile.sys 这样核心文件对 象的句柄。但对一些关键核心文件对象,比如 SAM 文件来说,如果将其关闭马上会造成 系统蓝屏。所以请在虚拟机下尝试,否则后果自负哦。 5.分别在 Windows 2000 sp4、Windows XP sp2、Windows 2003 sp1 下做了兼容性测试,发 现几处需要调整的地方: a.windows 2000 中没有 GetProcessImageFileName 函数,所以将原来的 API 换成 GetModuleFileNameEx; b.windows 2000 中没有 NtCreateProcessEx 这个 API ,所以将原来的 _CreateSystemShell分为2个版本; c.windows 2003 对内存属性的检查更加严格,故而从原来的 PAGE_READWRITE 变成 PAGE_EXECUTE_READWRITE,否则在2003下程序崩溃。 因为条件有限,没有在 windows NT 4.0 上做测试,如果哪位可以帮忙测试一下,就十分 感谢啦. :) 6.增加了 强力查找 功能,可以模糊匹配更多关键字; 7.加强了对 是否真正关闭 的检查功能,不像以前只是给出一个"模糊"的结果。并且更具 不同的结果以不同的颜色更加显目的呈现给用户。 8.修正了一个有符号数的关系 BUG 。 (未完待续) (下载审核中,稍后公布下载地址) |
|
|
|
11
修改
删除
举报
引用
回复
| |