PE_Kill

PE_Kill

Мудрец
Сообщения
192
Реакции
930
Возможно это было сделано для того, чтобы компилятор не "оптимизировал" код?
нет, это в репах Go Lang там ARM и AVX недавно завезли, до этого извращались байткодом, даже компиляторы понаписать успели.
 

PE_Kill

Мудрец
Сообщения
192
Реакции
930
Такс. Мне тут зарепортили, что на Win7 анпакер сбоит. Вываливается в исключение:
Exception: EConvertError, Message: ''UNIMPL_SHCreateStreamWrapper'' is not a valid integer value

Происходит это на
-> Hooking "SHLWAPI.dll"

Очень странно. Выкачал с семерки shlwapi.dll и поискал там "UNIMPL_SHCreateStreamWrapper". И что я вижу?
SHUNIMPL.#UNIMPL_SHCreateStreamWrapper

Это форвард апи! Но кривая. Она говорит, что за адресом надо идти в библиотеку SHUNIMPL. Решетка означает, что апи там надо искать по ординалу. Но вместо номера ординала там строка UNIMPL_SHCreateStreamWrapper! Соответственно анпакер делает StrToInt и вываливается в ошибку. Думал, может я чего в документации по апи не учел. Погуглил и нашел это:

Проект DLL Minesweeper, заметка автора:
Bug
ShlWAPI.dll from Windows 7 and newer versions of Windows NT exports SHCreateStreamWrapper as an invalid forward to SHUNIMPL.#UNIMPL_SHCreateStreamWrapper!
Note: ShUnimpl.dll is the graveyard for obsolete and now unimplemented functions of Windows’ shell from prior versions of Windows NT.

Т.е. это кривой форвард, который никуда не ведет. ShUnimpl.dll кладбище нереализованных функций. Не понимаю, вместо кривого форварда нельзя было сделать нормальный, который просто ошибку выдает при попытке использовать API?

Че мне теперь проверять все форварды, вдруг винда решила их поломать? Как я зол, ну буду проверять че...
 

DX0

Новичок
Сообщения
432
Реакции
92
@PE_Kill,

Я на виртуальной машине сижу. На данный момент проверял на Win10. Могу на Win7 проверить.

Если основную брать OS, то Win10

Дк, а сам экспорт битый получается на Win7 что ли?
 

DX0

Новичок
Сообщения
432
Реакции
92
@PE_Kill,
А у тебя сделан в проекте LogException? Просто было бы понятно тогда, на каком моменте вылетает.

Не, если ты знаешь, базара ноль. Просто хочу помочь.
Вообще в Delphi должны быть
try{
} catch(...){
}

Код:
try
  someOperation;
except
  on e: ECustomException do
    SomeCustomHandelr;
  else
     begin
       // the raise is only useful to rethrow the exception to an encompasing
       // handler.  In this case after I have called my logger code. as Rob
       // mentioned this can be omitted if you arent handling anything because
       // the compiler will simply jump you to the next block if there is no
       // else.
       LogUnexpectedException('some operation failed',e);
       raise;
     end;
end;
@PE_Kill, Мне кажется, что в функцию StrToInt передается не строка, а число, я думаю что в этом проблема. Все таки если глянуть на экспорт, то сперва идет экспортируемая функция, только потом идет форвард на другую функцию, только в качестве имени выступает ординал. И скорее всего ординал передается в функцию StrToInt и вылетает ошибка. Это значит, что нужно сделать проверку перед использованием StrToInt. Ну это я лично так думаю. Если Delphi не умеет определять с числом ли он работает или со строкой - это плохо. А может вообще передаваться строка в StrToInt но строку которую он хочет перевести просто не влезает в размер переменной, или же вообще он работает только с числами в виде строк, потом переводит в числа.

Возьми в качестве теста любую библиотеку, испорти экспорт и проверь на распаковщике, так ты точно поймешь где ошибка, тем самым распаковщик предвидит все ошибки экспорта.

В место имени экспорта введи число, на оборот, и тд. ну и тестировать.

Все таки не даром на работу берут тестировщиков.
 
Последнее редактирование модератором:

PE_Kill

Мудрец
Сообщения
192
Реакции
930
Такс проблему выше порешал. Решил оживить анпак DLL. Уперся в то, что у меня так всё написано, что не будет работать с PE если он загрузился не по ImageBase. Так когда то было проще. Exe тогда не перемещались в памяти. А для DLL я сделал лоадер, у которого ImageBase всегда не равнялось тому, что в DLL и XP грузило библиотеку по ее адресу.

Сейчас DLL не грузится по своей базе, потому что адрес этот чаще всего занят какой то памятью. Даже с отключеным aslr. Очень мне не хочется заново ресерчить релоки в аспре и прочее, может есть идеи как прогрузить dll по своему адресу, при условии что загружающий exe мой и генерится налету?
 

DX0

Новичок
Сообщения
432
Реакции
92
@PE_Kill, цытирую человека с одного форума и кстати он прав:
"Никогда не полагайтесь на загрузку DLL с определенной базы. Если вы можете заставить библиотеки DLL загружаться на определенной базе, вы открываете потенциальную дыру в безопасности."

Если так рассудить, то впринципе можно попробовать осовобить ранее занятую базу в памяти и потом загрузить снова библиотеку в память, попробовать можно, впринципе.
 

HESH

Авторы статей
Ветеран
Сообщения
3
Реакции
107
Сейчас DLL не грузится по своей базе, потому что адрес этот чаще всего занят какой то памятью. Даже с отключеным aslr. Очень мне не хочется заново ресерчить релоки в аспре и прочее, может есть идеи как прогрузить dll по своему адресу, при условии что загружающий exe мой и генерится налету?
Хорошо, даже если предположить, что такой способ будет найден, условия-то существования DLL-ки в дальнейшем для не поменяются. Если релоки не будут пофикшены при анпаке, в будущем она точно так же может быть подгружена в другой процесс, где её ImageBase занят ещё какой-нибудь DLL например и тогда краш или болт. IMAGE_FILE_RELOCS_STRIPPED убережёт от краша, но рабочей её точно не сделает.
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
> как прогрузить dll по своему адресу

Тогда нужно память в нэйтив резервить, до загрузки любого импорта, пока процесс не станет юзер. Для этого нужен инжект в загрузчик, то есть саспенд процесс, там резерв памяти, затем перед загрузкой освобождение памяти, ну или системкой обработать сервис отображения, в любом случае инжект.
 

PE_Kill

Мудрец
Сообщения
192
Реакции
930
Если релоки не будут пофикшены при анпаке
Да не, всё там нормально. Релоки находятся, прописываются в выходной файл и т.д. Просто там алгоритм расчитан на то, что они не применятся. Он их просто найдет и посчитает размер. А вот если они применяются, то там все адреса в алгоритме сбиваются. Надо его переделывать. И ладно если бы только релоки, но боюсь что там везде помаленьку что то такое вылезет.
 

kioresk

Мудрец
Сообщения
1
Реакции
8
Пеко, салют! Рад видеть, что жив-здоров, все в порядке, и есть время на творчество - так держать!!!

Всем олдам, которых знаю
- приятно видеть старую школу, которая до сих пор в теме. ;-)

Vnvvnv, респект за наводку на восставшую из пепла Л@бу!

P.S.
In the end its all about the... ;)))
 

PE_Kill

Мудрец
Сообщения
192
Реакции
930
Нашел неприятный баг в камазе. Если в IAT 1 адрес и он ведет на API у которой есть форвард,, то сложно определить какую API использовать. Пример:

004E9CD0 : shell32.dll!SHGetFileInfoW <- SHLWAPI.dll!#0139

Т.е. функция с ординалом 139 в SHLWAPI является форвардом на shell32.dll!SHGetFileInfoW

И в IAT это единственный адрес, до него и после идут нули, т.е. там другие библиотеки.

Программа на самом деле запрашивала shell32.dll!SHGetFileInfoW
Но камаз видит, что есть апи с форвардом и берет именно его, как предпочтительный. Тут сразу мысль, что в таком случае можно взять за правило, если у API нет названия, только ординал, то отдать предпочтение всё же форварду. Но помню, что я когда то внедрял такое правило и ломалось распознавание API в какой то библиотеке работы с сетью, где многие API имели только ординалы.

Тут наверное проблему на автомате никак не решить (если не лезть в алго аспра).
 

ARCHANGEL

Мудрец
Сообщения
83
Реакции
534
может есть идеи как прогрузить dll по своему адресу, при условии что загружающий exe мой и генерится налету?

Когда-то очень давно видел кастомную сборку олли от SnD, и у них был лоадер, нестандартный, ему можно было указать желаемую базу, и он туда грузил длл. Типа, для восстановления релоков удобно. Внутри он делал VirtualAlloc с первым параметром - вот той самой предпочитаемой базой, MEM_RESERVE делал и размер брал с ImageSize заголовка. По-моему, так было, если что где не так указал, прошу прощения - было давно. Но и вот эта шляпа работала, грузила куда надо. То есть сам по себе VirtualAlloc этот, конечно, ничего не грузил, грузил последующий LoadLibrary.
 
Последнее редактирование:

DX0

Новичок
Сообщения
432
Реакции
92
@ARCHANGEL, я написал код, мне теперь нужно знать какой модуль нужно подгрузить по адресу, ну адрес соответственно, и в какой процесс грузить. Дело в том, чтобы прогрузить модуль по какому-ту адресу - нужно знать, а не занет ли этот адрес!

@ARCHANGEL, 1.png

Слушай, а зачем тебе велосипед изобретать, просто в модуле который хочешь загрузить по конкретному адресу измени ImageBase, тогда он загрузится где надо. Я попробовал загрузить модуль через отладчик - он грузится как раз по этому ImageBase. Может быть такое, что, если адрес в ImageBase занят, то он ищет другой адрес это в полне возможно, ну тогда и не получится загрузить вообще модуль, потому как адрес-то занят, если говорить про конкретный адрес.

@ARCHANGEL, как и обещал: https://cracklab.team/index.php?threads/857/
 
Верх Низ