落入这样的任务手中。有两个dll。正如向我解释的第二个文件(new.dll),这是第一个文件(old.dll)的新版本。这两个文件都是针对 x64 编译的。我需要在 new.dll 中找到一些从 old.dll 变成的函数。以下是其中一种功能的示例。请表达您对我查找新版本代码的方法的想法:我首先使用 rdare2 查找 old.dll 中的所有函数(超过 4 万个),创建一个带有签名的文件并将其设置在一个新文件上。最后,什么也没找到。我的结论是,这些变化不仅仅是表面上的。接下来,我决定搜索如下:
- 我对功能代码的片段进行了搜索。我在调用函数之前先做个开场白,然后在 new.dll 中查找这个字节序列。
- 我尝试查找出现在函数中的常量、字符串和其他幻数,并在 new.dll 中查找它们。
- 我分析了所有调用所需函数的函数,并尝试在 new.dll 中找到一组类似的调用函数。
- 我尝试确定调用函数的顺序直到第一个(顶部),并在新文件中找到类似的调用序列。
- 我分析了从所需函数调用的所有函数,并尝试在 new.dll 中找到一组类似的调用函数
- 在这里,我承认以上所有内容都没有帮助我。接下来,我认为既然有这样的调用 call qword ptr [rax+18h] (在分析的函数中有8个),那么这些很可能是对对象(s)的方法的调用。您可能可以找到一个 vftable 并了解这些方法属于哪个类,并且已经创建了一组类。在我的函数中调用的方法。接下来,在 new.dll 中搜索调用相应类的此类方法序列的位置。
- 您可能可以尝试在我的函数中查找对象的创建位置以及它的来源。接下来,在 new.dll 中寻找类似的踪迹。不确定是否可以在不调试此 dll 的情况下应用此方法。不清楚如何运行dll,因为只有三个导出函数: 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