VB6 + OllyDbg + массивы - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день. По работе столкнулся с проблемой: есть Dll, написанная на VB6, в ней есть функция, которая берет из БД данные и пихает их в отчет. И там стоит проверка на кол-во данных:
  While Not rs.EOF
    If cnt > 19 Then
      MsgBox " Количество > 20!", vbCritical, "Ошибка"
    Else
      idx(cnt) = rs!IdTank
      cnt = cnt + 1
    End If
Перед этим кодом объявлены переменная и массив:
Dim cnt As Long, idx(20) As Long
Никто до сих пор понять не может, что имел в виду автор, объявляя эмпирическую константу 20, но это уже и не важно. Кода от этой Dll нет. Но есть код именно этой функции, которую нужно подправить. Проверку If cnt > 19 Then я нашел без труда и расширил. А вот с объявлением массива какая-то странность – я никак не могу найти в Olly, где хранится эта константа. Я написал 2 простые прораммы: Код exe файла (извините за кривоту, на VB сегодня второй день только пишу) Форма, на ней кнопка. Код такой:
Dim Dll As Object
 
Private Sub Command1_Click()
    Set Dll = CreateObject("Pr1Dll.Class1Dll")
    Dll.Report301 "aaaa", "bbbb"
    MsgBox ("In main F")
End Sub
(параметры передаются в оригинальную ф-ию, тут их я тоже решил оставить) И код для создания DLL
Public Sub Report301(svFile As String, dat As String)
  Dim i As Long
  i = 6
  Dim j As Long
  j = 9
  Dim idx(20) As Long
  For i = 0 To 19
    idx(i) = i
  Next i
  MsgBox ("I=" & i)
  End Sub
Этот код максимально приближен к тому, что есть в Dll, которую нужно подправить. То есть задача-минимум звучит так: Найти в скомпилированном Dll объявление массива и расширить его в 2 раза. На сколько мне удалось понять, создание массива происходит тут:
110019CA   . 6A 03          PUSH 3                                   ; /Arg3 = 00000003
110019CC   . 8D55 CC        LEA EDX,[DWORD SS:EBP-34]                ; |
110019CF   . 68 A8170011    PUSH Project_.110017A8                   ; |Arg2 = 110017A8
110019D4   . 52             PUSH EDX                                 ; |Arg1
110019D5   . 897D C4        MOV [DWORD SS:EBP-3C],EDI                ; |
110019D8   . 897D B4        MOV [DWORD SS:EBP-4C],EDI                ; |
110019DB   . 897D A4        MOV [DWORD SS:EBP-5C],EDI                ; |
110019DE   . 897D 94        MOV [DWORD SS:EBP-6C],EDI                ; |
110019E1   . 897D 84        MOV [DWORD SS:EBP-7C],EDI                ; |
110019E4   . 89BD 50FFFFFF  MOV [DWORD SS:EBP-B0],EDI                ; |
110019EA   . FF15 40100011  CALL [DWORD DS:<&MSVBVM60.__vbaAryConstr>; \__vbaAryConstruct2
Но в параметры __ vbaAryConstruct2 передаются не значения, а какие-то адреса, в дампе по этим адресам ничего полезного нет. Куда копать? Как быть? VB Decombiler отображает эту фи-ю вот так:
  Public Sub Report301(svFile, dat) '0
  loc_110019B5: var_8 = 110010B0h
  loc_110019C7: call Me.AddRef 'Ignore this(edi, esi, ebx)
  loc_110019EA: Dim var_34(20) As Long
  loc_110019F9: If esi > 0 Then GoTo loc_11001A1D
  loc_110019FE: If esi < 0 Then GoTo loc_11001A06
  loc_11001A00: Err.Raise
  …
И мне хочется верить, что Dim var_34(20) As Long - это та самая волшебная переменная, которую я ищу и которую надо подправить через Олли. (как минимум по тому, что изменение строки «Dim idx(20) As Long» приводит к изменению и декомпилированной версии: loc_110019EA: Dim var_34(666) As Long) Как поймать? Во вложениее Exe + Dll + reg файл для регистрации длл. Коды все тут приведены

Решение задачи: «VB6 + OllyDbg + массивы»

textual
Листинг программы
.text:110019FB                 cmp     esi, 15h
.text:110019FE                 jb      short loc_11001A06
.text:11001A00                 call    ds:__vbaGenerateBoundsError

Объяснение кода листинга программы

  1. Указатель esi сравнивается с 15h. Если esi меньше или равно 15h, то выполняется переход к короткому блоку кода loc_11001A06.
  2. Вызывается функция __vbaGenerateBoundsError.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.538 из 5
Похожие ответы