| 查看: 469 | 回复: 1 | |||
| 当前主题已经存档。 | |||
sdlj8051金虫 (著名写手)
|
[交流]
[转贴]CRC32碰撞的实现
|
||
|
????????????????????? ??CRC32??????N??????Ч??,???Ч????0xFFFFFFFF,????N????????????????Ч??? ?????????????????????4????????Ч???????????????????????? ??: ???????????Ч????ABCD,?????Ч?????????abcd,Ч???????WXYZ,????4???????????mnop (??????????????????) ???????????ABCD+WXYZ???abcd ????4??????F(x),G(x),H(x),I(x)???????x????????,???????DWORD????λ????λ??4????? CRC32Ч??abcd???????????: R0:A,B,C,D R1:F(m),A^G(m),B^H(m),C^I(m) R2:F(n),F(m)^G(n),A^G(m)^H(n),B^H(m)^I(n) R3:F(o),F(n)^G(o),F(m)^G(n)^H(o),A^G(m)^H(n)^I(o)
|
» 猜你喜欢
遇见不省心的家人很难过
已经有24人回复
依托企业入选了国家启明计划青年人才。有无高校可以引进的。
已经有6人回复
博士延得我,科研能力直往上蹿
已经有9人回复
天津大学招2026.09的博士生,欢迎大家推荐交流(博导是本人)
已经有6人回复
AI 太可怕了,写基金时,提出想法,直接生成的文字比自己想得深远,还有科学性
已经有6人回复
有院领导为了换新车,用横向课题经费买了俩车
已经有9人回复
酰胺脱乙酰基
已经有13人回复
同年申请2项不同项目,第1个项目里不写第2个项目的信息,可以吗
已经有4人回复
有时候真觉得大城市人没有县城人甚至个体户幸福
已经有10人回复
sdlj8051
金虫 (著名写手)
- 应助: 0 (幼儿园)
- 贵宾: 0.1
- 金币: 1149.8
- 红花: 3
- 帖子: 2254
- 在线: 18.1小时
- 虫号: 71297
- 注册: 2005-05-30
- 专业: 电路与系统
|
利用反向效验写了一个anti-debug的例子,全部代码和数据一起效验,然后利用效验值解密,当然效验值是事先想好的,这个例子里效验值=0x123456789 加密前的代码: .code check_start: start: mov esi,check_start call InitCRC32 mov ecx,check_end-check_start mov eax,0FFFFFFFFh call CRC32 mov ecx,(encrypt_end-encrypt_start) shr ecx,2 mov esi,encrypt_start decrypt: push eax push ecx mov ecx,4 call CRC32 mov [esi-4],eax pop ecx pop eax inc eax loop decrypt encrypt_start: jmp msgout msg db "this debugme cracked by none!",0,0,0,0,0,0,0,0,0 tmsg db "test CRC32 by DonQuixote[CCG][iPB]",0 msgout: invoke MessageBox,NULL,offset msg,offset tmsg,MB_OK invoke ExitProcess,NULL encrypt_end: InitCRC32: mov ecx, 256 _nexttable: lea eax, [ecx-1] push ecx mov ecx, 8 _nextbit: shr eax,1 jnc _notcarry xor eax, 0edb88320h _notcarry: dec ecx jnz _nextbit pop ecx mov [dwcrc32table + ecx*4 - 4], eax dec ecx jnz _nexttable ret CRC32: ;esi=data ;ecx=len of data ;eax=init of checksum or esi, esi jz _done or ecx, ecx jz _done _nextbyte: mov dl, [esi] xor dl, al movzx edx, dl shr eax, 8 xor eax, [dwcrc32table + edx*4] inc esi call antibp loop _nextbyte _done: not eax ret antibp: push seh push fs:[0] mov fs:[0],esp db 0CCh pop fs:[0] add esp,4 ret seh: mov eax,dword ptr ss:[esp+4h] mov ecx,dword ptr ss:[esp+0Ch] inc dword ptr ds:[ecx+0B8h] mov eax,dword ptr ds:[eax] xor eax,80000003h jnz start ;xor eax,eax and dword ptr ds:[ecx+4h],eax and dword ptr ds:[ecx+8h],eax and dword ptr ds:[ecx+0Ch],eax and dword ptr ds:[ecx+10h],eax and dword ptr ds:[ecx+14h],0FFFF0FF0h and dword ptr ds:[ecx+18h],0DC00h ret check_end: end start 对硬件断点做了一点处理,加密算法仍然是CRC32 因为用CRC32效验一个DWORD时,知道 效验数据 效验初值 效验值 3个中的2个就可以求另外一个 CRC32:是CRC32效验,eax指定效验初值(eax=0xFFFFFFFF就是标准CRC32) 加密时的算法: #define LEN 0x141 BYTE data[LEN]; DWORD wantedcrc=0x12345678; DWORD filebase=0x400; int fixfile() { FILE*fh=fopen("E:\\Crack\\CRC32\\anti.exe","r+" ;fseek(fh,filebase,SEEK_SET); fread(data,1,LEN,fh); DWORD iendata=0x3A; for(int i=0;i<0x1A;i++) { *(DWORD*)(data+iendata)=rCRC32(~*(DWORD*)(data+iendata),(wantedcrc+i)); iendata+=4; } DWORD b=~StdCRC(data,0x5D); DWORD a=RevCRC(~wantedcrc,(DWORD*)(data+0x61),(0x141-0x61)/4); *(DWORD*)(data+0x5D)=rCRC32(a,b); fseek(fh,filebase,SEEK_SET); fwrite(data,1,LEN,fh); fclose(fh); return 0; } wantedcrc=0x12345678是预先设定的效验值 for(int i=0;i<0x1A;i++)部分加密数据 RevCRC反向效验,然后在*(DWORD*)(data+0x5D)这里patch修补码,使效验值=wantedcrc 反向效验的代码: //return init reg DWORD RevCRC(DWORD reg,DWORD*pdata,int n) { for(int i=n-1;i>=0;i--)reg=RCRC32(reg,pdata); return reg; } //根据数据和效验值求出效验初值 利用CRC32加密的变换也可以应用到序列号变换里,可以增加一点写KeyGen的难度:) |













回复此楼
;