查壳,是nspack壳
脱壳工具能直接脱掉,这里我们研究一下手工脱壳 。
“由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置”
x32打开,停在入口点,按F8走单步两步,发现确实只有ESP变化(FPU)窗口
走两步到call了,这时候直接从esp转到内存设置硬件断点访问四字节
这样继续执行就会停在这里
单步进入jmp的位置,这里就是OEP
用Scylla,OEP的数值就设置这里,然后IAT Autosearch,再get imports,dump,pe rebuild,fix dump,就可以dump出来文件,没壳。
再看代码就很简单了
提取两个数组异或一下就出来了
#include <iostream>
int main()
{
unsigned char byte_402130[] =
{
116, 104, 105, 115, 95, 105, 115, 95, 110, 111,
116, 95, 102, 108, 97, 103, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0
};
unsigned char dword_402150[] =
{
18, 4, 8, 20, 36,
92, 74, 61, 86, 10,
16, 103, 0, 65, 0,
1, 70, 90, 68, 66,
110, 12, 68, 114, 12,
13, 64, 62, 75, 95,
2, 1, 76, 94, 91,
23, 110, 12, 22, 104,
91, 18, 0, 72, 0,
0, 0, 0, 0, 0, 0
};
char Buffer[50] = "";
int v4 = 0;
for (v4 = 0; v4 < 42; v4++) {
char c = dword_402150[v4] ^ byte_402130[v4 % 16];
std::cout << c;
}
return 0;
}