Сейчас на форуме: NIKOLA, Magister Yoda (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Ватермарк
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 03 января 2018 19:09 · Поправил: Jaa
· Личное сообщение · #1

Всем привет. С новогодними праздниками. Анализирую программку на сишарпе, запнулся на одной фиговине нездоровой, в незареганой версии на созданные картинки налаживается ватермарк Unregistered Version и название софта, в зарегистрированной версии, светло-зеленая полоса диагональная. Одна дллка под вмпротом, несколько методов из неё тянут данные, посмотреть внутренности загруженной дллки пока не удалось.
Проверка регистрации онлайн тут public string SentandGetURLData(string type), судя по всему вернуться должно string больше 10, если ставлю больше десяти не прохожу два сравнения тут. Тоесть используется License_key из CxImageFrame.dll, а special_hash из SentandGetURLData в string. Какое значение в string должен возвратить метод SentandGetURLData при успешной проверки регистрации???
Регистрация программы MainForm.Instance.boolIsProgramRegistered = true; и правильный ответ чтобы пройти проверку ниже
Code:
  1. <b>public MainForm()</b>
  2. string a = this.SentandGetURLData("2");
  3.                               this.special_hash = a;
  4.                               int num3 = MainForm.Instance.IsRegisteredFunction_2(this.license_key, this.special_hash);
  5.                               if (this.license_key != "")
  6.                               {
  7.                                    if (this.special_hash == "")
  8.                                    {
  9.                                        MainForm.Instance.MESSAGE_Internet_Connection_Problems();
  10.                                    }
  11.                                    if (this.special_hash == "3")
  12.                                    {
  13.                                        MainForm.Instance.MESSAGE_License_Key_Blocked();
  14.                                    }
  15.                                    if (this.special_hash == "4")
  16.                                    {
  17.                                        MainForm.Instance.MESSAGE_Need_new_License_key();
  18.                                    }
  19.                                    if (this.special_hash == "2")
  20.                                    {
  21.                                        MainForm.Instance.MESSAGE_License_Key_Not_Correct();
  22.                                    }
  23.                                    if (this.special_hash == "10")
  24.                                    {
  25.                                    }
  26.                                    if (this.special_hash.Length > 10)
  27.                                    {
  28.                                        if (num3 == 1)
  29.                                        {
  30.                                           MainForm.Instance.boolIsProgramRegistered = true;
  31.                                           MainForm.Instance.boolIsProgramCanRun = true;


Пробовал в ресурсах подменить ватермарк UnregisteredVersion_logo на исправленный фотошопом, как то эта дрянь палит и все равно ставит зеленые полосы. Тоесть без регистрации первое фото, с пропатченой регистрацией второе фото.




--> подопытная программа <--




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 03 января 2018 19:27
· Личное сообщение · #2

Я бы на вашем месте не разбирался с механизмами, а просто сравнил бы пару картинок, для примера тестовых, обычным сравнением выделил штамп и удалил через эту инфу его со всех картинок

-----
vx




Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 03 января 2018 19:38
· Личное сообщение · #3

Я не нашел в коде где программа добавляет зеленую полосу, остальные все ватермарки ставятся в методе methodSavingOfMosaic
Code:
  1. if (!MainForm.Instance.boolIsProgramRegistered)
  2.                                              {
  3.                                                       graphics2.InterpolationMode = InterpolationMode.NearestNeighbor;
  4.                                                       graphics2.SmoothingMode = SmoothingMode.None;
  5.                                                       graphics2.PixelOffsetMode = PixelOffsetMode.None;
  6.                                                       graphics2.CompositingQuality = CompositingQuality.HighSpeed;
  7.                                                       graphics2.DrawImage(Resource.UnregisteredVersion_logo, 0, 0, Resource.UnregisteredVersion_logo.Width, Resource.UnregisteredVersion_logo.Height);
  8.                                                       graphics2.InterpolationMode = InterpolationMode.HighQualityBicubic;
  9.                                                       graphics2.SmoothingMode = SmoothingMode.HighQuality;
  10.                                                       graphics2.PixelOffsetMode = PixelOffsetMode.HighQuality;
  11.                                                       graphics2.CompositingQuality = CompositingQuality.HighQuality;
  12.                                              }

Code:
  1. bool flag3 = MainForm.Instance.boolIsProgramRegistered;
  2.                                        if (flag3)
  3.                                        {
  4.                                           for (int j = 10; j < bitmap.Width; j += (int)((float)width2 / num14 * 1.5f))
  5.                                           {
  6.                                             for (int k = 10; k < bitmap.Height; k += (int)((float)width2 / num14 * 1.5f))
  7.                                             {
  8.                                              graphics.DrawImage(this.GetImageByLanguageAndName("artensoft_com"), (float)(+ 50), (float)(+ 50), (float)this.GetImageByLanguageAndName("artensoft_com").Width / num14, (float)this.GetImageByLanguageAndName("artensoft_com").Height / num14);
  9.                                              MainForm.Instance.WriteLogFile1("d_3");
  10.                                              graphics.DrawImage(this.GetImageByLanguageAndName("UnregisteredVersion"), (float)(+ 50), (float)(+ 50 + 50) + (float)this.GetImageByLanguageAndName("artensoft_com").Height / num14, (float)this.GetImageByLanguageAndName("UnregisteredVersion").Width / num14 / 1f, (float)this.GetImageByLanguageAndName("UnregisteredVersion").Height / num14 / 1f);
  11.                                              MainForm.Instance.WriteLogFile1("d_4");
  12.                                             }
  13.                                           }
  14.                                        }

Code:
  1. if (this.boolIsShowWatermarks)
  2.                                    {
  3.                                        bool flag2 = MainForm.Instance.boolIsProgramRegistered;
  4.                                        if (flag2)
  5.                                        {
  6.                                           bool flag3 = true;
  7.                                           if (flag3)
  8.                                           {
  9.                                             for (int k = 10; k < this.panel1.AutoScrollMinSize.Width; k += 300)
  10.                                             {
  11.                                              for (int l = 10; l < this.panel1.AutoScrollMinSize.Height; l += 300)
  12.                                              {
  13.                                                       try
  14.                                                       {
  15.                                                               e.DrawImage(this.GetImageByLanguageAndName("artensoft_com"), k + this.panel1.AutoScrollPosition.X, l + this.panel1.AutoScrollPosition.Y, this.GetImageByLanguageAndName("artensoft_com").Width / 2, this.GetImageByLanguageAndName("artensoft_com").Height / 2);
  16.                                                               e.DrawImage(this.GetImageByLanguageAndName("UnregisteredVersion"), k + this.panel1.AutoScrollPosition.X, l + this.panel1.AutoScrollPosition.+ 50, this.GetImageByLanguageAndName("UnregisteredVersion").Width / 2, this.GetImageByLanguageAndName("UnregisteredVersion").Height / 2);
  17.                                                       }
  18.                                                       catch
  19.                                                       {
  20.                                                               MessageBox.Show("Error #107");
  21.                                                       }
  22.                                              }
  23.                                             }
  24.                                           }
  25.                                        }
  26.                                    }


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

Добавлено спустя 15 минут
Что должен возвратить метод SentandGetURLData чтобы пройти все проверки и стать зарегистрированным? Цифра больше десяти не канает, меньше тоже.

Добавлено спустя 17 минут
difexacaw пишет:
Я бы на вашем месте не разбирался с механизмами, а просто сравнил бы пару картинок, для примера тестовых, обычным сравнением выделил штамп и удалил через эту инфу его со всех картинок

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



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 03 января 2018 20:10
· Личное сообщение · #4

Jaa пишет:
Одна дллка под вмпротом, несколько методов из неё тянут данные,

Как это не смешно, но вмпрот там 2 версии:
Code:
  1. 000007FEDA5D020B | 49 8B 14 C4                     | mov rdx,qword ptr ds:[r12+rax*8]

Jaa пишет:
посмотреть внутренности загруженной дллки пока не удалось.

в какой момент он вообще её грузит?




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 03 января 2018 20:28 · Поправил: sefkrd
· Личное сообщение · #5

Jaa
У тебя обязательное условие:
Code:
  1. if (this.special_hash.Length > 10)
  2.                                    {
  3.                                        if (num3 == 1)
  4.                                        {
  5.                                           MainForm.Instance.boolIsProgramRegistered = true;
  6.                                           MainForm.Instance.boolIsProgramCanRun = true;

Длина hash овер 10 и нум3 == 1

Это бы глянуть:
MainForm.Instance.IsRegisteredFunction_2(int a, int b)

Добавлено спустя 15 минут
Патч 2-мя байтами(по крайней мере, из того, что вижу)..



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 03 января 2018 21:06
· Личное сообщение · #6

sefkrd пишет:
Патч 2-мя байтами(по крайней мере, из того, что вижу)..

А конкретнее?

sefkrd пишет:
Это бы глянуть:
MainForm.Instance.IsRegisteredFunction_2(int a, int b)

Это функа из дллки которая под вмпротом

Добавлено спустя 4 минуты
ELF_7719116 пишет:
в какой момент он вообще её грузит?

При сохрании фотоколлажа, там некоторые нужные функи под вм вмпрота 2.




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 03 января 2018 21:20 · Поправил: sefkrd
· Личное сообщение · #7

if (this.special_hash.Length > 10)
битхак:
if (!this.special_hash.Length > 10) - первый байт.. (2Dh => 2Ch)

if (num3 == 1)
битхак:
if (num3 != 1) - второй байт.. (39h => 3Ah)



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 03 января 2018 21:35
· Личное сообщение · #8

Вы предлагаете патчить условные переходы или я неправильно понял?




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 03 января 2018 21:36
· Личное сообщение · #9

Все верно..
Но можно и респонз поковырять..



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 03 января 2018 21:46
· Личное сообщение · #10

Бесполезно, все уже заноплено для проверки. Если программа зарегистрирована, на фото полосы зеленые, если программа не зарегистрирована, то ватермарки незарегистрированой программы, где то скрытая проверка наложения ватермарка




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 03 января 2018 22:12
· Личное сообщение · #11

Респонз ковырял?



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 03 января 2018 22:15
· Личное сообщение · #12

Неа



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 04 января 2018 13:31 · Поправил: ELF_7719116
· Личное сообщение · #13

Jaa пишет:
При сохрании фотоколлажа, там некоторые нужные функи под вм вмпрота 2.

Там, по существу, накрыты GetAdaptationHbitmapOfImage, IsRegisteredFunction и DllInit. Хрен с последней. Там два vmp контекста всего-то. И то: тупо на выходе в обычные dll-ные функи попадаем (10 фунок)
Code:
  1. 000007FED21D70F0 | push rbx                               |
  2. 000007FED21D70F2 | sub rsp,0x20                           |
  3. 000007FED21D70F6 | lea rax,qword ptr ds:[<&sub_7FED21D62F |
  4. 000007FED21D70FD | mov rbx,rcx                            |
  5. 000007FED21D7100 | mov qword ptr ds:[rcx],rax             |
  6. 000007FED21D7103 | call <cximageframe.sub_7FED21D7010>    |
  7. 000007FED21D7108 | mov rax,rbx                            |
  8. 000007FED21D710B | add rsp,0x20                           |
  9. 000007FED21D710F | pop rbx                                |
  10. 000007FED21D7110 | ret                                    |

идёт всегда последней:
Code:
  1. 000007FED22F0620 | cmp rcx,qword ptr ds:[0x7FED239E860]   |
  2. 000007FED22F0627 | jne cximageframe.7FED22F063A           |
  3. 000007FED22F0629 | rol rcx,0x10                           |
  4. 000007FED22F062D | test cx,0xFFFF                         |
  5. 000007FED22F0632 | jne cximageframe.7FED22F0636           |
  6. 000007FED22F0634 | ret                                    |
  7. 000007FED22F0636 | ror rcx,0x10                           |
  8. 000007FED22F063A | jmp cximageframe.7FED22F5DAC           |

или в подобные такие куски кода (4 раза):
Code:
  1. 000007FED21D5B50 | 8B 41 14                        | mov eax,dword ptr ds:[rcx+0x14]        |
  2. 000007FED21D5B53 | C3                              | ret                                    |

вряд-ли там что-то внутри VM делается.
Jaa пишет:
Если программа зарегистрирована, на фото полосы зеленые

GetAdaptationHbitmapOfImage сто-пицот раз вызывается. Может она и рисует??!?


| Сообщение посчитали полезным: Jaa

Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 04 января 2018 14:17
· Личное сообщение · #14

ELF_7719116 пишет:
GetAdaptationHbitmapOfImage сто-пицот раз вызывается. Может она и рисует??!?

Она действительно и рисует, но если патчить всю функу не сохраняется никакого изображения, девмить эту функцию ума не хватает.
Вот метод, в нем цикл использующий метод GetAdaptationHbitmapOfImage
Code:
  1. public Image GetAdaptationHbitmapOfImage_EM(Bitmap inImage, int koeff, int rotation, string Name1, int rr1, int rr2, int rr3, string license_key, string special_hash)
  2.                  {
  3.                         Image result;
  4.                         if (inImage != null)
  5.                         {
  6.                               IntPtr hbitmap = inImage.GetHbitmap();
  7.                               Bitmap bitmap = new Bitmap(1, 1);
  8.                               Graphics graphics = Graphics.FromImage(bitmap);
  9.                               IntPtr hdc = graphics.GetHdc();
  10.                               IntPtr adaptationHbitmapOfImage = MainForm.GetAdaptationHbitmapOfImage(hdc, hbitmap, koeff, rotation, Name1, rr1, rr2, rr3, license_key, special_hash);
  11.                               bool flag = false;
  12.                               if (adaptationHbitmapOfImage.ToInt64() != 0L)
  13.                               {
  14.                                    try
  15.                                    {
  16.                                        bitmap = Image.FromHbitmap(adaptationHbitmapOfImage);
  17.                                        flag = true;
  18.                                    }
  19.                                    catch
  20.                                    {
  21.                                        flag = false;
  22.                                    }
  23.                               }
  24.                               if (!flag)
  25.                               {
  26.                                    bitmap = new Bitmap(10, 10);
  27.                               }
  28.                               PlatformInvokeGDI32.DeleteObject(adaptationHbitmapOfImage);
  29.                               PlatformInvokeGDI32.DeleteObject(hbitmap);
  30.                               graphics.ReleaseHdc(hdc);
  31.                               PlatformInvokeGDI32.DeleteObject(hdc);
  32.                               graphics.Dispose();
  33.                               GC.Collect();
  34.                               result = bitmap;
  35.                         }
  36.                         else
  37.                         {
  38.                               result = null;
  39.                         }
  40.                         return result;
  41.                  }


Добавлено спустя 19 минут
Рисование и обработка блоков происходит в дллке, из дллки уже пиходят готовые коллажи, поэтому в экзешнике собственно уже нечего патчить(




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 04 января 2018 14:46 · Поправил: sefkrd
· Личное сообщение · #15

Здесь:
bool flag = true;
if (adaptationHbitmapOfImage.ToInt64() == 0L)



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 04 января 2018 15:22 · Поправил: Jaa
· Личное сообщение · #16

Пробовал уже такой вариант и не только. Картинка с зеленой полоской уже приходит с метода GetAdaptationHbitmapOfImage



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 04 января 2018 16:01
· Личное сообщение · #17

Jaa пишет:
Рисование и обработка блоков происходит в дллке, из дллки уже пиходят готовые коллажи, поэтому в экзешнике собственно уже нечего патчить(

Там уж не так много требуется перебрать (9 уникальных фунок и два хвоста), причем больших фунок (с SSE2 и прочими ништяками) три или четыре, остальное - служебный мусор (вероятно). В некоторых местах у фунок код погажен немного. На крайний случае, затрейсить вм - если есть валидный ключ и сравнить с unregistred.
В секции .text считая от её начала дельты первых асм (в порядке вызовов):
Code:
  1. $+11EDD4         | push rbx                               | HealAlloc
  2. $+60F0           | push rbx                               |работает с кучей. инициализирует какую-то структуру
  3. $+480            | push rbx                               |куча вызовов из GDI32
  4. $+4B40           | mov eax,dword ptr ds:[rcx+0x18]        |
  5. $+7030           | mov qword ptr ss:[rsp+0x10],rbx        |
  6. $+4B40           | mov eax,dword ptr ds:[rcx+0x18]        |
  7. $+7570           | mov qword ptr ss:[rsp+0x8],rbx         |
  8. $+4B50           | mov eax,dword ptr ds:[rcx+0x14]        |
  9. $+4B40           | mov eax,dword ptr ds:[rcx+0x18]        |
  10. $+3BC0           | mov rax,rsp                            |вагон XMM, SSE2
  11. $+80             | push rbp                               |CreateCompatibleDC
  12. $+52F0           | mov qword ptr ss:[rsp+0x8],rbx         |HeapFree
  13. $+52F0           | mov qword ptr ss:[rsp+0x8],rbx         |
  14. $+11F620         | cmp rcx,qword ptr ds:[0x7FEDD45E860]   |

кто-то же из них получает контекст зеленой полоски/unregistred и рисует. Вероятней всего внутри vm стоит условие:
Code:
  1. if (registred == true && secu_check == true)
  2. DrawGreenLine();

тем более там есть аргументы - license_key, special_hash. Как видите, даже знаем-с примерно, где условная проверка может быть расположена (перегон GDI32 - CreateCompatibleDC).

| Сообщение посчитали полезным: sefkrd

Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 04 января 2018 16:05
· Личное сообщение · #18

Валидный рег ключ есть, только там онлайн проверка, приводил пример метода выше. Непонятно какой параметр должен быть в special_hash (string). Рабочего ключа с пройденной онлайн проверки нету, думаю и сам бы посомотрел и понял что надо вернуть. Ну, а вм разбирать - не по силам




Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 04 января 2018 16:20
· Личное сообщение · #19

Jaa пишет:
только там онлайн проверка

Ну так, трейси её, смотри что отдаёт-возвращает..

Добавлено спустя 3 минуты
Я раньше вроде с подобным стаффом имел дело(руборд вроде, не помню), бросил - времени не было..
Ща пока можно поковыряться..



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 04 января 2018 16:49
· Личное сообщение · #20

Jaa пишет:
Ну, а вм разбирать - не по силам

Сраный один контекст . Смотри-сравнивай, для начала, что в функах $+7570, $+7570, $+3BC0.
Я и так уже намекнул что заморачиваться он начинает:
Code:
  1. $+4B40           | mov eax,dword ptr ds:[rcx+0x18]        |

и продолжает
Code:
  1. $+4B50           | mov eax,dword ptr ds:[rcx+0x14]        |

когда из заполненной структуры в выделенной куче вытаскивает license_key или special_hash или чё это за говно (в обоих случаях одно и тоже значение у меня). Если его менять - уже начинаются вариации (зеленая полоска). Можно трейсануть эти вызовы контекстов. Примитивы у вм дефолтные - если он что-то и делает с этими значениями, то там а-ля ADD, SHL/SHR, MUL/DIV.
Картинки со всей фигней клеит он тут:
Code:
  1. $+3BC0           | mov rax,rsp                            |вагон XMM, SSE2

, но это не точно.



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 04 января 2018 20:33
· Личное сообщение · #21

64 или 32 битную программу смотрели?



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 04 января 2018 23:05
· Личное сообщение · #22

Jaa ну тут же по регистрам видно что 64




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 05 января 2018 01:23
· Личное сообщение · #23

ELF_7719116 пишет:
Как это не смешно, но вмпрот там 2 версии

Не подскажете, есть ли способ определить, что за версия на бинарник навешана. А то я с вмпротом дел не имел, мож, есть какой-то быстрый (или не очень) способ определения версии?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 33.4 (посетитель), 24thx
Активность: 0.020
Статус: Участник

Создано: 05 января 2018 01:36 · Поправил: redlord
· Личное сообщение · #24

ELF_7719116
хватит человека расстривать
дальше сам поймет




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 05 января 2018 02:00 · Поправил: ajax
· Личное сообщение · #25

ARCHANGEL
защити один раз версиями 1-2-3 - визуально поймешь во вьюере тотала. большинство коммерс протов "на глаз" сразу видно

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




Ранг: 5.9 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 07 января 2018 21:06 · Поправил: Gaal
· Личное сообщение · #26

Jaa, вас не смущает то факт, что для предварительного просмотра функция ресайза GetResizedHbitmapOfImage (из CxImageFrame.dll) используется напрямую, а при записи изображения — через функцию GetAdaptationHbitmapOfImage_EM, в параметрах которой передаются ключ и хеш ключа?

Смотрите метод methodSavingOfMosaic (apcm.MainForm) в исполняемом файле.



Замените функцию GetAdaptationHbitmapOfImage_EM на GetResizedImageFromEnotherImage.

Параметры функции:
GetResizedImageFromEnotherImage(Image inImage, int intX, int intY, int type)
где,
inImage - контекст изображения, у нас это bitmapWithTrans;
intX - новая ширина изображения, ширина текущей ячейки scellSimpleObj2.src_w на коэф. пропорциональности;
intY - новая высота изображения, высоте текущей ячейки scellSimpleObj2.src_h на коэф. пропорциональности;
type - режим ресайза (быстрый, нормальный, наилучший и т.д.).

Вот что получится:



| Сообщение посчитали полезным: Jaa

Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 07 января 2018 22:23 · Поправил: Jaa
· Личное сообщение · #27

Gaal пишет:
Замените функцию GetAdaptationHbitmapOfImage_EM на GetResizedImageFromEnotherImage.

Параметры функции:
GetResizedImageFromEnotherImage(Image inImage, int intX, int intY, int type)
где,
inImage - контекст изображения, у нас это bitmapWithTrans;
intX - новая ширина изображения, ширина текущей ячейки scellSimpleObj2.src_w на коэф. пропорциональности;
intY - новая высота изображения, высоте текущей ячейки scellSimpleObj2.src_h на коэф. пропорциональности;
type - режим ресайза (быстрый, нормальный, наилучший и т.д.).

Получилось примерно так:
Code:
  1. Bitmap bitmap2 = (Bitmap)this.GetResizedImageFromEnotherImage(bitmapWithTrans, (int)scellSimpleObj2.src_w, (int)scellSimpleObj2.src_h, 6);

но dnSpy не хочет комплировать такие изменения, в логе ошибка
Code:
  1. Серьезность       Код   Описание   Файл       Строка
  2. Ошибка   CS0201     Only assignment, call, increment, decrement, and new object expressions can be used as a statement     main.cs      163


Добавлено спустя 12 минут
Так, ну вроде все получилось по последнему скрину, но коллаж не сохраняется который нужен. Выше фото я прислал как должно сохраняться, вот ниже как сохраняется сейчас после патча
--> Foto <--

Добавлено спустя 14 минут
И сразу вопрос по патченному коду, почему ширина и высота фиксированная (1000)? Если выставить больше сразу и квадратики побольше и ватермарков нету. Но нужно сделать чтобы автоматически размер выбирался с помощью самой программы.
Code:
  1. Bitmap bitmap2 = (Bitmap)this.GetResizedImageFromEnotherImage(bitmapWithTrans, (int)((float)(scellSimpleObj2.src_w * width / 1000)), (int)((float)(scellSimpleObj2.src_h * width / 1000)), 6);




Ранг: 5.9 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 07 января 2018 23:25 · Поправил: Gaal
· Личное сообщение · #28

Вот результат патча по предложенной мною схеме:



Так или что-то не так?

Я патчил хардкорно (в нех-редакторе опкодами), т.к. пересборка программы после правки С# кода вносит свои коррективы, которые нужно перепроверять. Фиксированный коэф. пропорциональности, а ширина и высота берутся из заданного разрешения изображения (это всегда квадрат). Значение 1000 получилось на основе анализа исходных данных при расчете размеров ячеек для изображений. Возможно я ошибся или и неверно что-то истолковал. Я просто предложил вам вариант. Меня он полностью удовлетворяет.



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 08 января 2018 00:53
· Личное сообщение · #29

Кроме этого что вы еще патчили? Свой вариант патча отправил в ЛС (x64)



Ранг: 5.9 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 08 января 2018 09:50 · Поправил: Gaal
· Личное сообщение · #30

Jaa пишет:
Кроме этого что вы еще патчили?

Да, как вы и писали в самом начале: boolIsProgramRegistered = true.

Кроме того в MainForm.ctor(): bool flag = true и грохнул обращение к InitIP.



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

Затем разобрался с функцией SentandGetURLData. Основная её задача - это регистрация программы, её активация и проверка лицензии. Но выполняется она с больной навязчивостью.



Пока все работает. Может что-то пропустил или оно проявит себя позже.

| Сообщение посчитали полезным: sefkrd
. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Ватермарк
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати