问题描述
掌握了这样的任务。有两个dll。由于向我解释了第二个文件 (new.dll),这是第一个文件 (old.dll) 的新版本。 这两个文件都是为 x64 编译的。 我需要在 new.dll 中找到一些函数变成了 old.dll。以下是其中一项功能的示例。 请表达您对我寻找新版本代码的方法的看法: 我首先使用 rdare2 查找 old.dll 中的所有函数(超过 4 万个),创建一个带有签名的文件并将其设置在一个新文件中。最后,什么也没找到。我的结论是这些变化不仅仅是表面上的。 接下来,我决定搜索如下:
- 我搜索了函数代码的片段。我在调用函数之前先看序言,然后在 new.dll 中查找这个字节序列。
- 我尝试查找出现在函数中的常量、字符串和其他幻数,并在 new.dll 中查找它们。
- 我分析了所有调用所需函数的函数,并尝试在 new.dll 中找到一组类似的调用函数。
- 我尝试确定直到第一个(顶部)函数的调用顺序,并在新文件中找到类似的调用顺序。
- 我分析了从所需函数调用的所有函数,并尝试在 new.dll 中找到一组相似的调用函数
- 在此我承认上述所有内容都没有帮助我。接下来我想,既然有这样的调用是调用qword ptr [rax+18h](分析的函数中有8个),那么这些大概就是对对象的方法的调用了。您可能会找到一个 vftable 并了解这些方法属于哪个类,并且已经创建了一组类。在我的函数中调用的方法。接下来,在 new.dll 中搜索来自相应类的方法序列被调用的位置。
- 您可能可以尝试在我的函数中找到对象的创建位置以及它的来源。接下来,在 new.dll 中查找类似的跟踪。不确定是否可以在不调试此 dll 的情况下应用此方法。由于只有三个导出函数,所以不清楚如何运行dll: 获取LCID 主程序 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,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
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)