// 大循环开始
{
While myvar.pLen^ <> 0 do // 外循环,若中间只存在 Nop 指令的成对 push pop 处理
begin
myvar.Sbegin := myvar.pNextAddr ;
myvar.tdword := Pointer( myvar.patchaddr );
}
While myvar.pNextAddr^ <> 0 do // 中循环,找出壳的某个 StolenCode 块的范围
begin
myvar.len := myvar.pLen^;
myvar.pbyte := Pointer( myvar.Sbegin );
myvar.Send := myvar.pNextAddr^ ; // 传送表项的块结束地址
While Dword( myvar.pbyte ) < myvar.Send do // 内块循环:相邻的垃圾指令 Nop 掉
begin
myvar.Len := myvar.pLen^ ;
myvar.temp := myvar.pbyte ;
myvar.pword := myvar.temp ;
myvar.pdword := myvar.temp ;
Case myvar.len of
1:
begin
if myvar.pbyte^ in [ $91..$97 ] then //如果是32位寄存器 xchg 指令,就查找是否有成对,有则 Nop 掉
begin
myvar.tbyte := Pointer(myvar.pLen) ; //取当前指令长度表指针
myvar.cbyte := myvar.temp ;
if myvar.pbyte^ in [ $50..$57 ] then // 如果是相邻的Push Pop 32位寄存器指令,就 Nop 掉
begin
myvar.abyte := myvar.pbyte^;
inc(myvar.pbyte);
if (myvar.pbyte^ - 8) = myvar.abyte then
myvar.pword^ := $9090 ;
end; // Push Pop 判断结束
end;
2:
begin // 两字节的垃圾代码有很多
case myvar.pbyte^ of
$0F: // 是否32位寄存器的 bswap 指令,是则查找它有否配对,有则 Nop
begin
inc( myvar.pbyte);
if myvar.pbyte^ in [$C8..$CF] then
CheckDust2(myvar);
end;
$66:
begin
inc( myvar.pbyte);
if myvar.pbyte^ = $90 then // 特殊情况的 Nop 指令
myvar.pword^ := $9090 ;
if myvar.pbyte^ in [$91..$97] then // xchg 16位寄存器
CheckDust2(myvar);
end;
$70..$7F,$EB,$E3:
begin // 零距离的 Jmp 类指令
myvar.cbyte := myvar.temp ;
inc( myvar.pbyte);
case myvar.pbyte^ of
0:
begin
myvar.pword^ := $9090 ; // 不是则只 Nop 本条指令
end;
2:
begin
inc( myvar.pbyte );
if myvar.pbyte^ = myvar.cbyte^ then //是否同类的垃圾Short jmp
myvar.pdword^ := $90909090 ;
end;
end; // 零距离的 Jmp 类指令处理结束
$87:
begin
inc( myvar.pbyte);
if myvar.pbyte^ in [$C0, $C9,$D2,$DB,$E4,$ED,$F6,$FF] then // xchg 相同寄存器 ecx..edi
myvar.pword^ := $9090
else
begin
if myvar.pbyte^ in [$C1..$C8,$CA..$CF,$D0..$DA,$DC..$DF,$E0..$E3,$E5..$EF,$F0..$F5,$F7..$FE] then
CheckDust2(myvar); // 检测是否有成对
end;
end;
$8B:
begin
inc( myvar.pbyte );
if myvar.pbyte^ in [$C0,$C9,$D2,$DB,$E4,$ED,$F6,$FF] then // mov 同等32位寄存器,如:mov eax,eax
myvar.pword^ := $9090 ;
end;
$F7:
begin
inc( myvar.pbyte );
if myvar.pbyte^ in [ $D0..$D7 ] then // not 32位寄存器,是否有成对
CheckDust2(myvar);
end;
end; // case of 两字节处理块结束
end; // 两字节处理 End
3: // 三字节的垃圾代码也有,这个会有很多
begin
case myvar.pbyte^ of
$66:
begin
inc( myvar.pbyte );
if myvar.pbyte^ = $87 then
begin
inc( myvar.pbyte );
if myvar.pbyte^ in [ $F1..$F3,$F9..$FB ]then
begin
myvar.pword^ := $9090 ;
myvar.pbyte^ := $90 ;
end
end;
end;
$67:
begin
myvar.count := dword( myvar.pbyte ) ;
inc( myvar.count ) ;
myvar.pword := Pointer( myvar.count ) ;
if myvar.pword^ = $E300 then
begin
myvar.pbyte^ := $90 ;
myvar.pword^ := $9090 ;
end;
end;
end;
end;