Здравствуйте. Попала в руки такая задача. Есть две dll. Как мне объяснили второй файл (new.dll) это новый релиз первого файла (old.dll). Оба файла собраны под x64. Мне нужно найти во что реинкорнировали несколько функций из old.dll в new.dll. Ниже пример одной из функций. Прошу высказать мысли о моем подходе к поиску новой версии кода: Начал я с того, что при помощи rdare2 нашел все функции в old.dll (более 40 тыс), создал файл с сигнатурами и натравил на новый файл. В итоге ничего не нашлось. Делаю вывод, что изменения более чем косметические. Далее я решил искать следующим образом:
- Делаю поиск по кускам кода функции. Беру пролог перед вызовом функции и ищу эту последовательность байт в new.dll.
- Пытаюсь найти константы, строки и прочие магические цифры, которые фигурируют в функции и ищу их в new.dll.
- Анализирую все функции, которые вызывают нужную функцию и пытаюсь найти аналогичный набор вызывающих функций в new.dll.
- Определить последовательность вызывающих функций до самой первой (верхней) и найти аналогичную череду вызовов в новом файле.
- Анализирую все функции, которые вызываются из нужной функции и пытаюсь найти аналогичный набор вызываемых функций в new.dll
- Тут признаюсь, что все выше перечисленное мне не помогло. Далее думаю, что т.к. встречаются такие вызовы call qword ptr [rax+18h] (их штук 8 в анализируемой функции), то вероятно это вызовы методов объекта(-ов). Вероятно можно найти vftable и понять к какому классу эти методы относятся и уже составить набор класс.метод, которые вызываются в моей функции. Далее искать в new.dll где вызывается такая череда методов из соответствующих классов.
- Наверное можно попытаться найти где создавался объект и откуда этот this пришел в мою функцию. Далее искать аналогичный след в new.dll. Не уверен, что этот метод можно применить без отладки этой dll. Запускать dll не понятно как т.к. экспортируемых функций всего пять: Osf::OSFCreateOfficeExtensionsDialogUser Osf::OSFCreateOsfOartGallery DllGetLCID PPMain DllEntryPoint
Что из перечисленных подходов поиска утопия, а что нет? Может есть еще проверенные варианты?
Пример одной из функций:
.text:00000001806FFB30 f1 proc near ; CODE XREF: sub_1806F3630+172↑p
.text:00000001806FFB30 ; sub_1806FFC70+27↓p ...
.text:00000001806FFB30
pperrinfo = qword ptr -260h
perrinfo = qword ptr -258h
var_250 = qword ptr -250h
var_248 = dword ptr -248h
var_244 = qword ptr -244h
var_23C = word ptr -23Ch
var_30 = qword ptr -30h
; __unwind { // __GSHandlerCheck
push rbp
push rbx
push rsi
push rdi
push r14
lea rbp, [rsp-160h] ; Load Effective Address
sub rsp, 260h ; Integer Subtraction
mov rax, cs:__security_cookie
xor rax, rsp ; Logical Exclusive OR
mov [rbp+180h+var_30], rax
mov rbx, rcx
mov esi, r8d
lea rcx, [rsp+280h+pperrinfo] ; pperrinfo
mov rdi, rdx
call cs:CreateErrorInfo ; Indirect Call Near Procedure
xor r14d, r14d ; Logical Exclusive OR
test eax, eax ; Logical Compare
jns short loc_1806FFB80 ; Jump if Not Sign (SF=0)
mov ecx, 8B843h
call Mso20Win32Client_1159 ; Call Procedure
jmp loc_1806FFC52 ; Jump
; ---------------------------------------------------------------------------
loc_1806FFB80: ; CODE XREF: f1+3F↑j
mov rdx, cs:qword_181031910
test rdx, rdx ; Logical Compare
jz short loc_1806FFB9D ; Jump if Zero (ZF=1)
mov rcx, [rsp+280h+pperrinfo]
mov rdx, [rdx]
mov rax, [rcx]
mov rdx, [rdx]
call qword ptr [rax+18h] ; Indirect Call Near Procedure
loc_1806FFB9D: ; CODE XREF: f1+5A↑j
mov rcx, [rsp+280h+pperrinfo]
mov rdx, rdi
mov rax, [rcx]
call qword ptr [rax+30h] ; Indirect Call Near Procedure
mov rcx, [rsp+280h+pperrinfo]
mov edx, esi
mov rax, [rcx]
call qword ptr [rax+38h] ; Indirect Call Near Procedure
mov rcx, cs:qword_181038800
lea rax, [rsp+280h+var_23C] ; Load Effective Address
mov r9d, 100h
mov [rsp+280h+var_250], rax
lea r8, [rsp+280h+var_23C] ; Load Effective Address
mov [rsp+280h+var_244], r9
mov edx, 61850043h
mov [rsp+280h+var_248], 1
mov [rsp+280h+var_23C], r14w
call Mso30Win32Client_27 ; Call Procedure
mov rcx, [rsp+280h+pperrinfo]
add eax, eax ; Add
mov rdx, [rsp+280h+var_250]
mov dword ptr [rsp+280h+var_244+4], eax
mov rax, [rcx]
call qword ptr [rax+20h] ; Indirect Call Near Procedure
mov rcx, [rsp+280h+pperrinfo]
mov rdx, rbx
mov rax, [rcx]
call qword ptr [rax+28h] ; Indirect Call Near Procedure
mov rcx, [rsp+280h+pperrinfo]
lea r8, [rsp+280h+perrinfo] ; Load Effective Address
lea rdx, unk_180C909A8 ; Load Effective Address
mov rax, [rcx]
call qword ptr [rax] ; Indirect Call Near Procedure
test eax, eax ; Logical Compare
js short loc_1806FFC47 ; Jump if Sign (SF=1)
mov rdx, [rsp+280h+perrinfo] ; perrinfo
xor ecx, ecx ; dwReserved
call cs:SetErrorInfo ; Indirect Call Near Procedure
mov rcx, [rsp+280h+perrinfo]
mov rax, [rcx]
call qword ptr [rax+10h] ; Indirect Call Near Procedure
loc_1806FFC47: ; CODE XREF: f1+FD↑j
mov rcx, [rsp+280h+pperrinfo]
mov rax, [rcx]
call qword ptr [rax+10h] ; Indirect Call Near Procedure
loc_1806FFC52: ; CODE XREF: f1+4B↑j
mov rcx, [rbp+150h]
xor rcx, rsp ; Logical Exclusive OR
call sub_1801BFAE0 ; Call Procedure
add rsp, 260h ; Add
pop r14
pop rdi
pop rsi
pop rbx
pop rbp
retn ; Return Near from Procedure
; } // starts at 1806FFB30
f1 endp