Добавление функциональности в готовые программы

Тема в разделе "WASM.BEGINNERS", создана пользователем isolp, 28 авг 2008.

  1. isolp

    isolp New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    10
    Прочитал статью, попробовал по ней сделать, не получается.
    Хочу добавить функционал в прогу WirelessKeyView (скачать можно тут http://www.nirsoft.net/utils/wirelesskeyview.zip)
    Прога запакована upx, распаковал, распакованная работает.
    Нужно научить ее брать ключи с удаленного компа. Так как работает с реестром (для хр), то нужно в regopenkeyex вместо hkey_local_machine подсунуть хендл полученный через regconnectregistry.
    сделал такую прогу

    void Connect()
    {
    HKEY hResult = NULL;
    long status = RegConnectRegistry("\\\\192.168.1.83", HKEY_LOCAL_MACHINE, &hResult);
    }

    void main()
    {
    Connect();
    }

    линковщику поставил опцию /BASE:0x4020000, т.к. ImageBase + ImageSize для WirelessKeyView равно 4000000 + 13000
    сохранил секции .text, .rdata и .data моей проги на диск и добавил их в WirelessKeyView слдеующим образом:
    было
    .text 9ef4 1000 a000 400
    .rdata 2440 b000 2600 a400
    .data da4 e000 200 ca00
    .rsrc 35b4 f000 3600 cc00
    добавил
    .uinc e000 13000 0 10200
    .text1 3e00 21000 3c00 10200
    .rdata1 1600 25000 1400 13000
    .data1 600 27000 400 13000

    при попытке запустить получаю ошибку - приложение не win32
    что я не так сделал ?

    посмотрел сейчас, даже если добавить только
    .uinc e000 13000 0 10200
    перестает запускаться
     
  2. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Ради одной-единственной функции такие аццкие замуты?! Может проще:
    1. Добавить функцию RegConnectRegistry в импорт, если её там ещё нет
    2. Не смотреть итальянскую порнуху, где кричат "си!" си!", а строчку "long status = RegConnectRegistry("\\\\192.168.1.83", HKEY_LOCAL_MACHINE, &hResult);" написать на ассёмблере в конце уже имеющейся секции кода
    3. Кинуть туда jmp откуда-нибудь из места, которое заведомо исполняется раньше, чем RegOpenKeyEx.

    Кстати, а соединение с удалённым реестром без всяких логинов-паролЕй вообще нормально проходит, отлуп не дают? Если да - меня несколько удивляет такая политика администрирования.
     
  3. isolp

    isolp New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    10
    хочу разобраться именно с добавлением кода, ну и сполезным соединить
    чтобы без логинов и паролей надо сначала сказать net use с логином и паролем
    пардоньте за назойливость, но что я сделал не так при добавлении секций ?
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    isolp
    Да кто ж его знает... Может (и скорее всего) просто инструмент для добавления секций оказался кривой и что-то где-то сломал.
     
  5. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Возможно, не обновил поле ImageSize заголовка?
     
  6. isolp

    isolp New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    10
    точно, спасибо
     
  7. isolp

    isolp New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    10
    еще один вопрос
    прогу из которой беру секции слинковал с такими опциями
    #pragma comment(linker,"/ENTRY:main")
    #pragma comment(linker,"/NODEFAULTLIB")
    #pragma comment(linker,"/BASE:0x00420000")
    в результате и размер кода сократился и секций всего две осталось: .text и .rdata
    если смотреть идой, то секций 3 - еще .idata, такая
    .idata:00422000 ; Imports from ADVAPI32.dll
    .idata:00422000 ; Segment type: Externs
    .idata:00422000 ; _idata
    .idata:00422000 ; LONG __stdcall RegConnectRegistryA(LPCSTR lpMachineName,HKEY hKey,PHKEY phkResult)
    .idata:00422000 extrn RegConnectRegistryA:dword ; DATA XREF: start+2Er
    .idata:00422000 ; Establish a connection to a predefined
    .idata:00422000 ; registry handle on another computer
    .idata:00422004

    и соответственно в .text
    .text:0042102E call ds:RegConnectRegistryA ;


    после добавления секций в целевую прогу и открытия в иде эти адреса выглядят так
    .rdata1:00422000 _rdata1 segment para public 'CODE' use32
    .rdata1:00422000 assume cs:_rdata1
    .rdata1:00422000 ;org 422000h
    .rdata1:00422000 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
    .rdata1:00422000 dword_422000 dd 20AAh ; DATA XREF: .text1:0042102Er
    .rdata1:00422004 align 8

    .text1:0042102E call ds:dword_422000

    почему испортились данные в начале секции и как теперь их восстановить, чтобы они ссылались на RegConnectRegistry ?
    просто вставлять адрес не хочется, интересно сделать правильную секцию, чтобы адрес прописывал загрузчик
     
  8. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Почитай про таблицу импорта
    А чем не нравится метод предложенный в статье?
    Можно попробовать сшить струю таблицу импорта с новой...