下面这段初始化汇编代码要如何转换为c++
本帖最后由 zhuayi112 于 2024-1-25 22:27 编辑push ebp
mov ebp,esp
mov eax,0x1004
call 00584BC0
mov eax,dword ptr ds: ;eax = FF653105
xor eax,ebp ;ebp = 0012DAD8
mov dword ptr ss:,eax
push esi
push edi
mov dword ptr ss:,0xC5D1B023
mov dword ptr ss:,0x286085F0
mov dword ptr ss:,0xCA417918
.
.
dword ptr ds:,0x243F6A88
dword ptr ds:,0x85A308D3
dword ptr ds:,0x13198A2E
dword ptr ds:,0x3707344
dword ptr ds:,0xA4093822
dword ptr ds:,0x299F31D0
dword ptr ds:,0x82EFA98
dword ptr ds:,0xEC4E6C89
dword ptr ds:,0x452821E6
dword ptr ds:,0x38D01377
dword ptr ds:,0xBE5466CF
dword ptr ds:,0x34E90C6C
dword ptr ds:,0xC0AC29B7
dword ptr ds:,0xC97C50DD
dword ptr ds:,0x3F84D5B5
dword ptr ds:,0xB5470917
dword ptr ds:,0x9216D5D9
mov dword ptr ds:,0x8979FB1B
lea edi,dword ptr ds:
mov ecx,0x400
lea esi,dword ptr ss:
mov dword ptr ss:,0xF2D519FF
mov dword ptr ss:,0x4CF9AA7E
rep movs dword ptr es:,dword ptr ds:
mov ecx,dword ptr ss:
pop edi
xor ecx,ebp
pop esi
上面的汇编代码是初始化一个局部变量 0x1004 吗?中间 dword ptr ds:,0x243F6A88 .....一串的初始化有点不是很明白,还有最后 rep movs dword ptr es:,dword ptr ds: 这段。有汇编熟手能帮解释下吗?谢谢了! 本帖最后由 gunxsword 于 2024-1-26 09:52 编辑
你这一大堆代码,说白了就是在初始化一个数组
push ebp
mov ebp,esp
mov eax,0x1004//EAX可能是参数
call 00584BC0 //正常返回值应该是放在EAX中,但是下面给EAX重新赋值,也没有使用EAX,要么处理过,要么就是没有返回值
mov eax,dword ptr ds: ;eax = FF653105
xor eax,ebp ;ebp = 0012DAD8
mov dword ptr ss:,eax
push esi
push edi
mov dword ptr ss:,0xC5D1B023//这三个算是局部变量,后面可能用到
mov dword ptr ss:,0x286085F0
mov dword ptr ss:,0xCA417918
.
.
dword ptr ds:,0x243F6A88//这里开始相当于对ECX指向的数组开始赋值数据,+4,就是下一个,+8再下一个,a,a这前面应该有MOV,不可能没有
dword ptr ds:,0x85A308D3
dword ptr ds:,0x13198A2E
dword ptr ds:,0x3707344
dword ptr ds:,0xA4093822
dword ptr ds:,0x299F31D0
dword ptr ds:,0x82EFA98
dword ptr ds:,0xEC4E6C89
dword ptr ds:,0x452821E6
dword ptr ds:,0x38D01377
dword ptr ds:,0xBE5466CF
dword ptr ds:,0x34E90C6C
dword ptr ds:,0xC0AC29B7
dword ptr ds:,0xC97C50DD
dword ptr ds:,0x3F84D5B5
dword ptr ds:,0xB5470917
dword ptr ds:,0x9216D5D9
mov dword ptr ds:,0x8979FB1B到这里,直接赋值结束
lea edi,dword ptr ds: 这里计算了下一个下标的值放到了EDI
mov ecx,0x400循环,0X400次,计数 //这里是相当于循环,是一次就执行完的
lea esi,dword ptr ss: //这里是取得了EBP-0X1004的地址,不是里面的数据
mov dword ptr ss:,0xF2D519FF
mov dword ptr ss:,0x4CF9AA7E
rep movs dword ptr es:,dword ptr ds://这句的意思就是把ESI指向的地址的数据,按着,4字节一个,一共,0X400次,写入到EDI指向的地址,说白了就是继续给前面的数组,增加,0X400个数据
mov ecx,dword ptr ss:
pop edi
xor ecx,ebp
pop esi
前面是,0x44 0x44/4=0x11 =17 0-17 共,18个,再加上,0x400一共是,0x411个数据,整段代码,就是为了初始化一个0X411的数组,看数据,可能是个KEY表之类的东西! 我这个半吊子 看着应该不容易 转为 C++ 好多地址数据 没法弄吧。 本帖最后由 xlhwxyh 于 2024-1-25 21:44 编辑
直接用c++内联汇编不是更好吗?大致就是将
地址复制
p = ...;
p = ...;
懒得打字了,你懂滴吧! dword ptr ds:,0x243F6A88 //p = 0x243F6A88;
dword ptr ds:,0x85A308D3 //p = 0x85A308D3;
dword ptr ds:,0x13198A2E //p = 0x13198A2E;
dword ptr ds:,0x3707344 //p = 0x3707344 ;
.......
ecx 看来源因该是个数组!不懂就用内联汇编 如果汇编能直接转成c++那还要汇编干什么呢?C++再怎么说也是“高级”语言嘛 rep movs dword ptr es:,dword ptr ds: 这点不明白了 不如直接,__asm{}调用一样。替换地址成变量。 把汇编代码复制粘贴到chatgpt然后说把这段汇编代码转换成c++ 最简单的,扔ida里f5一下就自动转了,不过可能需要手动修改润色润色 学习经验丰富自己
页:
[1]
2