IsDebuggerPresent ()一般用来检测程序是否出于调试状态,返回值逻辑型
纯汇编调用此API,好处是程序导入表中查看不到此API
不过终究还是调用了API,bp 断点可以正常断下,
而且一般OD 反调试插件已经和谐此函数,所以:
此源码仅用于学习研究,请勿用于发布版程序!
此源码仅用于学习研究,请勿用于发布版程序!
不要被一些网络验证的宣传欺骗了,"买了送你纯汇编的XX之盾!"
一看全是汇编代码,"WOC,牛逼!",以为真的就是纯汇编不调用任何api函数
其实有的置入代码也同样调用了API函数,
bp可以正常断下,反调试插件同样可以和谐掉
程序最终的发布版肯定要加VMP,既然最后要加VMP,
个人感觉置入代码对防破的意义不大
防破还是主要靠代码混淆 暗桩和通信加密
回归正题,此代码执行过程
==========
1 遍历PEB表,获取IsDebuggerPresent函数地址
2 调用IsDebuggerPresent
2 判断返回值是否为真,如果是真,程序自动崩溃
如果是假,继续向下执行
.版本 2 .程序集 程序集1 .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 汇编是否调试 () MessageBoxA (0, “ok”, “1”, 0) 返回 (0) ' 可以根据您的需要返回任意数值 .子程序 汇编是否调试, , , 汇编调用IsDebuggerPresent (),F5调试自动崩溃,编译后正常 ' '注意,此汇编代码包含其他子程序,且子程序内未包含VMP标记 ' 如果使用VMP标识,编译后标记位置和预期的不一样,可自行测试 置入代码 ({ 232, 15, 0, 0, 0, 255, 208, 133, 192, 116, 3, 51, 228, 195, 233, 158, 0, 0, 0, 195, 81, 81, 100, 161, 48, 0, 0, 0, 83, 85, 86, 139, 64, 12, 87, 139, 72, 12, 235, 96, 139, 66, 60, 139, 9, 139, 116, 16, 120, 137, 116, 36, 20, 133, 246, 116, 79, 139, 92, 22, 32, 51, 255, 3, 218, 57, 124, 22, 24, 118, 65, 139, 43, 51, 192, 3, 234, 137, 68, 36, 16, 141, 91, 4, 138, 69, 0, 132, 192, 116, 38, 139, 116, 36, 16, 107, 246, 33, 15, 190, 192, 3, 240, 69, 138, 69, 0, 132, 192, 117, 240, 137, 116, 36, 16, 129, 124, 36, 16, 162, 232, 102, 111, 139, 116, 36, 20, 116, 23, 71, 59, 124, 22, 24, 114, 191, 139, 81, 24, 133, 210, 117, 153, 51, 192, 95, 94, 93, 91, 89, 89, 195, 139, 68, 22, 36, 141, 4, 120, 15, 183, 12, 16, 139, 68, 22, 28, 141, 4, 136, 139, 4, 16, 3, 194, 235, 224 }) MessageBoxA (0, “汇编是否调试”, “1”, 0)