本來作者說的很清楚,附錄里有怎么部署vs的環境,用vs寫c/c++程序調用asm程序,但是我這本的翻譯版沒有附錄,然而其他網站上都是有償下載pdf文件orz,目前資源也不多,
沒錢就只能自己想辦法。。。
這里主要是用到了https://blog.csdn.net/dfq12345/article/details/69870513這位兄弟的方法。
當然首先是msam官網http://www.masm32.com/下masm並安裝部署改一改環境變量,它安裝好了以后會有一個默認編輯器,其實也能用。
還有masm for windows 共享版 這個軟件也能用,而且感覺對新手挺不錯的,還有教學,不過對於這本書,基本上都是c程序加上asm程序的方式,沒看到什么純匯編,所以就不用它了。。。
基本就是按照上面那個兄弟的方法,但是最后我按它的方法無法默認給我把 自動asm文件編譯成obj文件然后再自動添加進去,改了設置也沒用,要是有懂得可以教教我orz,
就每次只能用cmd 手動 ml /c /coff 文件名.asm 這樣編譯,目前就先這么用着吧,我的vs是官網下的2017,我在里邊也沒找到網上所說的那個調試-》窗口-》的寄存器選項,還有網上說的
擴展里的asm語法高亮的插件,從那個插件官網上找了插件,發現vs2017不允許安裝?沒辦法只能這樣。
http://blog.csdn.net/maguanzhan7939/article/details/78608345這是可行方案2,按照這個哥們說的做也成功了。但是這個貌似是用匯編做主函數,調用c函數庫來顯示。
所以就老老實實的用手動編譯了。聽說vs最好不要亂動,我也不敢隨便更新和重裝orz,所以目前就先這樣吧。
ps:感覺整編譯器這件事真是比較玄學,仿佛看到了匯編這條路上在這第一步上勸退了一堆人,有人隨便就能配置好,還有人就瘋狂受苦 (就像我orz)。
要是有問題可以私信,我們互相分享一下資源還有踩過的坑什么的,雖說不一定能幫上,但是可以分享學習經驗,共同進步(抱團取暖)。。。。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//寫了幾天以后,發現到36頁的ConditonCodes_.asm 里邊的那個cmovl大於條件賦值和cmovg小於條件賦值 被dosbox,masm for windows ,和cmd直接調用ml /c /coff
全都識別不出來,說cpu不識別的指令集,我電腦64位的,具體原因我也不清楚。但是這些編譯器都是開頭要加.386才能使用的那種,我自己瞎搗鼓找到了另一種辦法竟然可行。。。。。。。
就是用https://www.kanxue.com/book-28-220.htm就用看雪學院里君子謬老師第一節課配置ide的方法在vs2017里新建個工程,然后只像它一樣把依賴項選了,其他都不用選,我們只用這個工程的環境來編譯,把你要編譯的.asm文件加進去,然后直接編譯執行,會告訴你編譯成功但是沒法連接,直接區debug文件里把編譯出來的.obj
文件復制出來到你的那個用.cpp做主函數的原來的照着書上寫的那個工程里,然后再打開那個工程,添加進去,編譯執行,就可以了。
對了用這種方法要書上的代碼一樣不要在第一行加.386!!!
對了用這種方法要書上的代碼一樣不要在第一行加.386!!!
#include<tchar.h> #include<stdio.h> extern "C" int SignedMinA_(int a, int b, int c); extern "C" int SignedMaxA_(int a, int b, int c); extern "C" int SignedMinB_(int a, int b, int c); extern "C" int SignedMaxB_(int a, int b, int c); int _tmain(int agrc, _TCHAR*agrv[]) { int a, b, c; int smin_a, smax_a; int smin_b, smax_b; //signedmin 示例 a = 2; b = 15; c = 8; smin_a = SignedMinA_(a, b, c); smin_b = SignedMinB_(a, b, c); printf("SignedMinA(%4d,%4d,%4d)=%4d\n", a, b, c, smin_a); printf("SignedMinB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smin_b); a = -3; b = -22; c = 28; smin_a = SignedMinA_(a, b, c); smin_b = SignedMinB_(a, b, c); printf("SignedMinA(%4d,%4d,%4d)=%4d\n", a, b, c, smin_a); printf("SignedMinB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smin_b); a = 17; b = 37; c = -11; smin_a = SignedMinA_(a, b, c); smin_b = SignedMinB_(a, b, c); printf("SignedMinA(%4d,%4d,%4d)=%4d\n", a, b, c, smin_a); printf("SignedMinB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smin_b); //SignedMax示例 a = 10; b = -5; c = 3; smax_a = SignedMaxA_(a, b, c); smax_b = SignedMaxB_(a, b, c); printf("SignedMaxA(%4d,%4d,%4d)=%4d\n", a, b, c, smax_a); printf("SignedMaxB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smax_b); a = -3; b = 28; c = 15; smax_a = SignedMaxA_(a, b, c); smax_b = SignedMaxB_(a, b, c); printf("SignedMaxA(%4d,%4d,%4d)=%4d\n", a, b, c, smax_a); printf("SignedMaxB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smax_b); a = -25; b = -37; c = -17; smax_a = SignedMaxA_(a, b, c); smax_b = SignedMaxB_(a, b, c); printf("SignedMaxA(%4d,%4d,%4d)=%4d\n", a, b, c, smax_a); printf("SignedMaxB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smax_b); }
.model flat,c .code SignedMinA_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] ;確定min(a,b) cmp eax,ecx jle @F mov eax,ecx ;確定min(a,b,c) @@: mov ecx,[ebp+16] cmp eax,ecx jle @F mov eax,ecx @@: pop ebp ret SignedMinA_ endp SignedMaxA_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] cmp eax,ecx jge @F mov eax,ecx @@: mov ecx,[ebp+16] cmp eax,ecx jge @F mov eax,ecx @@: pop ebp ret SignedMaxA_ endp SignedMinB_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] ;使用cmovg指令確定最小值 cmp eax,ecx CMOVG eax,ecx mov ecx,[ebp+16] cmp eax,ecx cmovg eax,ecx pop ebp ret SignedMinB_ endp SignedMaxB_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] cmp eax,ecx cmovl eax,ecx mov ecx,[ebp+16] cmp eax,ecx cmovl eax,ecx pop ebp ret SignedMaxB_ endp end
這幾天看了逆向工程的一些課和資料,看雪學院有一些課,都挺好的https://www.kanxue.com/book-28-220.htm還有b站 極客方舟的視頻資料,crack好有意思
這些天也算是收集了一些工具,想要的話可以加qq915405958聯系,免費給你發過去。