zhuayi112 发表于 2024-1-25 21:07

下面这段初始化汇编代码要如何转换为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: 这段。有汇编熟手能帮解释下吗?谢谢了!

月之点点 发表于 2024-1-26 10:50

gunxsword 发表于 2024-1-26 09:40

本帖最后由 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表之类的东西!

5598869 发表于 2024-1-25 21:20

我这个半吊子 看着应该不容易 转为 C++ 好多地址数据 没法弄吧。

xlhwxyh 发表于 2024-1-25 21:40

本帖最后由 xlhwxyh 于 2024-1-25 21:44 编辑

直接用c++内联汇编不是更好吗?大致就是将
地址复制
p = ...;
p = ...;
懒得打字了,你懂滴吧!

xlhwxyh 发表于 2024-1-25 21:47

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 看来源因该是个数组!不懂就用内联汇编

KaneHiroshi 发表于 2024-1-25 22:01

如果汇编能直接转成c++那还要汇编干什么呢?C++再怎么说也是“高级”语言嘛

zhuayi112 发表于 2024-1-25 22:27

rep   movs dword ptr es:,dword ptr ds: 这点不明白了

BY丶显示 发表于 2024-1-26 00:50

不如直接,__asm{}调用一样。替换地址成变量。

MSLOS 发表于 2024-1-26 02:10

把汇编代码复制粘贴到chatgpt然后说把这段汇编代码转换成c++

苏紫方璇 发表于 2024-1-26 03:07

最简单的,扔ida里f5一下就自动转了,不过可能需要手动修改润色润色

alongzhenggang 发表于 2024-1-26 08:08

学习经验丰富自己
页: [1] 2
查看完整版本: 下面这段初始化汇编代码要如何转换为c++