本帖最后由 longlonglong 于 2023-12-18 16:26 编辑
工具:52下的OD、exeinfope、ImportREC;
研究对象:SRJ.dll;
来源:网络;
理由:和谐过程中的一点心得;
软件类型:dll;
操作系统:winxp;
要达到目的:解决注册限制。
查壳:
强壳:VMProtect v3.00 - 3.5.0 2003-2020 VMProtect Software - www.vmpsoft.com
下断:
开OD,加载SRJ.dll,F9运行,出现联网验证,点击登录:出现:您未充值或您已到期.
Bp ws2_32.socket,点击:登录,断在:
71A24211 ws2_32.socket 8BFF mov edi,edi
Alt+K看堆栈调用:
看堆栈调用属于哪个段,
属于:
内存映射, 条目 53
地址=00C40000
大小=0028B000 (2666496.)
属主= 00C40000 (自身)
区段=
类型=Map 00041002
访问=R
初始访问=RWE
用工具ImportREC.exe:
是一个内存文件b301.dll Map到00C40000,下面分析b301.dll:
[Asm] 纯文本查看 复制代码 00C529F3 8945 F0 mov dword ptr ss:[ebp-0x10],eax ; ws2_32.socket
00C529F6 8B5D F4 mov ebx,dword ptr ss:[ebp-0xC]
00C529F9 85DB test ebx,ebx
00C529FB 74 09 je short 00C52A06
00C529FD 53 push ebx
00C529FE E8 B8FC0100 call 00C726BB
00C52A03 83C4 04 add esp,0x4
00C52A06 8B45 F0 mov eax,dword ptr ss:[ebp-0x10]
00C52A09 8945 FC mov dword ptr ss:[ebp-0x4],eax ; ws2_32.socket
00C52A0C 837D FC 00 cmp dword ptr ss:[ebp-0x4],0x0
00C52A10 0F84 75000000 je 00C52A8B ;
00C52A16 C745 F4 00000000 mov dword ptr ss:[ebp-0xC],0x0
00C52A1D 6A 00 push 0x0
00C52A1F FF75 F4 push dword ptr ss:[ebp-0xC]
00C52A22 E8 385B0000 call 00C5855F ; //验证
分析call 00C5855F找到语句:
[Asm] 纯文本查看 复制代码 00C585D8 0F8D 27000000 jge 00C58605
00C58635 0F8F 34000000 jg 00C5866F
00C586BD 0F8F 34000000 jg 00C586F7
00C5874B 0F8F 34000000 jg 00C58785
00C587B8 0F8F 34000000 jg 00C587F2
全部jump
内存程序b301.dll的基址会变化,因此在SRJ.dll利用LocalAlloc函数和内存写入断点找到写b301.dll的代码:[Asm] 纯文本查看 复制代码 106D6AC2 33C9 xor ecx,ecx
106D6AC4 66:BB 5101 mov bx,0x151
106D6AC8 9F lahf
106D6AC9 8BC6 mov eax,esi
106D6ACB D3CB ror ebx,cl
106D6ACD c0f7 b5 sal bh,0xb5
106D6AD0 0345 0C add eax,dword ptr ss:[ebp+0xC]
106D6AD3 0F47D9 cmova ebx,ecx
106D6AD6 FECF dec bh
106D6AD8 66:0FCB bswap bx
106D6ADB 134D 10 adc ecx,dword ptr ss:[ebp+0x10]
106D6ADE 66:0FB6DE movzx bx,dh
106D6AE2 46 inc esi
106D6AE3 894D FC mov dword ptr ss:[ebp-0x4],ecx
106D6AE6 66:0FABEB bts bx,bp
106D6AEA 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
106D6AED 66:0FABD3 bts bx,dx
106D6AF1 0FB7DD movzx ebx,bp
106D6AF4 8B59 04 mov ebx,dword ptr ds:[ecx+0x4]
106D6AF7 c0d1 bc rcl cl,0xbc
106D6AFA 8AC8 mov cl,al
106D6AFC F5 cmc
106D6AFD F8 clc
106D6AFE D3C3 rol ebx,cl
106D6B00 02D8 add bl,al
106D6B02 321C38 xor bl,byte ptr ds:[eax+edi] ; //内存B301.dll程序指令解码
106D6B05 66:B8 306C mov ax,0x6C30
106D6B09 8B45 14 mov eax,dword ptr ss:[ebp+0x14]
106D6B0C 885C06 FF mov byte ptr ds:[esi+eax-0x1],bl ; //写入内存B301.dll程序
106D6B10 3BF2 cmp esi,edx
106D6B12 ^ E9 0C52FDFF jmp 106ABD23 ; //补丁处 分析:
Eax=00C40000;程序b301.dll内存中的这次要写入的首地址Edx=00001000 ;要写入字节数,第1次写00001000hEsi=00000001;已经写入的字节数Edi=103F4620;字节来源首地址
Eax=00C41000;程序b301.dll内存中的这次要写入的首地址Edx=000D19DA ;要写入字节数,第1次写000D19DAhEsi=00000001;已经写入的字节数Edi=103F4620;字节来源首地址当这次000D19DAh个字节写完时,可以破解了。
补丁:[Asm] 纯文本查看 复制代码 <10F35D10>
pushfd
cmp edx,0xD19DA
jnz @loop1
cmp esi,edx
jnz @loop1
mov dword ptr ds:[eax+esi+0xFFF45BFE],0x90902BEB
mov word ptr ds:[eax+esi+0xFFF45C02],0x9090
mov dword ptr ds:[eax+esi+0xFFF45C5B],0x909038EB
mov word ptr ds:[eax+esi+0xFFF45C5F],0x9090
mov dword ptr ds:[eax+esi+0xFFF45CE3],0x909038EB
mov word ptr ds:[eax+esi+0xFFF45CE7],0x9090
mov dword ptr ds:[eax+esi+0xFFF45D71],0x909038EB
mov word ptr ds:[eax+esi+0xFFF45D75],0x9090
mov dword ptr ds:[eax+esi+0xFFF45DDE],0x909038EB
mov word ptr ds:[eax+esi+0xFFF45DE2],0x9090
@loop1:
popfd
jmp 106ABD23
验证一下:
|