某程序的smc破解分析源码
:00000000 C705E1C74B0068200340 mov dword ptr [004BC7E1], 40032068
:0000000A 66C705E5C74B0000C3 mov word ptr [004BC7E5], C300
:00000013 68E6FA4900 push 0049FAE6
:00000018 C3 ret
把程序的某个地方改成跳去执行我们的代码
然后返回程序oep执行。
:00000019 00000000000000 BYTE 7 DUP(0)
:00000020 B30A mov bl, 0A
:00000022 A0207F5300 mov al, byte ptr [00537F20]
:00000027 8A3D217F5300 mov bh, byte ptr [00537F21]
:0000002D E851000000 call 00000083
:00000032 8844240A mov byte ptr [esp+0A], al
取内存中的2个字符,转成数值,然后放到[esp+0A]
:00000036 A0237F5300 mov al, byte ptr [00537F23]
:0000003B 8A3D247F5300 mov bh, byte ptr [00537F24]
:00000041 E83D000000 call 00000083
:00000046 88442406 mov byte ptr [esp+06], al
:0000004A A0267F5300 mov al, byte ptr [00537F26]
:0000004F 8A3D277F5300 mov bh, byte ptr [00537F27]
:00000055 E829000000 call 00000083
:0000005A 6605D007 add ax, 07D0
:0000005E 6689442404 mov word ptr [esp+04], ax
:00000063 66B8002C mov ax, 2C00
:00000067 6633DB xor bx, bx
把寄存器的内容改成执行我们的代码前的样子
:0000006A C705E1C74B00668B4C24 mov dword ptr [004BC7E1], 244C8B66
:00000074 66C705E5C74B000A66 mov word ptr [004BC7E5], 660A
把一开始修改过的程序码改回原样,否则会出错。
:0000007D 68E1C74B00 push 004BC7E1
:00000082 C3 ret
:00000083 2C30 sub al, 30
:00000085 80EF30 sub bh, 30
:00000088 F6E3 mul bl
:0000008A 00F8 add al, bh
:0000008C C3 ret
:00000000 C705E1C74B0068200340 movdwordptr
[004BC7E1], 40032068
:0000000A 66C705E5C74B0000C3 movwordptr
[004BC7E5], C300
:00000013 68E6FA4900 push
0049FAE6
:00000018 C3 ret
这一小段是在运行完壳后运行的(aspack1.07的壳),
是把这一行
:004BC7E1 668B4C240A movcx
, wordptr
[esp
+0A]
改成
6820034000 pushdwordptr
, 00400320
c3 ret
然后跳回oep去运行,
当程序运行到4BC7E1时就会跳去运行我的代码,
然后我的代码再把4BC7E1处的代码改回原样。
* Reference To: KERNEL32.GetLocalTime, Ord:011Bh
|
:004BC7DB FF15B4635000 Calldwordptr
[005063B4]
:004BC7E1 668B4C240A movcx
, wordptr
[esp
+0A]
:004BC7E6 668B542406 movdx
, wordptr
[esp
+06]
:004BC7EB 668B442404 movax
, wordptr
[esp
+04]