&&&&&&&&&&&字符串移位 (只为自己方便查看)
[1]
exe文件改法:
1.先用od打开文件,找到调用了字符串的内存地址,记录下来
看看调用了字符串的地方有几个,跟随过去,看到的是push把字符串压入堆
栈,把所有调用了字符串地方的内存地址都记录下来,记录下了这些就可以先关了od了
2.用C32移动字符串,现在只向前移动一位,在od里把push的值也都减1,保存后字符串就回来了
[2]
dll文件改法:
步骤:
1.用C32载入文件,找到字符串,记下这个字符串的开头字符的物理地址
2.把这个物理地址转换为内存地址
3.把内存地址调换下位置
4.用C32打开***,再把字符串移位,也记下字符串移位后首字符的物理地址,然后十六进制替换
5.检测上线和功能
异或方法加密字符串:
用这个方法可以加密exe和dll字符串,包括像Pcshare***的DLL文件里的输出表函数名
步骤:
1.先找到你要加密的字符串的物理地址,再转为内存地址
2.记录下DLL现在的入口点,然后找一个零区域,同样记录下其内存地址,用来写入加密代码
再用LoadPe改入口点为零区域的地址
还得用LoadPe改PcMain.dll输出表所在区段的标志为E0000020,标志为E0000020就是可读可写
可执行.如果你不改这个的话,运行是会出错的!
字符串的物理地址:
字符串的内存地址:
DLL的入口点:
零区域地址:
(用LoadPE改入口的时候得去掉内存地址的基址哦)
3.再用下面的代码来实现加密,但这样一个一个的粘贴上去是很慢的,所以还是
用下面的二进制来粘贴了,这样不容易出错,也节省了时间
————————————————————————————————————
PUSHAD
CALL 10011866 //call 下面的“pop eax”的地址
POP EAX
XOR AX,AX
ADD EAX,xxxxxxxx //内存地址去掉前面的1001基址得到****,这里得按你的情况来填
XCHG EAX,ESI
MOV EDI,ESI
LODS BYTE PTR DS:[ESI]
OR AL,AL
JE 1001187C //je到下面的“POPAD”
XOR AL,18
STOS BYTE PTR ES:[EDI]
JMP 10011872 //jmp到上面的“LODS BYTE PTR DS:[ESI]”
POPAD
JMP xxxxxxxx //jmp到原入口,这里得按你的情况来填
————————————————————————————————————
二进制粘贴的代码:
60 E8 00 00 00 00 58 66 33 C0 05 C7 29 00 00 96 8B FE AC 08 C0 74 05 34 18 AA EB F6 61 EB 89
————————————————————————————————————
这样改后用OD打开文件,走到你加密的字符串那里,按F8单步,看看字符串被加密成了什么东西,二进制复制下来,
然后把这些加密了的字符串覆盖掉原字符串就可以了(正常的字符串被异或后成了乱码,所以乱码再次被异或就能还
原成了原来的正常的字符串)
exe文件字符串动态恢复:
首先把数据段(.data)也就是字符串所在区段属性的标志设置为E0000020,然后用OD载入,
记录下原入口点:
然后用C32把字符串的ASCII码记录下来(HEX格式化复制),每四个字节为一组分开,再把每组都反转过来
把字符串的内存地址找出来,然后找一个零区域,写入下面的动态恢复代码
————————————————————————————————————
exe文件动态恢复代码:
mov dword ptr ds:[字符串内存地址],上面得到的反转机器码1
mov dword ptr ds:[字符串内存地址+4],上面得到的反转机器码2
* * * * * * * *
jmp 原入口点
————————————————————————————————————
[2]
dll文件字符串动态恢复:
首先把数据段(.data)也就是字符串所在区段属性的标志设置为E0000020,然后用OD载入,
记录下原入口点:
然后用C32把字符串的ASCII码记录下来(HEX格式化复制),每四个字节为一组分开,再把每组都反转过来
把字符串的内存地址找出来,然后找一个零区域,写入下面的动态恢复代码
————————————————————————————————————
dll文件动态恢复代码:
pushad
call xxxxxxxx(call下面的pop eax地址)
pop eax
sub eax,xxxxxxxx; (上面的pop eax地址)
add eax,xxxxxxxx; (字符串原内存地址)
mov dword ptr ds:[eax],上面得到的反转机器码1
mov dword ptr ds:[eax+4],上面得到的反转机器码2
mov dword ptr ds:[eax+8],上面得到的反转机器码3
mov dword ptr ds:[eax+c],上面得到的反转机器码3
* * * * * * * *
popad
jmp 原入口点
————————————————————————————————————
二进制代码:
60 E8 00 00 00 00 58 2D E6 1F 01 10 05 70 45 01 10 C7 00 11 11 11 11
————————————————————————————————————
改入口点,00填充掉原来的字符串即可
[1]
exe文件字符串动态恢复:
首先把数据段(.data)也就是字符串所在区段属性的标志设置为E0000020,然后用OD载入,
记录下原入口点:
然后用C32把字符串的ASCII码记录下来(HEX格式化复制),每四个字节为一组分开,再把每组都反转过来
把字符串的内存地址找出来,然后找一个零区域,写入下面的动态恢复代码
————————————————————————————————————
exe文件动态恢复代码:
mov dword ptr ds:[字符串内存地址],上面得到的反转机器码1
mov dword ptr ds:[字符串内存地址+4],上面得到的反转机器码2
* * * * * * * *
jmp 原入口点
————————————————————————————————————
[2]
dll文件字符串动态恢复:
首先把数据段(.data)也就是字符串所在区段属性的标志设置为E0000020,然后用OD载入,
记录下原入口点:
然后用C32把字符串的ASCII码记录下来(HEX格式化复制),每四个字节为一组分开,再把每组都反转过来
把字符串的内存地址找出来,然后找一个零区域,写入下面的动态恢复代码
————————————————————————————————————
dll文件动态恢复代码:
pushad
call xxxxxxxx(call下面的pop eax地址)
pop eax
sub eax,xxxxxxxx; (上面的pop eax地址)
add eax,xxxxxxxx; (字符串原内存地址)
mov dword ptr ds:[eax],上面得到的反转机器码1
mov dword ptr ds:[eax+4],上面得到的反转机器码2
mov dword ptr ds:[eax+8],上面得到的反转机器码3
mov dword ptr ds:[eax+c],上面得到的反转机器码3
* * * * * * * *
popad
jmp 原入口点
————————————————————————————————————
二进制代码:
60 E8 00 00 00 00 58 2D E6 1F 01 10 05 70 45 01 10 C7 00 11 11 11 11
————————————————————————————————————
改入口点,00填充掉原来的字符串即可
转载于:https://blog.51cto.com/3451836/646491