首先说下小弟也是小白,有讲的不对的地方请见谅啊,特别是python是上午刚学的,可能有的地方写的不合适望见谅,附件里有那个crackme。分析论坛里的一个crackme的时候,觉得那个做的挺猥琐的,就写了个脚本模拟汇编语言行为。
from binascii import *
from idaapi import *
def decrypy(data): #string
result="";
eax=0;
ecx=0;
ebx=0;
#esi=0;
esi=data;
type(esi);
#while ecx<len(data):
eax=1;
while eax!=0:
eax=ord(data[ecx])
#Message(chr(eax));
#Message("\n");
ebx=ecx+1
eax=eax^ebx
#esi[ecx]=eax
result+=chr(eax)
#Message(result);
Message("\n");
ecx+=1
if(eax==0):
ecx=len(data)
eax=0
return result
eax=eax | eax
result
#52 67 77 51 6B 6E 66 66 6D 66 6E 68 48 76 6C 75
#61 66 7A 7B 7B 50 7E 74 6D 7F 69 1C 4C 67 70 77
#64 61 62 4A 66 72 4A 0C 00 00 00 00 00 00 00 00
key=unhexlify("52 67 77 51 6B 6E 66 66 6D 66 6E 68 48 76 6C 75 61 66 7A 7B 7B 50 7E 74 6D 7F 69 1C 4C 67 70 77 ".replace(" ",''))
#Message(key)
Message("\n")
decrypy(key)
Message(decrypy(key))
//下面是ida的代码
.text:00401000 sub_401000 proc near ; CODE XREF: sub_4010A2+Ap
.text:00401000
.text:00401000 arg_0 = dword ptr 8
.text:00401000
.text:00401000 push ebp
.text:00401001 mov ebp, esp ; esp,key1指针,返回地址
.text:00401003 push esi
.text:00401004 push ecx
.text:00401005 push eax
.text:00401006 push ebx
.text:00401007 mov esi, [ebp+arg_0] ; 取得最后一个入栈的参数,key1指针
.text:0040100A xor ecx, ecx
.text:0040100C xor ebx, ebx
.text:0040100E
.text:0040100E loc_40100E: ; CODE XREF: sub_401000+1Dj
.text:0040100E movsx eax, byte ptr [ecx+esi]
.text:00401012 lea ebx, [ecx+1]
.text:00401015 xor eax, ebx
.text:00401017 mov [ecx+esi], al
.text:0040101A inc ecx
.text:0040101B or al, al
.text:0040101D jnz short loc_40100E
.text:0040101F pop ebx
.text:00401020 pop eax
.text:00401021 pop ecx
.text:00401022 pop esi
.text:00401023 leave
.text:00401024 retn 4
.text:00401024 sub_401000 endp
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)