Мир Автомобильных навигаторов

Мир Автомобильных навигаторов (http://4pna.com/index.php)
-   Навигатор на WinCE (http://4pna.com/forumdisplay.php?f=20)
-   -   KIA SORENTO 2013 NEW ГУ AV310DMDG.S (http://4pna.com/showthread.php?t=13392)

urban81 19.02.2015 10:21

KIA SORENTO 2013 NEW ГУ AV310DMDG.S
 
Есть ГУ с WinCE 6.0 (MIPSII) и приложение Х, которое работает с портами. Надо снять лог, что приложение считывает с портов и что пишет в них. С возможностью потом динамически преобразовывать информацию в нужную. Сделать таким способом подсоединиться к процессу приложения X, добавить свою ДЛЛ к процессу в которой буду перехватывать API CreateFileW, ReadFile и WriteFile и с помощью переопределения этих функци буду писать лог…Переопределённые функции ReadFilXXX и WriteFileXXX должны иметь возможность менять размер массива байт (считанный или который хочем записать), а также сам массив байт.

Добавлено через 34 минуты
Всем здравствуйте.Так вот длл не инжектится к приложению X !!! УТОЧНЯЮ: Не работает PerformCallBack4! Какой алтернативный способ? После шага
HINSTANCE hInst = ( HINSTANCE ) PerformCallBack4 ( &ci ); - ERROR_SHARING_VIOLATION и hInst выдаёт unused = CXX0030: ошибка: не удается вычислить значение выражения.Пробовал другой способ но там в одном из мест после memcpy(p, &Code, sizeof(DWORD) * 9);-ERROR_SHARING_VIOLATION.Как правильно подсоединять ДЛЛ к процессу приложения Х?
Заранее благодарю. Функция способа №1 вот:
Код:

void Inject9 ( void )
{
        DWORD Err = 0;
        BOOL bMode = SetKMode ( TRUE );
        printf( "SetKMode (%d).\n", GetLastError() );
        DWORD dwPerm = SetProcPermissions ( 0xFFFFFFFF );
        printf( "SetProcPermissions (%d).\n", GetLastError() );
        HANDLE targetProcessHandle = GetProcessHandle ( szApplication );//get handle
        printf( "GetProcessHandle (%d).\n", GetLastError() );
        if ( targetProcessHandle )
        {
                void *Ptr = MapPtrToProcess( L"Urban81Dll.dll", GetCurrentProcess ( ) );
                printf( "MapPtrToProcess (%d).\n", GetLastError() );
                CALLBACKINFO ci;
                ci.hProc = targetProcessHandle;
                void *t = GetProcAddress ( GetModuleHandle ( L"coredll.dll" ), L"LoadLibraryW" );
                printf( "GetProcAddress (%d).\n", GetLastError() );
                ci.pfn = ( FARPROC ) MapPtrToProcess ( t, targetProcessHandle );
                printf( "MapPtrToProcess (%d).\n", GetLastError() );
                ci.pvArg0 = Ptr;
                HINSTANCE hInst = ( HINSTANCE ) PerformCallBack4 ( &ci, 0, 0 , 0 );
                printf( "PerformCallBack4 (%d).\n", GetLastError() );
                FARPROC pHook = GetProcAddress ( hInst, (LPWSTR ) 1 );
                printf( "GetProcAddress (%d).\n", GetLastError() );
                ci.hProc = targetProcessHandle;
                ci.pfn = ( FARPROC ) MapPtrToProcess( pHook , targetProcessHandle );
                printf( "MapPtrToProcess (%d).\n", GetLastError() );
                ci.pvArg0 = targetProcessHandle;
                DWORD dw = PerformCallBack4 ( &ci );
                printf( "PerformCallBack4 (%d).\n", GetLastError() );
                CloseHandle ( targetProcessHandle );
        }
}

Функции способа №2 вот:
Код:

HMODULE LoadRemoteLibrary(HANDLE hProcess, HANDLE hThread, LPCTSTR FileName)
{
        HMODULE hModule;
        void* pSrc;
        void* pDst;
        DWORD* p;
        DWORD Code[9] = {
                0xe92d5fff,        //stmdb      sp!, {r0 - r12, lr}
                0xe59f4024,        //ldr        r4, [pc, #0x24]
                0xe59f001c,        //ldr        r0, [pc, #0x1C]
                0xe1a0e00f,        //mov        lr, pc
                0xe1a0f004,        //mov        pc, r4
                0xe58f000c,        //str        r0, [pc, #0xC]
                0xe8bd5fff,        //ldmia      sp!, {r0 - r12, lr}
                0xe58ff000,        //str        pc, [pc]
                0xeafffffe
//                0x00000000,        //*pbDone
//                0x00000000,        //hModule
//                0x00000000,        //&FileName
//                0x00000000,        //&LoadLibrary()
//                0x00000000,        //FileName[0]
        };
        BOOL* pbDone;
        HMODULE* phModule;
        CONTEXT Context;
        CONTEXT NewContext;
        hModule = NULL;
        if(pSrc = VirtualAlloc(NULL, 65536, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
        {
                printf( "VirtualAlloc - (%d).\n", GetLastError() );
                if(pDst = VirtualAllocEx(hProcess, NULL, 65536, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
                {
                        printf( "VirtualAllocEx - (%d).\n", GetLastError() );
                        p = (DWORD*)pSrc;
                        memcpy(p, &Code, sizeof(DWORD) * 9);
                        printf( "memcpy - (%d).\n", GetLastError() );
                        p += 9;
                        *p = (DWORD)FALSE;
                        pbDone = (BOOL*)p;
                        p++;
                        phModule = (HMODULE*)p;
                        p++;
                        *p = (DWORD)pDst + sizeof(DWORD) * (9 + 4);
                        p++;
#ifdef UNICODE
                        *p = (DWORD)GetProcAddress(LoadLibrary(_T("coredll.dll")), _T("LoadLibraryW"));
                        printf( "GetProcAddress - (%d).\n", GetLastError() );
#else
                        *p = (DWORD)GetProcAddress(LoadLibrary(_T("coredll.dll")), _T("LoadLibrary"));
#endif
                        p++;
                        _tcscpy((TCHAR*)p, FileName);
                        if(WriteProcessMemory(hProcess, pDst, pSrc, 65536, NULL))
                        {
                                printf( "WriteProcessMemory - (%d).\n", GetLastError() );
                                while(true)
                                {
                                        SuspendThread(hThread);
                                        Context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
                                        GetThreadContext(hThread, &Context);
                                        if(Context.Pc < 0x40000000)
                                        {
                                                NewContext = Context;
                                                NewContext.Pc = (ULONG)pDst;
                                                SetThreadContext(hThread, &NewContext);
                                                break;
                                        }
                                        ResumeThread(hThread);
                                        Sleep(10);
                                }
                                ResumeThread(hThread);
                                while(!(*pbDone))
                                {
                                        ReadProcessMemory(hProcess, pDst, pSrc, 65536, NULL);
                                        Sleep(10);
                                }
                                hModule = *phModule;
                                SuspendThread(hThread);
                                SetThreadContext(hThread, &Context);
                                ResumeThread(hThread);
                        }
                        VirtualFreeEx(hProcess, pSrc, 65536, MEM_DECOMMIT);
                }
                VirtualFree(pSrc, 65536, MEM_DECOMMIT);
        }
        return hModule;
}


urban81 20.02.2015 09:29

ЕСТЬ СПОСОБ № 3 НУЖНА ПОМОЩЬ!
 
Здравствуйте.Сейчас вижу ещё один способ инжекта ДЛЛ-это отредактировать ЕХЕ файл вручную через редактор WinHex или подобный - вписать длл и ее вызов при старте ехе.Подскажите где есть рабочие прмеры с моей темой? Всем зарание спасибо.

urban81 25.02.2015 16:22

ИНЖЕКТ ЕСТЬ!
 
Всем здравствуйте.Инжект получился вышеуказанным способом (PETools->PeEditor).Версию проги только надо брать нормальную.

Добавлено через 18 минут
Длл внедрили в DrFish.exe. Этот модуль в ГУ отвечает за считывании данных ЖПС с портов и дальнейшей раздачи их остальным модулям или что то вроде этого...Задача ДЛЛ перехватить вышесказанные АПИ функции с подсунуть мои...делать это она будет при помощи редактирования таблиц импорта...Вот нарыл функцию которая это делает.Подскажите где берётся структура HDATA? Заранее всем спаибо!
Код:

DWORD XXX ( HANDLE hProc, DWORD dFind, DWORD dReplace )
{
        DWORD ret = 0;
        //GODMODE ON
        BOOL  bOldKMode = SetKMode ( TRUE );
        DWORD dOldPerms = SetProcPermissions ( 0xFFFFFFFF );
        //get process ptr prom handle       
        //Process pr;
        HDATA * hProcHD = ( HDATA * ) ( 0x80000000 | ( ( DWORD ) hProc & HANDLE_ADDRESS_MASK ) );
        PROCESS * prc = ( PROCESS * ) hProcHD->pvObj;
        //get imports sections
        struct ImpHdr * blockptr, * blockstart;

        blockstart = ( struct ImpHdr * ) MapPtrProc ( prc->e32.e32_vbase + prc->e32.e32_unit[IMP].rva, prc );
        //iterate thru imports sections
        for ( blockptr = blockstart; blockptr->imp_lookup; ++blockptr )
        {
                DWORD dOldProtect, tmp;
                //get vectors ptr
                DWORD * vectors = ( DWORD * ) MapPtrProc ( prc->e32.e32_vbase + blockptr->imp_address, prc );
                //count vectors
                DWORD * vptr = vectors;
                while ( * vptr ) ++vptr;
                DWORD vcnt = ( vptr - vectors );
                //try to unlock imports section memory
                if ( VirtualProtect ( vectors, vcnt * sizeof ( DWORD ), PAGE_EXECUTE_READWRITE, &dOldProtect ) )
                {
                        //find&replace
                        for ( UINT i = 0; i < vcnt; ++i )
                        {
                                if ( vectors[i] == dFind )
                                {
                                        vectors[i] = dReplace;
                                        ++ret;
                                }
                        }
                        //lock back
                        VirtualProtect ( vectors, vcnt * sizeof ( DWORD ), dOldProtect, &tmp );
                }
        }
        //GODMODE OFF
        SetProcPermissions ( dOldPerms );
        SetKMode ( bOldKMode );
        return ret;
}


tom_step 04.03.2015 13:37

Здравствуйте.
Тоже борюсь с такой железкой пока не очень получается. попал в СЕ а дальше тоже уперся в работу GPS. Я так понял что drfish как раз и открывает порт, и протокол hippo.

urban81 10.03.2015 14:27

Subverting wince6
 
Здравствуйте.Метод - правки таблицы импорта хорошо работал на винсе 5, но на 6-ке пока мной не побеждён.Нашёл одну статью про это "subverting_wince6.pdf".В этой статье приведены различия 5 и 6...Как раз по этой части.

urban81 24.03.2015 08:25

Подготовка к инжекту!
 
Всем здравствуйте.Делаем инжект на тестовом приложении в эмуляторе винсе. В ПЕ идиторе будем править ехе!.Для этого сделаем приложение, которое может писать и читать в виртуальный ком порт. Сначала сделаем, которое пишет...Запустим его...Потом которое читает с порта - его то мы и будем править в ПЕ идиторе...При запущенном приложении, которое пишет, наше приложение которое читает, при удачном инжекте(перехвате АПИ реадфайл...)-будет писать лог...
Предисловие:
В ПЕ-эдиторе при разборе тестового ехе есть такие вещи:
...
Imports Table: COREDLL.dll
OrigFirstThunk: 00003108 (Unbound IAT)
ForwarderChain: 00000000
First thunk RVA: 00004000
Ordn Name 859 (Bound to: 8000035B)
...
"Ordn Name" - это, возможно, имя АПИ функции. "Bound to" - это думаю адресс функции. Значит "Ordn Name" - это название функции и "Bound to"-это адресс функции...То внедрив вручную длл со своей функцией (API ReadFile) можно поменять "Bound to", зная нужный "Ordn Name" и ... Вот только неизвестно какой какой "Ordn Name" принадлежит API ReadFile? И нет подобных примеров как эту задумку реализовать.По логике вещей это всё должно происходить в коде - добавляешь в таблицу новые функции и заменяешь (запомнив) у прежних адреса на свои. а в своих используешь запомненые адреса.но чтоб в готовом ехе это сделать - надо функцию свою в него дописать и вычислить адреса.
"ordn name" = ordinal,
Нужный номер можно подсмотреть в public\common\oak\lib\<arch>\retail\coredll.def
Выкладываю проект с тестовыми приложениями.Кто в теме ПРОБУЕМ!!!Всем спасибо!
[[Ссылки могут видеть только зарегистрированные пользователи. ]]>

avtoserg 24.03.2015 09:46

urban81, Привет!
на столе стоит голова от киа спортаж 2014
не видит спутников, не может открыть ни одного порта
я так понимаю ты эту проблему пытаешься решить?

urban81 24.03.2015 11:21

Про заметки!
 
Здравствуйте все.Да наши задачи похожи в чём то.Хочу РЕШИТЬ задачу и самому интересно и людей научу как на ХАЛЯВУ решать...Ведь когда всё объяснено с примерами-это здорово!

avtoserg 24.03.2015 11:25

чем могу помочь?
на киа клабе сборки работают с dll , переделывает hipo в nmea
но на рестайлинговых аппаратах этот фокус не проходит

urban81 24.03.2015 11:51

Пишем прогу которая пишет в порт...
 
Всем здравствуйте.Скачал GpsVirtualDriver в коде.Установил...Он сделал записи в реестре...Пишу приложение которое, будет писать в порт пакет байт( в дальнейшем так будем скидывать в порт перехваченные пакеты байт)...
Пишу (см.проект):
Код HTML:

        PDWORD BytesHandled = 0;
        COM_Init ( L"", 0 );
        COM_Open ( DEVICE_CONTEXT, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE );
        COM_IOControl ( OPEN_CONTEXT, 0, ( PBYTE ) & BufferTx,        sizeof( BufferTx ), ( PBYTE ) & BufferRx, sizeof( BufferRx ), ( PDWORD ) & BytesHandled        );

После строки в GpsVirtualDriver.cpp :BOOL bRet=DeviceIoControl( hComm, dwCode, pBufIn, dwLenIn, pBufOut, dwLenOut, pdwActualOut, NULL); выдаёт bRet == FALSE и DWORD ERR_XXX = GetLastError(); ==0x00000057.Как правильно написать организовать отправку байт? Ведь вроде всё просто там все функции по работе с файлами...
Всем заранее спасибо!

Sanik 24.03.2015 12:24

Могу посоветовать в личку готовую сборку для ваших девайсов, стоит недорого

urban81 01.04.2015 12:27

Тестовые проги готовы.Начинаем править exe файл!
 
Здравствуйте все.Тестовые проги готовы (всё необходимое в архиве).Начинаем править exe файл!Предисловие.В роли программы-утилиты,которая является аналогом утилиты
доктор фишь, будет моя прога ZZZ.exe. Она будет читать с порта ком1 в эмуляторе вин се(эмулятор приложен).При разборе в пе едиторе доктора фиша, нашёл ,что только она
имеет апи функцию реадфайл(доктор фишь читает с порта жпс данные) её идентификатор-00AAh.Нужно чтобы ёщё были какие нибудь данные в ком1.Сделаем так.Возьмём любой адептер юзб-ком.Нужно, чтобы на компе было два ком порта.В моём случае адаптер установил мне два порта ком1 и ком2. Сопрягаем ком1 в эмуляторе.Делаем далее нульмодем соединяем ком1 и ком2 так: 2(ком1)-3(ком2),2(ком2)-3(ком1),5(ком2)-5(ком1).Далее запускаем прогу Advanced Serial Port Monitor (приложена).В ней посылаем в ком2 любой
пакет байт.Наша прога ZZZ.exe должна ловить этот пакет байт (у меня ловит).XXXDLL.dll - длл которую мы будем внедрять вручную(с помощью пе тулс) в ZZZ.exe.В длл есть
функция function1 "заглушка"- нужна чтобы попасть в адресное пространство ZZZ.exe.Функция APIHook_ReadFile "подменнная"- нужна чтобы заменить апи реадфайл
(идентификатор-00AAh) в ZZZ.exe.Начинаем править ZZZ.exe.1.Внедряемся в адресное пространство ZZZ.exe.Положим ZZZ.exe и XXXDLL.dll в одну папку и cмотри
картинку.Делаем как на картинках.Обясняю (пока не знаю почему так).Внедрив заглушку надо поменять Original first Thunk.Проследив, как они располагаются в других
библиотеках(смотри рисунок 5 и 6).Они располагаются с приращением 4.Находим последний Original first Thunk в библиотеке commctrl.dll 32A8.И прибовляем к нему 4 = 32AC- это и будет наш Original first Thunk.Сохраняем всё и запускаем.Если, до этих действий добавить в XXXDLL.dll после кода "case DLL_PROCESS_ATTACH:" любое сообщение, то после наших исправлений оно должно появиться-это и есть знак МЫ НА ПРАВИЛЬНОМ ПУТИ!!!Вот попали в адресное пространство ZZZ.exe.Дальше надо как то заменить апи реадфайл на на нашу функцию APIHook_ReadFile...Остановился здесь...Уважаемые форумчане пробуем, правим, заменяем, делимся...Дальше план такой- при удачной замене длл XXXDLL.dll,будет писать лог...Но мы можем и не писать, а перенаправлять данные в виртуальный порт(в архиве есть в коде), чтобы с него кушала наши данные любая другая навигация.Так же там в проекте виртуального порта уже есть функция конвертации в нужный протокол NMEA (попался на просторах инета).Eщё, попав в адресное пространство мы можем перехватывать нажатия аппартных клавиш ГУ и тем саммым перенаправлять родную оболочку на любую другую программу навигации...Всем кто в теме спасибо за внимание.
П.С.Так же актуален вопрос: как внедрять длл с помощью кода и перехватывать реадфайл с помощью кода???
SDK2.doc-емулятор Вин се 6. переименовать в SDK2.msi
Архив:[[Ссылки могут видеть только зарегистрированные пользователи. ]]> Картинки:[[Ссылки могут видеть только зарегистрированные пользователи. ]]>

urban81 09.04.2015 16:46

Есть ещё один план!!! Давайте обсудим!!!
 
Всем здравствуйте.Один мой земляк подсказал мне план.План прост.Хочу с вами его обсудить. Его + и -.План такой: Установить виртуальный ком порт.Изменить с помощью хекс редактора номер порта в приложении-утилите которая читает с порта(DrFish.exe).Сделать приложение, которое открывает аппаратный порт и скидывает данные в порт виртуальный, который мы поправили в DrFish.exe. Ну а там...Всем кто в теме спасибо за внимание.Жду обсуждений...

urban81 10.04.2015 11:51

Новый план не подходит.Но есть ещё один план!
 
Всем здравствуйте.При разборе в хекс редакторе фиша, уидел : да можно поменять номер порта, но так же увидел функции с приставкой "COM". Это говорит, скорее всего, о том, что доктор фишь не только читает но и управляет портом...Мне подсказали добрые люди, что можно "слушать вместо навишации(перехват через инжект) стэк 127.0.0.1 на порту"...Там есть нужные нам данные...Теперь нам нужно изучить риеестр ГУ, чтобы представить какие порты у нас есть и послушать их, да и вообще врага надо знать в лицо...Для этого нам понадобится редактор риестра для МИПС архитектуры.У кого есть поделитесь пожалуйста.Всем спасибо за внимание...
П.С.Так же актуален вопрос: как сделать перехват с помощью кода?

Anton 1983 18.04.2015 17:47

typedef struct udp_hdr
{
unsigned short source_port; // Source port no.
unsigned short dest_port; // Dest. port no.
unsigned short udp_length; // Udp packet length
unsigned short udp_checksum; // Udp checksum (optional)
} UDP_HDR;
MessageBox(0, TEXT("программа открыта"),TEXT ("Error"), 0);
HANDLE FileHandle,FileHandle2;
if (FileHandle=CreateFile(L"\\DiskA3\\log_UDP.txt",GE NERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_NEW,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0))MessageBox(0, TEXT("файл открыт"), TEXT("ок"), 0);

SOCKET sServerListen;
struct sockaddr_in localaddr,clientaddr;
int iSize;
char szIP [1024];
strcpy (szIP,"127.0.0.1");

//sServerListen = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sServerListen = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

//sServerListen = socket(AF_INET, SOCK_DGRAM, 0);
if (sServerListen == INVALID_SOCKET)
{
MessageBox(0, TEXT("Can't create socket"),TEXT ("Error"), 0);
return 0;
}

localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//localaddr.sin_addr.s_addr = inet_addr(szIP);
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(29000);

if (bind(sServerListen, (struct sockaddr *)&localaddr,sizeof(localaddr)) == SOCKET_ERROR)
{
MessageBox(0, TEXT("Can't bind"), TEXT("Error"), 0);
return 1;
}

Добавлено через 1 минуту
Лог с удп порта читай. А вот перехват я так и не освоил ;)

Добавлено через 1 час 12 минут
ну а вообще на 4pda есть тема соответствующая, почитай ее


Текущее время: 20:42. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot

Время генерации страницы 0.03440 секунды с 10 запросами