Chương <br />
7. <br />
Anti-‐Tampering <br />
<br />
<br />
<br />
Lương <br />
Ánh <br />
Hoàng <br />
<br />
<br />
hoangla@soict.hut.edu.vn <br />
<br />
<br />
Nội <br />
dung <br />
<br />
7.1 <br />
Phát <br />
hiện <br />
thay <br />
đổi <br />
(Detecting <br />
modi}ication) <br />
<br />
7.2 <br />
Che <br />
giấu <br />
mã <br />
(Code <br />
hiding) <br />
<br />
7.3 <br />
Sử <br />
dụng <br />
con <br />
trỏ <br />
hàm <br />
(Function <br />
Pointer) <br />
<br />
7.4 <br />
Giấu <br />
xâu <br />
(String <br />
hiding) <br />
<br />
7.5 <br />
Phát <br />
hiện <br />
debugger <br />
(Anti-‐Debugger) <br />
<br />
7.6 <br />
Self-‐modifying <br />
code <br />
<br />
7.7 <br />
Giải <br />
pháp <br />
tổng <br />
thể <br />
<br />
<br />
<br />
<br />
119 <br />
<br />
<br />
7.1 <br />
Phát <br />
hiện <br />
thay <br />
đổi <br />
mã <br />
lệnh <br />
<br />
• Mục <br />
tiêu: <br />
Phát <br />
hiện <br />
chương <br />
trình <br />
đã <br />
bị <br />
crack <br />
chưa <br />
(Detecting <br />
<br />
modi}ication) <br />
<br />
• Kỹ <br />
thuật: <br />
<br />
– Tính <br />
MD5, <br />
SHA1, <br />
hoặc <br />
HMAC <br />
mã <br />
lệnh <br />
của <br />
}ile <br />
thực <br />
thi. <br />
<br />
– Đánh <br />
dấu <br />
một <br />
đoạn <br />
trong <br />
chương <br />
trình <br />
sẽ <br />
dùng <br />
để <br />
lưu <br />
mã <br />
băm <br />
}ile <br />
thực <br />
thi <br />
và <br />
ghi <br />
<br />
giá <br />
trị <br />
băm <br />
vào <br />
đó <br />
bằng <br />
một <br />
chương <br />
trình <br />
Hex <br />
edit <br />
khác. <br />
<br />
– Tại <br />
thời <br />
điểm <br />
runtime <br />
tính <br />
lại <br />
giá <br />
trị <br />
băm <br />
của <br />
}ile <br />
thực <br />
thi <br />
và <br />
so <br />
sánh <br />
với <br />
mã <br />
băm <br />
<br />
trước <br />
đó. <br />
<br />
<br />
• Ví <br />
dụ: <br />
<br />
<br />
băm <br />
<br />
// <br />
Khai <br />
báo <br />
xâu <br />
<br />
đánh <br />
dấu <br />
m <br />
ã <br />
<br />
char <br />
* <br />
md5hash <br />
= <br />
"AAAAXXXXXXXXXXXXXXXX"; <br />
<br />
int <br />
_tmain(int <br />
argc, <br />
_TCHAR* <br />
argv[]) <br />
<br />
{ <br />
<br />
<br />
unsigned <br />
char <br />
hash[16];// <br />
Giá <br />
trị <br />
băm <br />
tính <br />
được <br />
<br />
<br />
unsigned <br />
char <br />
expectedhash[16];// <br />
Giá <br />
trị <br />
băm <br />
lưu <br />
trong <br />
}ile<br />
<br />
<br />
<br />
<br />
FILE <br />
* <br />
fp <br />
= <br />
fopen(argv[0],"rb");// <br />
Mở <br />
}ile <br />
để <br />
tính <br />
lại <br />
giá <br />
trị <br />
băm <br />
<br />
<br />
unsigned <br />
char <br />
* <br />
pFile <br />
; <br />
<br />
<br />
fseek(fp,0,SEEK_END); <br />
<br />
<br />
int<br />
<br />
len <br />
= <br />
ftell(fp); <br />
<br />
120 <br />
<br />
<br />
<br />
<br />
<br />
7.1 <br />
Phát <br />
hiện <br />
thay <br />
đổi <br />
mã <br />
lệnh <br />
<br />
• Ví <br />
dụ: <br />
<br />
<br />
char*)malloc(len); <br />
<br />
<br />
<br />
<br />
pFile <br />
= <br />
(unsigned <br />
<br />
fseek(fp,0,SEEK_SET); <br />
<br />
fread(pFile,1,len,fp); <br />
<br />
md5hash <br />
= <br />
0; <br />
<br />
for <br />
(int <br />
i=0;i