#include <stdlib.h>
#include <stdio.h>
int main()
{
__asm
{
CLD
push 0x1E380A6A //压入MessageBoxA-->user32.dll
push 0x4FD18963 //压入ExitProcess-->kernel32.dll
push 0x0C917432 //压入LoadLibraryA-->kernel32.
mov esi, esp //指向栈中LoadLibraryA的hash值
lea edi, [esi - 0xc] //预留3个函数地址的空间,后面会利用edi的值来调用不同的函数
//开辟内存空间,这里是栈空间
xor ebx, ebx //ebx=0
mov bh, 0x04 //ebx为0x400
sub esp, ebx //开辟0x400大小的空间
//将字符串"user32"入栈
mov bx, 0x3233 //字符串"32"
push ebx //压入字符串"32"
push 0x72657375 //压入字符串"user"
push esp //esp指向字符串"user32"
xor edx, edx //edx=0
//查找kernel32.dll的基地址
mov ebx, fs: [edx + 0x30] //[TEB+0x30]-->PEB(直接写[0x30] 会出现00指令码)
mov ecx, [ebx + 0xC] //[PEB+0xC]-->PEB_LDR_DATA
mov ecx, [ecx + 0x1C] //进入链表第一个就是ntdll.dll
mov ecx, [ecx] //进入链表第二个就是kernel32.dll
mov ebp, [ecx + 0x8] //ebp=kernel32.dll的基地址
//hash的查找相关
find_lib_functions :
lodsd //即mov eax,[esi],add esi,4。取当前需要查找的 hash
cmp eax, 0x1E380A6A //与MessageBoxA的Hash进行比较
jne find_functions //如果不相等则继续查找,否则切换 到user32.dll查找
xchg eax, ebp //eax<==>ebp交换
call[edi - 0x8] //如果相等,则LoadLibraryA("user32")
xchg eax, ebp //eax<==>ebp交换
//在PE文件中查找相应的API函数
find_functions :
pushad //保护寄存器
mov eax, [ebp + 0x3C] //PE头的地址(相对地址)
mov ecx, [ebp + eax + 0x78] //导出表的地址(相对地址)
add ecx, ebp //导出表的地址(绝对地址)
mov ebx, [ecx + 0x20] //函数名称表地址(相对地址)
add ebx, ebp //函数名称表地址(绝对地址)
xor edi, edi //清空edi中的内容
dec edi //edi=-1,用作索引
//循环读取导出表函数
next_function_loop:
inc edi //edi作为名称序号,自动递增
mov esi, [ebx + edi * 4] //从函数名称表中读取
add esi, ebp //esi保存的是函数名称所在的绝对地址
cdq //把eax的最高位复制到edx的每一位,这里相当于edx=0
//hash值的运算过程
hash_loop :
movzx eax, byte ptr[esi] //每次读取一个字节放入eax
cmp al, ah //eax和0做比较,即结束符
jz compare_hash //hash计算完毕跳转
ror edx, 7 //循环右移7位
add edx, eax //累加
inc esi //下一个字节
jmp hash_loop //重复
//hash值的比较函数
compare_hash :
cmp edx, [esp + 0x1C] //lodsd和pushad后,esp+1C为待比较的hash值
jnz next_function_loop //比较不成功则查找下一个函数
mov ebx, [ecx + 0x24] //函数序号表地址(相对地址)
add ebx, ebp //函数序号表地址(绝对地址)
mov di, [ebx + 2 * edi] //名称序号转为地址序号
mov ebx, [ecx + 0x1C] //函数地址表地址(相对地址)
add ebx, ebp //函数地址表地址(绝对地址)
add ebp, [ebx + 4 * edi] //函数地址(绝对地址)
xchg eax, ebp //eax<==>ebp交换
pop edi //edi是pushad中最后一个入栈
stosd //即mov [edi],eax,add edi,4。
push edi //edi入栈
popad //恢复寄存器
cmp eax, 0x1E380A6A //与MessageBox的hash值比较
jne find_lib_functions
//下方的代码,就是我们的弹窗
xor ebx, ebx //清空ebx寄存器
push ebx //字符串结束符00
push 0x74736577 //push "west"
push 0x6C696166 //push "fail"
mov eax, esp //eax指向"failwest"
push ebx //push 0
push eax //push "failwest"
push eax //push "failwest"
push ebx //push 0
call[edi - 0x04] //call MessageBoxA
push ebx //push 0
call[edi - 0x08] //call ExitProcess
}
system("pause");
return 0;
}
这段代码在vs2022中运行不了应该怎么改?