IDA:调用具有不同参数的函数

逆向工程 艾达 拆卸 解密 Python 职能
2021-06-25 00:05:30

我正在逆向一些软件,发现了解密一些东西的函数:

在此处输入图片说明

如您所见,它具有密码参数,该参数在此函数中被解密。

功能拆解:

sub_401350      proc near               ; CODE XREF: sub_4013F0+28Ep
                                        ; sub_4013F0+2D2p

var_4           = dword ptr -4
arg_0           = dword ptr  8
arg_4           = dword ptr  0Ch
arg_8           = dword ptr  10h
arg_C           = dword ptr  14h
arg_10          = byte ptr  18h

                push    ebp
                mov     ebp, esp
                push    ecx
                mov     [ebp+var_4], 0
                jmp     short loc_401366
loc_40135D:                             ; CODE XREF: sub_401350+46j
                mov     eax, [ebp+var_4]
                add     eax, 1
                mov     [ebp+var_4], eax

loc_401366:                             ; CODE XREF: sub_401350+Bj
                mov     ecx, [ebp+var_4]
                cmp     ecx, [ebp+arg_4]
                jnb     short loc_401398
                mov     edx, [ebp+arg_0]
                add     edx, [ebp+var_4]
                movsx   ecx, byte ptr [edx]
                mov     eax, [ebp+var_4]
                xor     edx, edx
                div     [ebp+arg_C]
                mov     eax, [ebp+arg_8]
                movsx   edx, byte ptr [eax+edx]
                movzx   eax, [ebp+arg_10]
                add     edx, eax
                xor     ecx, edx
                mov     edx, [ebp+arg_0]
                add     edx, [ebp+var_4]
                mov     [edx], cl
                jmp     short loc_40135D
.text:00401398
loc_401398:                             ; CODE XREF: sub_401350+1Cj
                mov     esp, ebp
                pop     ebp
                retn    14h
sub_401350      endp

这个函数也在其他一些地方被调用。我的目标是用一些其他参数调用这个函数来解密其他东西并查看内容。

我怎样才能做到这一点?如何使用 python 或任何其他方式使用其他一些参数调用此函数?谢谢。

2个回答

有点不正统,但我个人倾向于使用Cheat Engine 来做这样的“快速和肮脏”的事情。

基本思想是您将它挂钩call,跳转到分配的内存,其中包含您编写的指令,以将您想要的数据移动到应该传递给被调用者的任何寄存器/内存中,然后跟踪调用以查看结果。如果该函数是共享的,并且有时在您无法控制的情况下执行,您可以简单地cmp在代码注入中使用一条指令,让您的代码仅在满足特定条件时运行。

您注入的示例如下:

//--Allocate memory page in address space of application
alloc(newmem,2048,"application.exe"+40167E)

//--Create labels for your code
label(returnhere)
label(originalcode)
label(exit)

//--This is where your custom code would go
newmem:
//Maybe pop unwanted values off stack
//Then push your custom values onto stack

//--This is the CALL you hooked which will now run
originalcode:
call sub_401350

//--Jump to exit code injection
exit:
jmp returnhere

//--This hooks the CALL and injects a jump to your allocated memory
"application.exe"+40167E:
jmp newmem

//--Exit label jumps here, returning you to normal execution
returnhere:

这是一个视频,大致演示了通过 Cheat Engine 执行此类注入的方式。

我认为解决它的经典方法是在反转它之后重新创建解码算法,然后您可以使用您想要的任何字符串对其进行测试。一种方法是在函数调用之前中断并手动将 my_password 更改为您想要测试的字符串。一个更自动化的解决方案是 Binary Ninja 插件ripr从其 github 页面:

ripr 尝试通过静态收集足够的信息并将其全部包装到独角兽模拟器的“线束”中,自动生成功能上与所选代码段相同的 Python 类