VB6 + OllyDbg + массивы - Assembler
Формулировка задачи:
Добрый день. По работе столкнулся с проблемой:
есть Dll, написанная на VB6, в ней есть функция, которая берет из БД данные и пихает их в отчет. И там стоит проверка на кол-во данных:
Перед этим кодом объявлены переменная и массив:
Никто до сих пор понять не может, что имел в виду автор, объявляя эмпирическую константу 20, но это уже и не важно. Кода от этой Dll нет. Но есть код именно этой функции, которую нужно подправить.
Проверку If cnt > 19 Then я нашел без труда и расширил. А вот с объявлением массива какая-то странность – я никак не могу найти в Olly, где хранится эта константа.
Я написал 2 простые прораммы:
Код exe файла (извините за кривоту, на VB сегодня второй день только пишу)
Форма, на ней кнопка. Код такой:
(параметры передаются в оригинальную ф-ию, тут их я тоже решил оставить)
И код для создания DLL
Этот код максимально приближен к тому, что есть в Dll, которую нужно подправить.
То есть задача-минимум звучит так:
Найти в скомпилированном Dll объявление массива и расширить его в 2 раза.
На сколько мне удалось понять, создание массива происходит тут:
Но в параметры __ vbaAryConstruct2 передаются не значения, а какие-то адреса, в дампе по этим адресам ничего полезного нет. Куда копать? Как быть?
VB Decombiler отображает эту фи-ю вот так:
И мне хочется верить, что Dim var_34(20) As Long - это та самая волшебная переменная, которую я ищу и которую надо подправить через Олли. (как минимум по тому, что изменение строки «Dim idx(20) As Long» приводит к изменению и декомпилированной версии: loc_110019EA: Dim var_34(666) As Long)
Как поймать?
Во вложениее Exe + Dll + reg файл для регистрации длл. Коды все тут приведены
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
Dim Dll As Object Private Sub Command1_Click() Set Dll = CreateObject("Pr1Dll.Class1Dll") Dll.Report301 "aaaa", "bbbb" MsgBox ("In main F") End Sub
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
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
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 …
Решение задачи: «VB6 + OllyDbg + массивы»
textual
Листинг программы
.text:110019FB cmp esi, 15h .text:110019FE jb short loc_11001A06 .text:11001A00 call ds:__vbaGenerateBoundsError
Объяснение кода листинга программы
- Указатель esi сравнивается с 15h. Если esi меньше или равно 15h, то выполняется переход к короткому блоку кода loc_11001A06.
- Вызывается функция __vbaGenerateBoundsError.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д