fxyang你脚本的MutexName指针是基于堆栈还是ebx(以谁为准)?
fxyang, 你的“arm3.75版以后的从双进程到单进程转换的Script自动运行脚本”为何只能应用到3.75版以后,原理是否利用在OpenMutexA上设bpx断点,Shift+F9运行或通过异常,当中断在OpenMutexA后,只要得到OpenMutexA的MutexName指针(你的edx是否等于中断OpenMutexA入口时堆栈的MutexName指针),是就可以轻松实现任意版的双->单的代码!如果是代码可写成下面这样可以通过吗?我没有玩过,现在也不能玩,但看过好些arm双进程的文章,理解是这样,不知如何?
dbh
var MutexName
gpa "OpenMutexA","kernel32.dll"
bp $RESULT //若bp断点不能用,可换上硬件断点
eob check
pass:
esto
check:
cmp eip,$RESULT //是否中断在OpenMutexA
jne pass
mov MutexName,esp
add MutexName,0C
mov MutexName,[MutexName]
mov edx,MutexName //获得MutexName指针
turn-alone:
exec
PUSHAD
PUSH EDX
push 0
push 0
CALL kernel32.CreateMutexA
POPAD
jmp kernel32.OpenMutexA
ende
bc $RESULT
//上面的代码就是在Script中运行从双进程到单进程的转换//
msg "已经转换成功!"
ret
讨论 EXEC/ENDE 之实际应用
/*
讨论 EXEC/ENDE 之实际应用(你有更好的见解请务必告知):
1.使用call api,api前面需加相关动态链接库的前缀方能应用(fxyang的脚本点通了我,说明书写了个错误的样版),如:call kernel32.GetProcAddress
2.从EXEC/ENDE的错误应用中得出,该命令会自动寻找00空间,自动一边汇编代码,一边执行和回收!
3.下面设当前堆栈已经压入call GetProcAddress所需的两个参数,希望从addr中得到返回VirtualProtect的地址(事与原违):
*/
var modulebase // 动态链接库基址
var addr
var name //API函数名指针
mov modulebase,[esp] //设当前esp指向动态链接库基址: kernel32.dll
mov addr,esp
add addr,4 //当前esp+4指向aip字符串地址:"VirtualProtect"
mov name,[addr]
exec
pushad
push {name}
push {modulebase}
call kernel32.GetProcAddress
mov {addr},eax // 测试请擦去下面两行
xor eax,eax // 原测试没有以下两行,
xor [eax],eax //以上两行是发动异常,让你看见EXEC/ENDE进行的地点,后果自理
popad
ende
log addr // 为何我不能从addr获得"VirtualProtect"的地址?addr为何不能返回eax的值?这里addr只能是esp+4的值,难到addr在EXEC/ENDE中只能参与运算,而不能更改???
ret
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课