Добрый вечер. Подскажите пожалуйста как определить свой IP, без использования gethostbyname? Определяю так: Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib includelib /masm32/lib/wsock32.lib include /masm32/include/wsock32.inc .data caption db "message",0 lcht db '127.0.0.1', 0 .data? szip db ? wsa WSADATA <?> .code Start: invoke WSAStartup,101h,addr wsa invoke gethostname, addr szip, sizeof szip invoke gethostbyname, addr szip mov eax, [eax + 12] mov eax, [eax] mov eax, [eax] invoke inet_ntoa, eax invoke lstrcmpi, eax, addr lcht invoke WSACleanup invoke MessageBox, NULL,addr lcht, addr caption, MB_OK invoke ExitProcess, 0 end Start Но этот способ меня не устраивает ( не потому что не работает, просто не устраивает ). Может быть есть еще способ. Подскажите пожалуйста.
валом способов - если тебе нужно узнать IP любым способом 1- вывести диалоговое окно с просьбой ввести IP. результат использовать у себя далее. 2- запустить процесс cmd.exe с параметрами /c "ipconfig >ip.txt" и потом парсить ip.txt 3- купить хостинг с пхп на котором поставить скрипт, который при обращении к нему возвращает IP адресс инициализатора соеденения - далее ответ с сервера парсим и получаем IP. ... хоть и могут показаться глупыми мои советы - но если тебе надо узнать - все методы хороши.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces, там содержится текущий IP
хорошо. вот код. немного подправил. но все еще не работает. Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\gdi32.inc includelib \masm32\lib\gdi32.lib include \masm32\include\advapi32.inc includelib \masm32\lib\advapi32.lib .data? phKey dd ? newKey dd ? sizekey dd ? valuekey dd ? dwIndex dd ? namepkey db 40 dup(?) buffnamepkey dd ? .code Start: .data .code invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, ADDR patch, NULL, KEY_ALL_ACCESS, ADDR phKey mov dwIndex, 0 mov buffnamepkey, 40 rec: invoke RegEnumKeyEx, phKey, dwIndex, addr namepkey, addr buffnamepkey,NULL,NULL,NULL,NULL invoke MessageBox, NULL, addr namepkey, NULL, MB_OK invoke lstrcat,ADDR patch, ADDR namepkey invoke RegOpenKeyEx, phKey, ADDR patch, NULL, KEY_ALL_ACCESS, ADDR newKey invoke MessageBox, NULL, addr patch, NULL, MB_OK invoke RegQueryValueEx,newKey,addr data,0,0,NULL,addr sizekey invoke RegQueryValueEx,newKey,addr data,0,0,ADDR valuekey,addr sizekey invoke RegCloseKey, newKey invoke RegCloseKey, phKey .IF valuekey == 0 inc dwIndex jmp rec .ENDIF invoke MessageBox, NULL, addr valuekey, NULL, MB_OK invoke ExitProcess, 0 end Start в чем дело ?
немного продвинулся. вот код: Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\gdi32.inc includelib \masm32\lib\gdi32.lib include \masm32\include\advapi32.inc includelib \masm32\lib\advapi32.lib .data patch db "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\",0 data db "DhcpIPAddress",0 namepkey db MAX_PATH dup (0) sz_buf dd sizeof MAX_PATH .data? phKey dd ? newKey dd ? sizekey dd ? valuekey dd ? patch1 dd ? .code Start: invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, ADDR patch, NULL, KEY_ALL_ACCESS, ADDR phKey mov dwIndex, 0 rec: push sz_buf ;mov eax,offset patch ;mov patch1,eax invoke RegEnumKeyEx, phKey, dwIndex, addr namepkey, addr sz_buf,NULL,NULL,NULL,NULL ;invoke MessageBox, NULL, addr namepkey, NULL, MB_OK invoke lstrcat,ADDR patch, ADDR namepkey invoke RegOpenKeyEx, phKey, ADDR patch, NULL, KEY_ALL_ACCESS, ADDR newKey ;invoke MessageBox, NULL, addr patch, NULL, MB_OK invoke RegQueryValueEx,newKey,addr data,0,0,NULL,addr sizekey invoke RegQueryValueEx,newKey,addr data,0,0,ADDR valuekey,addr sizekey pop sz_buf inc dwIndex jmp rec invoke MessageBox, NULL, addr valuekey, NULL, MB_OK invoke ExitProcess, 0 end Start Вопрос почему после вызова lstrcat меняется параметр namepkey на другой ( вобще на какуюто фигню )? Из за этого все идет на перекосяк.
отладчик показывает что сразу же после вызова lstrcat в namepkey записывается другая строка. даже непонимаю откуда он берет ее. голова уже кругом идет.
Потому что имя ключа пишется в конец строки patch, а что у неё в конце, сам посмотри. Как выход: добавь ещё один буфер, скопируй в него начальное имя ключа (patch) и сохрани указатель на конец строки. При перечислении ключей будешь копировать полученное имя сразу в сохранённый указатель, получая полный путь.
это надо было сделать?: Код (Text): ........... invoke RegEnumKeyEx, phKey, dwIndex, addr namepkey, addr sz_buf,NULL,NULL,NULL,NULL ;invoke MessageBox, NULL, addr namepkey, NULL, MB_OK lea edx, patch lea eax, namepkey invoke lstrcat, edx, eax invoke RegOpenKeyEx, phKey, edx, NULL, KEY_ALL_ACCESS, ADDR newKey ............ если да то, сделал все равно не работает. если я не так понял. запостите код. что именно надо сделать. плиз.
Код (Text): .data data db "DhcpIPAddress",0 namepkey db MAX_PATH dup (0) sz_buf dd sizeof MAX_PATH patch db "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\",0 db MAX_PATH dup(0)
еще продвинулся. все вродебы перечисляет. но. есть одно но вот код: Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\gdi32.inc includelib \masm32\lib\gdi32.lib include \masm32\include\advapi32.inc includelib \masm32\lib\advapi32.lib .data patch db "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\",0 ;{A453EED3-1CD5-46E0-8111-E7FAA70A7EE0} data db "DhcpIPAddress",0 namepkey db 40 dup (0) sz_buf dd 40 .data? phKey dd ? newKey dd ? sizekey dd ? valuekey dd ? dwIndex dd ? oldszbuf dd ? patch1 db ? .code Start: invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, ADDR patch, NULL, KEY_ALL_ACCESS, ADDR phKey mov dwIndex, 0 rec: push sz_buf ;mov eax,offset patch ;mov patch1,eax invoke RegEnumKeyEx, phKey, dwIndex, addr namepkey, addr sz_buf,NULL,NULL,NULL,NULL ;invoke MessageBox, NULL, addr namepkey, NULL, MB_OK invoke lstrcpy, addr patch1, addr patch lea eax, namepkey invoke lstrcat, addr patch1, eax invoke RegOpenKeyEx, phKey, addr patch1, NULL, KEY_ALL_ACCESS, ADDR newKey ;invoke MessageBox, NULL, addr patch, NULL, MB_OK invoke RegQueryValueEx,newKey,addr data,0,0,NULL,addr sizekey invoke RegQueryValueEx,newKey,addr data,0,0,ADDR valuekey,addr sizekey invoke MessageBox, NULL, addr valuekey, NULL, MB_OK pop sz_buf inc dwIndex jmp rec invoke ExitProcess, 0 end Start но после вызова этой функции invoke RegOpenKeyEx, phKey, eax, NULL, KEY_ALL_ACCESS, ADDR newKey поидее в newKey мы должны получить дескриптор. но я его не могу получить. в чем дело? параметры функции заданы верно. из-за этого ( что я не могу получить этот дескриптор ). ничего и не работает ( не получаю IP ). что делать? в чем загвоздка? всю голову сломал. заранее спасибо.
trust ну и чтоже было ? Я вот тоже не пойму, примеров натянул, все вроде правильно, но не идет что-то, не выдает IP почему-то Код (Text): #include <stdio.h> #include <windows.h> int main(int argc, char *argv[]) { DWORD dwIndex = 0; DWORD dwBufSize = 256; DWORD dwDataType; char szSubKey[256]; unsigned char szData[256]; char lpszTcpip_IPAddress[20]; char strKeyName[] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"; HKEY hKey; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKeyName, 0, KEY_READ, &hKey)!= ERROR_SUCCESS) return FALSE; while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { strcpy(szData, strKeyName); strcat(szData, szSubKey ); dwBufSize = 256; if(RegQueryValueEx(hKey, "IPAddress", 0, &dwDataType, (LPTSTR)lpszTcpip_IPAddress, &dwBufSize) == ERROR_SUCCESS); printf("TCP/IP IPAddress : %s\n", lpszTcpip_IPAddress); } RegCloseKey(hKey); return 0; } ... ветки (их пути) формируются правильно, а RegQueryValueEx() в lpszTcpip_IPAddress оставляет пусто ... ... что не так? помогите разглядеть пожалуйста ...
_sheva740 я эту проблему решил так.... смотри у меня в примере был код: Код (Text): invoke lstrcat, addr patch1, eax invoke RegOpenKeyEx, phKey, addr patch1, NULL, KEY_ALL_ACCESS, ADDR newKey ;invoke MessageBox, NULL, addr patch, NULL, MB_OK invoke RegQueryValueEx,newKey,addr data,0,0,NULL,addr sizekey вмето phKey я передал HKEY_LOCAL_MACHINE вот код: Код (Text): invoke lstrcat, addr patch1, eax invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr patch1, NULL, KEY_ALL_ACCESS, ADDR newKey ;invoke MessageBox, NULL, addr patch, NULL, MB_OK invoke RegQueryValueEx,newKey,addr data,0,0,NULL,addr sizekey теперь IP отлично определяется вот полный код: Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\gdi32.inc includelib \masm32\lib\gdi32.lib include \masm32\include\advapi32.inc includelib \masm32\lib\advapi32.lib .data patch db "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\",0 ;{A453EED3-1CD5-46E0-8111-E7FAA70A7EE0} data db "DhcpIPAddress",0 namepkey db 40 dup (0) sz_buf dd 40 ip db "0.0.0.0",0 .data? phKey dd ? newKey dd ? sizekey dd ? valuekey dd ? dwIndex dd ? oldszbuf dd ? patch1 db ? .code Start: invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, ADDR patch, NULL, KEY_ALL_ACCESS, ADDR phKey mov dwIndex, 0 rec: push sz_buf invoke RegEnumKeyEx, phKey, dwIndex, addr namepkey, addr sz_buf,NULL,NULL,NULL,NULL invoke lstrcpy, addr patch1, addr patch lea eax, namepkey invoke lstrcat, addr patch1, eax invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr patch1, NULL, KEY_ALL_ACCESS, addr newKey invoke RegQueryValueEx,newKey,addr data,0,0,NULL,addr sizekey invoke RegQueryValueEx,newKey,addr data,0,0,addr valuekey,addr sizekey .IF eax == ERROR_SUCCESS jmp x .ENDIF pop sz_buf inc dwIndex jmp rec x: invoke RegCloseKey, newKey invoke RegCloseKey, phKey invoke MessageBox, NULL, addr valuekey, NULL, MB_OK invoke ExitProcess, 0 end Start