首页
社区
课程
招聘
如何将用汇编语言EAX内容作为字符串表示出来?
发表于: 2010-9-11 23:16 6556

如何将用汇编语言EAX内容作为字符串表示出来?

2010-9-11 23:16
6556
比如EAX=F9A5DBF2,如何将F9A5DBF2转换成十进制(4188396530),然后再转换成字符串,存到内存中呢?

我是看【原创】OllyDBG 入门系列(四)-内存断点时,考虑如何将其注册码作为字符串直接显示在文本框中!

DS:[0040339C]=F9A5DBF2

004012B0  |.  31 32 33 34 3>ASCII "12345666",0
004012B9      68 B0124000   PUSH CrackHea.004012B0                   ;  ASCII "12345666"
004012BE  |.  FF35 90314000 PUSH DWORD PTR DS:[403190]               ; |hWnd = 000309C4 (class='Edit',parent=000909FA)
004012C4  |.  E8 DB010000   CALL <JMP.&USER32.SetWindowTextA>        ; \SetWindowTextA

上面是程序初始的字符 "12345666",我想让它是真正的注册码"2162142881",该如何呢?

MOV EAX,DWORD PTR DS:[40339C]
XOR EAX,797A7553               ;EAX=80DFAEA1h,2162142881d
……
……
如何完善代码,使其“2162142881”作为ASCII "2162142881"表示出来呢?

请教中……

悬赏金额太少,因为手头紧,请谅解。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没超int范围可以直接itoa。
2010-9-11 23:52
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
itoa好像是C中的吧。如果在汇编语言下呢?
2010-9-12 13:57
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
004012B9      68 B0124000   PUSH CrackHea.004012B0                   ;  ASCII "12345666"

将"2162142881“字符串写入00区,在把上面的指针改了
2010-9-12 20:07
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
user32.wsprintf
2010-9-12 20:24
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这跟是不是c没关系。有库就能调用。
2010-9-12 21:23
0
雪    币: 58
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
只要是windows系统API,就可以在汇编中用。

除了C自己的函数库。

user32.wsprintf 正解,想输出什么格式都行。

具本用法看msdn。。。
2010-9-13 14:25
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也是这么想的,如何将"2162142881"写入00区,如何转换成"2162142881"呢?请问!
2010-9-13 20:24
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢programfan,使用itoa,我终于达到我的需求了。

原程序是:


004012A9  |.  E8 FC010000   CALL <JMP.&USER32.ShowWindow>            ; \ShowWindow
004012AE      EB 09         JMP SHORT CrackHea.004012B9
004012B0      3132          XOR DWORD PTR DS:[EDX],ESI
004012B2      333435 363636>XOR ESI,DWORD PTR DS:[ESI+363636]
004012B9      68 B0124000   PUSH CrackHea.004012B0                   ;  ASCII "12345666"
004012BE      FF35 90314000 PUSH DWORD PTR DS:[403190]
004012C4  |.  E8 DB010000   CALL <JMP.&USER32.SetWindowTextA>        ; \SetWindowTextA
004012C9  |.  EB 08         JMP SHORT CrackHea.004012D3




我修改成:


004012A9   .  E8 FC010000   CALL <JMP.&USER32.ShowWindow>            ; \ShowWindow
004012AE   .  E9 2D020000   JMP CrackHea.004014E0
004012B3      90            NOP
004012B4      90            NOP
004012B5      90            NOP
004012B6      90            NOP
004012B7      90            NOP
004012B8      90            NOP
004012B9   >  FF35 90314000 PUSH DWORD PTR DS:[403190]               ; |hWnd = NULL
004012BF   .  90            NOP                                      ; |
004012C0   .  90            NOP                                      ; |
004012C1   .  90            NOP                                      ; |
004012C2   .  90            NOP                                      ; |
004012C3   .  90            NOP                                      ; |
004012C4   .  E8 DB010000   CALL <JMP.&USER32.SetWindowTextA>        ; \SetWindowTextA
004012C9   .  EB 08         JMP SHORT CrackHea.004012D3


004014E0   > \50            PUSH EAX
004014E1   .  53            PUSH EBX
004014E2   .  33C0          XOR EAX,EAX
004014E4   .  33DB          XOR EBX,EBX
004014E6   .  A1 9C334000   MOV EAX,DWORD PTR DS:[40339C]
004014EB   .  35 53757A79   XOR EAX,797A7553
004014F0   .  8D1D C4334000 LEA EBX,DWORD PTR DS:[4033C4]
004014F6   .  6A 0A         PUSH 0A                                  ; /radix = A (10.)
004014F8   .  53            PUSH EBX                                 ; |string => CrackHea.004033C4
004014F9   .  50            PUSH EAX                                 ; |value
004014FA   .  E8 95D4547C   CALL ntdll._itoa                         ; \_itoa
004014FF   .  5B            POP EBX
00401500   .  5B            POP EBX
00401501   .  5B            POP EBX
00401502   .  5B            POP EBX
00401503   .  58            POP EAX
00401504   .  68 C4334000   PUSH CrackHea.004033C4
00401509   .^ E9 ABFDFFFF   JMP CrackHea.004012B9





这样,就实现了将注册码直接显示到文本框中!
这里:
004014E6   .  A1 9C334000   MOV EAX,DWORD PTR DS:[40339C]  
将机器生成的机器码,暂且叫机器码,因其与或797A7553后的十进制数即为注册码。
004014EB   .  35 53757A79   XOR EAX,797A7553
EAX此时为注册码,只需将其转换成十进制字符串
004014F0   .  8D1D C4334000 LEA EBX,DWORD PTR DS:[4033C4]
建立缓冲区
004014F6   .  6A 0A         PUSH 0A                                  ; /radix = A (10.)
004014F8   .  53            PUSH EBX                                 ; |string => CrackHea.004033C4
004014F9   .  50            PUSH EAX                                 ; |value
004014FA   .  E8 95D4547C   CALL ntdll._itoa                         ; \_itoa
调用itoa函数,将EAX转换成进制为10的字符串,放到EBX处去。
004014FF   .  5B            POP EBX
00401500   .  5B            POP EBX
00401501   .  5B            POP EBX
以上为平衡堆栈,我汇编不好,不会用更好的方法,就笨招数OD的堆栈窗口中堆栈的元素个数一直平衡到push ebx为止,我这里有疑问,为什么CALL ntdll._itoa不能平衡堆栈呢?是不是所有的Windows函数(像CALL <JMP.&USER32.SetWindowTextA>)都是这样的呢?
00401502   .  5B            POP EBX
00401503   .  58            POP EAX

00401504   .  68 C4334000   PUSH CrackHea.004033C4

OK了!
后面的就和修改前差不多了。
00401504   .  68 C4334000   PUSH CrackHea.004033C4   
内容
004012B9   > /FF35 90314000 PUSH DWORD PTR DS:[403190]
句柄
004012C4   .  E8 DB010000   CALL <JMP.&USER32.SetWindowTextA>        ; \SetWindowTextA

通过programfan的提示后,我开始修改的文件总是出错,但是重新加载后有可运行,但是运行不到最后,我找了半天,才发现是堆栈没有平衡好,导致的错误。

再次谢谢programfan,还有其他回帖的朋友。

上传下结果,显摆一下。 CrackHead0.rar
上传的附件:
2010-9-13 23:29
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
sessiondiy和Modifix的wsprintf的提示,并不能解决我的问题,如果使用C/C++来另编程写注册码,也许会用到。
谢谢你们!
2010-9-13 23:35
0
游客
登录 | 注册 方可回帖
返回
//