![图片描述](upload/tmp/959994_A2VPGA4YA958KYG.png)
这是一段加密的代码,我想在C++通过内联汇编的方式运行这段代码。
其中函数头部[esp+0x14]的参数有点不知道怎么写。
![图片描述](upload/tmp/959994_U9BEN98G7P9VWET.png)
这是加密函数的第一层,此时eax来源于一个基地址+偏移,在内联汇编中可以通过调用call的方式正常加密。
![图片描述](upload/tmp/959994_N6999VFAVRSJDWF.png)
这是下一层,此时密钥被赋值给一个堆栈地址了,从这个位置开始我已经不知道该如何调用了。这里mov[esp+0x10],ecx的值是上一层1939ADC0地址的值。
![图片描述](upload/tmp/959994_NCZXTHPBNVRFVRQ.png)
最内层[esp+14]的值是上一层的堆栈地址,堆栈地址的值也就是1939ADC0地址的值D4A09F8C。
[C++] 纯文本查看 复制代码 __declspec(naked) void jiami(DWORD 密钥,DWORD 加密长度,DWORD 加密地址){
__asm{
push ebx
push ebp
mov ebp, dword ptr ss : [esp + 0x14] //密钥之类的
mov ecx, dword ptr ss : [ebp]
push esi
mov esi, dword ptr ss : [esp + 0x10] //加密长度
mov ebx, esi
shr esi, 0x2
and ebx, 0x3
test esi, esi
push edi
mov edi, dword ptr ss : [esp + 0x18] //加密地址
jbe Label1
Label2:
dec esi
lea eax, dword ptr ds : [ecx + esi]
xor edx, edx
mov eax,0xA95EDC
div dword ptr ds : [eax]
mov eax, dword ptr ds : [edi]
add edi, 0x4
mov eax, 0xA90620
mov ecx, dword ptr ds : [edx * 4 + eax]
add ecx, 0x2E6D23C1
xor eax, ecx
test esi, esi
mov dword ptr ds : [edi - 0x4], eax
ja Label2
Label1:
xor edx, edx
mov eax, ebx
mov eax, 0xA95EDC
div dword ptr ds : [eax]
mov eax, 0xA90620
mov ecx, dword ptr ds : [edx * 4 + eax]
test ebx, ebx
jbe Label3
lea esp, dword ptr ss : [esp]
Label4:
xor byte ptr ds : [edi], cl
inc edi
shr ecx, 0x8
dec ebx
jnz Label4
Label3:
mov eax, dword ptr ss : [ebp]
imul eax, eax, 0x1F
pop edi
add eax, 0x8088405
pop esi
mov dword ptr ss : [ebp], eax
pop ebp
mov eax, 0x1
pop ebx
retn
}
}
这是我用C++写的代码,各位帮忙看一下[esp+0x14]这里该如何赋值。
我现在一运行这一段注入的程序就崩溃了。可能后边代码也有写的不对的地方
[C++] 纯文本查看 复制代码 __asm {
push eax
push 加密地址
push 加密长度
mov eax, 0x009bc710
call eax
add esp, 0xC
}
第一层CALL这样调用是可以的,后边的现在想直接运行代码不调用call了,不知道该怎么写。 |