洛阳铲的日志

2005年02月5日

最近查找Debug工具和文章的时候发现的好东西

Filed under: Security_Resource — HackGou @ 21:07

 

最近查找Debug工具和文章的时候发现的好东西,摘录部分目录:
Debug Toolkit
28 Mar 2000Advanced
A complete debug toolkit to add intelligent debugging capability to your application.
http://www.codeproject.com/debug/#General
上面有很多值得一看的东西: (more…)

ip4和ip6的sockaddr_in 结构解释

Filed under: Security_Resource — HackGou @ 20:03

 

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
struct sockaddr_in6 {
        short   sin6_family;
        u_short sin6_port;
        u_long  sin6_flowinfo;
        struct  in6_addr sin6_addr;
        u_long  sin6_scope_id;
};
struct sockaddr_in6_old {
        short   sin6_family;       
        u_short sin6_port;         
        u_long  sin6_flowinfo;     
        struct  in6_addr sin6_addr; 
};
sin_family字段必须设为AF_INET,以告知sock我们此时正在使用IP地址家族

SOCKADDR_IN结构的sin_addr字段用于把一个IP地址保存为一个4字节的数,它是无符
号长整数类型。根据这个字段的不同用法,还可表示一个本地或远程IP地址。IP地址一般是
用“互联网标准点分表示法”(像a.b.c.d一样)指定的,每个字母代表一个字节数,从左到右
分配一个4字节的无符号长整数。最后一个字段sin_zero,只充当填充项的职责,以使
SOCKADDR_IN结构和SOCKADDR结构的长度一样。
The in_addr structure represents a host by its Internet address.
typedef struct in_addr
 {
  union {
    struct {
           u_char s_b1,s_b2,s_b3,s_b4;   
     } S_un_b;   
    struct {
           u_short s_w1,s_w2;
               }S_un_w;
    u_long S_addr; 
 } S_un;
} in_addr;
Members
S_un
S_un_b Address of the host formatted as four u_chars.
S_un_w Address of the host formatted as two u_shorts.
S_addr Address of the host formatted as a u_long.
—– 

2004年12月2日

Win2000下进程隐藏的另外一种方案

Filed under: Security_Resource — HackGou @ 00:09

 

Win2000下进程隐藏的另外一种方案
创建时间:2003-09-15
文章属性:原创
文章提交:pjf_ (pjf_at_ustc.edu)
十分抱歉,匆匆写了几句代码有点bug,即“ZwOpenSection(&g_hMPM,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&attributes)”使得第一次运行返回失败,请删除原文,改正为:
pjf (jfpan20000@sina.com)
上次在CVC提到了这东西,因为很简单觉得没必要多说什么,但有人要求写全,所以补充几句:

(more…)

Win2K下的API函数的拦截

Filed under: Security_Resource — HackGou @ 00:08

Win2K下的API函数的拦截

原始文档:http://www.xfocus.net/articles/200201/336.html
创建时间:2002-01-21
浏览次数:290
原创:tomh (tomh_at_yeah.net)

这么多高手在这里,哎,小弟愿意向各位高手学习
Api拦截并不是一个新的技术,很多商业软件都采用这种技术。对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richter 的修改exe文件的模块输入节,种方法,很安全,但很复杂,而且有些exe文件,没有Dll的输入符号的列表,有可能出现拦截不到的情况。第二种方法就是常用的JMP XXX的方法,虽然很古老,却很简单实用。
本文一介绍第二种方法在Win2k下的使用。第二种方法,Win98/me 下因为进入Ring0级的方法很多,有LDT,IDT,Vxd等方法,很容易在内存中动态修改代码,但在Win2k下,这些方法都不能用,写WDM太过复杂,表面上看来很难实现,
其实不然。Win2k为我们提供了一个强大的内存Api操作函数—VirtualProtectEx,WriteProcessMemeory,ReadProcessMemeory,有了它们我们就能在内存中动态修改代码了,其原型为:
BOOL VirtualProtectEx(
HANDLE hProcess, // 要修改内存的进程句柄
LPVOID lpAddress, // 要修改内存的起始地址
DWORD dwSize, // 修改内存的字节
DWORD flNewProtect, // 修改后的内存属性
PDWORD lpflOldProtect // 修改前的内存属性的地址
);
BOOL WriteProcessMemory(
HANDLE hProcess, // 要写进程的句柄
LPVOID lpBaseAddress, // 写内存的起始地址
LPVOID lpBuffer, // 写入数据的地址
DWORD nSize, // 要写的字节数
LPDWORD lpNumberOfBytesWritten // 实际写入的子节数
);
BOOL ReadProcessMemory(
HANDLE hProcess, // 要读进程的句柄
LPCVOID lpBaseAddress, // 读内存的起始地址
LPVOID lpBuffer, // 读入数据的地址
DWORD nSize, // 要读入的字节数
LPDWORD lpNumberOfBytesRead // 实际读入的子节数
);
具体的参数请参看MSDN帮助。在Win2k下因为Dll和所属进程在同一地址空间,这点又和Win9x/me存在所有进程存在共享的地址空间不同,
因此,必须通过钩子函数和远程注入进程的方法,现以一个简单采用钩子函数对MessageBoxA进行拦截例子来说明:
其中Dll文件为:
HHOOK g_hHook;
HINSTANCE g_hinstDll;
FARPROC pfMessageBoxA;
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
BYTE OldMessageBoxACode[5],NewMessageBoxACode[5];
HMODULE hModule ;
DWORD dwIdOld,dwIdNew;
BOOL bHook=false;
void HookOn();
void HookOff();
BOOL init();
LRESULT WINAPI MousHook(int nCode,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(!init())
{
MessageBoxA(NULL,”Init”,”ERROR”,MB_OK);
return(false);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if(bHook) UnintallHook();
break;
}
return TRUE;
}
LRESULT WINAPI Hook(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数
{

return(CallNextHookEx(g_hHook,nCode,wParam,lParam));
}
HOOKAPI2_API BOOL InstallHook()//输出安装空的钩子函数
{
g_hinstDll=LoadLibrary(“HookApi2.dll”);
g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);
if (!g_hHook)
{
MessageBoxA(NULL,”SET ERROR”,”ERROR”,MB_OK);
return(false);
}


return(true);
}
HOOKAPI2_API BOOL UninstallHook()//输出御在钩子函数
{

return(UnhookWindowsHookEx(g_hHook));
}

BOOL init()//初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令
{
hModule=LoadLibrary(“user32.dll”);
pfMessageBoxA=GetProcAddress(hModule,”MessageBoxA”);
if(pfMessageBoxA==NULL)
return false;
_asm
{
lea edi,OldMessageBoxACode
mov esi,pfMessageBoxA
cld
movsd
movsb
}
NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令
_asm
{
lea eax,MyMessageBoxA
mov ebx,pfMessageBoxA
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxACode+1],eax
}
dwIdNew=GetCurrentProcessId(); //得到所属进程的ID
dwIdOld=dwIdNew;
HookOn();//开始拦截
return(true);
}


int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption, UINT uType )//首先关闭拦截,然后才能调用被拦截的Api 函数
{
int nReturn=0;
HookOff();
nReturn=MessageBoxA(hWnd,”Hook”,lpCaption,uType);
HookOn();
return(nReturn);
}
void HookOn()
{
HANDLE hProc;
dwIdOld=dwIdNew;
hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);//得到所属进程的句柄
VirtualProtectEx(hProc,pfMessageBoxA,5,PAGE_READWRITE,&dwIdOld);//修改所属进程中MessageBoxA的前5个字节的属性为可写
WriteProcessMemory(hProc,pfMessageBoxA,NewMessageBoxACode,5,0);//将所属进程中MessageBoxA的前5个字节改为JMP 到MyMessageBoxA
VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,&dwIdOld);//修改所属进程中MessageBoxA的前5个字节的属性为原来的属性
bHook=true;
}
void HookOff()//将所属进程中JMP MyMessageBoxA的代码改为Jmp MessageBoxA
{
HANDLE hProc;
dwIdOld=dwIdNew;
hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);
VirtualProtectEx(hProc,pfMessageBoxA,5,PAGE_READWRITE,&dwIdOld);
WriteProcessMemory(hProc,pfMessageBoxA,OldMessageBoxACode,5,0);
VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,&dwIdOld);
bHook=false;
}
//测试文件:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

if(!InstallHook())
{
MessageBoxA(NULL,”Hook Error!”,”Hook”,MB_OK);
return 1;
}
MessageBoxA(NULL,”TEST”,”TEST”,MB_OK);//可以看见Test变成了Hook,也可以在其他进程中看见
if(!UninstallHook())
{
MessageBoxA(NULL,”Uninstall Error!”,”Hook”,MB_OK);
return 1;
}
return 0;
}


—–

Windows 2000缓冲区溢出技术原理-转载

Filed under: Security_Resource — HackGou @ 00:05

前言:
在看Jason著backend翻译的《Windows 2000缓冲区溢出入门》时觉得过于简单,没有讲到真正的
原理,我简直不敢相信那会是老外写的文章. 相反在看ipxodi和袁哥的缓冲区溢出原理和高级
ShellCode编写技巧时我觉得写的太好了,非常专业,简直是一种艺术,看来我国的安全技术已经在
向欧美等技术先进国家迈进。但是面向初学者的,进行详细分析的缓冲溢出入门文章还是很少(我
还没有看到),所以我下决心写了这篇文章,从C的局部变量分配以及它和堆栈的关系、返回地址和
堆栈的关系、局部变量和返回地址以及堆栈的关系开始写起,并在讲述完原理后进行简单的应用,
使理论和应用相结合,以给广大初学缓冲溢出的朋友一点小小的帮助,本文还是具有典型性的,通
过本文的学习,可以让我们从一个普通的C程序员,了解到更加底层的技术,本文虽是面向初学者(
指初学缓冲溢出,而不是初学C语言),作者假定你(读者)已经是一位熟练的C程序员,并且了解一些
Asm编程技术。我也是刚学缓冲区溢出不久,这是我第一次写溢出技术,所以难免有错误的地方,还
请大家指正,在ipxodi和袁哥的文章中我学到了很多东西,但ipxodi和袁哥和文章比较深比较专业
,初学者学习起来有些困难,特别我又是非计算机专业的(我和绿盟的小四哥一样是电脑会计专业的
,向小四哥学习,呵呵!).在这里把我学习时的一点理解,一点经验介绍给大家,希望对广大学习缓冲
溢出的朋友有所帮助!

(more…)

Older Posts »

Powered by WordPress