Нахождение недокументированных API в Windows

Swift 3 со Swift FacebookSDK

Подфайл

pod 'FacebookCore'
pod 'FacebookLogin'

info.plist

без изменений от старого SDK

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb$(YOUR_FB_APP_ID)</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>
<key>FacebookAppID</key>
<string>$(YOUR_FB_APP_ID)</string>
<key>FacebookDisplayName</key>
<string>$(YOUR_APP_NAME)</string>

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
    ...
}

func applicationDidBecomeActive(_ application: UIApplication) {
    AppEventsLogger.activate(application)
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let appId = SDKSettings.appId
    if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.host ==  "authorize" { // facebook
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    }
    return false
}

...

LoginManager (пользовательский вход в систему, см. Документы для реализации по умолчанию / кнопки)

содержит пользовательский код, но вы получите точку

let facebookManager = LoginManager(loginBehavior: .systemAccount, defaultAudience: .everyone)
func loginWithFacebook() {
    self.facebookManager.logIn(HAAccountManager.shared.facebookPermissions, viewController: self) { (result) in
        switch result {
        case .failed(let error):
            self.showAlert(forError: error as NSError)
        case .cancelled:
            print("FB login cancelled")
        case .success(let grantedPermissions, let deniedPermissions, let accessToken):
            if grantedPermissions.contains(Permission(name: "email")) == true {
                ApiClient.shared.facebookSignIn(authToken: accessToken.authenticationToken, completion: { (err, user) in
                    if err == nil {
                        // success
                    }
                    else {
                        self.showAlert(forError: err!)
                    }
                })
            }
            else {
                self.showAlert(forError: HAError(title: String(format: String.somethingError, String.signIn), message: grantedPermissions.contains(Permission(name: "email")) == true ? String.noAccountFound : String.missingEmailForSignUp))
            }
        }
    }
}

Аналитика

// custom ex
AppEventsLogger.log(AppEvent(name: "open_app", parameters: ["logged_in": NSNumber(value: HAAccountManager.shared.isUserLoggedIn())], valueToSum: nil))

// purchase ex
AppEventsLogger.log(
    AppEvent.purchased(
        amount: Double(revenue),
        currency: currency,
        extraParameters: [
            AppEventParameterName.contentId : orderId,
            AppEventParameterName.itemCount : order.orderItems.count.nsNumber()
        ])
)
46
задан Sathyajith Bhat 19 June 2012 в 11:44
поделиться

5 ответов

Используйте инструмент для создания дампа таблицы экспорта из общей библиотеки (например, DLL, такой как kernel32.dll). Вы увидите названные точки входа и / или порядковые точки входа. Как правило, для окон именованные точки входа не связаны (внешний «C»). Скорее всего, вам нужно будет немного взглянуть на код сборки и получить параметры (типы, число, порядок, соглашение о вызовах и т. Д.) Из кадра стека (если он есть) и использования регистра. Если кадра стека нет, это немного сложнее, но все же выполнимо. См. Ссылки по следующим ссылкам:

  1. http://www.sf.org.cn/symbian/Tools/symbian_18245.html
  2. http://msdn.microsoft.com/en-us/library/31d242h4. aspx

Воспользуйтесь такими инструментами, как dumpbin для исследования разделов экспорта. Эти же принципы работают во множестве операционных систем, однако вам нужно будет заменить инструмент, который вы используете для создания дампа таблицы экспорта. Например, в Linux вы можете использовать nm для создания дампа объектного файла и перечисления его раздела экспорта (среди прочего). Вы также можете использовать gdb для установки точек останова и пошагового выполнения кода сборки точки входа, чтобы определить, какими должны быть аргументы.

39
ответ дан 26 November 2019 в 20:38
поделиться

IDA Pro - ваш лучший выбор, но пожалуйста, удвойте, пожалуйста, фактически никогда не используйте их ни для чего.

Они внутренние, потому что меняются; они могут (и меняют) даже изменяться в результате исправления, поэтому вам даже не гарантируется, что ваш недокументированный API будет работать для конкретной версии ОС и уровня пакета обновления, для которого вы его написали. Если вы отправляете такой продукт, вы живете в долг.

9
ответ дан 26 November 2019 в 20:38
поделиться

Посмотрите на системные dll и какие функции они экспортируют. Каждая функция API, документированная или нет, экспортируется в один из них (пользователь, ядро, ...).

1
ответ дан 26 November 2019 в 20:38
поделиться

Для API пользовательского режима вы можете открыть Kernel32.dll User32.dll Gdi32.dll, особенно ntdll.dll в обходчике зависимостей , и найти все экспортированные API. Но у вас не будет документации.

Только что нашел хорошую статью о Native APIS Марка Руссиновича

1
ответ дан 26 November 2019 в 20:38
поделиться

Всем здесь пока не хватает некоторых существенных функций, которые включают в себя очень недокументированные части ОС Windows RPC . Операции RPC (например, rpcrt4.dll, lsass.exe, csrss.exe и т. Д.) Очень часто происходят во всех подсистемах, через порты LPC или другие интерфейсы, их функциональность похоронена в мистических заклинаниях различных типов / подтипов. / struct-typedef и т. д., которые значительно труднее отлаживать из-за асинхронного характера или того факта, что они предназначены для процессов, которые, если бы вы выполняли отладку с помощью одного шага или что-то еще, вы бы обнаружили всю систему блокировка из-за блокировки клавиатуры или другого ввода-вывода от передачи;)

ReactOS , вероятно, наиболее целесообразный способ исследовать недокументированный API. У них достаточно зрелое ядро ​​и другие исполнительные с застроен. IDA требует довольно много времени, и маловероятно, что вы найдете что-то, чего еще не было у разработчиков ReactOS.

Вот аннотация со связанной страницы;

ReactOS® - это бесплатная современная операционная система система на основе дизайна Windows® XP / 2003. Написано полностью с царапины, он стремится следовать Архитектура Windows® разработана Microsoft с аппаратного уровня прямо до приложения уровень. Это не на базе Linux система и не разделяет ни одну из unix архитектура.

Основная цель Проект ReactOS должен предоставить операционная система, которая является двоичной совместим с Windows. Это будет разрешите ваши приложения Windows и драйверов, чтобы они работали, как на вашем Система Windows. Кроме того, внешний вид и ощущение работы Windows система используется так, что люди привык к знакомому пользователю интерфейс Windows® найдет использование ReactOS проста. Конечная цель ReactOS - позволить вам удалите Windows® и установите ReactOS без того, чтобы конечный пользователь заметил

Когда я исследую некоторые редко встречающиеся конструкции Windows, ReactOS часто является единственной достоверной ссылкой.

8
ответ дан 26 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: