07/05/27 11:15:59
>>654
了解です。
「はじめての」シリーズがアマゾンで評価高かったので見てみようかと思います。
あとは、インラインアセンブラで関数作ってその部分だけバイナリで吐き出させて
再び埋め込んでみるのもいいかもしれないです。
シェルコードの解説サイトにソースがあったので使えそうです。
スレ違いな感じですがいろいろ有難うございます。
656:デフォルトの名無しさん
07/05/27 12:40:27
>>649
おそらくポインタ関係でミスってる、てことは分かるでしょ?
>>652 で im != NULL のときどうなるか考えてみ。
657:デフォルトの名無しさん
07/05/27 17:46:45
>>644
EAX の上位ビットをクリアすればいけるかも
658:デフォルトの名無しさん
07/05/27 18:09:00
>>644のは ret のC3がeaxレジスタにmovするときの数値で食われてるから
返ってこないんだよ。
659:デフォルトの名無しさん
07/05/27 18:24:25
>>644
IMMが32bitの場合と16bitの場合を区別するために、
mov ax, 0x123
では、0x66, 0xb8, 0x23, 0x01
とプリフィックスを入れる必要があるみたい。
660:デフォルトの名無しさん
07/05/27 18:29:14
まぁ厳密には関数ポインタは他のポインタと互換性があるとは限らないんだけど
661:デフォルトの名無しさん
07/05/27 18:34:14
確かに…
リニアアドレスであればいいかもしれないが、
データセグメントとコードセグメントなんかに分かれてると
普通に呼び出すのは無理そう
OSのセキュリティレベルが上がってくると
またDOSのようにセグメント毎に分かれるかもしれんし
662:デフォルトの名無しさん
07/05/27 18:45:59
>>660
>>661
こういうことをやる場合は16bit/32bit/64bitで分けるのは当然。
逆にそれを分けてしまえば、ポインタのサイズも
セグメントの問題もどうにでもなると思うけど…
663:デフォルトの名無しさん
07/05/27 18:47:20
16bit/32bit/64bitで分けるっていうのは、
CPUの種類の話ね^^
664:649
07/05/28 09:22:00
みなさん、ありがとうございます。
無事に動かすことができました。
665:デフォルトの名無しさん
07/05/28 10:42:28
クラスのコピーコンストラクタとoperator=って、
実装する処理がまったく同じになることが多いんですけど、
メンバのコピー自体はoperator=だけに書いて、
AAAA::AAAA(const AAAA& rSrc)
{
*this = rSrc;
}
とか書いて処理を合体してしまうことって
やっぱり好ましくないことですか?
666:デフォルトの名無しさん
07/05/28 10:55:56
>>665
代入と初期化は異なる演算です。
コピーコンストラクタでは初期化リストで各メンバのコピーコンストラクタを使いましょう。
667:デフォルトの名無しさん
07/05/28 11:33:02
結果:Strike!
char *pszMsg = "Lucky Strike!";
char *pszHit;
[ 問 ];
printf("%s\n,pszHit");
668:デフォルトの名無しさん
07/05/28 11:37:50
最後の"はそこでいいのか
669:デフォルトの名無しさん
07/05/29 01:31:34
VisualStudio2005でC++をコンパイルした実行ファイルをリバースエンジニアリングできますか?
670:デフォルトの名無しさん
07/05/29 01:37:08
はい、できます。
671:デフォルトの名無しさん
07/05/29 01:47:07
>>669
君には、できません><
672:デフォルトの名無しさん
07/05/29 03:10:42
CLRヘッダが無いと怒られてしまいました。
どうすれば、リバースエンジニアリングできますか?
673:デフォルトの名無しさん
07/05/29 03:16:27
リバースエンジニアになればリバースエンジニアリングできます!
674:デフォルトの名無しさん
07/05/29 03:20:04
馬鹿にはできない不思議なリバースエンジニアリング
675:デフォルトの名無しさん
07/05/29 19:35:08
逆アセンブラはできるけど、逆コンパイルはできない。
676:デフォルトの名無しさん
07/05/29 19:49:18
× 逆アセンブラ
○ 逆アセンブル
× できない
○ それ的な事はできるけど、元のソースを再現できるわけではない
677:デフォルトの名無しさん
07/05/29 20:07:41
ブーメラン ブーメラン
678:デフォルトの名無しさん
07/05/29 20:13:09
64ビットになったらアセンブラでプログラムなんて無理だよね
679:デフォルトの名無しさん
07/05/29 20:13:48
>>678
なんでやねん?
680:デフォルトの名無しさん
07/05/29 20:14:36
めんどくさくない?
681:デフォルトの名無しさん
07/05/29 20:15:00
>>678
ドラスティックな変化があると思っているなら、不勉強にも程がある。
682:デフォルトの名無しさん
07/05/29 20:26:26
eax とかが rax とかになるだけだろ。
683:デフォルトの名無しさん
07/05/29 20:30:51
歳も歳だし、新しく勉強なんてもう俺には無理だよorz
16ビットが恋しい
684:デフォルトの名無しさん
07/05/29 21:14:53
逆アセでollydbg使ってる奴はいないのか?
685:デフォルトの名無しさん
07/05/29 21:49:24
なんだよ
686:デフォルトの名無しさん
07/05/29 22:59:51
16ビットなら人間の手足で数えられるんだな
687:デフォルトの名無しさん
07/05/29 23:39:43
つーか16ビットの方がめんどうだっだろ
688:デフォルトの名無しさん
07/05/29 23:42:06
だっだろ
689:デフォルトの名無しさん
07/05/30 08:45:31
だっだろだっだろ
690:デフォルトの名無しさん
07/05/30 10:24:56
リスクは面倒だっだ
691:デフォルトの名無しさん
07/05/30 12:59:59
フリスクはよかった
692:デフォルトの名無しさん
07/05/30 13:12:08
ロリスクってなんですか?ハァハァ
693:デフォルトの名無しさん
07/05/30 13:24:56
ローリスクっぽい言葉の響きなのに凄くハイリスクな感じがするな。
694:デフォルトの名無しさん
07/05/30 13:27:09
>>693
っ ■■■(座布団)
695:デフォルトの名無しさん
07/05/30 15:02:25
なんら意味のないプログラム
void add(int)
int main(void){
add(2);
return 0;
}
void add(int x){
x=x+1;
}
これ、main関数の中のadd(2)が実行された時点で、
内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。
main関数の中に
2=2+1;
ってやったらエラーが出て実行できない。
これはなぜ?教えてください
696:デフォルトの名無しさん
07/05/30 15:06:43
>>695
関数へはコピー渡しだからaddを呼んだ時点で2が変数xにコピーされている。
void add(int& x) だとコンパイルエラーにならないか?
697:デフォルトの名無しさん
07/05/30 15:06:58
意味がないなら、どうでもいいじゃないか。( ´∀`)
>内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。
C/C++ では、引数は値渡しなので
add() 内部で x という変数が 2 になっているだけ。
add() を抜けると、+1 したはずの x は消滅。
698:デフォルトの名無しさん
07/05/30 15:08:10
おいおいw
699:デフォルトの名無しさん
07/05/30 15:09:56
↑誤爆スマソ
700:デフォルトの名無しさん
07/05/30 15:11:53
↓自爆スマソ
701:デフォルトの名無しさん
07/05/30 15:12:26
>>695
そのx=x+1;での=は、数学の授業でやるような等しいという状態を表しているものではなく、
「代入しろ」という動作の命令なのよ。
代入しろという命令だから=の左には代入できるものを書かないとエラー。
だからx=x+1;はokで2=2+1;はエラーになる。
702:デフォルトの名無しさん
07/05/30 22:14:02
CかC++で、整数型のユニークなIDを作るような機能を持ったライブラリってありませんか?
703:デフォルトの名無しさん
07/05/30 22:27:11
>>702
uuid
704:デフォルトの名無しさん
07/05/30 22:32:30
用途が分からんと何とも言えない気がする。
705:デフォルトの名無しさん
07/05/30 23:14:46
unsigned long GenerateUniqueID()
{
static unsigned long id=0;
id++;
return id;
}
706:デフォルトの名無しさん
07/05/30 23:47:21
スレッドセーフじゃないな。
707:デフォルトの名無しさん
07/05/30 23:51:39
unsigned long GenerateUniqueID()
{
static unsigned long id=0;
static int locked=0;
while(locked) msleep(1);
locked=1;
id++;
locked=0;
return id;
}
ミューテックス使わなきゃ駄目?
708:デフォルトの名無しさん
07/05/31 00:06:39
当然なんらかの同期化機構を利用しないとダメ。
スレッドAがwhile(locked)で
"lockedの値をレジスタに取った直後に" スレッドが切り替わり
スレッドBが同様にwhile(locked)を実行したらどうなる?
あと、そのコードはstatic変数の初期化も下手すると二回以上行われるね。
709:デフォルトの名無しさん
07/05/31 00:08:51
いや、、、初期化は実行時じゃ無いぞ・・・
クリティカルセクションでいいな
710:デフォルトの名無しさん
07/05/31 00:17:29
ごめん。C++のつもりで書いてたわ…。
711:デフォルトの名無しさん
07/05/31 00:42:27
最適化でゴッソリ消える予感
712:デフォルトの名無しさん
07/05/31 00:50:34
synchronized
713:デフォルトの名無しさん
07/05/31 02:12:57
C++ にあればねえ
714:デフォルトの名無しさん
07/05/31 02:16:48
>>711
その点については volatile つけとけばおk
715:デフォルトの名無しさん
07/05/31 06:43:11
そういう問題じゃないけどまぁいいか。
716:デフォルトの名無しさん
07/05/31 08:42:34
すいません、この関数って何か間違ってますか?
hairetsu2は、メモリ領域が確保してあり、srand()も関数の外で処理しています。
hairetsu2[j][i] = rand()%2のところで止まります。お願いします。
void rand_point( int **hairetsu2, int row, int line ){
int i, j;
/*** 2次配列の0or1をランダムに格納する ***/
for (j=0; j<row; j++){
for (i=0; i<(1+line); i++){
hairetsu2[j][i] = (rand()%2);
}
}
printf("2次配列にランダムに0or1を格納できました。\n");
}
717:デフォルトの名無しさん
07/05/31 09:06:05
>hairetsu2は、メモリ領域が確保してあり、
どうせちゃんと確保してないに決まってる
718:デフォルトの名無しさん
07/05/31 09:06:36
「止まります」?そもそもコンパイル通らんだろ。
719:デフォルトの名無しさん
07/05/31 09:25:24
コンパイルは通るんですよ↓メモリ確保は、次の関数で確保してます。
void securement2( int **hairetsu2 , int row , int line ){
int i, j;
/*** 2次配列の行を確保する ***/
if (( hairetsu2 = (int **)malloc( sizeof( int* ) * row )) == NULL ){
printf("2次配列のメモリ領域が確保できません。\n");
exit (1);
}
/*** 各行に得点の列を確保する ***/
for ( j=0; j<(row); j++){
if (( hairetsu2[j] = (int*)malloc( sizeof(int) * (1+line) )) == NULL ){
printf("2次配列のメモリ領域が確保できません。\n");
exit (1);
}
}
/*** 2次配列を0で初期化 ***/
for (j=0; j<row; j++){
for (i=0; i<(1+line); i++){
hairetsu2[j][i] = 0;
}
}
printf("2次配列のメモリ領域が確保できました。\n");
}
720:デフォルトの名無しさん
07/05/31 09:30:00
>>718
根拠は?
>>717
同意。
>>716
その構造だと、メモリはとint配列[line + 1]をrow回とポインタ配列[row]だけ確保する必要があるわけだが。
その部分のコードを晒して味噌。
721:デフォルトの名無しさん
07/05/31 09:30:21
hairetsu2[0][0]だけが格納されて止まるみたいです。hairetsu2[1][1]も格納できないみたいです。
722:720
07/05/31 09:32:01
>>719
あーすまん、やってたのね。
で、止まるってのは具体的にどうなると?
723:デフォルトの名無しさん
07/05/31 09:32:23
>>719
確かにメモリ確保はできてるようだけど、
hairetsu2 をそのまま使うことは出来ない。
変数 hairetsu2 は関数 securement2 を終えた時点で使用不能
724:デフォルトの名無しさん
07/05/31 09:33:06
void securement2( int **hairetsu2 , int row , int line ){
↓
void securement2( int ***hairetsu2 , int row , int line ){
または
void securement2( int **hairetsu2 , int row , int line ){
↓
int **securement2( int row , int line ){
int **hairetsu2;
printf("2次配列のメモリ領域が確保できました。\n");
↓
printf("2次配列のメモリ領域が確保できました。\n");
return hairetsu2;
725:デフォルトの名無しさん
07/05/31 09:44:15
2次元配列も連続した領域である必要があるんだよ。
その配列のアクセスの仕方をやめるか、メモリ確保を一回でやるかどっちかにせい
726:デフォルトの名無しさん
07/05/31 09:45:30
>>725
ちょ…おまw
727:デフォルトの名無しさん
07/05/31 10:29:04
素朴な疑問だが、>>719みたいな奴って「2次元配列」言うの?
確かに同じ形で操作出来た気はするが。
>>725
何に対するレスか非常に疑問。
728:デフォルトの名無しさん
07/05/31 10:36:01
可変長二次元ぬるぽ( ´∀`)
729:デフォルトの名無しさん
07/05/31 11:31:48
>>727
配列のポインタの配列。
730:デフォルトの名無しさん
07/05/31 11:47:39
URLリンク(www.kouno.jp)
731:デフォルトの名無しさん
07/05/31 12:37:24
windows98で
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
は実行できますか?
実行するとどうなりますか?
732:649
07/05/31 13:10:14
716です。ありがとうございます。ちょっと試してみます。
733:デフォルトの名無しさん
07/05/31 13:37:36
>>731
MSDN読め
734:デフォルトの名無しさん
07/05/31 15:43:09
>>716はダブルポインタ理解してるか?
引数にint **hairetsu2って書いてあるが、ここでダブルポインタにする必要はなにもない。
引数をダブルポインタにするには、関数内でメモリを確保して返すような場合だけだ。
ダブルポインタ=二次元配列じゃないぞ。配列は何次元になってもメモリ内の表現は連続だ。
あとrowとlineは普通どっちも行を意味する。
rowを行とするなら、列の変数名はcolumnの方がいい。
735:デフォルトの名無しさん
07/05/31 17:38:07
>>707
Windows APIのInterlockedIncrementのような関数が使えれば、それを使うのが楽
736:デフォルトの名無しさん
07/05/31 17:52:17
ダブルポインタってなに?
737:デフォルトの名無しさん
07/05/31 17:58:01
1点決めると2点分になる人
738:デフォルトの名無しさん
07/05/31 17:58:22
配列の連続性だけど、
a[3][3] で a[0][2] と a[1][0] の連続性って規格で保証されてたっけ?
739:デフォルトの名無しさん
07/05/31 18:00:11
int**がダブルポインタならこれは何ポインタ?
int*************** nullpo;
740:デフォルトの名無しさん
07/05/31 18:07:56
pentadecuple
741:デフォルトの名無しさん
07/05/31 18:47:40
>>733
読みました。2000以降と書いてありますが、98でどうなるかは書いていません。