kantou 发表于 2022-8-3 01:59

大家帮忙看看这一段汇编怎么转成C++内联汇编,或者有什么更好的写法

![图片描述](upload/tmp/959994_A2VPGA4YA958KYG.png)
这是一段加密的代码,我想在C++通过内联汇编的方式运行这段代码。
其中函数头部的参数有点不知道怎么写。
![图片描述](upload/tmp/959994_U9BEN98G7P9VWET.png)
这是加密函数的第一层,此时eax来源于一个基地址+偏移,在内联汇编中可以通过调用call的方式正常加密。
![图片描述](upload/tmp/959994_N6999VFAVRSJDWF.png)
这是下一层,此时密钥被赋值给一个堆栈地址了,从这个位置开始我已经不知道该如何调用了。这里mov,ecx的值是上一层1939ADC0地址的值。
![图片描述](upload/tmp/959994_NCZXTHPBNVRFVRQ.png)
最内层的值是上一层的堆栈地址,堆栈地址的值也就是1939ADC0地址的值D4A09F8C。

__declspec(naked) void jiami(DWORD 密钥,DWORD 加密长度,DWORD 加密地址){

        __asm{

        push ebx

        push ebp

        mov ebp, dword ptr ss :       //密钥之类的

        mov ecx, dword ptr ss :

        push esi

        mov esi, dword ptr ss :       //加密长度

        mov ebx, esi

        shr esi, 0x2

        and ebx, 0x3

        test esi, esi

        push edi

        mov edi, dword ptr ss :     //加密地址

        jbe Label1

        Label2:

        dec esi

        lea eax, dword ptr ds :

        xor edx, edx

    mov eax,0xA95EDC

        div dword ptr ds :

        mov eax, dword ptr ds :

        add edi, 0x4

        mov eax, 0xA90620

        mov ecx, dword ptr ds :

        add ecx, 0x2E6D23C1

        xor eax, ecx

        test esi, esi

        mov dword ptr ds : , eax

        ja Label2

        Label1:

        xor edx, edx

        mov eax, ebx

        mov eax, 0xA95EDC

        div dword ptr ds :

        mov eax, 0xA90620

        mov ecx, dword ptr ds :

        test ebx, ebx

        jbe Label3

        lea esp, dword ptr ss :

        Label4:

        xor byte ptr ds : , cl

        inc edi

        shr ecx, 0x8

        dec ebx

        jnz Label4

        Label3:

        mov eax, dword ptr ss :

        imul eax, eax, 0x1F

        pop edi

        add eax, 0x8088405

        pop esi

        mov dword ptr ss : , eax

        pop ebp

        mov eax, 0x1

        pop ebx

        retn

        }

}
这是我用C++写的代码,各位帮忙看一下这里该如何赋值。
我现在一运行这一段注入的程序就崩溃了。可能后边代码也有写的不对的地方
__asm {
                push eax
                push 加密地址
                push 加密长度
                mov eax, 0x009bc710
                call eax
                add esp, 0xC
        }
第一层CALL这样调用是可以的,后边的现在想直接运行代码不调用call了,不知道该怎么写。

kantou 发表于 2022-8-3 23:24

本帖最后由 kantou 于 2022-8-3 23:27 编辑

剔除掉一些无关代码测试了几个加密数据暂时测试是可以使用的。
并且加入了取密钥和加密地址 加密长度的代码。暂时算是解决了这个问题。

                mov eax, 0xc36b40         
                mov eax,
                mov eax,
                add eax, 0x1d8   //取密钥

                mov ecx, dword ptr ds :
                push ebx
                push esi
                mov esi, 包长
                sub esi,0x4   //取加密 长度
                mov ebx, esi
                shr esi, 0x2
                and ebx, 0x3
                test esi, esi
                push edi
                mov edi, 包地址
                add edi,0x4         //取加密地址
                jbe Label1

                Label2 :

                dec esi
                lea eax, dword ptr ds :
                xor edx, edx
                div dword ptr ds :
                mov eax, dword ptr ds :
                add edi, 0x4
                mov ecx, dword ptr ds :
                add ecx, 0x2E6D23C1
                xor eax, ecx
                test esi, esi
                mov dword ptr ds : , eax
                ja Label2

                Label1 :

                xor edx, edx
                mov eax, ebx
                div dword ptr ds :
                mov ecx, dword ptr ds :
                test ebx, ebx
                jbe Label3

                Label4 :

                xor byte ptr ds : , cl
                inc edi
                shr ecx, 0x8
                dec ebx
                jnz Label4

                Label3 :

                pop edi
                pop esi
                pop ebx
      
页: [1]
查看完整版本: 大家帮忙看看这一段汇编怎么转成C++内联汇编,或者有什么更好的写法