我正在反转一些软件,找到了可以解密某些东西的功能:



您可以看到它具有用于此功能的解密密码参数。

功能反汇编:

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或任何其他方式使用其他一些参数调用此函数?谢谢。

评论

请内嵌图片,甚至最好粘贴代码

这是代码pastebin.com/yUt13qSL

我打算把它放在体内,看编辑。最好将内容保留在此站点上,因为外部链接可能会消失。

在[ebp + x]中,x应该是指针移到ebp以外的十六进制偏移量,除非包含它的整个(ebp + x),否则我不知道密码是怎么回事。

#1 楼

有点不合常规,但是我个人倾向于使用Cheat Engine来处理诸如此类的“快速”操作。写入以将所需的数据移动到应传递给被调用方的任何寄存器/内存中,然后跟踪调用以查看结果。如果该函数是共享的,并且有时在您无法控制的范围内执行,则只需在代码注入中使用call指令即可让代码仅在满足特定条件时才运行。您的注射可能如下所示:

//--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:


这里的视频大致演示了通过作弊引擎进行这种类型的注射的样子。

#2 楼

我认为解决该问题的经典方法是在反转解码算法后重新创建解码算法,然后可以使用所需的任何字符串对其进行测试。一种怪异的方法是在函数调用之前中断,然后将my_password手动更改为要测试的字符串。更加自动化的解决方案是Binary Ninja插件ripr。在其github页面上:ripr尝试通过静态收集足够的信息并将其全部包装为一个“工具”来自动生成与所选代码段功能相同的python类独角兽模拟器